From e4a047526334dc97a93ef364878b14760e85408d Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Sat, 25 Jul 2026 10:57:19 -0700 Subject: [PATCH 001/279] test: remove four mirror test files that exercise none of their module A second mutation batch scored the previously unmapped mirror files on current staging. These four generate mutants for the module they are named after, yet no test in the file executes any of them; their test-context coverage lands on generic shared machinery or, for the guardrail translation handler remainder, on no litellm line at all. Eight sibling findings that do exercise a different real module are kept for retargeting instead of removal. --- .../datadog/test_datadog_llm_observability.py | 1195 ----------------- .../guardrail_translation/test_handler.py | 37 - .../test_reasoning_content_transformation.py | 296 ---- tests/test_litellm/test_azure_video_router.py | 53 - 4 files changed, 1581 deletions(-) delete mode 100644 tests/test_litellm/integrations/datadog/test_datadog_llm_observability.py delete mode 100644 tests/test_litellm/llms/pass_through/guardrail_translation/test_handler.py delete mode 100644 tests/test_litellm/responses/litellm_completion_transformation/test_reasoning_content_transformation.py delete mode 100644 tests/test_litellm/test_azure_video_router.py diff --git a/tests/test_litellm/integrations/datadog/test_datadog_llm_observability.py b/tests/test_litellm/integrations/datadog/test_datadog_llm_observability.py deleted file mode 100644 index 1cc3591392b..00000000000 --- a/tests/test_litellm/integrations/datadog/test_datadog_llm_observability.py +++ /dev/null @@ -1,1195 +0,0 @@ -import asyncio -import os -import sys -from datetime import datetime, timedelta, timezone -from typing import Optional -from unittest.mock import MagicMock, Mock, patch - -import pytest - -# Adds the grandparent directory to sys.path to allow importing project modules -sys.path.insert(0, os.path.abspath("../..")) -import litellm -from litellm.integrations.custom_logger import CustomLogger -from litellm.integrations.datadog.datadog_llm_obs import DataDogLLMObsLogger -from litellm.types.integrations.datadog_llm_obs import ( - DatadogLLMObsInitParams, -) -from litellm.types.utils import ( - StandardLoggingGuardrailInformation, - StandardLoggingHiddenParams, - StandardLoggingMetadata, - StandardLoggingModelInformation, - StandardLoggingPayload, - StandardLoggingPayloadErrorInformation, -) - - -def create_standard_logging_payload_with_cache() -> StandardLoggingPayload: - """Create a real StandardLoggingPayload object for testing""" - return StandardLoggingPayload( - id="test-request-id-456", - call_type="completion", - response_cost=0.05, - response_cost_failure_debug_info=None, - status="success", - total_tokens=30, - prompt_tokens=10, - completion_tokens=20, - startTime=1234567890.0, - endTime=1234567891.0, - completionStartTime=1234567890.5, - model_map_information=StandardLoggingModelInformation( - model_map_key="gpt-4", model_map_value=None - ), - model="gpt-4", - model_id="model-123", - model_group="openai-gpt", - api_base="https://api.openai.com", - metadata=StandardLoggingMetadata( - user_api_key_hash="test_hash", - user_api_key_org_id=None, - user_api_key_alias="test_alias", - user_api_key_team_id="test_team", - user_api_key_user_id="test_user", - user_api_key_team_alias="test_team_alias", - spend_logs_metadata=None, - requester_ip_address="127.0.0.1", - requester_metadata=None, - ), - cache_hit=True, - cache_key="test-cache-key-789", - saved_cache_cost=0.02, - request_tags=[], - end_user=None, - requester_ip_address="127.0.0.1", - messages=[{"role": "user", "content": "Hello, world!"}], - response={"choices": [{"message": {"content": "Hi there!"}}]}, - error_str=None, - model_parameters={"stream": True}, - hidden_params=StandardLoggingHiddenParams( - model_id="model-123", - cache_key="test-cache-key-789", - api_base="https://api.openai.com", - response_cost="0.05", - additional_headers=None, - ), - trace_id="test-trace-id-123", - custom_llm_provider="openai", - ) - - -def create_standard_logging_payload_with_failure() -> StandardLoggingPayload: - """Create a StandardLoggingPayload object for failure testing""" - return StandardLoggingPayload( - id="test-request-id-failure-789", - call_type="completion", - response_cost=0.0, - response_cost_failure_debug_info=None, - status="failure", - total_tokens=0, - prompt_tokens=10, - completion_tokens=0, - startTime=1234567890.0, - endTime=1234567891.0, - completionStartTime=1234567890.5, - model_map_information=StandardLoggingModelInformation( - model_map_key="gpt-4", model_map_value=None - ), - model="gpt-4", - model_id="model-123", - model_group="openai-gpt", - api_base="https://api.openai.com", - metadata=StandardLoggingMetadata( - user_api_key_hash="test_hash", - user_api_key_org_id=None, - user_api_key_alias="test_alias", - user_api_key_team_id="test_team", - user_api_key_user_id="test_user", - user_api_key_team_alias="test_team_alias", - spend_logs_metadata=None, - requester_ip_address="127.0.0.1", - requester_metadata=None, - ), - cache_hit=False, - cache_key=None, - saved_cache_cost=0.0, - request_tags=[], - end_user=None, - requester_ip_address="127.0.0.1", - messages=[{"role": "user", "content": "Hello, world!"}], - response=None, - error_str="RateLimitError: You exceeded your current quota", - error_information=StandardLoggingPayloadErrorInformation( - error_code="rate_limit_exceeded", - error_class="RateLimitError", - llm_provider="openai", - traceback="Traceback (most recent call last):\n File test.py, line 1\n RateLimitError: You exceeded your current quota", - error_message="RateLimitError: You exceeded your current quota", - ), - model_parameters={"stream": False}, - hidden_params=StandardLoggingHiddenParams( - model_id="model-123", - cache_key=None, - api_base="https://api.openai.com", - response_cost="0.0", - additional_headers=None, - ), - trace_id="test-trace-id-failure-456", - custom_llm_provider="openai", - ) - - -class TestDataDogLLMObsLogger: - """Test suite for DataDog LLM Observability Logger""" - - @pytest.fixture - def mock_env_vars(self): - """Mock environment variables for DataDog""" - with patch.dict( - os.environ, {"DD_API_KEY": "test_api_key", "DD_SITE": "us5.datadoghq.com"} - ): - yield - - @pytest.fixture - def mock_response_obj(self): - """Create a mock response object""" - mock_response = Mock() - mock_response.__getitem__ = Mock( - return_value={ - "choices": [ - { - "message": Mock( - json=Mock( - return_value={"role": "assistant", "content": "Hello!"} - ) - ) - } - ] - } - ) - return mock_response - - def test_cost_and_trace_id_integration(self, mock_env_vars, mock_response_obj): - """Test that total_cost is passed and trace_id from standard payload is used""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_cache() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": { - "metadata": {"trace_id": "old-trace-id-should-be-ignored"} - }, - } - - start_time = datetime.now() - end_time = datetime.now() - - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - - # Test 1: Verify total_cost is correctly extracted from response_cost - assert payload["metrics"].get("total_cost") == 0.05 - - # Test 2: Verify trace_id comes from standard_logging_payload, not metadata - assert payload["trace_id"] == "test-trace-id-123" - - # Test 3: Verify saved_cache_cost is in metadata - metadata = payload["meta"]["metadata"] - assert metadata["saved_cache_cost"] == 0.02 - assert metadata["cache_hit"] is True - assert metadata["cache_key"] == "test-cache-key-789" - - # Test 4: Verify is_streamed_request is in metadata - assert metadata["is_streamed_request"] is True - - def test_cache_metadata_fields(self, mock_env_vars, mock_response_obj): - """Test that cache-related metadata fields are correctly tracked""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_cache() - - # Test the _get_dd_llm_obs_payload_metadata method directly - metadata = logger._get_dd_llm_obs_payload_metadata(standard_payload) - - # Verify all cache-related fields are present - assert metadata["cache_hit"] is True - assert metadata["cache_key"] == "test-cache-key-789" - assert metadata["saved_cache_cost"] == 0.02 - assert metadata["id"] == "test-request-id-456" - assert metadata["trace_id"] == "test-trace-id-123" - assert metadata["model_name"] == "gpt-4" - assert metadata["model_provider"] == "openai" - - def test_get_time_to_first_token_seconds(self, mock_env_vars): - """Test the _get_time_to_first_token_seconds method for streaming calls""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Test streaming case (completion_start_time available) - streaming_payload = create_standard_logging_payload_with_cache() - # Modify times for testing: start=1000, completion_start=1002, end=1005 - streaming_payload["startTime"] = 1000.0 - streaming_payload["completionStartTime"] = 1002.0 - streaming_payload["endTime"] = 1005.0 - - # Test streaming case: should use completion_start_time - start_time - time_to_first_token = logger._get_time_to_first_token_seconds( - streaming_payload - ) - assert time_to_first_token == 2.0 # 1002.0 - 1000.0 = 2.0 seconds - - def test_datadog_span_kind_mapping(self, mock_env_vars): - """Test that call_type values are correctly mapped to DataDog span kinds""" - from litellm.types.utils import CallTypes - - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Test embedding operations - assert ( - logger._get_datadog_span_kind(CallTypes.embedding.value, "123") - == "embedding" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.aembedding.value, "123") - == "embedding" - ) - - # Test LLM completion operations - assert logger._get_datadog_span_kind(CallTypes.completion.value, None) == "llm" - assert logger._get_datadog_span_kind(CallTypes.acompletion.value, None) == "llm" - assert ( - logger._get_datadog_span_kind(CallTypes.text_completion.value, None) - == "llm" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.generate_content.value, None) - == "llm" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.anthropic_messages.value, None) - == "llm" - ) - assert logger._get_datadog_span_kind(CallTypes.responses.value, None) == "llm" - assert logger._get_datadog_span_kind(CallTypes.aresponses.value, None) == "llm" - - # Test tool operations - assert ( - logger._get_datadog_span_kind(CallTypes.call_mcp_tool.value, "123") - == "tool" - ) - - # Test retrieval operations - assert ( - logger._get_datadog_span_kind(CallTypes.get_assistants.value, "123") - == "retrieval" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.file_retrieve.value, "123") - == "retrieval" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.retrieve_batch.value, "123") - == "retrieval" - ) - - # Test task operations - assert ( - logger._get_datadog_span_kind(CallTypes.create_batch.value, "123") == "task" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.image_generation.value, "123") - == "task" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.moderation.value, "123") == "task" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.transcription.value, "123") - == "task" - ) - - # Test default fallback - assert logger._get_datadog_span_kind("unknown_call_type", None) == "llm" - assert logger._get_datadog_span_kind(None, None) == "llm" - - def test_datadog_span_kind_defaults_without_parent(self, mock_env_vars): - """Test that non-llm kinds fallback to llm when no parent span is provided""" - from litellm.types.utils import CallTypes - - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Tool/task/retrieval span kinds should fallback to llm when parent_id missing - assert ( - logger._get_datadog_span_kind(CallTypes.call_mcp_tool.value, None) == "llm" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.create_batch.value, None) == "llm" - ) - assert ( - logger._get_datadog_span_kind(CallTypes.get_assistants.value, None) == "llm" - ) - - @pytest.mark.asyncio - async def test_async_log_failure_event(self, mock_env_vars): - """Test that async_log_failure_event correctly processes failure payloads according to DD LLM Obs API spec""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Ensure log_queue starts empty - logger.log_queue = [] - - standard_failure_payload = create_standard_logging_payload_with_failure() - - kwargs = { - "standard_logging_object": standard_failure_payload, - "model": "gpt-4", - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() + timedelta(seconds=2) - - # Mock async_send_batch to prevent actual network calls - with patch.object(logger, "async_send_batch") as mock_send_batch: - # Call the method under test - await logger.async_log_failure_event(kwargs, None, start_time, end_time) - - # Verify payload was added to queue - assert len(logger.log_queue) == 1 - - # Verify the payload has correct failure characteristics according to DD LLM Obs API spec - payload = logger.log_queue[0] - assert payload["trace_id"] == "test-trace-id-failure-456" - assert ( - payload["meta"]["metadata"]["id"] == "test-request-id-failure-789" - ) - assert payload["status"] == "error" - - # Verify error information follows DD LLM Obs API spec - assert ( - payload["meta"]["error"]["message"] - == "RateLimitError: You exceeded your current quota" - ) - assert payload["meta"]["error"]["type"] == "RateLimitError" - assert ( - payload["meta"]["error"]["stack"] - == "Traceback (most recent call last):\n File test.py, line 1\n RateLimitError: You exceeded your current quota" - ) - - assert payload["metrics"]["total_cost"] == 0.0 - assert payload["metrics"]["total_tokens"] == 0 - assert payload["metrics"]["output_tokens"] == 0 - - # Verify batch sending not triggered (queue size < batch_size) - mock_send_batch.assert_not_called() - - -class TestDataDogLLMObsLoggerForRedaction(DataDogLLMObsLogger): - """Test suite for DataDog LLM Observability Logger""" - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.logged_standard_logging_payload: Optional[StandardLoggingPayload] = None - - async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): - self.logged_standard_logging_payload = kwargs.get("standard_logging_object") - - -class TestS3Logger(CustomLogger): - """Test suite for S3 Logger""" - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.logged_standard_logging_payload: Optional[StandardLoggingPayload] = None - - async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): - self.logged_standard_logging_payload = kwargs.get("standard_logging_object") - - -@pytest.mark.asyncio -async def test_dd_llms_obs_redaction(mock_env_vars): - # init DD with turn_off_message_logging=True - litellm._turn_on_debug() - from litellm.types.utils import LiteLLMCommonStrings - - litellm.datadog_llm_observability_params = DatadogLLMObsInitParams( - turn_off_message_logging=True - ) - dd_llms_obs_logger = TestDataDogLLMObsLoggerForRedaction() - test_s3_logger = TestS3Logger() - litellm.callbacks = [dd_llms_obs_logger, test_s3_logger] - - # call litellm - await litellm.acompletion( - model="gpt-4o", - mock_response="Hi there!", - messages=[{"role": "user", "content": "Hello, world!"}], - ) - - # sleep 1 second for logging to complete - await asyncio.sleep(1) - - ################# - # test validation - # 1. both loggers logged a standard_logging_payload - # 2. DD LLM Obs standard_logging_payload has messages and response redacted - # 3. S3 standard_logging_payload does not have messages and response redacted - - assert dd_llms_obs_logger.logged_standard_logging_payload is not None - assert test_s3_logger.logged_standard_logging_payload is not None - - assert ( - dd_llms_obs_logger.logged_standard_logging_payload["messages"][0]["content"] - == "redacted-by-litellm" - ) - assert ( - dd_llms_obs_logger.logged_standard_logging_payload["response"]["choices"][0][ - "message" - ]["content"] - == "redacted-by-litellm" - ) - - assert test_s3_logger.logged_standard_logging_payload["messages"] == [ - {"role": "user", "content": "Hello, world!"} - ] - assert ( - test_s3_logger.logged_standard_logging_payload["response"]["choices"][0][ - "message" - ]["content"] - == "Hi there!" - ) - - -@pytest.fixture -def mock_env_vars(): - """Mock environment variables for DataDog""" - with patch.dict( - os.environ, {"DD_API_KEY": "test_api_key", "DD_SITE": "us5.datadoghq.com"} - ): - yield - - -@pytest.mark.asyncio -async def test_create_llm_obs_payload(mock_env_vars): - datadog_llm_obs_logger = DataDogLLMObsLogger() - standard_logging_payload = create_standard_logging_payload_with_cache() - payload = datadog_llm_obs_logger.create_llm_obs_payload( - kwargs={ - "model": "gpt-4", - "messages": [{"role": "user", "content": "Hello"}], - "standard_logging_object": standard_logging_payload, - }, - start_time=datetime.now(), - end_time=datetime.now() + timedelta(seconds=1), - ) - - assert payload["name"] == "litellm_llm_call" - assert payload["meta"]["kind"] == "llm" - assert payload["meta"]["input"]["messages"] == [ - {"role": "user", "content": "Hello, world!"} - ] - assert payload["meta"]["output"]["messages"][0]["content"] == "Hi there!" - assert payload["metrics"]["input_tokens"] == 10 - assert payload["metrics"]["output_tokens"] == 20 - assert payload["metrics"]["total_tokens"] == 30 - - -def create_standard_logging_payload_with_latency_metrics() -> StandardLoggingPayload: - """Create a StandardLoggingPayload object with latency metrics for testing""" - guardrail_info = StandardLoggingGuardrailInformation( - guardrail_name="test_guardrail", - guardrail_status="success", - start_time=1234567890.0, - end_time=1234567890.5, - duration=0.5, # 500ms - guardrail_request={"input": "test input message", "user_id": "test_user"}, - guardrail_response={ - "output": "filtered output", - "flagged": False, - "score": 0.1, - }, - ) - - hidden_params = StandardLoggingHiddenParams( - model_id="model-123", - cache_key="test-cache-key", - api_base="https://api.openai.com", - response_cost="0.05", - litellm_overhead_time_ms=150.0, # 150ms - additional_headers=None, - ) - - return StandardLoggingPayload( - id="test-request-id-latency", - call_type="completion", - response_cost=0.05, - response_cost_failure_debug_info=None, - status="success", - total_tokens=30, - prompt_tokens=10, - completion_tokens=20, - startTime=1234567890.0, - endTime=1234567892.0, - completionStartTime=1234567890.8, # 800ms after start - response_time=2.0, - model_map_information=StandardLoggingModelInformation( - model_map_key="gpt-4", model_map_value=None - ), - model="gpt-4", - model_id="model-123", - model_group="openai-gpt", - api_base="https://api.openai.com", - metadata=StandardLoggingMetadata( - user_api_key_hash="test_hash", - user_api_key_org_id=None, - user_api_key_alias="test_alias", - user_api_key_team_id="test_team", - user_api_key_user_id="test_user", - user_api_key_team_alias="test_team_alias", - spend_logs_metadata=None, - requester_ip_address="127.0.0.1", - requester_metadata=None, - ), - cache_hit=False, - cache_key=None, - saved_cache_cost=0.0, - request_tags=[], - end_user=None, - requester_ip_address="127.0.0.1", - messages=[{"role": "user", "content": "Hello, world!"}], - response={"choices": [{"message": {"content": "Hi there!"}}]}, - error_str=None, - error_information=None, - model_parameters={"stream": True}, - hidden_params=hidden_params, - guardrail_information=[guardrail_info], - trace_id="test-trace-id-latency", - custom_llm_provider="openai", - ) - - -def test_latency_metrics_in_metadata(mock_env_vars): - """Test that time to first token, litellm overhead, and guardrail overhead are included in metadata""" - with ( - patch("litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client"), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_latency_metrics() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - # Test the metadata generation directly - metadata = logger._get_dd_llm_obs_payload_metadata(standard_payload) - latency_metadata = metadata.get("latency_metrics", {}) - - # Verify time to first token is included (800ms) - assert "time_to_first_token_ms" in latency_metadata - assert ( - abs(latency_metadata["time_to_first_token_ms"] - 800.0) < 0.001 - ) # 0.8 seconds * 1000 with tolerance for floating-point precision - - # Verify litellm overhead is included (150ms) - assert "litellm_overhead_time_ms" in latency_metadata - assert latency_metadata["litellm_overhead_time_ms"] == 150.0 - - # Verify guardrail overhead is included (500ms) - assert "guardrail_overhead_time_ms" in latency_metadata - assert ( - latency_metadata["guardrail_overhead_time_ms"] == 500.0 - ) # 0.5 seconds * 1000 - - # Verify these metrics are also included in the full payload - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - payload_metadata_latency = payload["meta"]["metadata"]["latency_metrics"] - - assert abs(payload_metadata_latency["time_to_first_token_ms"] - 800.0) < 0.001 - assert payload_metadata_latency["litellm_overhead_time_ms"] == 150.0 - assert payload_metadata_latency["guardrail_overhead_time_ms"] == 500.0 - - -def test_latency_metrics_edge_cases(mock_env_vars): - """Test latency metrics with edge cases (missing fields, zero values, etc.)""" - with ( - patch("litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client"), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Test case 1: No latency metrics present - standard_payload = create_standard_logging_payload_with_cache() - metadata = logger._get_dd_llm_obs_payload_metadata(standard_payload) - - # Should not have latency fields if data is missing/zero - assert "time_to_first_token_ms" not in metadata # Will be 0, so not included - assert ( - "litellm_overhead_time_ms" not in metadata - ) # Not present in hidden_params - assert "guardrail_overhead_time_ms" not in metadata # No guardrail_information - - # Test case 2: Zero time to first token should not be included - standard_payload = create_standard_logging_payload_with_cache() - standard_payload["startTime"] = 1000.0 - standard_payload["completionStartTime"] = 1000.0 # Same time = 0 difference - metadata = logger._get_dd_llm_obs_payload_metadata(standard_payload) - assert "time_to_first_token_ms" not in metadata - - # Test case 3: Missing guardrail duration should not crash - standard_payload = create_standard_logging_payload_with_cache() - standard_payload["guardrail_information"] = [ - StandardLoggingGuardrailInformation( - guardrail_name="test", - guardrail_status="success", - # duration is missing - ) - ] - metadata = logger._get_dd_llm_obs_payload_metadata(standard_payload) - assert "guardrail_overhead_time_ms" not in metadata - - -def test_guardrail_information_in_metadata(mock_env_vars): - """Test that guardrail_information is included in metadata with input/output fields""" - with ( - patch("litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client"), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Create a standard payload with guardrail information - standard_payload = create_standard_logging_payload_with_latency_metrics() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - # Create the payload and verify guardrail_information is in metadata - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - metadata = payload["meta"]["metadata"] - - # Verify guardrail_information is present in metadata - assert "guardrail_information" in metadata - assert metadata["guardrail_information"] is not None - - # Verify the guardrail information structure - guardrail_info = metadata["guardrail_information"] - assert guardrail_info[0]["guardrail_name"] == "test_guardrail" - assert guardrail_info[0]["guardrail_status"] == "success" - assert guardrail_info[0]["duration"] == 0.5 - - # Verify input/output fields are present - assert "guardrail_request" in guardrail_info[0] - assert "guardrail_response" in guardrail_info[0] - - # Validate the input/output content - assert guardrail_info[0]["guardrail_request"]["input"] == "test input message" - assert guardrail_info[0]["guardrail_request"]["user_id"] == "test_user" - assert guardrail_info[0]["guardrail_response"]["output"] == "filtered output" - assert guardrail_info[0]["guardrail_response"]["flagged"] is False - assert guardrail_info[0]["guardrail_response"]["score"] == 0.1 - - -def create_standard_logging_payload_with_tool_calls() -> StandardLoggingPayload: - """Create a StandardLoggingPayload object with tool calls for testing""" - return { - "id": "test-request-id-tool-calls", - "trace_id": "test-trace-id-tool-calls", - "call_type": "completion", - "stream": None, - "response_cost": 0.05, - "response_cost_failure_debug_info": None, - "status": "success", - "custom_llm_provider": "openai", - "total_tokens": 50, - "prompt_tokens": 20, - "completion_tokens": 30, - "startTime": 1234567890.0, - "endTime": 1234567891.0, - "completionStartTime": 1234567890.5, - "response_time": 1.0, - "model_map_information": {"model_map_key": "gpt-4", "model_map_value": None}, - "model": "gpt-4", - "model_id": "model-123", - "model_group": "openai-gpt", - "api_base": "https://api.openai.com", - "metadata": { - "user_api_key_hash": "test_hash", - "user_api_key_org_id": None, - "user_api_key_alias": "test_alias", - "user_api_key_team_id": "test_team", - "user_api_key_user_id": "test_user", - "user_api_key_team_alias": "test_team_alias", - "user_api_key_user_email": None, - "user_api_key_end_user_id": None, - "user_api_key_request_route": None, - "spend_logs_metadata": None, - "requester_ip_address": "127.0.0.1", - "requester_metadata": None, - "requester_custom_headers": None, - "prompt_management_metadata": None, - "mcp_tool_call_metadata": None, - "vector_store_request_metadata": None, - "applied_guardrails": None, - "usage_object": None, - "cold_storage_object_key": None, - }, - "cache_hit": False, - "cache_key": None, - "saved_cache_cost": 0.0, - "request_tags": [], - "end_user": None, - "requester_ip_address": "127.0.0.1", - "messages": [ - {"role": "user", "content": "What's the weather?"}, - { - "role": "assistant", - "content": "I'll check the weather for you.", - "tool_calls": [ - { - "id": "call_123", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "NYC"}', - }, - } - ], - }, - { - "role": "tool", - "tool_call_id": "call_123", - "content": '{"temperature": 72, "condition": "sunny"}', - }, - ], - "response": { - "choices": [ - { - "message": { - "role": "assistant", - "content": "It's 72°F and sunny in NYC!", - "tool_calls": [ - { - "id": "call_456", - "type": "function", - "function": { - "name": "format_response", - "arguments": '{"temp": 72, "condition": "sunny"}', - }, - } - ], - } - } - ] - }, - "error_str": None, - "error_information": None, - "model_parameters": {"temperature": 0.7}, - "hidden_params": { - "model_id": "model-123", - "cache_key": None, - "api_base": "https://api.openai.com", - "response_cost": "0.05", - "litellm_overhead_time_ms": None, - "additional_headers": None, - "batch_models": None, - "litellm_model_name": None, - "usage_object": None, - }, - "guardrail_information": None, - "standard_built_in_tools_params": None, - } # type: ignore - - -class TestDataDogLLMObsLoggerToolCalls: - """Simple test suite for DataDog LLM Observability Logger tool call handling""" - - @pytest.fixture - def mock_env_vars(self): - """Mock environment variables for DataDog""" - with patch.dict( - os.environ, {"DD_API_KEY": "test_api_key", "DD_SITE": "us5.datadoghq.com"} - ): - yield - - def test_tool_call_span_kind_mapping(self, mock_env_vars): - """Test that tool call operations are correctly mapped to 'tool' span kind""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - # Test MCP tool call mapping - from litellm.types.utils import CallTypes - - assert ( - logger._get_datadog_span_kind(CallTypes.call_mcp_tool.value, "123") - == "tool" - ) - - def test_tool_call_payload_creation(self, mock_env_vars): - """Test that tool call payloads are created correctly""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_tool_calls() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - - # Verify basic payload structure - assert payload.get("name") == "litellm_llm_call" - assert payload.get("status") == "ok" - assert ( - payload.get("meta", {}).get("kind") == "llm" - ) # Regular completion, not tool call - - # Verify metrics - metrics = payload.get("metrics", {}) - assert metrics.get("input_tokens") == 20 - assert metrics.get("output_tokens") == 30 - assert metrics.get("total_tokens") == 50 - - def test_tool_call_messages_preserved(self, mock_env_vars): - """Test that tool call messages are preserved in the payload""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_tool_calls() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - - # Verify input messages include tool calls - meta = payload.get("meta", {}) - input_meta = meta.get("input", {}) - input_messages = input_meta.get("messages", []) - assert len(input_messages) == 3 - - # Check assistant message has tool calls - assistant_msg = input_messages[1] - assert assistant_msg.get("role") == "assistant" - assert "tool_calls" in assistant_msg - tool_calls = assistant_msg.get("tool_calls", []) - assert len(tool_calls) == 1 - tool_call = tool_calls[0] - function_info = tool_call.get("function", {}) - assert function_info.get("name") == "get_weather" - - # Check tool message - tool_msg = input_messages[2] - assert tool_msg.get("role") == "tool" - assert tool_msg.get("tool_call_id") == "call_123" - - def test_tool_call_response_handling(self, mock_env_vars): - """Test that tool calls in response are handled correctly""" - with ( - patch( - "litellm.integrations.datadog.datadog_llm_obs.get_async_httpx_client" - ), - patch("asyncio.create_task"), - ): - logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_tool_calls() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - payload = logger.create_llm_obs_payload(kwargs, start_time, end_time) - - # Verify output messages include tool calls - meta = payload.get("meta", {}) - output_meta = meta.get("output", {}) - output_messages = output_meta.get("messages", []) - assert len(output_messages) == 1 - - output_msg = output_messages[0] - assert output_msg.get("role") == "assistant" - assert "tool_calls" in output_msg - output_tool_calls = output_msg.get("tool_calls", []) - assert len(output_tool_calls) == 1 - output_function_info = output_tool_calls[0].get("function", {}) - assert output_function_info.get("name") == "format_response" - - -def create_standard_logging_payload_with_spend_metrics() -> StandardLoggingPayload: - """Create a StandardLoggingPayload object with spend metrics for testing""" - from datetime import datetime, timezone - - # Create a budget reset time 10 days from now (using "10d" format) - budget_reset_at = datetime.now(timezone.utc) + timedelta(days=10) - - return { - "id": "test-request-id-spend", - "trace_id": "test-trace-id-spend", - "call_type": "completion", - "stream": None, - "response_cost": 0.15, - "response_cost_failure_debug_info": None, - "status": "success", - "custom_llm_provider": "openai", - "total_tokens": 30, - "prompt_tokens": 10, - "completion_tokens": 20, - "startTime": 1234567890.0, - "endTime": 1234567891.0, - "completionStartTime": 1234567890.5, - "response_time": 1.0, - "model_map_information": {"model_map_key": "gpt-4", "model_map_value": None}, - "model": "gpt-4", - "model_id": "model-123", - "model_group": "openai-gpt", - "api_base": "https://api.openai.com", - "metadata": { - "user_api_key_hash": "test_hash", - "user_api_key_org_id": None, - "user_api_key_alias": "test_alias", - "user_api_key_team_id": "test_team", - "user_api_key_user_id": "test_user", - "user_api_key_team_alias": "test_team_alias", - "user_api_key_user_email": None, - "user_api_key_end_user_id": None, - "user_api_key_request_route": None, - "user_api_key_spend": 0.67, - "user_api_key_max_budget": 10.0, # $10 max budget - "user_api_key_budget_reset_at": budget_reset_at.isoformat(), # ISO format: 2025-09-26T... - "spend_logs_metadata": None, - "requester_ip_address": "127.0.0.1", - "requester_metadata": None, - "requester_custom_headers": None, - "prompt_management_metadata": None, - "mcp_tool_call_metadata": None, - "vector_store_request_metadata": None, - "applied_guardrails": None, - "usage_object": None, - "cold_storage_object_key": None, - }, - "cache_hit": False, - "cache_key": None, - "saved_cache_cost": 0.0, - "request_tags": [], - "end_user": None, - "requester_ip_address": "127.0.0.1", - "messages": [{"role": "user", "content": "Hello, world!"}], - "response": {"choices": [{"message": {"content": "Hi there!"}}]}, - "error_str": None, - "error_information": None, - "model_parameters": {"stream": False}, - "hidden_params": { - "model_id": "model-123", - "cache_key": None, - "api_base": "https://api.openai.com", - "response_cost": "0.15", - "litellm_overhead_time_ms": None, - "additional_headers": None, - "batch_models": None, - "litellm_model_name": None, - "usage_object": None, - }, - "guardrail_information": None, - "standard_built_in_tools_params": None, - } # type: ignore - - -@pytest.mark.asyncio -async def test_datadog_llm_obs_spend_metrics(mock_env_vars): - """Test that budget metrics are properly extracted and logged""" - datadog_llm_obs_logger = DataDogLLMObsLogger() - - # Create a standard logging payload with spend metrics - payload = create_standard_logging_payload_with_spend_metrics() - - # Show the budget reset time in ISO format - budget_reset_iso = payload["metadata"]["user_api_key_budget_reset_at"] - print(f"Budget reset time (ISO format): {budget_reset_iso}") - from datetime import datetime, timezone - - print(f"Current time: {datetime.now(timezone.utc).isoformat()}") - - # Test the _get_spend_metrics method - spend_metrics = datadog_llm_obs_logger._get_spend_metrics(payload) - - # Verify budget metrics are present - assert "user_api_key_max_budget" in spend_metrics - assert spend_metrics["user_api_key_max_budget"] == 10.0 - - assert "user_api_key_budget_reset_at" in spend_metrics - # The budget reset should be a datetime string in ISO format - budget_reset = spend_metrics["user_api_key_budget_reset_at"] - assert isinstance(budget_reset, str) - print(f"Budget reset datetime: {budget_reset}") - # Should be close to 10 days from now - budget_reset_dt = datetime.fromisoformat(budget_reset.replace("Z", "+00:00")) - now = datetime.now(timezone.utc) - time_diff = (budget_reset_dt - now).total_seconds() / 86400 # days - assert 9.5 <= time_diff <= 10.5 # Should be close to 10 days - - print(f"Spend metrics: {spend_metrics}") - - -@pytest.mark.asyncio -async def test_datadog_llm_obs_spend_metrics_no_budget(mock_env_vars): - """Test that spend metrics work when no budget is set""" - datadog_llm_obs_logger = DataDogLLMObsLogger() - - # Create a standard logging payload without budget metadata - payload = create_standard_logging_payload_with_spend_metrics() - - # Remove budget-related metadata to test no-budget scenario - payload["metadata"].pop("user_api_key_max_budget", None) - payload["metadata"].pop("user_api_key_budget_reset_at", None) - - # Test the _get_spend_metrics method - spend_metrics = datadog_llm_obs_logger._get_spend_metrics(payload) - - # Verify only response cost is present - assert "response_cost" in spend_metrics - assert spend_metrics["response_cost"] == 0.15 - - # Budget metrics should not be present - assert "user_api_key_max_budget" not in spend_metrics - assert "user_api_key_budget_reset_at" not in spend_metrics - - print(f"Spend metrics (no budget): {spend_metrics}") - - -@pytest.mark.asyncio -async def test_spend_metrics_in_datadog_payload(mock_env_vars): - """Test that spend metrics are correctly included in DataDog LLM Observability payloads""" - from datetime import datetime - - datadog_llm_obs_logger = DataDogLLMObsLogger() - - standard_payload = create_standard_logging_payload_with_spend_metrics() - - kwargs = { - "standard_logging_object": standard_payload, - "litellm_params": {"metadata": {}}, - } - - start_time = datetime.now() - end_time = datetime.now() - - payload = datadog_llm_obs_logger.create_llm_obs_payload( - kwargs, start_time, end_time - ) - - # Verify basic payload structure - assert payload.get("name") == "litellm_llm_call" - assert payload.get("status") == "ok" - - # Verify spend metrics are included in metadata - meta = payload.get("meta", {}) - assert meta is not None, "Meta section should exist in payload" - - metadata = meta.get("metadata", {}) - assert metadata is not None, "Metadata section should exist in meta" - - spend_metrics = metadata.get("spend_metrics", {}) - assert spend_metrics, "Spend metrics should exist in metadata" - - # Check that all metrics are present - assert "response_cost" in spend_metrics - assert "user_api_key_spend" in spend_metrics - assert "user_api_key_max_budget" in spend_metrics - assert "user_api_key_budget_reset_at" in spend_metrics - - # Verify the values are correct - assert spend_metrics["response_cost"] == 0.15 # response_cost - assert spend_metrics["user_api_key_spend"] == 0.67 # lol - assert spend_metrics["user_api_key_max_budget"] == 10.0 # max budget - - # Verify budget reset is a datetime string in ISO format - budget_reset = spend_metrics["user_api_key_budget_reset_at"] - assert isinstance(budget_reset, str) - print( - f"Budget reset in payload: {budget_reset}" - ) # In StandardLoggingUserAPIKeyMetadata - user_api_key_budget_reset_at: Optional[str] = None - - # In DDLLMObsSpendMetrics - user_api_key_budget_reset_at: str - # Should be close to 10 days from now - from datetime import datetime, timezone - - budget_reset_dt = datetime.fromisoformat(budget_reset.replace("Z", "+00:00")) - now = datetime.now(timezone.utc) - time_diff = (budget_reset_dt - now).total_seconds() / 86400 # days - assert 9.5 <= time_diff <= 10.5 # Should be close to 10 days diff --git a/tests/test_litellm/llms/pass_through/guardrail_translation/test_handler.py b/tests/test_litellm/llms/pass_through/guardrail_translation/test_handler.py deleted file mode 100644 index 1043c26c6ec..00000000000 --- a/tests/test_litellm/llms/pass_through/guardrail_translation/test_handler.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Tests for the guardrail_translation_mappings registry. - -Validates: -- allm_passthrough_route is registered in the mappings (regression: this was the bug) -""" - -from litellm.llms.pass_through.guardrail_translation import ( - guardrail_translation_mappings, -) -from litellm.llms.pass_through.guardrail_translation.handler import ( - LlmPassthroughRouteHandler, -) -from litellm.types.utils import CallTypes - - -class TestRegistry: - def test_allm_passthrough_route_registered(self): - """Regression: missing this mapping was the root cause of the bug.""" - assert CallTypes.allm_passthrough_route in guardrail_translation_mappings - - def test_allm_passthrough_route_maps_to_llm_passthrough_route_handler(self): - assert ( - guardrail_translation_mappings[CallTypes.allm_passthrough_route] - is LlmPassthroughRouteHandler - ) - - def test_pass_through_still_registered(self): - from litellm.llms.pass_through.guardrail_translation.handler import ( - PassThroughEndpointHandler, - ) - - assert ( - guardrail_translation_mappings[CallTypes.pass_through] - is PassThroughEndpointHandler - ) - diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_reasoning_content_transformation.py b/tests/test_litellm/responses/litellm_completion_transformation/test_reasoning_content_transformation.py deleted file mode 100644 index 020b5de0a2a..00000000000 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_reasoning_content_transformation.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -Test reasoning content preservation in Responses API transformation -""" - -from unittest.mock import AsyncMock - -from litellm.responses.litellm_completion_transformation.streaming_iterator import ( - LiteLLMCompletionStreamingIterator, -) -from litellm.responses.litellm_completion_transformation.transformation import ( - LiteLLMCompletionResponsesConfig, -) -from litellm.types.utils import ( - Choices, - Delta, - Message, - ModelResponse, - ModelResponseStream, - StreamingChoices, -) - - -class TestReasoningContentStreaming: - """Test reasoning content preservation during streaming""" - - def test_reasoning_content_in_delta(self): - """Test that reasoning content is preserved in streaming deltas""" - # Setup - chunk = ModelResponseStream( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion.chunk", - choices=[ - StreamingChoices( - finish_reason=None, - index=0, - delta=Delta( - content="", - role="assistant", - reasoning_content="Let me think about this problem...", - ), - ) - ], - ) - - mock_stream = AsyncMock() - - iterator = LiteLLMCompletionStreamingIterator( - model="test-model", - litellm_custom_stream_wrapper=mock_stream, - request_input="Test input", - responses_api_request={}, - ) - - # Execute - transformed_chunk = ( - iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk) - ) - - # Assert - assert transformed_chunk.delta == "Let me think about this problem..." - assert transformed_chunk.type == "response.reasoning_summary_text.delta" - - def test_mixed_content_and_reasoning(self): - """Test handling of both content and reasoning content""" - # Setup - chunk = ModelResponseStream( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion.chunk", - choices=[ - StreamingChoices( - finish_reason=None, - index=0, - delta=Delta( - content="Here is the answer", - role="assistant", - reasoning_content="First, let me analyze...", - ), - ) - ], - ) - - mock_stream = AsyncMock() - iterator = LiteLLMCompletionStreamingIterator( - model="test-model", - litellm_custom_stream_wrapper=mock_stream, - request_input="Test input", - responses_api_request={}, - ) - - # Execute - transformed_chunk = ( - iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk) - ) - - # Assert - assert transformed_chunk.delta == "First, let me analyze..." - assert transformed_chunk.type == "response.reasoning_summary_text.delta" - - def test_no_reasoning_content(self): - """Test handling when no reasoning content is present""" - # Setup - chunk = ModelResponseStream( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion.chunk", - choices=[ - StreamingChoices( - finish_reason=None, - index=0, - delta=Delta( - content="Regular content only", - role="assistant", - ), - ) - ], - ) - - mock_stream = AsyncMock() - iterator = LiteLLMCompletionStreamingIterator( - model="test-model", - litellm_custom_stream_wrapper=mock_stream, - request_input="Test input", - responses_api_request={}, - ) - - # Execute - transformed_chunk = ( - iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk) - ) - - # Assert - assert transformed_chunk.delta == "Regular content only" - assert transformed_chunk.type == "response.output_text.delta" - - -class TestReasoningContentFinalResponse: - """Test reasoning content preservation in final response transformation""" - - def test_reasoning_content_in_final_response(self): - """Test that reasoning content is included in final response""" - # Setup - response = ModelResponse( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion", - choices=[ - Choices( - finish_reason="stop", - index=0, - message=Message( - content="Here is my answer", - role="assistant", - reasoning_content="Let me think step by step about this problem...", - ), - ) - ], - ) - - # Execute - responses_api_response = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( - request_input="Test input", - responses_api_request={}, - chat_completion_response=response, - ) - - # Assert - assert hasattr(responses_api_response, "output") - assert len(responses_api_response.output) > 0 - - reasoning_items = [ - item for item in responses_api_response.output if item.type == "reasoning" - ] - assert len(reasoning_items) > 0, "No reasoning item found in output" - - reasoning_item = reasoning_items[0] - assert ( - reasoning_item.content[0].text - == "Let me think step by step about this problem..." - ) - - def test_no_reasoning_content_in_response(self): - """Test handling when no reasoning content in response""" - # Setup - response = ModelResponse( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion", - choices=[ - Choices( - finish_reason="stop", - index=0, - message=Message( - content="Simple answer", - role="assistant", - ), - ) - ], - ) - - # Execute - responses_api_response = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( - request_input="Test input", - responses_api_request={}, - chat_completion_response=response, - ) - - # Assert - reasoning_items = [ - item for item in responses_api_response.output if item.type == "reasoning" - ] - assert ( - len(reasoning_items) == 0 - ), "Should have no reasoning items when no reasoning content present" - - def test_multiple_choices_with_reasoning(self): - """Test handling multiple choices, first with reasoning content""" - # Setup - response = ModelResponse( - id="test-id", - created=1234567890, - model="test-model", - object="chat.completion", - choices=[ - Choices( - finish_reason="stop", - index=0, - message=Message( - content="First answer", - role="assistant", - reasoning_content="Reasoning for first answer", - ), - ), - Choices( - finish_reason="stop", - index=1, - message=Message( - content="Second answer", - role="assistant", - reasoning_content="Reasoning for second answer", - ), - ), - ], - ) - - # Execute - responses_api_response = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( - request_input="Test input", - responses_api_request={}, - chat_completion_response=response, - ) - - # Assert - reasoning_items = [ - item for item in responses_api_response.output if item.type == "reasoning" - ] - assert len(reasoning_items) == 1, "Should have exactly one reasoning item" - assert reasoning_items[0].content[0].text == "Reasoning for first answer" - - -def test_streaming_chunk_id_raw(): - """Test that streaming chunk IDs are raw (not encoded) to match OpenAI format""" - chunk = ModelResponseStream( - id="chunk-123", - created=1234567890, - model="test-model", - object="chat.completion.chunk", - choices=[ - StreamingChoices( - finish_reason=None, - index=0, - delta=Delta(content="Hello", role="assistant"), - ) - ], - ) - - iterator = LiteLLMCompletionStreamingIterator( - model="test-model", - litellm_custom_stream_wrapper=AsyncMock(), - request_input="Test input", - responses_api_request={}, - custom_llm_provider="openai", - litellm_metadata={"model_info": {"id": "gpt-4"}}, - ) - - result = iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk) - - # Streaming chunk IDs should be raw (like OpenAI's msg_xxx format) - assert result.item_id == "chunk-123" # Should be raw, not encoded - assert not result.item_id.startswith("resp_") # Should NOT have resp_ prefix diff --git a/tests/test_litellm/test_azure_video_router.py b/tests/test_litellm/test_azure_video_router.py deleted file mode 100644 index e7e2e0a01ea..00000000000 --- a/tests/test_litellm/test_azure_video_router.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Test suite for Azure video router functionality. -Tests that the router method gets called correctly for Azure video generation. -""" - -import pytest -from unittest.mock import Mock, patch, MagicMock -import litellm - - -class TestAzureVideoRouter: - """Test suite for Azure video router functionality""" - - def setup_method(self): - """Setup test fixtures""" - self.model = "azure/sora-2" - self.prompt = "A beautiful sunset over mountains" - self.seconds = "5" - self.size = "1280x720" - - @patch("litellm.videos.main.base_llm_http_handler") - def test_azure_video_generation_router_call_mock(self, mock_handler): - """Test that Azure video generation calls the router method with mock response""" - # Setup mock response - mock_response = { - "id": "video_123", - "model": "sora-2", - "object": "video", - "status": "processing", - "created_at": 1234567890, - "progress": 0, - } - - # Configure the mock handler - mock_handler.video_generation_handler.return_value = mock_response - - # Call the video generation function with mock response - result = litellm.video_generation( - prompt=self.prompt, - model=self.model, - seconds=self.seconds, - size=self.size, - custom_llm_provider="azure", - mock_response=mock_response, - ) - - # Verify the result is a VideoObject with the expected data - assert result.id == mock_response["id"] - assert result.model == mock_response["model"] - assert result.object == mock_response["object"] - assert result.status == mock_response["status"] - assert result.created_at == mock_response["created_at"] - assert result.progress == mock_response["progress"] From e1afe2e29cee700710faa85063a9a0f7927104f6 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 16:42:15 -0700 Subject: [PATCH 002/279] test(e2e): bound the post-/model/new servable wait at 40s _await_model_servable used poll_timeout (120s), the spend/log read-back budget. A stuck model reload therefore stalled every suite that creates a deployment for two minutes before failing Give create_model a fixed harness middle ground: model_servable_timeout=40s, polled every 2s, with each /v1/models call capped at 5s and clamped to the remaining deadline so one slow GET cannot overrun the wait. Happy path still returns on the first listing. Not derived from proxy general_settings or env Transport.get accepts an optional per-call timeout for that clamp. Unit tests cover the deadline arithmetic and clamp without a live proxy (cherry picked from commit c082a0e6488f50978bf5255f6b5298ba7e8fd8da) --- tests/e2e/proxy_client.py | 134 ++++++++++-- tests/e2e/test_proxy_client_model_servable.py | 190 ++++++++++++++++++ tests/e2e/transport.py | 13 +- 3 files changed, 313 insertions(+), 24 deletions(-) create mode 100644 tests/e2e/test_proxy_client_model_servable.py diff --git a/tests/e2e/proxy_client.py b/tests/e2e/proxy_client.py index 6c6b948e29c..87693175e62 100644 --- a/tests/e2e/proxy_client.py +++ b/tests/e2e/proxy_client.py @@ -75,12 +75,95 @@ from transport import HttpTransport, SplitTransport, Transport RowsPredicate = Callable[[list[SpendLogRow]], bool] +# After /model/new, poll the data plane until the model is listed (or fail). +# Shorter than poll_timeout (spend/log read-backs ~120s); longer than a single +# request. 40s is the harness middle ground: happy path returns on the first +# poll, a stuck reload fails in under a minute instead of two. +MODEL_SERVABLE_TIMEOUT = 40.0 +MODEL_SERVABLE_INTERVAL = 2.0 +# Cap each /v1/models poll so one slow request cannot outlast the budget. +# Clamped further to remaining deadline inside await_servable. +MODEL_SERVABLE_REQUEST_TIMEOUT = 5.0 + + +@dataclass(frozen=True, slots=True) +class Servable: + """The data plane listed the model within the deadline.""" + + +@dataclass(frozen=True, slots=True) +class NotServable: + """The deadline passed without the data plane listing the model. + + `last_result` is the final /v1/models read, so the caller can tell "the proxy + answered but omitted the model" (propagation) from "the read itself failed" + (network/auth) when reporting.""" + + last_result: Result[ModelsListResponse] | None + + +ServableOutcome = Servable | NotServable + + +def await_servable( + list_models: Callable[[float], Result[ModelsListResponse]], + *, + model_name: str, + timeout: float, + interval: float, + request_timeout: float, + now: Callable[[], float], + sleep: Callable[[float], None], +) -> ServableOutcome: + """Poll `list_models` until the data plane lists `model_name` or `timeout` elapses. + + `list_models` receives the per-poll request timeout, clamped to the remaining + deadline so a slow final poll cannot overrun the overall budget. Clock and sleep + are injected so this is exercised without wall-clock waits. Always polls at least + once when the loop starts with a positive budget.""" + deadline = now() + timeout + last_result: Result[ModelsListResponse] | None = None + while True: + remaining = deadline - now() + if remaining <= 0 and last_result is not None: + return NotServable(last_result=last_result) + poll_timeout = min(request_timeout, remaining) if remaining > 0 else request_timeout + last_result = list_models(poll_timeout) + if isinstance(last_result, Success) and any( + entry.id == model_name for entry in last_result.data.data + ): + return Servable() + if now() + interval >= deadline: + return NotServable(last_result=last_result) + sleep(interval) + + +def servable_timeout_message( + *, + model_name: str, + timeout: float, + last_result: Result[ModelsListResponse] | None, +) -> str: + last_error = ( + f"; last /v1/models poll did not succeed: {last_result}" + if last_result is not None and not isinstance(last_result, Success) + else "" + ) + return ( + f"model {model_name!r} was created but never became servable on the data " + f"plane within {timeout}s of /model/new (control/data-plane propagation or " + f"STORE_MODEL_IN_DB reload issue){last_error}" + ) + @dataclass(frozen=True, slots=True) class ProxyClient: transport: Transport poll_timeout: float = 120.0 poll_interval: float = 5.0 + model_servable_timeout: float = MODEL_SERVABLE_TIMEOUT + model_servable_interval: float = MODEL_SERVABLE_INTERVAL + model_servable_request_timeout: float = MODEL_SERVABLE_REQUEST_TIMEOUT # ---- keys / customers (satisfies lifecycle.ResourceClient) ---------- @@ -167,7 +250,12 @@ class ProxyClient: this returns can race the reload and 400 with "Invalid model name passed". We therefore poll the data-plane /v1/models until the model appears before handing back, so callers can invoke it immediately. In the monolithic case - it is already present on the first poll, so this adds one request.""" + it is already present on the first poll, so this adds one request. + + The wait is bounded by `model_servable_timeout` rather than the much longer + `poll_timeout` used for batched read-backs, so a stuck reload fails in under + a minute instead of two. Happy path still returns as soon as /v1/models lists + the model (usually the first poll).""" model_id = unwrap( self.transport.post( "/model/new", @@ -185,32 +273,34 @@ class ProxyClient: def _await_model_servable(self, model_name: str) -> None: """Block until the data plane lists `model_name`, or fail loudly if it does - not within poll_timeout (a real propagation/config problem, surfaced here - instead of as a downstream "Invalid model name passed").""" - deadline = time.monotonic() + self.poll_timeout - last_result: Result[ModelsListResponse] | None = None - while time.monotonic() < deadline: - last_result = self.transport.get( + not within model_servable_timeout (a real propagation/config problem, + surfaced here instead of as a downstream "Invalid model name passed").""" + outcome = await_servable( + lambda poll_timeout: self.transport.get( "/v1/models", headers=self.transport.master, params=NoBody(), response_type=ModelsListResponse, - ) - if isinstance(last_result, Success) and any( - entry.id == model_name for entry in last_result.data.data - ): + timeout=poll_timeout, + ), + model_name=model_name, + timeout=self.model_servable_timeout, + interval=self.model_servable_interval, + request_timeout=self.model_servable_request_timeout, + now=time.monotonic, + sleep=time.sleep, + ) + match outcome: + case Servable(): return - time.sleep(self.poll_interval) - last_error = ( - f"; last /v1/models poll did not succeed: {last_result}" - if last_result is not None and not isinstance(last_result, Success) - else "" - ) - raise AssertionError( - f"model {model_name!r} was created but never became servable on the data " - f"plane within {self.poll_timeout}s of /model/new (control/data-plane " - f"propagation or STORE_MODEL_IN_DB reload issue){last_error}" - ) + case NotServable(last_result=last_result): + raise AssertionError( + servable_timeout_message( + model_name=model_name, + timeout=self.model_servable_timeout, + last_result=last_result, + ) + ) def update_model(self, model_id: str, litellm_params: LiteLLMParamsBody) -> None: """Merge `litellm_params` over the deployment `model_id`'s stored params via diff --git a/tests/e2e/test_proxy_client_model_servable.py b/tests/e2e/test_proxy_client_model_servable.py new file mode 100644 index 00000000000..0cc63f882e2 --- /dev/null +++ b/tests/e2e/test_proxy_client_model_servable.py @@ -0,0 +1,190 @@ +"""Harness coverage for the bounded wait after /model/new (no live proxy). + +Model propagation is polled to a deadline so a stuck control/data-plane reload fails +fast instead of stalling every test that creates a model. The clock and sleep are +injected, so these assert the deadline arithmetic without waiting. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +from e2e_http import NetworkError, Result, Success +from models import ModelListEntry, ModelsListResponse +from proxy_client import ( + MODEL_SERVABLE_REQUEST_TIMEOUT, + MODEL_SERVABLE_TIMEOUT, + NotServable, + Servable, + await_servable, + servable_timeout_message, +) + + +def _listing(*model_names: str) -> Result[ModelsListResponse]: + return Success( + status_code=200, + data=ModelsListResponse(data=tuple(ModelListEntry(id=name) for name in model_names)), + ) + + +@dataclass(slots=True) +class FakeClock: + """A clock that only advances when the code under test sleeps or a slow poll runs.""" + + seconds: float = 0.0 + slept: list[float] = field(default_factory=list) # mutable-ok: records calls for assertions + + def now(self) -> float: + return self.seconds + + def sleep(self, duration: float) -> None: + self.slept.append(duration) + self.seconds += duration + + +@dataclass(slots=True) +class FakeModelList: + """Returns each queued /v1/models read in turn, repeating the last forever.""" + + responses: tuple[Result[ModelsListResponse], ...] + calls: int = 0 + timeouts: list[float] = field(default_factory=list) # mutable-ok: records call timeouts + + def __call__(self, request_timeout: float) -> Result[ModelsListResponse]: + self.timeouts.append(request_timeout) + response = self.responses[min(self.calls, len(self.responses) - 1)] + self.calls += 1 + return response + + +def test_returns_servable_on_first_listing_without_sleeping() -> None: + clock = FakeClock() + list_models = FakeModelList(responses=(_listing("my-model"),)) + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=40.0, + interval=2.0, + request_timeout=5.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert outcome == Servable() + assert list_models.calls == 1 + assert list_models.timeouts == [5.0] + assert clock.slept == [] + + +def test_polls_until_the_model_appears() -> None: + clock = FakeClock() + list_models = FakeModelList(responses=(_listing("other"), _listing("other"), _listing("other", "my-model"))) + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=40.0, + interval=2.0, + request_timeout=5.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert outcome == Servable() + assert list_models.calls == 3 + assert clock.seconds == 4.0 + + +def test_gives_up_at_the_deadline_rather_than_polling_forever() -> None: + clock = FakeClock() + list_models = FakeModelList(responses=(_listing("other"),)) + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=10.0, + interval=2.0, + request_timeout=5.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert isinstance(outcome, NotServable) + assert clock.seconds == 8.0 + assert list_models.calls == 5 + assert list_models.timeouts == [5.0, 5.0, 5.0, 4.0, 2.0] + + +def test_does_not_wait_past_the_overall_budget() -> None: + clock = FakeClock() + + outcome = await_servable( + FakeModelList(responses=(_listing("other"),)), + model_name="my-model", + timeout=MODEL_SERVABLE_TIMEOUT, + interval=2.0, + request_timeout=MODEL_SERVABLE_REQUEST_TIMEOUT, + now=clock.now, + sleep=clock.sleep, + ) + + assert isinstance(outcome, NotServable) + assert clock.seconds <= MODEL_SERVABLE_TIMEOUT + + +def test_clamps_request_timeout_to_remaining_deadline() -> None: + """A slow final poll must not receive the full request cap when less budget remains. + + Without the clamp, remaining=3 and cap=5 lets the transport block for 5s and the + overall wait overruns model_servable_timeout by up to ~cap seconds. + """ + clock = FakeClock() + timeouts: list[float] = [] + + def list_models(request_timeout: float) -> Result[ModelsListResponse]: + timeouts.append(request_timeout) + clock.seconds += request_timeout + return _listing("other") + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=10.0, + interval=2.0, + request_timeout=5.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert isinstance(outcome, NotServable) + assert timeouts[0] == 5.0 + assert any(timeout < 5.0 for timeout in timeouts) + assert timeouts[-1] == 3.0 + assert clock.seconds <= 10.0 + + +def test_reports_a_failed_read_distinctly_from_a_missing_model() -> None: + clock = FakeClock() + unreachable: Result[ModelsListResponse] = NetworkError(message="connection refused") + + outcome = await_servable( + FakeModelList(responses=(unreachable,)), + model_name="my-model", + timeout=1.0, + interval=0.5, + request_timeout=5.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert outcome == NotServable(last_result=unreachable) + message = servable_timeout_message(model_name="my-model", timeout=1.0, last_result=unreachable) + assert "connection refused" in message + + listed_without_model = _listing("other") + propagation_message = servable_timeout_message( + model_name="my-model", timeout=1.0, last_result=listed_without_model + ) + assert "did not succeed" not in propagation_message diff --git a/tests/e2e/transport.py b/tests/e2e/transport.py index a6adf83ed1f..27b11befc8e 100644 --- a/tests/e2e/transport.py +++ b/tests/e2e/transport.py @@ -58,6 +58,7 @@ class Transport(Protocol): headers: BaseModel, params: BaseModel, response_type: type[R], + timeout: float | None = None, ) -> Result[R]: ... def delete[R: BaseModel]( @@ -136,13 +137,16 @@ class HttpTransport: headers: BaseModel, params: BaseModel, response_type: type[R], + timeout: float | None = None, ) -> Result[R]: + """`timeout` overrides the transport-wide request_timeout for this call, for + pollers whose own deadline is shorter than it.""" return e2e_http.get( self._url(path), headers=headers, params=params, response_type=response_type, - timeout=self.request_timeout, + timeout=self.request_timeout if timeout is None else timeout, ) def delete[R: BaseModel]( @@ -336,9 +340,14 @@ class SplitTransport: headers: BaseModel, params: BaseModel, response_type: type[R], + timeout: float | None = None, ) -> Result[R]: return self._route(path).get( - path, headers=headers, params=params, response_type=response_type + path, + headers=headers, + params=params, + response_type=response_type, + timeout=timeout, ) def delete[R: BaseModel]( From 5aa66ea33e6c194f66d360e22292f22eddac38e7 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 17:09:20 -0700 Subject: [PATCH 003/279] fix(e2e): wait one default DB reload interval of continuous listing create_model returned after the first /v1/models hit that listed the model, so chat could still land on a cold gateway worker (numWorkers>1 / peer pod) and 400 Invalid model name. Require continuous listing for the product default add_deployment interval (30s) after first sight so every worker has synced from the DB; first listing still bounded at 40s (cherry picked from commit 7d1ee2ff861b970f6de3f6759ff015947af9d2a1) --- tests/e2e/proxy_client.py | 85 ++++++++---- tests/e2e/test_proxy_client_model_servable.py | 125 ++++++++++++------ 2 files changed, 148 insertions(+), 62 deletions(-) diff --git a/tests/e2e/proxy_client.py b/tests/e2e/proxy_client.py index 87693175e62..dfbb90ac08e 100644 --- a/tests/e2e/proxy_client.py +++ b/tests/e2e/proxy_client.py @@ -75,14 +75,17 @@ from transport import HttpTransport, SplitTransport, Transport RowsPredicate = Callable[[list[SpendLogRow]], bool] -# After /model/new, poll the data plane until the model is listed (or fail). -# Shorter than poll_timeout (spend/log read-backs ~120s); longer than a single -# request. 40s is the harness middle ground: happy path returns on the first -# poll, a stuck reload fails in under a minute instead of two. +# After /model/new, the control-plane writer reloads itself immediately, but every +# other gateway worker (and peer pod) only picks the model up on its add_deployment +# job. That job runs every proxy_config_reload_interval_seconds (product default 30). +# A single /v1/models hit can land on a hot worker while the next /chat hits a cold +# one ("Invalid model name"). Wait for first listing within MODEL_SERVABLE_TIMEOUT, +# then require continuous listing for MODEL_SERVABLE_DB_SYNC_SECONDS (the default +# reload interval) so every worker has had a chance to sync from the DB. MODEL_SERVABLE_TIMEOUT = 40.0 +MODEL_SERVABLE_DB_SYNC_SECONDS = 30.0 MODEL_SERVABLE_INTERVAL = 2.0 -# Cap each /v1/models poll so one slow request cannot outlast the budget. -# Clamped further to remaining deadline inside await_servable. +# Cap each /v1/models poll so one slow request cannot outlast the remaining budget. MODEL_SERVABLE_REQUEST_TIMEOUT = 5.0 @@ -112,29 +115,55 @@ def await_servable( timeout: float, interval: float, request_timeout: float, + db_sync_seconds: float, now: Callable[[], float], sleep: Callable[[float], None], ) -> ServableOutcome: - """Poll `list_models` until the data plane lists `model_name` or `timeout` elapses. + """Poll until `model_name` is listed long enough for every worker to DB-sync. - `list_models` receives the per-poll request timeout, clamped to the remaining - deadline so a slow final poll cannot overrun the overall budget. Clock and sleep - are injected so this is exercised without wall-clock waits. Always polls at least - once when the loop starts with a positive budget.""" - deadline = now() + timeout + First listing must happen within `timeout`. After that, the model must stay + listed continuously for `db_sync_seconds` (any miss resets the continuous + window). `db_sync_seconds=0` returns on the first listing. Each poll's request + timeout is clamped to the remaining budget. Clock and sleep are injected.""" + started = now() + first_seen_at: float | None = None last_result: Result[ModelsListResponse] | None = None while True: - remaining = deadline - now() + t = now() + if first_seen_at is None: + deadline = started + timeout + else: + deadline = first_seen_at + db_sync_seconds + remaining = deadline - t if remaining <= 0 and last_result is not None: + if first_seen_at is not None and db_sync_seconds <= 0: + return Servable() + if first_seen_at is not None and t - first_seen_at >= db_sync_seconds: + return Servable() return NotServable(last_result=last_result) poll_timeout = min(request_timeout, remaining) if remaining > 0 else request_timeout last_result = list_models(poll_timeout) - if isinstance(last_result, Success) and any( + listed = isinstance(last_result, Success) and any( entry.id == model_name for entry in last_result.data.data - ): + ) + t = now() + if not listed: + first_seen_at = None + elif first_seen_at is None: + first_seen_at = t + if db_sync_seconds <= 0: + return Servable() + elif t - first_seen_at >= db_sync_seconds: return Servable() - if now() + interval >= deadline: - return NotServable(last_result=last_result) + if first_seen_at is None: + if now() + interval >= started + timeout: + return NotServable(last_result=last_result) + elif now() + interval >= first_seen_at + db_sync_seconds: + # Final stretch: sleep only the remainder of the continuous window. + remainder = first_seen_at + db_sync_seconds - now() + if remainder > 0: + sleep(remainder) + continue sleep(interval) @@ -142,6 +171,7 @@ def servable_timeout_message( *, model_name: str, timeout: float, + db_sync_seconds: float, last_result: Result[ModelsListResponse] | None, ) -> str: last_error = ( @@ -151,7 +181,8 @@ def servable_timeout_message( ) return ( f"model {model_name!r} was created but never became servable on the data " - f"plane within {timeout}s of /model/new (control/data-plane propagation or " + f"plane within {timeout}s of first listing (plus {db_sync_seconds}s continuous " + f"DB sync) after /model/new (control/data-plane propagation or " f"STORE_MODEL_IN_DB reload issue){last_error}" ) @@ -162,6 +193,7 @@ class ProxyClient: poll_timeout: float = 120.0 poll_interval: float = 5.0 model_servable_timeout: float = MODEL_SERVABLE_TIMEOUT + model_servable_db_sync_seconds: float = MODEL_SERVABLE_DB_SYNC_SECONDS model_servable_interval: float = MODEL_SERVABLE_INTERVAL model_servable_request_timeout: float = MODEL_SERVABLE_REQUEST_TIMEOUT @@ -252,10 +284,10 @@ class ProxyClient: handing back, so callers can invoke it immediately. In the monolithic case it is already present on the first poll, so this adds one request. - The wait is bounded by `model_servable_timeout` rather than the much longer - `poll_timeout` used for batched read-backs, so a stuck reload fails in under - a minute instead of two. Happy path still returns as soon as /v1/models lists - the model (usually the first poll).""" + First listing must arrive within `model_servable_timeout` (not the longer + spend `poll_timeout`). The model must then stay listed for + `model_servable_db_sync_seconds` (product default DB reload interval) so every + gateway worker has run add_deployment before callers use the model.""" model_id = unwrap( self.transport.post( "/model/new", @@ -272,9 +304,10 @@ class ProxyClient: return model_id def _await_model_servable(self, model_name: str) -> None: - """Block until the data plane lists `model_name`, or fail loudly if it does - not within model_servable_timeout (a real propagation/config problem, - surfaced here instead of as a downstream "Invalid model name passed").""" + """Block until the data plane lists `model_name` long enough for DB sync. + + Fails if first listing misses model_servable_timeout, or if continuous listing + for model_servable_db_sync_seconds never holds (multi-worker / peer reload).""" outcome = await_servable( lambda poll_timeout: self.transport.get( "/v1/models", @@ -287,6 +320,7 @@ class ProxyClient: timeout=self.model_servable_timeout, interval=self.model_servable_interval, request_timeout=self.model_servable_request_timeout, + db_sync_seconds=self.model_servable_db_sync_seconds, now=time.monotonic, sleep=time.sleep, ) @@ -298,6 +332,7 @@ class ProxyClient: servable_timeout_message( model_name=model_name, timeout=self.model_servable_timeout, + db_sync_seconds=self.model_servable_db_sync_seconds, last_result=last_result, ) ) diff --git a/tests/e2e/test_proxy_client_model_servable.py b/tests/e2e/test_proxy_client_model_servable.py index 0cc63f882e2..c9edd148c2b 100644 --- a/tests/e2e/test_proxy_client_model_servable.py +++ b/tests/e2e/test_proxy_client_model_servable.py @@ -1,8 +1,9 @@ """Harness coverage for the bounded wait after /model/new (no live proxy). -Model propagation is polled to a deadline so a stuck control/data-plane reload fails -fast instead of stalling every test that creates a model. The clock and sleep are -injected, so these assert the deadline arithmetic without waiting. +create_model must wait for the product default DB reload interval of continuous +listing so multi-worker gateways finish add_deployment before callers use the +model. Clock and sleep are injected so these assert the deadline arithmetic +without wall-clock waits. """ from __future__ import annotations @@ -12,6 +13,7 @@ from dataclasses import dataclass, field from e2e_http import NetworkError, Result, Success from models import ModelListEntry, ModelsListResponse from proxy_client import ( + MODEL_SERVABLE_DB_SYNC_SECONDS, MODEL_SERVABLE_REQUEST_TIMEOUT, MODEL_SERVABLE_TIMEOUT, NotServable, @@ -30,8 +32,6 @@ def _listing(*model_names: str) -> Result[ModelsListResponse]: @dataclass(slots=True) class FakeClock: - """A clock that only advances when the code under test sleeps or a slow poll runs.""" - seconds: float = 0.0 slept: list[float] = field(default_factory=list) # mutable-ok: records calls for assertions @@ -45,8 +45,6 @@ class FakeClock: @dataclass(slots=True) class FakeModelList: - """Returns each queued /v1/models read in turn, repeating the last forever.""" - responses: tuple[Result[ModelsListResponse], ...] calls: int = 0 timeouts: list[float] = field(default_factory=list) # mutable-ok: records call timeouts @@ -58,7 +56,7 @@ class FakeModelList: return response -def test_returns_servable_on_first_listing_without_sleeping() -> None: +def test_returns_on_first_listing_when_db_sync_is_zero() -> None: clock = FakeClock() list_models = FakeModelList(responses=(_listing("my-model"),)) @@ -68,17 +66,64 @@ def test_returns_servable_on_first_listing_without_sleeping() -> None: timeout=40.0, interval=2.0, request_timeout=5.0, + db_sync_seconds=0.0, now=clock.now, sleep=clock.sleep, ) assert outcome == Servable() assert list_models.calls == 1 - assert list_models.timeouts == [5.0] assert clock.slept == [] -def test_polls_until_the_model_appears() -> None: +def test_requires_continuous_listing_for_default_db_sync_interval() -> None: + clock = FakeClock() + list_models = FakeModelList(responses=(_listing("my-model"),)) + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=40.0, + interval=2.0, + request_timeout=5.0, + db_sync_seconds=MODEL_SERVABLE_DB_SYNC_SECONDS, + now=clock.now, + sleep=clock.sleep, + ) + + assert outcome == Servable() + assert clock.seconds >= MODEL_SERVABLE_DB_SYNC_SECONDS + assert list_models.calls >= 2 + + +def test_resets_db_sync_window_when_a_poll_misses() -> None: + clock = FakeClock() + list_models = FakeModelList( + responses=( + _listing("my-model"), + _listing("my-model"), + _listing("other"), + _listing("my-model"), + ) + ) + + outcome = await_servable( + list_models, + model_name="my-model", + timeout=40.0, + interval=2.0, + request_timeout=5.0, + db_sync_seconds=6.0, + now=clock.now, + sleep=clock.sleep, + ) + + assert outcome == Servable() + assert list_models.calls >= 4 + assert clock.seconds >= 6.0 + + +def test_polls_until_the_model_first_appears() -> None: clock = FakeClock() list_models = FakeModelList(responses=(_listing("other"), _listing("other"), _listing("other", "my-model"))) @@ -88,6 +133,7 @@ def test_polls_until_the_model_appears() -> None: timeout=40.0, interval=2.0, request_timeout=5.0, + db_sync_seconds=0.0, now=clock.now, sleep=clock.sleep, ) @@ -97,7 +143,7 @@ def test_polls_until_the_model_appears() -> None: assert clock.seconds == 4.0 -def test_gives_up_at_the_deadline_rather_than_polling_forever() -> None: +def test_gives_up_if_first_listing_never_arrives() -> None: clock = FakeClock() list_models = FakeModelList(responses=(_listing("other"),)) @@ -107,6 +153,7 @@ def test_gives_up_at_the_deadline_rather_than_polling_forever() -> None: timeout=10.0, interval=2.0, request_timeout=5.0, + db_sync_seconds=30.0, now=clock.now, sleep=clock.sleep, ) @@ -114,32 +161,9 @@ def test_gives_up_at_the_deadline_rather_than_polling_forever() -> None: assert isinstance(outcome, NotServable) assert clock.seconds == 8.0 assert list_models.calls == 5 - assert list_models.timeouts == [5.0, 5.0, 5.0, 4.0, 2.0] - - -def test_does_not_wait_past_the_overall_budget() -> None: - clock = FakeClock() - - outcome = await_servable( - FakeModelList(responses=(_listing("other"),)), - model_name="my-model", - timeout=MODEL_SERVABLE_TIMEOUT, - interval=2.0, - request_timeout=MODEL_SERVABLE_REQUEST_TIMEOUT, - now=clock.now, - sleep=clock.sleep, - ) - - assert isinstance(outcome, NotServable) - assert clock.seconds <= MODEL_SERVABLE_TIMEOUT def test_clamps_request_timeout_to_remaining_deadline() -> None: - """A slow final poll must not receive the full request cap when less budget remains. - - Without the clamp, remaining=3 and cap=5 lets the transport block for 5s and the - overall wait overruns model_servable_timeout by up to ~cap seconds. - """ clock = FakeClock() timeouts: list[float] = [] @@ -154,6 +178,7 @@ def test_clamps_request_timeout_to_remaining_deadline() -> None: timeout=10.0, interval=2.0, request_timeout=5.0, + db_sync_seconds=30.0, now=clock.now, sleep=clock.sleep, ) @@ -161,10 +186,27 @@ def test_clamps_request_timeout_to_remaining_deadline() -> None: assert isinstance(outcome, NotServable) assert timeouts[0] == 5.0 assert any(timeout < 5.0 for timeout in timeouts) - assert timeouts[-1] == 3.0 assert clock.seconds <= 10.0 +def test_does_not_wait_past_first_listing_budget_when_missing() -> None: + clock = FakeClock() + + outcome = await_servable( + FakeModelList(responses=(_listing("other"),)), + model_name="my-model", + timeout=MODEL_SERVABLE_TIMEOUT, + interval=2.0, + request_timeout=MODEL_SERVABLE_REQUEST_TIMEOUT, + db_sync_seconds=MODEL_SERVABLE_DB_SYNC_SECONDS, + now=clock.now, + sleep=clock.sleep, + ) + + assert isinstance(outcome, NotServable) + assert clock.seconds <= MODEL_SERVABLE_TIMEOUT + + def test_reports_a_failed_read_distinctly_from_a_missing_model() -> None: clock = FakeClock() unreachable: Result[ModelsListResponse] = NetworkError(message="connection refused") @@ -175,16 +217,25 @@ def test_reports_a_failed_read_distinctly_from_a_missing_model() -> None: timeout=1.0, interval=0.5, request_timeout=5.0, + db_sync_seconds=0.0, now=clock.now, sleep=clock.sleep, ) assert outcome == NotServable(last_result=unreachable) - message = servable_timeout_message(model_name="my-model", timeout=1.0, last_result=unreachable) + message = servable_timeout_message( + model_name="my-model", + timeout=1.0, + db_sync_seconds=0.0, + last_result=unreachable, + ) assert "connection refused" in message listed_without_model = _listing("other") propagation_message = servable_timeout_message( - model_name="my-model", timeout=1.0, last_result=listed_without_model + model_name="my-model", + timeout=1.0, + db_sync_seconds=30.0, + last_result=listed_without_model, ) assert "did not succeed" not in propagation_message From 5953a66eab8212beac24d3265cd118b7f4a51176 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 17:10:04 -0700 Subject: [PATCH 004/279] test(e2e): drop proxy_client model-servable unit tests Keep the create_model DB-sync wait in the harness; the pure-function unit file is not needed for this PR (cherry picked from commit 89204651d1a4537c6f21550c5ab85448ae0923f8) --- tests/e2e/test_proxy_client_model_servable.py | 241 ------------------ 1 file changed, 241 deletions(-) delete mode 100644 tests/e2e/test_proxy_client_model_servable.py diff --git a/tests/e2e/test_proxy_client_model_servable.py b/tests/e2e/test_proxy_client_model_servable.py deleted file mode 100644 index c9edd148c2b..00000000000 --- a/tests/e2e/test_proxy_client_model_servable.py +++ /dev/null @@ -1,241 +0,0 @@ -"""Harness coverage for the bounded wait after /model/new (no live proxy). - -create_model must wait for the product default DB reload interval of continuous -listing so multi-worker gateways finish add_deployment before callers use the -model. Clock and sleep are injected so these assert the deadline arithmetic -without wall-clock waits. -""" - -from __future__ import annotations - -from dataclasses import dataclass, field - -from e2e_http import NetworkError, Result, Success -from models import ModelListEntry, ModelsListResponse -from proxy_client import ( - MODEL_SERVABLE_DB_SYNC_SECONDS, - MODEL_SERVABLE_REQUEST_TIMEOUT, - MODEL_SERVABLE_TIMEOUT, - NotServable, - Servable, - await_servable, - servable_timeout_message, -) - - -def _listing(*model_names: str) -> Result[ModelsListResponse]: - return Success( - status_code=200, - data=ModelsListResponse(data=tuple(ModelListEntry(id=name) for name in model_names)), - ) - - -@dataclass(slots=True) -class FakeClock: - seconds: float = 0.0 - slept: list[float] = field(default_factory=list) # mutable-ok: records calls for assertions - - def now(self) -> float: - return self.seconds - - def sleep(self, duration: float) -> None: - self.slept.append(duration) - self.seconds += duration - - -@dataclass(slots=True) -class FakeModelList: - responses: tuple[Result[ModelsListResponse], ...] - calls: int = 0 - timeouts: list[float] = field(default_factory=list) # mutable-ok: records call timeouts - - def __call__(self, request_timeout: float) -> Result[ModelsListResponse]: - self.timeouts.append(request_timeout) - response = self.responses[min(self.calls, len(self.responses) - 1)] - self.calls += 1 - return response - - -def test_returns_on_first_listing_when_db_sync_is_zero() -> None: - clock = FakeClock() - list_models = FakeModelList(responses=(_listing("my-model"),)) - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=40.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=0.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert outcome == Servable() - assert list_models.calls == 1 - assert clock.slept == [] - - -def test_requires_continuous_listing_for_default_db_sync_interval() -> None: - clock = FakeClock() - list_models = FakeModelList(responses=(_listing("my-model"),)) - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=40.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=MODEL_SERVABLE_DB_SYNC_SECONDS, - now=clock.now, - sleep=clock.sleep, - ) - - assert outcome == Servable() - assert clock.seconds >= MODEL_SERVABLE_DB_SYNC_SECONDS - assert list_models.calls >= 2 - - -def test_resets_db_sync_window_when_a_poll_misses() -> None: - clock = FakeClock() - list_models = FakeModelList( - responses=( - _listing("my-model"), - _listing("my-model"), - _listing("other"), - _listing("my-model"), - ) - ) - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=40.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=6.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert outcome == Servable() - assert list_models.calls >= 4 - assert clock.seconds >= 6.0 - - -def test_polls_until_the_model_first_appears() -> None: - clock = FakeClock() - list_models = FakeModelList(responses=(_listing("other"), _listing("other"), _listing("other", "my-model"))) - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=40.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=0.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert outcome == Servable() - assert list_models.calls == 3 - assert clock.seconds == 4.0 - - -def test_gives_up_if_first_listing_never_arrives() -> None: - clock = FakeClock() - list_models = FakeModelList(responses=(_listing("other"),)) - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=10.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=30.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert isinstance(outcome, NotServable) - assert clock.seconds == 8.0 - assert list_models.calls == 5 - - -def test_clamps_request_timeout_to_remaining_deadline() -> None: - clock = FakeClock() - timeouts: list[float] = [] - - def list_models(request_timeout: float) -> Result[ModelsListResponse]: - timeouts.append(request_timeout) - clock.seconds += request_timeout - return _listing("other") - - outcome = await_servable( - list_models, - model_name="my-model", - timeout=10.0, - interval=2.0, - request_timeout=5.0, - db_sync_seconds=30.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert isinstance(outcome, NotServable) - assert timeouts[0] == 5.0 - assert any(timeout < 5.0 for timeout in timeouts) - assert clock.seconds <= 10.0 - - -def test_does_not_wait_past_first_listing_budget_when_missing() -> None: - clock = FakeClock() - - outcome = await_servable( - FakeModelList(responses=(_listing("other"),)), - model_name="my-model", - timeout=MODEL_SERVABLE_TIMEOUT, - interval=2.0, - request_timeout=MODEL_SERVABLE_REQUEST_TIMEOUT, - db_sync_seconds=MODEL_SERVABLE_DB_SYNC_SECONDS, - now=clock.now, - sleep=clock.sleep, - ) - - assert isinstance(outcome, NotServable) - assert clock.seconds <= MODEL_SERVABLE_TIMEOUT - - -def test_reports_a_failed_read_distinctly_from_a_missing_model() -> None: - clock = FakeClock() - unreachable: Result[ModelsListResponse] = NetworkError(message="connection refused") - - outcome = await_servable( - FakeModelList(responses=(unreachable,)), - model_name="my-model", - timeout=1.0, - interval=0.5, - request_timeout=5.0, - db_sync_seconds=0.0, - now=clock.now, - sleep=clock.sleep, - ) - - assert outcome == NotServable(last_result=unreachable) - message = servable_timeout_message( - model_name="my-model", - timeout=1.0, - db_sync_seconds=0.0, - last_result=unreachable, - ) - assert "connection refused" in message - - listed_without_model = _listing("other") - propagation_message = servable_timeout_message( - model_name="my-model", - timeout=1.0, - db_sync_seconds=30.0, - last_result=listed_without_model, - ) - assert "did not succeed" not in propagation_message From 38d03fd341bf5b7030b2ebbc45c2555a7f1ee1e6 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 17:16:30 -0700 Subject: [PATCH 005/279] fix(e2e): never skip the final deadline-clamped model-servable poll When less than one full poll interval remained in the first-listing budget, the pre-sleep check returned NotServable without another /v1/models call. Sleep only min(interval, time left) so a model that becomes listable in the last seconds of the timeout still gets a clamped final poll (cherry picked from commit 8439195922c913d118cb146409c75cc081d23e6e) --- tests/e2e/proxy_client.py | 43 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/tests/e2e/proxy_client.py b/tests/e2e/proxy_client.py index dfbb90ac08e..36dada5770a 100644 --- a/tests/e2e/proxy_client.py +++ b/tests/e2e/proxy_client.py @@ -124,24 +124,28 @@ def await_servable( First listing must happen within `timeout`. After that, the model must stay listed continuously for `db_sync_seconds` (any miss resets the continuous window). `db_sync_seconds=0` returns on the first listing. Each poll's request - timeout is clamped to the remaining budget. Clock and sleep are injected.""" + timeout is clamped to the remaining budget. Sleeps only min(interval, time left) + so a final deadline-clamped poll is never skipped just because a full interval + does not fit. Clock and sleep are injected.""" started = now() first_seen_at: float | None = None last_result: Result[ModelsListResponse] | None = None while True: t = now() - if first_seen_at is None: - deadline = started + timeout - else: - deadline = first_seen_at + db_sync_seconds - remaining = deadline - t - if remaining <= 0 and last_result is not None: - if first_seen_at is not None and db_sync_seconds <= 0: - return Servable() - if first_seen_at is not None and t - first_seen_at >= db_sync_seconds: + phase_deadline = ( + started + timeout if first_seen_at is None else first_seen_at + db_sync_seconds + ) + remaining = phase_deadline - t + if remaining <= 0: + if ( + last_result is not None + and first_seen_at is not None + and (db_sync_seconds <= 0 or t - first_seen_at >= db_sync_seconds) + ): return Servable() return NotServable(last_result=last_result) - poll_timeout = min(request_timeout, remaining) if remaining > 0 else request_timeout + + poll_timeout = min(request_timeout, remaining) last_result = list_models(poll_timeout) listed = isinstance(last_result, Success) and any( entry.id == model_name for entry in last_result.data.data @@ -155,16 +159,13 @@ def await_servable( return Servable() elif t - first_seen_at >= db_sync_seconds: return Servable() - if first_seen_at is None: - if now() + interval >= started + timeout: - return NotServable(last_result=last_result) - elif now() + interval >= first_seen_at + db_sync_seconds: - # Final stretch: sleep only the remainder of the continuous window. - remainder = first_seen_at + db_sync_seconds - now() - if remainder > 0: - sleep(remainder) - continue - sleep(interval) + + phase_deadline = ( + started + timeout if first_seen_at is None else first_seen_at + db_sync_seconds + ) + wait = min(interval, phase_deadline - now()) + if wait > 0: + sleep(wait) def servable_timeout_message( From 87be33f9354f399100c7ededdfba31b0e831d225 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 17:35:13 -0700 Subject: [PATCH 006/279] fix(e2e): reject first listing that returns after the 40s deadline A poll may start with remaining budget and still return after started+timeout if the transport overruns its clamp. Recheck the first-listing deadline after the response so a late listing does not open the continuous DB-sync phase (cherry picked from commit 7ff2bcbf1498ee82f7dbe0b4330c1ab48927ed01) --- tests/e2e/proxy_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/e2e/proxy_client.py b/tests/e2e/proxy_client.py index 36dada5770a..b3fc8538322 100644 --- a/tests/e2e/proxy_client.py +++ b/tests/e2e/proxy_client.py @@ -154,6 +154,8 @@ def await_servable( if not listed: first_seen_at = None elif first_seen_at is None: + if t > started + timeout: + return NotServable(last_result=last_result) first_seen_at = t if db_sync_seconds <= 0: return Servable() From 82fa66908bb72748efc574a8a1a8750155a85c14 Mon Sep 17 00:00:00 2001 From: mubashir1osmani Date: Tue, 28 Jul 2026 22:15:21 -0700 Subject: [PATCH 007/279] test(e2e): poll MCP tools across multi-worker lag (#35047) * fix(mcp): resolve call_tool by registry without requiring tool map Multi-worker reloads put MCP servers in the registry from the DB but do not re-run tools/list on every process. Gating call_tool on tool_name_to_mcp_server_name_mapping made cold workers 500 with Tool not found after another worker had already listed the tool. Treat a registry match on server id/name/alias as enough; upstream rejects unknown tools * test(e2e): poll MCP register, tools/list, and tools/call across multi-worker lag Stage multi-worker gateways only load MCP servers and tool maps on the process that handled the request. Poll until the server is listed, the tool appears on tools/list, and tools/call is not a cold-worker 500 so key-access and Datadog MCP e2e stop racing the LB * Revert "fix(mcp): resolve call_tool by registry without requiring tool map" This reverts commit 8b56e51e39b876d13d1112efa4130554ddf5f173. * test(e2e): tighten MCP multi-worker lag classifier Only retry tools/call on gateway shapes Tool not found and server_not_found, not any 500 that mentions tool/server not found, so upstream failures are not retried until the poll deadline * test(e2e): drop unit file for MCP lag classifier The live await_call_tool polls already cover multi-worker lag; a separate string-match unit module is not worth keeping (cherry picked from commit c274cf321c5c35c629220a89bb497d15b56f870f) --- tests/e2e/mcp/mcp_client.py | 91 +++++++++++++++++++++- tests/e2e/mcp/test_mcp_access_group_e2e.py | 1 + tests/e2e/mcp/test_mcp_datadog_e2e.py | 28 ++++--- tests/e2e/mcp/test_mcp_key_access_e2e.py | 15 ++-- 4 files changed, 111 insertions(+), 24 deletions(-) diff --git a/tests/e2e/mcp/mcp_client.py b/tests/e2e/mcp/mcp_client.py index 6d0f6ddc760..33ec557c339 100644 --- a/tests/e2e/mcp/mcp_client.py +++ b/tests/e2e/mcp/mcp_client.py @@ -11,13 +11,14 @@ request/response bodies are co-located here because only this suite speaks MCP. from __future__ import annotations +import re import time from collections.abc import Mapping from dataclasses import dataclass from pydantic import BaseModel, ConfigDict, Field, RootModel -from e2e_http import Headers, NoBody, Result, Success, unwrap +from e2e_http import Headers, NoBody, Result, Success, UnknownApiError, unwrap from models import KeyGenerateBody, ObjectPermission from proxy_client import ProxyClient @@ -270,6 +271,60 @@ class McpClient: ) time.sleep(self.proxy.poll_interval) + def await_call_tool( + self, + key: str, + *, + server_id: str, + name: str, + arguments: McpToolArguments, + ) -> McpCallToolResponse: + """Poll tools/call until the result is not a multi-worker registry miss. + + Retries only on the gateway's own cold-worker 500 shapes (Tool + not found / server_not_found). Upstream tool errors and other 500s fail + immediately so non-idempotent calls are not repeated. + """ + deadline = time.monotonic() + self.proxy.poll_timeout + last: Result[McpCallToolResponse] | None = None + while True: + last = self.call_tool(key, server_id=server_id, name=name, arguments=arguments) + if not _is_mcp_not_synced(last, tool_name=name): + return unwrap(last) + if time.monotonic() >= deadline: + raise AssertionError( + f"tools/call for {name!r} on server {server_id} still missing on the " + f"data plane after {self.proxy.poll_timeout}s (multi-worker registry lag); " + f"last result: {last}" + ) + time.sleep(self.proxy.poll_interval) + + def await_call_tool_denied( + self, + key: str, + *, + server_id: str, + name: str, + arguments: McpToolArguments, + ) -> UnknownApiError: + """Poll tools/call until a cold-worker miss clears and the call is 403 access_denied.""" + deadline = time.monotonic() + self.proxy.poll_timeout + last: Result[McpCallToolResponse] | None = None + while True: + last = self.call_tool(key, server_id=server_id, name=name, arguments=arguments) + if isinstance(last, UnknownApiError) and last.status_code == 403: + return last + if not _is_mcp_not_synced(last, tool_name=name): + raise AssertionError( + f"ungranted key's tools/call was not 403 access_denied: {last}" + ) + if time.monotonic() >= deadline: + raise AssertionError( + f"ungranted key never got 403 for {name!r} within {self.proxy.poll_timeout}s; " + f"last result: {last}" + ) + time.sleep(self.proxy.poll_interval) + def register_mcp_content_filter(self, *, name: str, blocked_keyword: str) -> str: """Register a default-on content-filter guardrail that runs on the MCP tool-call hook (pre_mcp_call) and blocks a single keyword. The keyword is @@ -317,5 +372,39 @@ class McpClient: ) +def _is_mcp_not_synced( + result: Result[McpCallToolResponse], + *, + tool_name: str | None = None, +) -> bool: + """True only for gateway multi-worker registry misses, not upstream errors. + + Matches the proxy's own shapes: + - ValueError ``Tool not found`` wrapped as HTTP 500 (cold tool map / + unresolved server on this process) + - REST ``server_not_found`` when this worker has not loaded the MCP server row + + Does not treat arbitrary 500 bodies that merely mention "tool" and "not found" + (e.g. upstream MCP payload text) as lag, so await_call_tool does not retry + real failures or non-idempotent calls. + """ + if not isinstance(result, UnknownApiError) or result.status_code != 500: + return False + body = result.body + body_l = body.lower() + + if "server_not_found" in body_l: + return True + if re.search(r"mcp server ['\"][^'\"]+['\"] was not found", body_l): + return True + + # Gateway: "Tool search_datadog_logs not found" (optionally inside a longer message) + if tool_name is not None: + return ( + re.search(rf"\btool\s+{re.escape(tool_name)}\s+not found\b", body_l) is not None + ) + return re.search(r"\btool\s+\S+\s+not found\b", body_l) is not None + + def build_client(proxy: ProxyClient) -> McpClient: return McpClient(proxy=proxy) diff --git a/tests/e2e/mcp/test_mcp_access_group_e2e.py b/tests/e2e/mcp/test_mcp_access_group_e2e.py index 1b53d1ca0b4..f72b75fd43d 100644 --- a/tests/e2e/mcp/test_mcp_access_group_e2e.py +++ b/tests/e2e/mcp/test_mcp_access_group_e2e.py @@ -29,6 +29,7 @@ class TestMcpAccessGroupToolSelection: ) -> None: group = f"e2e-mcp-grp-{unique_marker()}" server_id = register_datadog_mcp(client, resources, mcp_access_groups=[group]) + client.await_registered(server_id) granted = client.generate_key( user_id=f"e2e-mcp-ag-granted-{unique_marker()}", diff --git a/tests/e2e/mcp/test_mcp_datadog_e2e.py b/tests/e2e/mcp/test_mcp_datadog_e2e.py index 8a539b86bff..d093e307f99 100644 --- a/tests/e2e/mcp/test_mcp_datadog_e2e.py +++ b/tests/e2e/mcp/test_mcp_datadog_e2e.py @@ -60,6 +60,7 @@ class TestDatadogMcpRoundTrip: _assert_datadog_logger_active(client.proxy) server_id = register_datadog_mcp(client, resources) + client.await_registered(server_id) marker = f"{MARKER_PREFIX}{unique_marker()}" key = client.generate_key( @@ -78,22 +79,19 @@ class TestDatadogMcpRoundTrip: ) tool_name = client.await_tool(key, server_id, SEARCH_LOGS_TOOL) - - call = unwrap( - client.call_tool( - key, - server_id=server_id, - name=tool_name, - arguments={ - "query": marker, - "from": DD_SEARCH_FROM, - "to": "now", - "max_tokens": 5000, - "telemetry": { - "intent": "e2e assert seeded litellm completion log is searchable via MCP" - }, + call = client.await_call_tool( + key, + server_id=server_id, + name=tool_name, + arguments={ + "query": marker, + "from": DD_SEARCH_FROM, + "to": "now", + "max_tokens": 5000, + "telemetry": { + "intent": "e2e assert seeded litellm completion log is searchable via MCP" }, - ) + }, ) assert call.is_error is not True, f"search_datadog_logs errored: {call}" body = call.all_text diff --git a/tests/e2e/mcp/test_mcp_key_access_e2e.py b/tests/e2e/mcp/test_mcp_key_access_e2e.py index 35c864c07d8..678424e36d1 100644 --- a/tests/e2e/mcp/test_mcp_key_access_e2e.py +++ b/tests/e2e/mcp/test_mcp_key_access_e2e.py @@ -16,7 +16,7 @@ import pytest from datadog_mcp import SEARCH_LOGS_TOOL, register_datadog_mcp from e2e_config import DD_SEARCH_FROM, unique_marker -from e2e_http import UnknownApiError, unwrap +from e2e_http import unwrap from lifecycle import ResourceManager from mcp_client import McpClient @@ -72,13 +72,12 @@ class TestMcpKeyWithoutAccessIsDenied: "max_tokens": 1000, "telemetry": {"intent": "e2e control call proving granted key can invoke Datadog MCP"}, } - permitted_call = unwrap( - client.call_tool(permitted_key, server_id=server_id, name=tool_name, arguments=search_args) + permitted_call = client.await_call_tool( + permitted_key, server_id=server_id, name=tool_name, arguments=search_args ) assert permitted_call.is_error is not True, f"granted key's tool call errored: {permitted_call}" - match client.call_tool(denied_key, server_id=server_id, name=tool_name, arguments=search_args): - 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}") + denied = client.await_call_tool_denied( + denied_key, server_id=server_id, name=tool_name, arguments=search_args + ) + assert "access_denied" in denied.body, f"403 was not an MCP access denial: {denied.body}" From bae58eb4e0aa015d5085264e8b0d9a342f163ce5 Mon Sep 17 00:00:00 2001 From: eugene-yao-zocdoc Date: Fri, 31 Jul 2026 13:03:13 -0400 Subject: [PATCH 008/279] fix(anthropic): preserve mid-turn system messages Generated with AI Co-Authored-By: Claude Code --- .../chat/guardrail_translation/handler.py | 209 ++++-- .../adapters/transformation.py | 48 +- .../responses_adapters/transformation.py | 49 +- litellm/types/guardrails.py | 47 +- litellm/types/llms/anthropic.py | 12 + .../test_anthropic_guardrail_handler.py | 699 ++++++++++++++++++ ...al_pass_through_adapters_transformation.py | 218 ++++++ .../context_management/test_compact.py | 54 ++ .../test_responses_adapters_transformation.py | 138 ++++ 9 files changed, 1380 insertions(+), 94 deletions(-) diff --git a/litellm/llms/anthropic/chat/guardrail_translation/handler.py b/litellm/llms/anthropic/chat/guardrail_translation/handler.py index a549db94224..82707e741c0 100644 --- a/litellm/llms/anthropic/chat/guardrail_translation/handler.py +++ b/litellm/llms/anthropic/chat/guardrail_translation/handler.py @@ -13,6 +13,7 @@ Pattern Overview: """ import json +from copy import deepcopy from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, cast from litellm._logging import verbose_proxy_logger @@ -24,7 +25,6 @@ from litellm.llms.base_llm.guardrail_translation.base_translation import BaseTra from litellm.llms.base_llm.guardrail_translation.utils import ( effective_skip_system_message_for_guardrail, effective_skip_tool_message_for_guardrail, - openai_messages_without_system, openai_messages_without_tool, ) from litellm.proxy.pass_through_endpoints.llm_provider_handlers.anthropic_passthrough_logging_handler import ( @@ -59,14 +59,10 @@ if TYPE_CHECKING: class AnthropicMessagesHandler(BaseTranslation): - """ - Handler for processing Anthropic messages with guardrails. + """Process Anthropic messages with guardrails. - This class provides methods to: - 1. Process input messages (pre-call hook) - 2. Process output responses (post-call hook) - - Methods can be overridden to customize behavior for different message formats. + In-sequence system entries are untrusted client input. This handler scans and preserves + them through guardrail rewrites; downstream provider handling is out of scope. """ def __init__(self): @@ -279,14 +275,26 @@ class AnthropicMessagesHandler(BaseTranslation): skip_system = effective_skip_system_message_for_guardrail(guardrail_to_apply) skip_tool = effective_skip_tool_message_for_guardrail(guardrail_to_apply) - chat_completion_compatible_request = self._translate_to_openai(data) + # Exclude only the trusted top-level prompt. In-sequence system entries are untrusted + # and must stay aligned with texts_to_check for positional masking. When the top-level + # prompt is included, the pre-existing count mismatch disables positional masking. + translation_source = { # mutable-ok: API message payload + key: value for key, value in data.items() if key != "system" + } # mutable-ok: API message payload + chat_completion_compatible_request = self._translate_to_openai(translation_source) structured_messages = cast( List[AllMessageValues], chat_completion_compatible_request.get("messages", []), ) - if skip_system: - structured_messages = openai_messages_without_system(structured_messages) + has_midturn_system_message = any( + str(message.get("role") or "").lower() == "system" for message in structured_messages + ) + hoisted_system_message: AllMessageValues | None = None + if not skip_system: + hoisted_system_message = self._hoisted_top_level_system_message(data) + if hoisted_system_message is not None: + structured_messages.insert(0, hoisted_system_message) if skip_tool: structured_messages = openai_messages_without_tool(structured_messages) @@ -346,7 +354,12 @@ class AnthropicMessagesHandler(BaseTranslation): guardrailed_structured_messages is not None and guardrailed_structured_messages is not original_structured_messages ): - self._write_back_structured_messages(data, guardrailed_structured_messages) + self._write_back_structured_messages( + data, + guardrailed_structured_messages, + hoisted_system_message=hoisted_system_message, + preserve_system_messages=has_midturn_system_message, + ) else: # Step 3: Map guardrail responses back to original message structure await self._apply_guardrail_responses_to_input( @@ -359,36 +372,120 @@ class AnthropicMessagesHandler(BaseTranslation): return data - @staticmethod - def _write_back_structured_messages(data: dict, structured_messages: list) -> None: - """Convert compressed structured_messages back to Anthropic format and write to data. + def _hoisted_top_level_system_message( + self, data: dict + ) -> AllMessageValues | None: # mutable-ok: API message payload + """Return the system message produced by translating the top-level prompt.""" + system = data.get("system") + if not system: + return None + probe = self._translate_to_openai( + { # mutable-ok: API message payload + "model": data.get("model") or "", + "messages": [], # mutable-ok: API message payload + "system": system, + } + ) + hoisted = probe.get("messages") or [] # mutable-ok: API message payload + return hoisted[0] if hoisted else None - ``anthropic_messages_pt`` merges every run of consecutive user/tool rows - into a single message, so a turn carrying only tool results and the user - turn that follows it come back fused, and the request the model sees no - longer has the boundaries the client sent. Converting a row at a time - would keep them apart but breaks tool pairing: an assistant row whose - tool results sit outside its own call reads as an orphaned tool call, - and under ``modify_params`` the sanitizer answers it with a synthetic - "tool execution skipped" result and drops the real one. Converting each - assistant row together with the tool rows that answer it, and every - other row on its own, satisfies both. - """ + @staticmethod + def _openai_system_message_to_anthropic( + message: dict[str, Any], + ) -> dict[str, Any] | None: # mutable-ok: API message payload + """Convert an OpenAI system message to the client's Anthropic-shaped entry.""" + content = message.get("content") + if isinstance(content, str): + return ( + {"role": "system", "content": content} if content else None # mutable-ok: API message payload + ) # mutable-ok: API message payload + if not isinstance(content, list): + return None + blocks: list[dict[str, Any]] = [] # mutable-ok: API message payload + for block in content: + if not isinstance(block, dict) or block.get("type") != "text": + continue + text = block.get("text") + if not isinstance(text, str) or not text: + continue + anthropic_block: dict[str, Any] = { # mutable-ok: API message payload + "type": "text", + "text": text, + } # mutable-ok: API message payload + cache_control = block.get("cache_control") + if cache_control: + anthropic_block["cache_control"] = deepcopy(cache_control) + blocks.append(anthropic_block) + return ( + {"role": "system", "content": blocks} if blocks else None # mutable-ok: API message payload + ) # mutable-ok: API message payload + + @staticmethod + def _is_hoisted_top_level_system(message: Any, hoisted_system_message: Any) -> bool: + """Match the hoisted prompt by identity, or by value after serialization.""" + if hoisted_system_message is None: + return False + if message is hoisted_system_message: + return True + return ( + isinstance(message, dict) and isinstance(hoisted_system_message, dict) and message == hoisted_system_message + ) + + @staticmethod + def _write_back_structured_messages( + data: dict, # mutable-ok: API message payload + structured_messages: list, # mutable-ok: API message payload + hoisted_system_message: Any = None, + preserve_system_messages: bool = False, + ) -> None: + """Write a guardrail's structured-message rewrite back without losing corrections.""" from litellm.litellm_core_utils.prompt_templates.factory import ( anthropic_messages_pt, group_tool_exchanges, ) + def _is_system(message: Any) -> bool: + return isinstance(message, dict) and str(message.get("role") or "").lower() == "system" + model = str(data.get("model") or "") - non_system = [m for m in structured_messages if m.get("role") != "system"] - groups = tuple([non_system[index] for index in group] for group in group_tool_exchanges(non_system)) or ( - non_system, - ) - converted = [ - message - for group in groups - for message in anthropic_messages_pt(messages=group, model=model, llm_provider="anthropic") - ] + converted: list = [] # mutable-ok: API message payload + + def _convert_run(run: list) -> None: # mutable-ok: API message payload + for group in group_tool_exchanges(run): + converted.extend( + anthropic_messages_pt( + messages=[ # mutable-ok: API message payload + run[index] for index in group + ], # mutable-ok: API message payload + model=model, + llm_provider="anthropic", + ) + ) + + run: list = [] # mutable-ok: API message payload + hoisted_dropped = False + for message in structured_messages: + if not _is_system(message): + run.append(message) + continue + _convert_run(run) + run = [] # mutable-ok: API message payload + if not hoisted_dropped and AnthropicMessagesHandler._is_hoisted_top_level_system( + message, hoisted_system_message + ): + hoisted_dropped = True + continue + if preserve_system_messages: + anthropic_system = AnthropicMessagesHandler._openai_system_message_to_anthropic(message) + if anthropic_system is not None: + converted.append(anthropic_system) + _convert_run(run) + if not any(not _is_system(message) for message in converted): + converted.extend( + anthropic_messages_pt( + messages=[], model=model, llm_provider="anthropic" + ) # mutable-ok: API message payload + ) # mutable-ok: API message payload for msg in converted: content = msg.get("content") if isinstance(content, list): @@ -397,6 +494,29 @@ class AnthropicMessagesHandler(BaseTranslation): block.pop("cache_control", None) data["messages"] = converted + @staticmethod + def _extract_midturn_system_text( + message: dict[str, Any], # mutable-ok: API message payload + msg_idx: int, + texts_to_check: list[str], # mutable-ok: API message payload + task_mappings: list[tuple[int, int | None]], # mutable-ok: API message payload + ) -> None: + content = message.get("content") + if isinstance(content, str): + if content: + texts_to_check.append(content) + task_mappings.append((msg_idx, None)) + return + if not isinstance(content, list): + return + for content_idx, content_item in enumerate(content): + if not isinstance(content_item, dict) or content_item.get("type") != "text": + continue + text_str = content_item.get("text") + if isinstance(text_str, str) and text_str: + texts_to_check.append(text_str) + task_mappings.append((msg_idx, content_idx)) + def extract_request_tool_names(self, data: dict) -> List[str]: """Extract tool names from Anthropic messages request (tools[].name).""" names: List[str] = [] @@ -415,15 +535,18 @@ class AnthropicMessagesHandler(BaseTranslation): skip_system_message: bool = False, skip_tool_message: bool = False, ) -> None: - """ - Extract text content and images from a message. - - Override this method to customize text/image extraction logic. - """ - role = str(message.get("role") or "").lower() - if skip_system_message and role == "system": + """Extract text content and images from a message.""" + role = str(message.get("role") or "") + if role == "system": + # Match the adapter's filtering so positional guardrail write-back stays aligned. + self._extract_midturn_system_text( + message=message, + msg_idx=msg_idx, + texts_to_check=texts_to_check, + task_mappings=task_mappings, + ) return - if skip_tool_message and role == "tool": + if skip_tool_message and role.lower() == "tool": return content = message.get("content", None) diff --git a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py index 86c9c1db481..707d53e9006 100644 --- a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py @@ -85,12 +85,12 @@ from litellm.llms.anthropic.experimental_pass_through.context_management import ) from litellm.types.llms.anthropic import ( ANTHROPIC_HOSTED_TOOLS, + AllAnthropicPassThroughMessageValues, AllAnthropicToolsValues, - AnthopicMessagesAssistantMessageParam, AnthropicFinishReason, AnthropicMessagesRequest, + AnthropicMessagesSystemMessageParam, AnthropicMessagesToolChoice, - AnthropicMessagesUserMessageParam, AnthropicResponseContentBlockRedactedThinking, AnthropicResponseContentBlockText, AnthropicResponseContentBlockThinking, @@ -354,12 +354,7 @@ class LiteLLMAnthropicMessagesAdapter: def translate_anthropic_messages_to_openai( self, - messages: List[ - Union[ - AnthropicMessagesUserMessageParam, - AnthopicMessagesAssistantMessageParam, - ] - ], + messages: List[AllAnthropicPassThroughMessageValues], # mutable-ok: API message payload model: Optional[str] = None, ) -> List: new_messages: List[AllMessageValues] = [] @@ -367,6 +362,11 @@ class LiteLLMAnthropicMessagesAdapter: user_message: Optional[ChatCompletionUserMessage] = None tool_message_list: List[ChatCompletionToolMessage] = [] new_user_content_list: List[Union[ChatCompletionTextObject, ChatCompletionImageObject]] = [] + if m["role"] == "system": + system_message = self._translate_midturn_system_message_to_openai(m, model) + if system_message is not None: + new_messages.append(system_message) + continue ## USER MESSAGE ## if m["role"] == "user": ## translate user message @@ -867,6 +867,29 @@ class LiteLLMAnthropicMessagesAdapter: for def_schema in schema[key].values(): LiteLLMAnthropicMessagesAdapter._add_additional_properties_false(def_schema) + def _translate_midturn_system_message_to_openai( + self, + message: AnthropicMessagesSystemMessageParam, + model: str | None, + ) -> ChatCompletionSystemMessage | None: + """Translate an in-sequence system entry without changing its role or position.""" + content = message.get("content") + if isinstance(content, str): + return ChatCompletionSystemMessage(role="system", content=content) if content else None + if not isinstance(content, list): + return None + text_parts: list[ChatCompletionTextObject] = [] # mutable-ok: API message payload + for block in content: + if not isinstance(block, dict) or block.get("type") != "text": + continue + text = block.get("text") + if not text: + continue + text_obj = ChatCompletionTextObject(type="text", text=text) + self._add_cache_control_if_applicable(block, text_obj, model) + text_parts.append(text_obj) + return ChatCompletionSystemMessage(role="system", content=text_parts) if text_parts else None + def _add_system_message_to_messages( self, new_messages: List[AllMessageValues], @@ -1068,13 +1091,8 @@ class LiteLLMAnthropicMessagesAdapter: tool_name_mapping: Dict[str, str] = {} ## CONVERT ANTHROPIC MESSAGES TO OPENAI - messages_list: List[Union[AnthropicMessagesUserMessageParam, AnthopicMessagesAssistantMessageParam]] = cast( - List[ - Union[ - AnthropicMessagesUserMessageParam, - AnthopicMessagesAssistantMessageParam, - ] - ], + messages_list = cast( + List[AllAnthropicPassThroughMessageValues], anthropic_message_request["messages"], ) new_messages = self.translate_anthropic_messages_to_openai( diff --git a/litellm/llms/anthropic/experimental_pass_through/responses_adapters/transformation.py b/litellm/llms/anthropic/experimental_pass_through/responses_adapters/transformation.py index 172e54de98e..cbe36100eb0 100644 --- a/litellm/llms/anthropic/experimental_pass_through/responses_adapters/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/responses_adapters/transformation.py @@ -6,6 +6,7 @@ path used for OpenAI and Azure models. """ import json +from collections.abc import Iterable from typing import Any, Dict, List, Optional, Union, cast from litellm.litellm_core_utils.reasoning_effort_utils import ( @@ -15,15 +16,15 @@ from litellm.llms.anthropic.experimental_pass_through.utils import ( is_reasoning_auto_summary_enabled, ) from litellm.types.llms.anthropic import ( + AllAnthropicPassThroughMessageValues, AllAnthropicToolsValues, - AnthopicMessagesAssistantMessageParam, AnthropicFinishReason, AnthropicMessagesRequest, AnthropicMessagesToolChoice, - AnthropicMessagesUserMessageParam, AnthropicResponseContentBlockText, AnthropicResponseContentBlockThinking, AnthropicResponseContentBlockToolUse, + AnthropicSystemMessageContent, ) from litellm.types.llms.anthropic_messages.anthropic_response import ( AnthropicMessagesResponse, @@ -54,19 +55,32 @@ class LiteLLMAnthropicToResponsesAPIAdapter: return source.get("url") return None + @staticmethod + def _translate_midturn_system_content_to_responses( + content: Union[str, Iterable[AnthropicSystemMessageContent]], + ) -> list[dict[str, str]]: # mutable-ok: API message payload + """Convert in-sequence system content to Responses input-text parts.""" + if isinstance(content, str): + return ( + [{"type": "input_text", "text": content}] if content else [] # mutable-ok: API message payload + ) # mutable-ok: API message payload + if not isinstance(content, list): + return [] # mutable-ok: API message payload + return [ # mutable-ok: API message payload + {"type": "input_text", "text": text} # mutable-ok: API message payload + for block in content + if isinstance(block, dict) and block.get("type") == "text" and (text := block.get("text")) + ] + def translate_messages_to_responses_input( self, - messages: List[ - Union[ - AnthropicMessagesUserMessageParam, - AnthopicMessagesAssistantMessageParam, - ] - ], + messages: List[AllAnthropicPassThroughMessageValues], # mutable-ok: API message payload ) -> List[Dict[str, Any]]: """ Convert Anthropic messages list to Responses API `input` items. Mapping: + system text -> message(role=system, input_text) user text -> message(role=user, input_text) user image -> message(role=user, input_image) user tool_result -> function_call_output @@ -76,6 +90,18 @@ class LiteLLMAnthropicToResponsesAPIAdapter: input_items: List[Dict[str, Any]] = [] for m in messages: + if m["role"] == "system": + system_parts = self._translate_midturn_system_content_to_responses(m.get("content")) + if system_parts: + input_items.append( + { # mutable-ok: API message payload + "type": "message", + "role": "system", + "content": system_parts, + } + ) + continue + role = m["role"] content = m.get("content") @@ -287,12 +313,7 @@ class LiteLLMAnthropicToResponsesAPIAdapter: """ model: str = anthropic_request["model"] messages_list = cast( - List[ - Union[ - AnthropicMessagesUserMessageParam, - AnthopicMessagesAssistantMessageParam, - ] - ], + List[AllAnthropicPassThroughMessageValues], anthropic_request["messages"], ) diff --git a/litellm/types/guardrails.py b/litellm/types/guardrails.py index af419d8cb6f..2e0da24ccda 100644 --- a/litellm/types/guardrails.py +++ b/litellm/types/guardrails.py @@ -11,12 +11,24 @@ from litellm.types.proxy.guardrails.guardrail_hooks.akto import ( from litellm.types.proxy.guardrails.guardrail_hooks.block_code_execution import ( BlockCodeExecutionGuardrailConfigModel, ) +from litellm.types.proxy.guardrails.guardrail_hooks.cisco_ai_defense import ( + CiscoAIDefenseGuardrailConfigModel, +) +from litellm.types.proxy.guardrails.guardrail_hooks.compresr import ( + CompresrGuardrailConfigModel, +) from litellm.types.proxy.guardrails.guardrail_hooks.enkryptai import ( EnkryptAIGuardrailConfigs, ) from litellm.types.proxy.guardrails.guardrail_hooks.grayswan import ( GraySwanGuardrailConfigModel, ) +from litellm.types.proxy.guardrails.guardrail_hooks.headroom import ( + HeadroomGuardrailConfigModel, +) +from litellm.types.proxy.guardrails.guardrail_hooks.hiddenlayer import ( + HiddenlayerGuardrailConfigModel, +) from litellm.types.proxy.guardrails.guardrail_hooks.ibm import ( IBMGuardrailsBaseConfigModel, ) @@ -29,38 +41,26 @@ from litellm.types.proxy.guardrails.guardrail_hooks.ovalix import ( from litellm.types.proxy.guardrails.guardrail_hooks.promptguard import ( PromptGuardConfigModel, ) -from litellm.types.proxy.guardrails.guardrail_hooks.xecguard import ( - XecGuardConfigModel, +from litellm.types.proxy.guardrails.guardrail_hooks.qohash import ( + QostodianNexusConfigModel, ) from litellm.types.proxy.guardrails.guardrail_hooks.qualifire import ( QualifireGuardrailConfigModel, ) -from litellm.types.proxy.guardrails.guardrail_hooks.tool_permission import ( - ToolPermissionGuardrailConfigModel, -) -from litellm.types.proxy.guardrails.guardrail_hooks.hiddenlayer import ( - HiddenlayerGuardrailConfigModel, -) -from litellm.types.proxy.guardrails.guardrail_hooks.qohash import ( - QostodianNexusConfigModel, -) from litellm.types.proxy.guardrails.guardrail_hooks.repelloai import ( RepelloAIGuardrailConfigModel, ) -from litellm.types.proxy.guardrails.guardrail_hooks.vigil_guard import ( - VigilGuardGuardrailConfigModel, -) -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, +from litellm.types.proxy.guardrails.guardrail_hooks.tool_permission import ( + ToolPermissionGuardrailConfigModel, ) -from litellm.types.proxy.guardrails.guardrail_hooks.compresr import ( - CompresrGuardrailConfigModel, +from litellm.types.proxy.guardrails.guardrail_hooks.vigil_guard import ( + VigilGuardGuardrailConfigModel, +) +from litellm.types.proxy.guardrails.guardrail_hooks.xecguard import ( + XecGuardConfigModel, ) """ @@ -743,7 +743,10 @@ class BaseLitellmParams(ContentFilterConfigModel): # works for new and patch up "When True, unified guardrails skip system-role messages when building " "evaluation inputs (texts and structured_messages). When False, system " "messages are included even if litellm_settings sets a global skip. When " - "None, use the global litellm.skip_system_message_in_guardrail setting." + "None, use the global litellm.skip_system_message_in_guardrail setting. " + "For Anthropic /v1/messages, the flag applies only to the trusted top-level " + "system prompt. In-sequence system entries are untrusted client input and remain " + "in texts and structured_messages." ), ) diff --git a/litellm/types/llms/anthropic.py b/litellm/types/llms/anthropic.py index c24d072217a..29faf500b3d 100644 --- a/litellm/types/llms/anthropic.py +++ b/litellm/types/llms/anthropic.py @@ -365,8 +365,20 @@ class AnthropicSystemMessageContent(TypedDict, total=False): cache_control: Optional[Union[dict, ChatCompletionCachedContent]] +class AnthropicMessagesSystemMessageParam(TypedDict, total=False): + role: Required[Literal["system"]] + content: Required[Union[str, Iterable[AnthropicSystemMessageContent]]] + + AllAnthropicMessageValues = Union[AnthropicMessagesUserMessageParam, AnthopicMessagesAssistantMessageParam] +# System is not a native Anthropic message role; only pass-through adapters use this union. +AllAnthropicPassThroughMessageValues = Union[ + AnthropicMessagesUserMessageParam, + AnthopicMessagesAssistantMessageParam, + AnthropicMessagesSystemMessageParam, +] + class AnthropicMessagesRequestOptionalParams(TypedDict, total=False): max_tokens: Optional[int] diff --git a/tests/test_litellm/llms/anthropic/chat/guardrail_translation/test_anthropic_guardrail_handler.py b/tests/test_litellm/llms/anthropic/chat/guardrail_translation/test_anthropic_guardrail_handler.py index 48acdd348e9..7757b0fa5a4 100644 --- a/tests/test_litellm/llms/anthropic/chat/guardrail_translation/test_anthropic_guardrail_handler.py +++ b/tests/test_litellm/llms/anthropic/chat/guardrail_translation/test_anthropic_guardrail_handler.py @@ -75,6 +75,51 @@ class MockRecordingGuardrail(CustomGuardrail): return inputs +class MockMaskingGuardrail(CustomGuardrail): + """Capture request inputs and mask one known prohibited value.""" + + def __init__(self, skip_system_message_in_guardrail: Optional[bool] = True): + super().__init__(guardrail_name="masking-test") + self.skip_system_message_in_guardrail = skip_system_message_in_guardrail + self.inputs: Optional[GenericGuardrailAPIInputs] = None + + async def apply_guardrail( + self, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: Literal["request", "response"], + logging_obj: Optional[Any] = None, + ) -> GenericGuardrailAPIInputs: + self.inputs = inputs.copy() + masked_inputs = inputs.copy() + masked_inputs["texts"] = [ + "[MASKED]" if text == "prohibited correction" else text for text in inputs.get("texts", []) + ] + return masked_inputs + + +class MockCompactingGuardrail(CustomGuardrail): + """Stand in for a compaction guardrail that rewrites `structured_messages` wholesale.""" + + def __init__(self, replacement_messages: list): + super().__init__(guardrail_name="compacting-test") + self.replacement_messages = replacement_messages + self.inputs: Optional[GenericGuardrailAPIInputs] = None + + async def apply_guardrail( + self, + inputs: GenericGuardrailAPIInputs, + request_data: dict, + input_type: Literal["request", "response"], + logging_obj: Optional[Any] = None, + ) -> GenericGuardrailAPIInputs: + self.inputs = inputs.copy() + rewritten = inputs.copy() + # A new list object -- this is what signals a rewrite to the handler. + rewritten["structured_messages"] = list(self.replacement_messages) + return rewritten + + class TestAnthropicMessagesHandlerStreamingRequestData: """Post-call guardrails on streaming /v1/messages receive the response and identity metadata""" @@ -210,6 +255,660 @@ class TestAnthropicMessagesHandlerInputProcessing: assert data.get("litellm_metadata", {}).get("guardrails") assert guardrail.dynamic_params == {"policy_id": "policy-123"} + @pytest.mark.asyncio + async def test_midturn_system_correction_is_guardrailed_when_top_level_system_is_skipped( + self, + ): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "safe text"}, + { + "role": "system", + "content": [ + {"type": "unsupported", "text": "discarded text"}, + {"type": "text", "text": "prohibited correction"}, + ], + }, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + assert guardrail.inputs["texts"] == ["safe text", "prohibited correction"] + assert "trusted top-level system prompt" not in guardrail.inputs["texts"] + assert data["messages"][1]["content"][0]["text"] == "discarded text" + assert data["messages"][1]["content"][1]["text"] == "[MASKED]" + + @pytest.mark.asyncio + async def test_string_midturn_system_correction_is_guardrailed(self): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [{"role": "system", "content": "prohibited correction"}], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + assert guardrail.inputs["texts"] == ["prohibited correction"] + assert data["messages"][0]["content"] == "[MASKED]" + + @pytest.mark.asyncio + async def test_unsupported_midturn_system_content_is_not_guardrailed(self): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + { + "role": "system", + "content": [{"type": "image", "source": {"type": "url"}}], + } + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is None + + @pytest.mark.asyncio + async def test_skip_system_message_excludes_only_hoisted_top_level_system(self): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "safe text"}, + {"role": "system", "content": "prohibited correction"}, + {"role": "user", "content": "continue"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + structured = guardrail.inputs["structured_messages"] + assert [m["role"] for m in structured] == ["user", "system", "user"] + assert structured[1]["content"] == "prohibited correction" + + @pytest.mark.asyncio + async def test_default_skip_false_scans_midturn_system_and_hoists_top_level_system( + self, + ): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail(skip_system_message_in_guardrail=None) + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "safe text"}, + {"role": "system", "content": "prohibited correction"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + assert guardrail.inputs["texts"] == ["safe text", "prohibited correction"] + structured = guardrail.inputs["structured_messages"] + assert [m["role"] for m in structured] == ["system", "user", "system"] + assert structured[0]["content"] == "trusted top-level system prompt" + assert data["messages"][1]["content"] == "[MASKED]" + + @pytest.mark.asyncio + async def test_bedrock_masking_slice_is_unavailable_when_top_level_system_is_included( + self, + ): + from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( + BedrockGuardrail, + ) + + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail(skip_system_message_in_guardrail=None) + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "safe text"}, + {"role": "system", "content": "prohibited correction"}, + {"role": "user", "content": "latest question"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + texts = guardrail.inputs["texts"] + structured = guardrail.inputs["structured_messages"] + + bedrock = BedrockGuardrail(guardrailIdentifier="gi", guardrailVersion="1") + assert sum(bedrock._count_message_texts(m) for m in structured) == len(texts) + 1 + latest_user_index = bedrock._find_latest_message_index(structured, target_role="user") + assert ( + bedrock._locate_message_texts_slice( + structured_messages=structured, + target_index=latest_user_index, + texts=texts, + ) + is None + ) + assert ( + bedrock._merge_masked_texts( + masked_texts=["{MASKED}"], + texts=texts, + scanned_slice=None, + scanned_role_subset=True, + ) + == texts + ) + + @pytest.mark.asyncio + @pytest.mark.parametrize("skip_system_message_in_guardrail", [True, None]) + async def test_midturn_system_text_extraction_matches_translation_in_both_skip_modes( + self, + skip_system_message_in_guardrail: Optional[bool], + ): + from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( + BedrockGuardrail, + ) + + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail(skip_system_message_in_guardrail=skip_system_message_in_guardrail) + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "safe text"}, + { + "role": "system", + "content": [ + {"type": "text", "text": ""}, + {"type": "image", "source": {"type": "url", "url": "https://example.com/a.png"}}, + {"type": "text", "text": "prohibited correction"}, + ], + }, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + texts = guardrail.inputs["texts"] + structured = guardrail.inputs["structured_messages"] + assert texts == ["safe text", "prohibited correction"] + bedrock = BedrockGuardrail(guardrailIdentifier="gi", guardrailVersion="1") + assert sum(bedrock._count_message_texts(m) for m in structured) == len(texts) + assert data["messages"][1]["content"][2]["text"] == "[MASKED]" + + @pytest.mark.asyncio + async def test_bedrock_masking_slice_stays_aligned_with_midturn_system(self): + from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( + BedrockGuardrail, + ) + + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "safe text"}, + { + "role": "system", + "content": [ + {"type": "text", "text": "prohibited correction"}, + {"type": "text", "text": "second correction"}, + ], + }, + {"role": "user", "content": "latest question"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + texts = guardrail.inputs["texts"] + structured = guardrail.inputs["structured_messages"] + + bedrock = BedrockGuardrail(guardrailIdentifier="gi", guardrailVersion="1") + total = sum(bedrock._count_message_texts(m) for m in structured) + assert total == len(texts) + + latest_user_index = bedrock._find_latest_message_index(structured, target_role="user") + assert latest_user_index == 2 + scanned_slice = bedrock._locate_message_texts_slice( + structured_messages=structured, + target_index=latest_user_index, + texts=texts, + ) + assert scanned_slice == (3, 1) + + merged = bedrock._merge_masked_texts( + masked_texts=["{MASKED}"], + texts=texts, + scanned_slice=scanned_slice, + scanned_role_subset=True, + ) + assert merged == [ + "safe text", + "prohibited correction", + "second correction", + "{MASKED}", + ] + + @pytest.mark.asyncio + async def test_compaction_rewrite_keeps_midturn_system_messages(self): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "user", "content": "compacted history"}, + { + "role": "system", + "content": [{"type": "text", "text": "use the corrected result"}], + }, + {"role": "user", "content": "continue"}, + ] + ) + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "continue"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["user", "system", "user"] + assert data["messages"][1]["content"] == [{"type": "text", "text": "use the corrected result"}] + assert data["messages"][0]["content"] == [{"type": "text", "text": "compacted history"}] + assert data["messages"][2]["content"] == [{"type": "text", "text": "continue"}] + assert data["system"] == "trusted top-level system prompt" + + @pytest.mark.asyncio + async def test_compaction_rewrite_does_not_duplicate_hoisted_top_level_system(self): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "system", "content": "trusted top-level system prompt"}, + {"role": "user", "content": "compacted history"}, + {"role": "system", "content": "use the corrected result"}, + ] + ) + guardrail.skip_system_message_in_guardrail = None + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["user", "system"] + assert data["messages"][1]["content"] == "use the corrected result" + assert data["system"] == "trusted top-level system prompt" + + @pytest.mark.asyncio + async def test_compaction_rewrite_keeps_leading_midturn_system_when_system_is_skipped( + self, + ): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "compacted history"}, + ] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "trusted top-level system prompt", + "messages": [ + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "original history"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["system", "user"] + assert data["messages"][0]["content"] == "use the corrected result" + + @pytest.mark.asyncio + async def test_compaction_rewrite_keeps_leading_correction_when_top_level_system_hoists_nothing( + self, + ): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "compacted history"}, + ] + ) + guardrail.skip_system_message_in_guardrail = None + data = { + "model": "claude-3-5-sonnet-20241022", + "system": [{"type": "image", "source": {"type": "url", "url": "https://example.com/a.png"}}], + "messages": [ + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "original history"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["system", "user"] + assert data["messages"][0]["content"] == "use the corrected result" + + @pytest.mark.asyncio + async def test_compaction_rewrite_keeps_leading_correction_when_hoisted_prompt_is_dropped( + self, + ): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "system", "content": "CLIENT CORRECTION"}, + {"role": "user", "content": "compacted history"}, + ] + ) + guardrail.skip_system_message_in_guardrail = None + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "TRUSTED", + "messages": [ + {"role": "system", "content": "CLIENT CORRECTION"}, + {"role": "user", "content": "original history"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + assert guardrail.inputs["structured_messages"][0] == { + "role": "system", + "content": "TRUSTED", + } + assert [m["role"] for m in data["messages"]] == ["system", "user"] + assert data["messages"][0]["content"] == "CLIENT CORRECTION" + assert data["system"] == "TRUSTED" + + @pytest.mark.asyncio + async def test_compaction_rewrite_drops_hoisted_prompt_matched_by_content_copy(self): + import json + + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + json.loads(json.dumps({"role": "system", "content": "TRUSTED"})), + {"role": "user", "content": "compacted history"}, + {"role": "system", "content": "CLIENT CORRECTION"}, + ] + ) + guardrail.skip_system_message_in_guardrail = None + data = { + "model": "claude-3-5-sonnet-20241022", + "system": "TRUSTED", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "CLIENT CORRECTION"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["user", "system"] + assert data["messages"][1]["content"] == "CLIENT CORRECTION" + assert data["system"] == "TRUSTED" + + @pytest.mark.asyncio + async def test_compaction_rewrite_preserves_cache_control_on_system_blocks(self): + """ + `cache_control` on an in-sequence system text block survives the write-back, and is + copied rather than aliased into the guardrail's own returned list. + """ + handler = AnthropicMessagesHandler() + source_cache_control = {"type": "ephemeral"} + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "user", "content": "compacted history"}, + { + "role": "system", + "content": [ + { + "type": "text", + "text": "use the corrected result", + "cache_control": source_cache_control, + } + ], + }, + ] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert data["messages"][1]["content"] == [ + { + "type": "text", + "text": "use the corrected result", + "cache_control": {"type": "ephemeral"}, + } + ] + assert data["messages"][1]["content"][0]["cache_control"] is not source_cache_control + + @pytest.mark.asyncio + async def test_compaction_rewrite_rstrips_trailing_assistant_in_each_run(self): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "user", "content": "compacted history"}, + {"role": "assistant", "content": "earlier "}, + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "continue"}, + {"role": "assistant", "content": "prefill "}, + ] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == [ + "user", + "assistant", + "system", + "user", + "assistant", + ] + assert data["messages"][1]["content"] == [{"type": "text", "text": "earlier"}] + assert data["messages"][-1]["content"] == [{"type": "text", "text": "prefill"}] + + @pytest.mark.asyncio + async def test_compaction_rewrite_drops_text_free_system_message(self): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[ + {"role": "user", "content": "compacted history"}, + {"role": "system", "content": [{"type": "text", "text": ""}]}, + {"role": "system", "content": ""}, + {"role": "user", "content": "continue"}, + ] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "continue"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["user", "user"] + assert data["messages"][0]["content"] == [{"type": "text", "text": "compacted history"}] + assert data["messages"][1]["content"] == [{"type": "text", "text": "continue"}] + + @pytest.mark.asyncio + async def test_noncanonical_system_role_casing_is_still_scanned(self): + handler = AnthropicMessagesHandler() + guardrail = MockMaskingGuardrail() + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "safe text"}, + {"role": "System", "content": "prohibited correction"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert guardrail.inputs is not None + assert "prohibited correction" in guardrail.inputs["texts"] + assert data["messages"][1]["content"] == "[MASKED]" + + @pytest.mark.asyncio + async def test_tool_result_turns_have_a_preexisting_alignment_gap(self): + from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( + BedrockGuardrail, + ) + + handler = AnthropicMessagesHandler() + bedrock = BedrockGuardrail(guardrailIdentifier="gi", guardrailVersion="1") + tool_loop = [ + {"role": "user", "content": "call the tool"}, + { + "role": "assistant", + "content": [{"type": "tool_use", "id": "tu_1", "name": "get", "input": {"a": 1}}], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "tu_1", + "content": [{"type": "text", "text": "tool output"}], + } + ], + }, + ] + + async def _slice_for(messages: list): + guardrail = MockMaskingGuardrail() + data = {"model": "claude-3-5-sonnet-20241022", "messages": messages} + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + assert guardrail.inputs is not None + texts = guardrail.inputs["texts"] + structured = guardrail.inputs["structured_messages"] + target_index = bedrock._find_latest_message_index(structured, target_role="user") + return ( + sum(bedrock._count_message_texts(m) for m in structured) - len(texts), + bedrock._locate_message_texts_slice( + structured_messages=structured, + target_index=target_index, + texts=texts, + ), + ) + + with_system = await _slice_for( + tool_loop + + [ + {"role": "system", "content": "use the corrected result"}, + {"role": "user", "content": "latest question"}, + ] + ) + without_system = await _slice_for(tool_loop + [{"role": "user", "content": "latest question"}]) + + assert with_system == without_system == (1, None) + + @pytest.mark.asyncio + async def test_compaction_rewrite_to_only_system_messages_is_rejected(self): + import litellm + + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[{"role": "system", "content": "use the corrected result"}] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + ], + } + + with patch.object(litellm, "modify_params", False): + with pytest.raises(litellm.BadRequestError, match="at least one non-system message"): + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + @pytest.mark.asyncio + async def test_compaction_rewrite_to_only_system_messages_repaired_with_modify_params( + self, + ): + import litellm + + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail( + replacement_messages=[{"role": "system", "content": "use the corrected result"}] + ) + guardrail.skip_system_message_in_guardrail = True + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "original history"}, + {"role": "system", "content": "use the corrected result"}, + ], + } + + with patch.object(litellm, "modify_params", True): + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert [m["role"] for m in data["messages"]] == ["system", "user"] + assert data["messages"][0]["content"] == "use the corrected result" + + @pytest.mark.asyncio + async def test_compaction_rewrite_without_system_messages_is_unchanged(self): + handler = AnthropicMessagesHandler() + guardrail = MockCompactingGuardrail(replacement_messages=[{"role": "user", "content": "compacted history"}]) + data = { + "model": "claude-3-5-sonnet-20241022", + "messages": [ + {"role": "user", "content": "a"}, + {"role": "assistant", "content": "b"}, + {"role": "user", "content": "c"}, + ], + } + + await handler.process_input_messages(data=data, guardrail_to_apply=guardrail) + + assert data["messages"] == [{"role": "user", "content": [{"type": "text", "text": "compacted history"}]}] + @pytest.mark.asyncio async def test_process_output_streaming_response_empty_choices(self): """Test that streaming response with empty choices doesn't raise IndexError diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py index c0c6e315b5b..b72620f9918 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py @@ -413,6 +413,224 @@ def test_translate_anthropic_messages_to_openai_tool_message_placement(): ), "Tool message should be placed before user message" +@pytest.mark.parametrize( + ("system_content", "expected_content"), + [ + ("Use the corrected result.", "Use the corrected result."), + ( + [{"type": "text", "text": "Use the corrected result."}], + [{"type": "text", "text": "Use the corrected result."}], + ), + ( + [ + { + "type": "image", + "source": {"type": "url", "url": "https://example.com/a.png"}, + }, + {"type": "text", "text": "Use the corrected result."}, + ], + [{"type": "text", "text": "Use the corrected result."}], + ), + ( + [ + {"type": "text", "text": "First correction."}, + {"type": "text", "text": "Second correction."}, + ], + [ + {"type": "text", "text": "First correction."}, + {"type": "text", "text": "Second correction."}, + ], + ), + ], +) +def test_translate_anthropic_messages_to_openai_preserves_midturn_system_correction( + system_content: object, + expected_content: object, +): + messages = [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_01234", + "name": "get_weather", + "input": {"location": "Boston"}, + } + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_01234", + "content": "Rainy, 55°F", + } + ], + }, + {"role": "system", "content": system_content}, + {"role": "user", "content": "Continue."}, + ] + + result = LiteLLMAnthropicMessagesAdapter().translate_anthropic_messages_to_openai( + messages=messages, + model="claude-3-5-sonnet-20240620", + ) + + assert result == [ + { + "role": "assistant", + "content": None, + "thinking_blocks": None, + "tool_calls": [ + { + "id": "toolu_01234", + "type": "function", + "function": { + "name": "get_weather", + "arguments": '{"location": "Boston"}', + }, + } + ], + }, + { + "role": "tool", + "tool_call_id": "toolu_01234", + "content": "Rainy, 55°F", + }, + {"role": "system", "content": expected_content}, + {"role": "user", "content": "Continue."}, + ] + + +def test_translate_anthropic_messages_to_openai_preserves_midturn_system_cache_control(): + """ + `cache_control` on an in-sequence system text block survives, matching how the + hoisted top-level `system` prompt and user text blocks are already handled. + """ + messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "Use the corrected result.", + "cache_control": {"type": "ephemeral"}, + } + ], + } + ] + + result = LiteLLMAnthropicMessagesAdapter().translate_anthropic_messages_to_openai( + messages=messages, + model="claude-3-5-sonnet-20240620", + ) + + assert result == [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "Use the corrected result.", + "cache_control": {"type": "ephemeral"}, + } + ], + } + ] + + +def test_translate_anthropic_messages_to_openai_drops_midturn_system_cache_control_for_non_claude(): + """ + `cache_control` goes through the same `_add_cache_control_if_applicable` gate as the + hoisted top-level prompt and user text blocks, so a non-Claude *requested model name* + does not get it. That gate is a best-effort check of the requested name before routing + (behind the proxy it is often a public alias), not a guarantee about the backend that + ultimately serves the request. + """ + messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "Use the corrected result.", + "cache_control": {"type": "ephemeral"}, + } + ], + } + ] + + result = LiteLLMAnthropicMessagesAdapter().translate_anthropic_messages_to_openai( + messages=messages, + model="gpt-4o", + ) + + assert result == [ + { + "role": "system", + "content": [{"type": "text", "text": "Use the corrected result."}], + } + ] + + +@pytest.mark.parametrize( + "system_content", + [ + "", + [{"type": "text", "text": ""}], + [ + { + "type": "image", + "source": {"type": "url", "url": "https://example.com/a.png"}, + } + ], + None, + ], +) +def test_translate_anthropic_messages_to_openai_drops_empty_midturn_system( + system_content: object, +): + messages = [{"role": "system", "content": system_content}] + + result = LiteLLMAnthropicMessagesAdapter().translate_anthropic_messages_to_openai( + messages=messages, + model="claude-3-5-sonnet-20240620", + ) + + assert result == [] + + +def test_translate_anthropic_to_openai_orders_top_level_and_midturn_system(): + """ + Request level: the trusted top-level prompt is hoisted to index 0 exactly once and the + in-sequence correction keeps its own position and `role: "system"` -- no duplication of + either, and no reordering of the surrounding turns. + """ + openai_request, _ = LiteLLMAnthropicMessagesAdapter().translate_anthropic_to_openai( + anthropic_message_request={ + "model": "claude-3-5-sonnet-20240620", + "max_tokens": 100, + "system": "Trusted top-level prompt.", + "messages": [ + {"role": "user", "content": "First question."}, + {"role": "assistant", "content": "First answer."}, + {"role": "system", "content": "Use the corrected result."}, + {"role": "user", "content": "Continue."}, + ], + } + ) + + assert openai_request["messages"] == [ + {"role": "system", "content": "Trusted top-level prompt."}, + {"role": "user", "content": "First question."}, + {"role": "assistant", "content": "First answer.", "thinking_blocks": None}, + {"role": "system", "content": "Use the corrected result."}, + {"role": "user", "content": "Continue."}, + ] + + def test_translate_openai_content_to_anthropic_empty_function_arguments(): """Test that empty function arguments are handled safely and don't cause JSON parsing errors.""" diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/context_management/test_compact.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/context_management/test_compact.py index 9c8df1c79f9..6cc1d9e5add 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/context_management/test_compact.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/context_management/test_compact.py @@ -2475,3 +2475,57 @@ def test_endpoint_runs_failure_hook_on_500_context_management_error(): body = response.json() assert body["type"] == "error" failure_hook.assert_awaited_once() + + +def test_count_effective_tokens_counts_midturn_system_correction(): + from litellm.llms.anthropic.experimental_pass_through.context_management.editors.compact import ( + _count_effective_tokens, + ) + + base: List[Dict[str, Any]] = [ + {"role": "user", "content": "hello"}, + {"role": "assistant", "content": "hi"}, + ] + correction = { + "role": "system", + "content": [{"type": "text", "text": "use the corrected result " * 20}], + } + + without_correction = _count_effective_tokens( + model=MODEL, effective_messages=base, compaction_block=None, tools=None + ) + with_correction = _count_effective_tokens( + model=MODEL, + effective_messages=base + [correction], + compaction_block=None, + tools=None, + ) + + assert with_correction > without_correction + + +def test_build_summary_messages_keeps_midturn_system_correction_in_place(): + from litellm.llms.anthropic.experimental_pass_through.context_management.editors.compact import ( + _build_summary_messages, + ) + + summary_messages = _build_summary_messages( + effective_messages=[ + {"role": "user", "content": "original question"}, + {"role": "system", "content": "use the corrected result"}, + {"role": "assistant", "content": "acknowledged"}, + ], + prompt="summarize the conversation", + system="caller system prompt", + ) + + assert [m["role"] for m in summary_messages] == [ + "system", + "user", + "system", + "assistant", + "user", + ] + assert summary_messages[0]["content"] == "caller system prompt" + assert summary_messages[2]["content"] == "use the corrected result" + assert summary_messages[-1]["content"] == "summarize the conversation" diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_transformation.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_transformation.py index 606ff39b35e..8963012ecd5 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_transformation.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/responses_adapters/test_responses_adapters_transformation.py @@ -9,6 +9,8 @@ import sys from typing import Any, Dict, List from unittest.mock import MagicMock +import pytest + sys.path.insert(0, os.path.abspath("../../../../../../..")) from litellm.constants import ( @@ -221,6 +223,106 @@ class TestTranslateMessagesToResponsesInput: {"type": "input_text", "text": "Second part."}, ] + @pytest.mark.parametrize( + "system_content", + [ + "Use the corrected result.", + [{"type": "text", "text": "Use the corrected result."}], + [ + {"type": "image", "source": {"type": "url", "url": "https://example.com/a.png"}}, + {"type": "text", "text": "Use the corrected result."}, + ], + ], + ) + def test_midturn_system_correction_stays_system_in_sequence(self, system_content: object): + messages = [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_01234", + "name": "get_weather", + "input": {"location": "Boston"}, + } + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_01234", + "content": "Rainy, 55°F", + } + ], + }, + {"role": "system", "content": system_content}, + {"role": "user", "content": "Continue."}, + ] + + result = _translate_messages(messages) + + assert result == [ + { + "type": "function_call", + "call_id": "toolu_01234", + "name": "get_weather", + "arguments": '{"location": "Boston"}', + }, + { + "type": "function_call_output", + "call_id": "toolu_01234", + "output": "Rainy, 55°F", + }, + { + "type": "message", + "role": "system", + "content": [{"type": "input_text", "text": "Use the corrected result."}], + }, + { + "type": "message", + "role": "user", + "content": [{"type": "input_text", "text": "Continue."}], + }, + ] + + def test_midturn_system_correction_keeps_multiple_text_blocks(self): + messages = [ + { + "role": "system", + "content": [ + {"type": "text", "text": "First correction."}, + {"type": "text", "text": "Second correction."}, + ], + } + ] + + assert _translate_messages(messages) == [ + { + "type": "message", + "role": "system", + "content": [ + {"type": "input_text", "text": "First correction."}, + {"type": "input_text", "text": "Second correction."}, + ], + } + ] + + @pytest.mark.parametrize( + "system_content", + [ + "", + [{"type": "text", "text": ""}], + [{"type": "image", "source": {"type": "url", "url": "https://example.com/a.png"}}], + None, + ], + ) + def test_empty_or_unsupported_midturn_system_correction_is_dropped(self, system_content: object): + messages = [{"role": "system", "content": system_content}] + + assert _translate_messages(messages) == [] + def test_user_base64_image(self): """User message with base64 image source becomes input_image with data URL.""" messages = [ @@ -722,6 +824,42 @@ class TestTranslateRequestBroaderCoverage: kwargs = _ADAPTER.translate_request(req) assert kwargs["instructions"] == "You are a helpful assistant." + def test_top_level_system_and_midturn_correction_are_not_duplicated(self): + """ + Request level: the trusted top-level prompt goes to `instructions` only, and the + in-sequence correction stays a `role: "system"` input item in its original position. + Neither appears twice, and the surrounding turns keep their order. + """ + req = _make_request( + system="Trusted top-level prompt.", + messages=[ + {"role": "user", "content": "First question."}, + {"role": "system", "content": "Use the corrected result."}, + {"role": "user", "content": "Continue."}, + ], + ) + + kwargs = _ADAPTER.translate_request(req) + + assert kwargs["instructions"] == "Trusted top-level prompt." + assert kwargs["input"] == [ + { + "type": "message", + "role": "user", + "content": [{"type": "input_text", "text": "First question."}], + }, + { + "type": "message", + "role": "system", + "content": [{"type": "input_text", "text": "Use the corrected result."}], + }, + { + "type": "message", + "role": "user", + "content": [{"type": "input_text", "text": "Continue."}], + }, + ] + def test_system_list_of_text_blocks_joined(self): req = _make_request( system=[ From c5c5a276790529e2de3378654864fd847530c5a0 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:19:42 +0000 Subject: [PATCH 009/279] fix(files): enforce require_managed_files on file retrieve, content and delete Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../openai_files_endpoints/common_utils.py | 30 +++++ .../openai_files_endpoints/files_endpoints.py | 7 ++ .../test_files_endpoint.py | 116 ++++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/litellm/proxy/openai_files_endpoints/common_utils.py b/litellm/proxy/openai_files_endpoints/common_utils.py index 87514b46dbd..3eef3868c94 100644 --- a/litellm/proxy/openai_files_endpoints/common_utils.py +++ b/litellm/proxy/openai_files_endpoints/common_utils.py @@ -866,6 +866,36 @@ def validate_managed_files_requirement( ) +def validate_managed_file_id_requirement(file_id: str) -> None: + """ + Enforce proxy-level managed files on the file read/delete routes when + ``litellm.require_managed_files`` is enabled. + + Ownership is only recorded for LiteLLM managed files, so a raw provider file id sent to + retrieve/content/delete is forwarded to the provider under shared credentials without any + tenant check; knowing another tenant's provider file id would be enough to read or delete it. + + Raises: + HTTPException: 400 if ``file_id`` is not a LiteLLM managed file id. + """ + import litellm + from fastapi import HTTPException + + if litellm.require_managed_files is not True: + return + + if _is_base64_encoded_unified_file_id(file_id): + return + + raise HTTPException( + status_code=400, + detail=( + "Raw provider file ids cannot be used when require_managed_files is enabled in " + "litellm_settings. Use the LiteLLM managed file id returned when the file was created." + ), + ) + + def _extract_model_param(request: "Request", request_body: dict) -> str | None: """ Extract model parameter from request. diff --git a/litellm/proxy/openai_files_endpoints/files_endpoints.py b/litellm/proxy/openai_files_endpoints/files_endpoints.py index 4e4718272bd..37f1ced6996 100644 --- a/litellm/proxy/openai_files_endpoints/files_endpoints.py +++ b/litellm/proxy/openai_files_endpoints/files_endpoints.py @@ -49,6 +49,7 @@ from litellm.proxy.openai_files_endpoints.common_utils import ( get_credentials_for_model, handle_model_based_routing, prepare_data_with_credentials, + validate_managed_file_id_requirement, validate_managed_files_requirement, ) from litellm.proxy.utils import ProxyLogging, is_known_model @@ -612,6 +613,8 @@ async def get_file_content( data: dict = {"file_id": file_id} try: + validate_managed_file_id_requirement(file_id=file_id) + # Include original request and headers in the data base_llm_response_processor = ProxyBaseLLMRequestProcessing(data=data) ( @@ -908,6 +911,8 @@ async def get_file( data: dict = {"file_id": file_id} try: + validate_managed_file_id_requirement(file_id=file_id) + custom_llm_provider = ( provider or get_custom_llm_provider_from_request_headers(request=request) @@ -1098,6 +1103,8 @@ async def delete_file( data: dict = {"file_id": file_id} try: + validate_managed_file_id_requirement(file_id=file_id) + custom_llm_provider = ( provider or get_custom_llm_provider_from_request_headers(request=request) diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py index ac01c6ae1d1..24b814bae1f 100644 --- a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py @@ -3051,3 +3051,119 @@ def test_list_files_key_allowed_openai_model_still_resolves_team_credentials( mocker, monkeypatch, _team_openai_plus_global_anthropic_router(), ["team-gpt"] ) assert captured_kwargs.get("api_key") == "team-openai-key" + + +@pytest.mark.parametrize( + "http_method, url, patched_litellm_call", + [ + ("get", "/v1/files/file-victim-abc123", "litellm.afile_retrieve"), + ("get", "/v1/files/file-victim-abc123/content", "litellm.afile_content"), + ("delete", "/v1/files/file-victim-abc123", "litellm.afile_delete"), + ], +) +def test_require_managed_files_rejects_raw_provider_file_id( + mocker: MockerFixture, + monkeypatch, + llm_router: Router, + http_method: str, + url: str, + patched_litellm_call: str, +): + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import LitellmUserRoles + + monkeypatch.setattr("litellm.require_managed_files", True) + monkeypatch.setattr("litellm.proxy.proxy_server.master_key", None) + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", None) + monkeypatch.setattr("litellm.proxy.proxy_server.llm_router", llm_router) + setup_proxy_logging_object(monkeypatch, llm_router) + + mock_call = mocker.patch(patched_litellm_call, new=mocker.AsyncMock()) + + app.dependency_overrides[ps.user_api_key_auth] = lambda: UserAPIKeyAuth( + user_role=LitellmUserRoles.INTERNAL_USER, user_id="attacker-user" + ) + + try: + response = getattr(client, http_method)( + url, headers={"Authorization": "Bearer test-key"} + ) + finally: + app.dependency_overrides.pop(ps.user_api_key_auth, None) + monkeypatch.setattr("litellm.require_managed_files", False) + + assert response.status_code == 400, response.text + mock_call.assert_not_called() + + +def _unified_managed_file_id() -> str: + import base64 + + from litellm.types.utils import SpecialEnums + + unified_id = SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( + "application/json", "victim-unified-id", "gpt-3.5-turbo", "file-victim-abc123", "gpt-3.5-turbo-id" + ) + return base64.urlsafe_b64encode(unified_id.encode()).decode().rstrip("=") + + +def test_require_managed_files_allows_unified_managed_file_id(monkeypatch): + from litellm.proxy.openai_files_endpoints.common_utils import ( + validate_managed_file_id_requirement, + ) + + monkeypatch.setattr("litellm.require_managed_files", True) + + validate_managed_file_id_requirement(file_id=_unified_managed_file_id()) + + +def test_managed_file_id_requirement_is_opt_in(monkeypatch): + from litellm.proxy.openai_files_endpoints.common_utils import ( + validate_managed_file_id_requirement, + ) + + monkeypatch.setattr("litellm.require_managed_files", False) + + validate_managed_file_id_requirement(file_id="file-victim-abc123") + + +def test_raw_provider_file_id_retrieve_allowed_when_managed_files_not_required( + mocker: MockerFixture, monkeypatch, llm_router: Router +): + import litellm.proxy.proxy_server as ps + from litellm.proxy._types import LitellmUserRoles + + monkeypatch.setattr("litellm.require_managed_files", False) + monkeypatch.setattr("litellm.proxy.proxy_server.master_key", None) + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", None) + monkeypatch.setattr("litellm.proxy.proxy_server.llm_router", llm_router) + setup_proxy_logging_object(monkeypatch, llm_router) + + mock_retrieve = mocker.patch( + "litellm.afile_retrieve", + new=mocker.AsyncMock( + return_value=OpenAIFileObject( + id="file-victim-abc123", + object="file", + bytes=3, + created_at=1234567890, + filename="test.txt", + purpose="user_data", + status="uploaded", + ) + ), + ) + + app.dependency_overrides[ps.user_api_key_auth] = lambda: UserAPIKeyAuth( + user_role=LitellmUserRoles.INTERNAL_USER, user_id="some-user" + ) + + try: + response = client.get( + "/v1/files/file-victim-abc123", headers={"Authorization": "Bearer test-key"} + ) + finally: + app.dependency_overrides.pop(ps.user_api_key_auth, None) + + assert response.status_code == 200, response.text + mock_retrieve.assert_called_once() From 81a80b8c632a9b5d942193bb71eda601630e9906 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2026 01:02:27 +0000 Subject: [PATCH 010/279] fix(anthropic): preserve speed=fast in usage for /v1/messages and pass-through Fast mode is priced with a provider-specific multiplier applied off usage.speed, but only chat completions kept that field. The Messages route rebuilt usage with empty optional params, stream reassembly dropped speed and inference_geo, and the pass-through handler never read speed off the request body, so fast-mode spend was logged at the standard rate. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/litellm_core_utils/litellm_logging.py | 2 +- .../streaming_chunk_builder_utils.py | 16 +++ .../anthropic_passthrough_logging_handler.py | 24 +++- .../streaming_chunk_builder_utils.py | 2 + .../test_litellm_logging.py | 35 ++++++ .../test_streaming_chunk_builder_utils.py | 39 ++++++ ...t_anthropic_passthrough_logging_handler.py | 113 ++++++++++++++++++ 7 files changed, 228 insertions(+), 3 deletions(-) diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index c2dc7189934..15330a2a910 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -3278,7 +3278,7 @@ class Logging(LiteLLMLoggingBaseClass): model=self.model, messages=[], logging_obj=self, - optional_params={}, + optional_params=self.optional_params or {}, api_key="", request_data={}, encoding=litellm.encoding, diff --git a/litellm/litellm_core_utils/streaming_chunk_builder_utils.py b/litellm/litellm_core_utils/streaming_chunk_builder_utils.py index d52d9849310..5ceb64547a0 100644 --- a/litellm/litellm_core_utils/streaming_chunk_builder_utils.py +++ b/litellm/litellm_core_utils/streaming_chunk_builder_utils.py @@ -569,6 +569,8 @@ class ChunkProcessor: # lost and 1h cache writes get billed at the 5m rate. cache_creation_token_details: Optional[CacheCreationTokenDetails] = None cost: Optional[float] = None + inference_geo: Optional[str] = None + speed: Optional[str] = None for chunk in chunks: usage_chunk = self._extract_usage_chunk(chunk) @@ -627,6 +629,13 @@ class ChunkProcessor: if usage_chunk_dict["cost"] is not None: cost = usage_chunk_dict["cost"] + chunk_inference_geo = getattr(usage_chunk, "inference_geo", None) + if isinstance(chunk_inference_geo, str): + inference_geo = chunk_inference_geo + chunk_speed = getattr(usage_chunk, "speed", None) + if isinstance(chunk_speed, str): + speed = chunk_speed + prompt_tokens_details = self._attach_cache_creation_token_details( prompt_tokens_details, cache_creation_token_details ) @@ -647,6 +656,8 @@ class ChunkProcessor: completion_tokens_details=completion_tokens_details, prompt_tokens_details=prompt_tokens_details, cost=cost, + inference_geo=inference_geo, + speed=speed, ) @staticmethod @@ -806,6 +817,11 @@ class ChunkProcessor: if cost is not None: setattr(returned_usage, "cost", cost) + if calculated_usage_per_chunk["inference_geo"] is not None: + setattr(returned_usage, "inference_geo", calculated_usage_per_chunk["inference_geo"]) + if calculated_usage_per_chunk["speed"] is not None: + setattr(returned_usage, "speed", calculated_usage_per_chunk["speed"]) + # Return a new usage object with the new values returned_usage = Usage(**returned_usage.model_dump()) diff --git a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py index 50e90699194..112780581de 100644 --- a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py +++ b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py @@ -80,7 +80,9 @@ class AnthropicPassthroughLoggingHandler: model=model, messages=[], logging_obj=logging_obj, - optional_params={}, + optional_params=AnthropicPassthroughLoggingHandler._cost_relevant_request_params( + request_body or kwargs.get("request_body") + ), api_key="", request_data={}, encoding=litellm.encoding, @@ -102,6 +104,15 @@ class AnthropicPassthroughLoggingHandler: "kwargs": kwargs, } + @staticmethod + def _cost_relevant_request_params(request_body: Optional[dict]) -> dict: + """ + Request params that change how the response is priced, and so must reach the + usage-building paths. Anthropic's ``speed=fast`` multiplies non-cache token cost. + """ + speed = (request_body or {}).get("speed") + return {"speed": speed} if isinstance(speed, str) else {} + @staticmethod def _get_user_from_metadata( passthrough_logging_payload: PassthroughStandardLoggingPayload, @@ -315,6 +326,7 @@ class AnthropicPassthroughLoggingHandler: - Logs in litellm callbacks """ + speed = AnthropicPassthroughLoggingHandler._cost_relevant_request_params(request_body).get("speed") model = request_body.get("model", "") # Check if it's available in the logging object if ( @@ -334,6 +346,7 @@ class AnthropicPassthroughLoggingHandler: all_chunks=all_chunks, litellm_logging_obj=litellm_logging_obj, model=model, + speed=speed, ) except Exception as e: # stream_chunk_builder re-raises assembly failures (as litellm.APIError) @@ -355,6 +368,7 @@ class AnthropicPassthroughLoggingHandler: complete_streaming_response = AnthropicPassthroughLoggingHandler._build_usage_only_response_from_chunks( all_chunks=all_chunks, model=model, + speed=speed, ) except Exception as e: verbose_proxy_logger.warning( @@ -419,6 +433,7 @@ class AnthropicPassthroughLoggingHandler: all_chunks: Sequence[Union[str, bytes]], litellm_logging_obj: LiteLLMLoggingObj, model: str, + speed: Optional[str] = None, ) -> Optional[Union[ModelResponse, TextCompletionResponse]]: """ Builds complete response from raw Anthropic chunks. @@ -443,11 +458,13 @@ class AnthropicPassthroughLoggingHandler: all_chunks=collapsed, litellm_logging_obj=litellm_logging_obj, model=model, + speed=speed, ) return AnthropicPassthroughLoggingHandler._build_complete_streaming_response_legacy( all_chunks=all_chunks, litellm_logging_obj=litellm_logging_obj, model=model, + speed=speed, ) # Anthropic SSE block/delta types that the fast path is NOT allowed to @@ -575,6 +592,7 @@ class AnthropicPassthroughLoggingHandler: all_chunks: Sequence[Union[str, bytes]], litellm_logging_obj: LiteLLMLoggingObj, model: str, + speed: Optional[str] = None, ) -> Optional[Union[ModelResponse, TextCompletionResponse]]: """ Original reconstruction: convert every SSE event to a generic chunk @@ -590,6 +608,7 @@ class AnthropicPassthroughLoggingHandler: anthropic_model_response_iterator = AnthropicModelResponseIterator( streaming_response=None, sync_stream=False, + speed=speed, ) all_openai_chunks = [] @@ -649,6 +668,7 @@ class AnthropicPassthroughLoggingHandler: def _build_usage_only_response_from_chunks( all_chunks: Sequence[Union[str, bytes]], model: str, + speed: Optional[str] = None, ) -> Optional[ModelResponse]: """ Build a usage-bearing ModelResponse from Anthropic SSE token-usage events, for @@ -742,7 +762,7 @@ class AnthropicPassthroughLoggingHandler: usage_object["server_tool_use"] = _server_tool_use if inference_geo is not None: usage_object["inference_geo"] = inference_geo - usage_obj = AnthropicConfig().calculate_usage(usage_object=usage_object, reasoning_content=None) + usage_obj = AnthropicConfig().calculate_usage(usage_object=usage_object, reasoning_content=None, speed=speed) return ModelResponse( model=resolved_model, choices=[ diff --git a/litellm/types/litellm_core_utils/streaming_chunk_builder_utils.py b/litellm/types/litellm_core_utils/streaming_chunk_builder_utils.py index c9f9d4e6baa..4ff47171e32 100644 --- a/litellm/types/litellm_core_utils/streaming_chunk_builder_utils.py +++ b/litellm/types/litellm_core_utils/streaming_chunk_builder_utils.py @@ -15,3 +15,5 @@ class UsagePerChunk(TypedDict): completion_tokens_details: Optional[CompletionTokensDetails] prompt_tokens_details: Optional[PromptTokensDetailsWrapper] cost: Optional[float] + inference_geo: Optional[str] + speed: Optional[str] diff --git a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py index eaa4bd3e3fc..1cd4174c57c 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -4153,3 +4153,38 @@ def test_pre_call_does_not_pin_request_in_module_state(logging_obj): logging_obj.post_call(original_response='{"ok": true}', input=big_input, api_key="sk-test") assert litellm.error_logs == {} + + +def test_handle_anthropic_messages_response_logging_preserves_fast_mode_speed(): + """/v1/messages non-streaming rebuilds usage by re-transforming the raw Anthropic + response. Anthropic's fast-mode multiplier is applied off ``usage.speed``, which the + response body never carries, so the request's optional params have to be passed in or + fast-mode spend is logged at the standard rate.""" + import httpx + + logging_obj = LitellmLogging( + model="claude-opus-4-8", + messages=[{"role": "user", "content": "hi"}], + stream=False, + call_type="anthropic_messages", + start_time=time.time(), + litellm_call_id="lit-5115", + function_id="lit-5115", + ) + logging_obj.optional_params = {"speed": "fast"} + logging_obj.model_call_details["httpx_response"] = httpx.Response( + status_code=200, + json={ + "id": "msg_1", + "type": "message", + "role": "assistant", + "model": "claude-opus-4-8", + "content": [{"type": "text", "text": "ok"}], + "stop_reason": "end_turn", + "usage": {"input_tokens": 1000, "cache_read_input_tokens": 200, "output_tokens": 100}, + }, + ) + + result = logging_obj._handle_anthropic_messages_response_logging(result=None) + + assert result.usage.speed == "fast" # type: ignore[attr-defined] diff --git a/tests/test_litellm/litellm_core_utils/test_streaming_chunk_builder_utils.py b/tests/test_litellm/litellm_core_utils/test_streaming_chunk_builder_utils.py index be8c5a05601..72bbad7ae49 100644 --- a/tests/test_litellm/litellm_core_utils/test_streaming_chunk_builder_utils.py +++ b/tests/test_litellm/litellm_core_utils/test_streaming_chunk_builder_utils.py @@ -992,3 +992,42 @@ def test_cost_field_in_usage_chunks(): assert usage.cost == 0.00025 assert usage.prompt_tokens == 10 assert usage.completion_tokens == 5 + + +def test_anthropic_speed_and_geo_survive_stream_assembly(): + """Anthropic prices fast mode and non-global regions with a multiplier read off + ``usage.speed`` / ``usage.inference_geo``. Dropping them while reassembling a stream + bills streamed fast-mode calls at the standard rate.""" + from litellm.llms.anthropic.cost_calculation import cost_per_token + + def _usage(**extra): + usage = Usage(completion_tokens=100, prompt_tokens=1000, total_tokens=1100) + for key, value in extra.items(): + setattr(usage, key, value) + return usage + + def _chunk(usage): + return ModelResponseStream( + id="chatcmpl-1", + created=1745513206, + model="claude-opus-4-8", + choices=[StreamingChoices(finish_reason="stop", index=0, delta=Delta(content="Hi"))], + usage=usage, + ) + + fast_chunk = _chunk(_usage(speed="fast", inference_geo="global")) + fast_usage = ChunkProcessor(chunks=[fast_chunk]).calculate_usage( + chunks=[fast_chunk], model="claude-opus-4-8", completion_output="Hi" + ) + standard_chunk = _chunk(_usage(inference_geo="global")) + standard_usage = ChunkProcessor(chunks=[standard_chunk]).calculate_usage( + chunks=[standard_chunk], model="claude-opus-4-8", completion_output="Hi" + ) + + assert fast_usage.speed == "fast" + assert fast_usage.inference_geo == "global" + assert getattr(standard_usage, "speed", None) is None + + fast_cost = sum(cost_per_token(model="claude-opus-4-8", usage=fast_usage)) + standard_cost = sum(cost_per_token(model="claude-opus-4-8", usage=standard_usage)) + assert fast_cost == pytest.approx(standard_cost * 2.0) diff --git a/tests/test_litellm/proxy/pass_through_endpoints/llm_provider_handlers/test_anthropic_passthrough_logging_handler.py b/tests/test_litellm/proxy/pass_through_endpoints/llm_provider_handlers/test_anthropic_passthrough_logging_handler.py index 947a7a64beb..ffbdb3485ae 100644 --- a/tests/test_litellm/proxy/pass_through_endpoints/llm_provider_handlers/test_anthropic_passthrough_logging_handler.py +++ b/tests/test_litellm/proxy/pass_through_endpoints/llm_provider_handlers/test_anthropic_passthrough_logging_handler.py @@ -2192,3 +2192,116 @@ class TestAnthropicResponseCostRecordedOnModelCallDetails: logging_obj.model_call_details["response_cost"] == kwargs["response_cost"] ) assert logging_obj.model_call_details["response_cost"] > 0 + + +class TestAnthropicPassthroughFastMode: + """Anthropic charges a provider-specific multiplier for ``speed=fast``, and the + multiplier is applied off ``usage.speed``. The pass-through handler only sees the + speed in the request body, so it has to thread it into every usage-building path or + fast-mode pass-through spend is under-reported.""" + + MODEL = "claude-opus-4-8" + STREAM_CHUNKS = [ + 'event: message_start', + 'data: {"type": "message_start", "message": {"id": "msg_1", "type": "message", "role": "assistant",' + ' "model": "claude-opus-4-8", "content": [], "stop_reason": null,' + ' "usage": {"input_tokens": 1000, "cache_read_input_tokens": 200, "output_tokens": 0}}}', + 'event: content_block_start', + 'data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}', + 'event: content_block_delta', + 'data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "ok"}}', + 'event: content_block_stop', + 'data: {"type": "content_block_stop", "index": 0}', + 'event: message_delta', + 'data: {"type": "message_delta", "delta": {"stop_reason": "end_turn"},' + ' "usage": {"input_tokens": 1000, "cache_read_input_tokens": 200, "output_tokens": 100}}', + 'event: message_stop', + 'data: {"type": "message_stop"}', + ] + + def _logging_obj(self) -> LiteLLMLoggingObj: + return LiteLLMLoggingObj( + model=self.MODEL, + messages=[], + stream=True, + call_type="pass_through_endpoint", + start_time=datetime.now(), + litellm_call_id="fast-mode", + function_id="fast-mode", + ) + + def _cost(self, response) -> float: + import litellm + + return litellm.completion_cost(completion_response=response, model=f"anthropic/{self.MODEL}") + + def _expected_fast_cost(self, standard_cost: float) -> float: + import litellm + + model_info = litellm.get_model_info(model=self.MODEL, custom_llm_provider="anthropic") + cache_read_cost = 200 * (model_info.get("cache_read_input_token_cost") or 0.0) + return (standard_cost - cache_read_cost) * 2.0 + cache_read_cost + + def test_non_streaming_applies_fast_multiplier(self): + import httpx + + response_body = { + "id": "msg_1", + "type": "message", + "role": "assistant", + "model": self.MODEL, + "content": [{"type": "text", "text": "ok"}], + "stop_reason": "end_turn", + "usage": {"input_tokens": 1000, "cache_read_input_tokens": 200, "output_tokens": 100}, + } + + def _handle(request_body): + logging_obj = self._logging_obj() + logging_obj.model_call_details["stream"] = False + return AnthropicPassthroughLoggingHandler.anthropic_passthrough_handler( + httpx_response=httpx.Response(status_code=200, json=response_body), + response_body=response_body, + logging_obj=logging_obj, + url_route="https://api.anthropic.com/v1/messages", + result="", + start_time=datetime.now(), + end_time=datetime.now(), + cache_hit=False, + request_body=request_body, + ) + + fast = _handle({"model": self.MODEL, "speed": "fast"}) + standard = _handle({"model": self.MODEL}) + + assert fast["result"].usage.speed == "fast" + assert self._cost(fast["result"]) == pytest.approx(self._expected_fast_cost(self._cost(standard["result"]))) + + def test_streaming_reconstruction_applies_fast_multiplier(self): + fast = AnthropicPassthroughLoggingHandler._build_complete_streaming_response( + all_chunks=self.STREAM_CHUNKS, + litellm_logging_obj=self._logging_obj(), + model=self.MODEL, + speed="fast", + ) + standard = AnthropicPassthroughLoggingHandler._build_complete_streaming_response( + all_chunks=self.STREAM_CHUNKS, + litellm_logging_obj=self._logging_obj(), + model=self.MODEL, + ) + + assert fast.usage.speed == "fast" + assert self._cost(fast) == pytest.approx(self._expected_fast_cost(self._cost(standard))) + + def test_usage_only_fallback_applies_fast_multiplier(self): + fast = AnthropicPassthroughLoggingHandler._build_usage_only_response_from_chunks( + all_chunks=self.STREAM_CHUNKS, + model=self.MODEL, + speed="fast", + ) + standard = AnthropicPassthroughLoggingHandler._build_usage_only_response_from_chunks( + all_chunks=self.STREAM_CHUNKS, + model=self.MODEL, + ) + + assert fast.usage.speed == "fast" + assert self._cost(fast) == pytest.approx(self._expected_fast_cost(self._cost(standard))) From 5a5bb8c9d844870c25684e169960f1571d08e5ce Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:29:39 +0000 Subject: [PATCH 011/279] fix(proxy): stop /{provider}/v1/files from capturing /openai_passthrough The native files and batches routes declare /{provider}/v1/... and their routers are mounted before the passthrough router, so /openai_passthrough/v1/files and /openai_passthrough/v1/batches matched them with provider="openai_passthrough" and 500'd on the LlmProviders lookup instead of reaching openai_proxy_route. Move the dedicated /openai_passthrough prefix onto its own router mounted ahead of the batches and files routers. /openai/... and every other provider prefix keep their current behavior. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../llm_passthrough_endpoints.py | 3 +- litellm/proxy/proxy_server.py | 2 + .../test_llm_pass_through_endpoints.py | 57 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py index 38da00a3bb9..baa74c19182 100644 --- a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py +++ b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py @@ -60,6 +60,7 @@ from .passthrough_endpoint_router import PassthroughEndpointRouter vertex_llm_base: Final = VertexBase() router: Final = APIRouter() +openai_passthrough_router: Final = APIRouter() default_vertex_config: Final = None passthrough_endpoint_router: Final = PassthroughEndpointRouter() @@ -1875,7 +1876,7 @@ async def vertex_proxy_route( ) -@router.api_route( +@openai_passthrough_router.api_route( "/openai_passthrough/{endpoint:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"], tags=["OpenAI Pass-through", "pass-through"], diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index fb9c4e67aad..e75277e7f0a 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -522,6 +522,7 @@ from litellm.proxy.openai_files_endpoints.files_endpoints import ( set_files_config, ) from litellm.proxy.pass_through_endpoints.llm_passthrough_endpoints import ( + openai_passthrough_router, passthrough_endpoint_router, vertex_ai_live_websocket_passthrough, ) @@ -16433,6 +16434,7 @@ app.include_router(search_router) app.include_router(image_router) app.include_router(fine_tuning_router) app.include_router(credential_router) +app.include_router(openai_passthrough_router) app.include_router(batches_router) app.include_router(openai_files_router) app.include_router(llm_passthrough_router) diff --git a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py index 181846fe289..27d6e4c8585 100644 --- a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py +++ b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py @@ -2814,6 +2814,63 @@ class TestOpenAIPassthroughRoute: assert result == {"id": "asst_123", "object": "assistant"} +def _resolve_route_name(method: str, path: str) -> str | None: + from starlette.routing import Match + + from litellm.proxy.proxy_server import app + + scope = { + "type": "http", + "method": method, + "path": path, + "headers": [], + "query_string": b"", + "root_path": "", + } + for route in app.router.routes: + if route.matches(scope)[0] == Match.FULL: + return getattr(route, "name", None) + return None + + +@pytest.mark.parametrize( + "method, path", + [ + ("POST", "/openai_passthrough/v1/files"), + ("GET", "/openai_passthrough/v1/files"), + ("GET", "/openai_passthrough/v1/files/file-abc123"), + ("DELETE", "/openai_passthrough/v1/files/file-abc123"), + ("GET", "/openai_passthrough/v1/files/file-abc123/content"), + ("POST", "/openai_passthrough/v1/batches"), + ("GET", "/openai_passthrough/v1/batches"), + ("GET", "/openai_passthrough/v1/batches/batch_abc123"), + ("POST", "/openai_passthrough/v1/batches/batch_abc123/cancel"), + ("POST", "/openai_passthrough/v1/responses"), + ], +) +def test_openai_passthrough_prefix_wins_over_native_provider_routes(method, path): + """ + /openai_passthrough exists to guarantee passthrough, so the native + /{provider}/v1/files and /{provider}/v1/batches routes must never capture it + with provider="openai_passthrough" (which 500s on the LlmProviders lookup). + """ + assert _resolve_route_name(method, path) == "openai_proxy_route" + + +@pytest.mark.parametrize( + "method, path, expected_name", + [ + ("POST", "/openai/v1/files", "create_file"), + ("GET", "/azure/v1/files", "list_files"), + ("POST", "/v1/files", "create_file"), + ("POST", "/v1/batches", "create_batch"), + ("POST", "/openai/v1/chat/completions", "openai_proxy_route"), + ], +) +def test_native_provider_routes_are_unchanged(method, path, expected_name): + assert _resolve_route_name(method, path) == expected_name + + class TestCursorProxyRoute: """Tests for the Cursor Cloud Agents pass-through route.""" From 357f90fa39d18c9a158a978ebd1ed0fecac6044d Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:33:40 +0000 Subject: [PATCH 012/279] fix(proxy): scope file list pagination cursors to the caller GET /v1/files filters data down to the caller's own managed files but left first_id and last_id as the upstream page's, so a non-owner got back file ids belonging to other users even with an empty data array --- .../proxy/hooks/managed_files.py | 15 +++ .../proxy/hooks/test_managed_files.py | 100 ++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py index 0036603bcd1..851e202e2fb 100644 --- a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py +++ b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py @@ -1270,10 +1270,25 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ) ## Filter the response to only include the files created by the user response.data = user_created_file_ids # type: ignore + self._scope_list_page_cursors(response, user_created_file_ids) return response return response return response + @staticmethod + def _scope_list_page_cursors(response: AsyncCursorPage, data: List[OpenAIFileObject]) -> None: + """Rebuild ``first_id`` / ``last_id`` from the caller-scoped page. + + The upstream cursors point at rows that were just filtered out, so + leaving them in place discloses other callers' file ids. + """ + if hasattr(response, "first_id"): + response.first_id = data[0].id if data else None + if hasattr(response, "last_id"): + response.last_id = data[-1].id if data else None + if not data and hasattr(response, "has_more"): + response.has_more = False + async def afile_retrieve( self, file_id: str, litellm_parent_otel_span: Optional[Span], llm_router=None ) -> OpenAIFileObject: diff --git a/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py b/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py index 50af6465d06..3384c553740 100644 --- a/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py +++ b/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py @@ -2861,3 +2861,103 @@ async def test_same_user_different_keys_can_access_batch(): assert "batch_id" in result2 # Both keys should get the same result assert result1["batch_id"] == result2["batch_id"] + + +@pytest.mark.asyncio +async def test_file_list_cursors_are_scoped_to_the_caller(): + """A non-owner must not learn other callers' file ids through the page cursors.""" + from openai.pagination import AsyncCursorPage + from openai.types import FileObject + + from litellm.proxy._types import UserAPIKeyAuth + + owner_file = FileObject( + id="file-owner-1", + bytes=100, + created_at=1, + filename="owner.jsonl", + object="file", + purpose="batch", + status="processed", + ) + upstream_page = AsyncCursorPage[FileObject].construct( + data=[owner_file], + has_more=True, + first_id=owner_file.id, + last_id=owner_file.id, + object="list", + ) + + prisma_client = AsyncMock() + prisma_client.db.litellm_managedfiletable.find_many.return_value = [] + proxy_managed_files = _PROXY_LiteLLMManagedFiles( + DualCache(), prisma_client=prisma_client + ) + + response = await proxy_managed_files.async_post_call_success_hook( + data={}, + user_api_key_dict=UserAPIKeyAuth( + user_id="other-user", team_id="other-team", parent_otel_span=MagicMock() + ), + response=upstream_page, + ) + + assert response.data == [] + assert response.first_id is None + assert response.last_id is None + assert response.has_more is False + + +@pytest.mark.asyncio +async def test_file_list_cursors_follow_the_owner_scoped_page(): + from openai.pagination import AsyncCursorPage + from openai.types import FileObject + + from litellm.proxy._types import UserAPIKeyAuth + + def _raw_file(file_id: str) -> FileObject: + return FileObject( + id=file_id, + bytes=100, + created_at=1, + filename=f"{file_id}.jsonl", + object="file", + purpose="batch", + status="processed", + ) + + upstream_page = AsyncCursorPage[FileObject].construct( + data=[_raw_file("file-someone-else"), _raw_file("file-mine")], + has_more=False, + first_id="file-someone-else", + last_id="file-mine", + object="list", + ) + + managed_row = MagicMock() + managed_row.file_object = { + "id": "litellm_proxy:mine", + "bytes": 100, + "created_at": 1, + "filename": "mine.jsonl", + "object": "file", + "purpose": "batch", + "status": "processed", + } + prisma_client = AsyncMock() + prisma_client.db.litellm_managedfiletable.find_many.return_value = [managed_row] + proxy_managed_files = _PROXY_LiteLLMManagedFiles( + DualCache(), prisma_client=prisma_client + ) + + response = await proxy_managed_files.async_post_call_success_hook( + data={}, + user_api_key_dict=UserAPIKeyAuth( + user_id="mine-user", parent_otel_span=MagicMock() + ), + response=upstream_page, + ) + + assert [file_object.id for file_object in response.data] == ["litellm_proxy:mine"] + assert response.first_id == "litellm_proxy:mine" + assert response.last_id == "litellm_proxy:mine" From bd1478e4add9bb4a724e25dc1b5d921cb898b85d Mon Sep 17 00:00:00 2001 From: Daniel Cadenas Date: Wed, 8 Jul 2026 16:08:51 -0300 Subject: [PATCH 013/279] fix(responses): preserve Codex namespace tool calls --- .../streaming_iterator.py | 28 +- .../transformation.py | 96 +++- .../test_litellm_completion_responses.py | 461 +++++++++++++++++- 3 files changed, 571 insertions(+), 14 deletions(-) diff --git a/litellm/responses/litellm_completion_transformation/streaming_iterator.py b/litellm/responses/litellm_completion_transformation/streaming_iterator.py index ddd05075763..09964d56c81 100644 --- a/litellm/responses/litellm_completion_transformation/streaming_iterator.py +++ b/litellm/responses/litellm_completion_transformation/streaming_iterator.py @@ -124,6 +124,15 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): except (TypeError, ValueError): return None + def _responses_namespace_tool_call_fields(self, fn_name: str) -> tuple[str, str | None]: + tools = self.responses_api_request.get("tools") + namespace_map = LiteLLMCompletionResponsesConfig._namespace_tool_name_map(tools) + mapped = namespace_map.get(fn_name) + if mapped: + namespace, tool_name = mapped + return tool_name, namespace + return fn_name, None + def _is_reasoning_end(self, chunk): delta: Final = chunk.choices[0].delta @@ -182,13 +191,17 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): else: fn_name = str(getattr(fn, "name", "") or "") fn_args_delta = str(getattr(fn, "arguments", "") or "") + tool_name, tool_namespace = self._responses_namespace_tool_call_fields(fn_name) output_index = self._get_or_assign_tool_output_index(call_id) if call_id not in self._tool_args_by_call_id: self._tool_args_by_call_id[call_id] = "" self._sequence_number += 1 - item_kwargs = build_tool_call_item_kwargs(call_id, fn_name, "", "in_progress", self._custom_tool_names) + names = self._custom_tool_names + item_kwargs = build_tool_call_item_kwargs(call_id, tool_name, "", "in_progress", names) + if tool_namespace: + item_kwargs["namespace"] = tool_namespace event = OutputItemAddedEvent( type=ResponsesAPIStreamEvents.OUTPUT_ITEM_ADDED, output_index=output_index, @@ -249,6 +262,7 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): else: fn_name = str(getattr(fn, "name", "") or "") fn_args = str(getattr(fn, "arguments", "") or "") + tool_name, tool_namespace = self._responses_namespace_tool_call_fields(fn_name) # Track if this is a new tool call that wasn't streamed is_new_tool_call = call_id not in self._tool_args_by_call_id @@ -257,7 +271,10 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): if is_new_tool_call: self._tool_args_by_call_id[call_id] = "" self._sequence_number += 1 - item_kwargs = build_tool_call_item_kwargs(call_id, fn_name, "", "in_progress", self._custom_tool_names) + names = self._custom_tool_names + item_kwargs = build_tool_call_item_kwargs(call_id, tool_name, "", "in_progress", names) + if tool_namespace: + item_kwargs["namespace"] = tool_namespace event = OutputItemAddedEvent( type=ResponsesAPIStreamEvents.OUTPUT_ITEM_ADDED, output_index=output_index, @@ -299,9 +316,10 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): self._pending_tool_events.append(done_event) self._sequence_number += 1 - item_kwargs = build_tool_call_item_kwargs( - call_id, fn_name, final_args, "completed", self._custom_tool_names - ) + names = self._custom_tool_names + item_kwargs = build_tool_call_item_kwargs(call_id, tool_name, final_args, "completed", names) + if tool_namespace: + item_kwargs["namespace"] = tool_namespace item_done_event = OutputItemDoneEvent( type=ResponsesAPIStreamEvents.OUTPUT_ITEM_DONE, output_index=output_index, diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index f54023836e5..4134a65c95a 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -78,6 +78,10 @@ from .custom_tools import ( unwrap_custom_tool_arguments, ) +NsMap = dict[str, tuple[str, str]] +NsTool = dict[str, Any] +RespTools = list[FunctionToolParam | OpenAIMcpServerTool] | None + ########### Initialize Classes used for Responses API ########### TOOL_CALLS_CACHE: Final = InMemoryCache() @@ -1204,6 +1208,10 @@ class LiteLLMCompletionResponsesConfig: if "cache_control" in item: image_block["cache_control"] = item["cache_control"] content_list.append(image_block) + elif item.get("type") == "encrypted_content": + encrypted_content = item.get("encrypted_content") + if encrypted_content is not None: + content_list.append({"type": "text", "text": str(encrypted_content)}) else: # Skip text blocks with None text to avoid downstream errors text_value = item.get("text") @@ -1264,6 +1272,45 @@ class LiteLLMCompletionResponsesConfig: """ return ChatCompletionSystemMessage(role="system", content=instructions or "") + @staticmethod + def _build_ns_chat_tool(ns: str, ns_desc: str, ns_tool: NsTool, nested: bool) -> ChatCompletionToolParam | None: + if nested and ns_tool.get("type") != "function": + return None + + raw_parameters = ns_tool.get("parameters") + parameters = dict(raw_parameters) if isinstance(raw_parameters, dict) else {} + normalized_parameters = parameters if parameters and "type" in parameters else {**parameters, "type": "object"} + tool_name = str(ns_tool.get("name") or "") + raw_description = str(ns_tool.get("description") or "") + description = raw_description + if nested and ns_desc: + description = f"{ns_desc}\n\n{raw_description}" if raw_description else ns_desc + chat_tool_name = f"{ns}__{tool_name}" if nested else tool_name + function: dict[str, Any] = {"name": chat_tool_name} + function["description"] = description + function["parameters"] = normalized_parameters + function["strict"] = bool(ns_tool.get("strict", False)) + return {"type": "function", "function": function} + + @staticmethod + def _namespace_chat_tools(tool: dict[str, Any]) -> list[ChatCompletionToolParam]: + namespace = str(tool.get("name") or "") + namespace_description = str(tool.get("description") or "") + namespace_tools = tool.get("tools") + if isinstance(namespace_tools, list): + chat_completion_tools: list[ChatCompletionToolParam] = [] + ns = namespace + ns_desc = namespace_description + for ns_tool in namespace_tools: + if not isinstance(ns_tool, dict): + continue + chat_tool = LiteLLMCompletionResponsesConfig._build_ns_chat_tool(ns, ns_desc, ns_tool, True) + if chat_tool is not None: + chat_completion_tools.append(chat_tool) + return chat_completion_tools + flat_tool = LiteLLMCompletionResponsesConfig._build_ns_chat_tool(namespace, namespace_description, tool, False) + return [flat_tool] if flat_tool is not None else [] + @staticmethod def transform_responses_api_tools_to_chat_completion_tools( tools: list[FunctionToolParam | OpenAIMcpServerTool] | None, @@ -1317,13 +1364,15 @@ class LiteLLMCompletionResponsesConfig: if tool.get("input_examples"): chat_completion_tool["input_examples"] = tool.get("input_examples") chat_completion_tools.append(cast(ChatCompletionToolParam, chat_completion_tool)) + elif tool.get("type") == "namespace": + chat_completion_tools.extend(LiteLLMCompletionResponsesConfig._namespace_chat_tools(tool)) elif tool.get("type") == "custom": converted = convert_custom_tool_to_function_tool(tool) if converted is not None: chat_completion_tools.append(converted) else: _tool_type = tool.get("type") - if _tool_type in ("computer_use", "image_generation", "namespace", "shell"): + if _tool_type in ("computer_use", "image_generation", "shell"): # Drop unsupported Responses-API-only tool types that have no # Chat Completions equivalent. Passing them through verbatim # causes providers to reject the request with "'function' is a @@ -1379,6 +1428,42 @@ class LiteLLMCompletionResponsesConfig: result.append(dict(tool)) return result + @staticmethod + def _namespace_tool_name_map(tools: RespTools) -> NsMap: + namespace_tool_names: NsMap = {} + ambiguous_unqualified_names: set[str] = set() + for tool in tools or []: + if not isinstance(tool, dict) or tool.get("type") != "namespace": + continue + namespace = str(tool.get("name") or "") + for namespace_tool in tool.get("tools") or []: + if not isinstance(namespace_tool, dict) or namespace_tool.get("type") != "function": + continue + tool_name = str(namespace_tool.get("name") or "") + namespace_tool_names[f"{namespace}__{tool_name}"] = (namespace, tool_name) + if tool_name in ambiguous_unqualified_names: + continue + existing = namespace_tool_names.get(tool_name) + if existing is not None and existing != (namespace, tool_name): + ambiguous_unqualified_names.add(tool_name) + namespace_tool_names.pop(tool_name, None) + continue + namespace_tool_names[tool_name] = (namespace, tool_name) + return namespace_tool_names + + @staticmethod + def _restore_namespace_tool_name(tool_name: str, names: NsMap) -> tuple[str, str | None]: + mapped = names.get(tool_name) + if mapped is None: + return tool_name, None + namespace, restored_tool_name = mapped + return restored_tool_name, namespace + + @staticmethod + def _set_tool_call_namespace(output_tool_call: ResponseFunctionToolCall, namespace: str | None) -> None: + if namespace: + setattr(output_tool_call, "namespace", namespace) + @staticmethod def transform_chat_completion_tools_to_responses_tools( chat_completion_response: ModelResponse, @@ -1404,8 +1489,11 @@ class LiteLLMCompletionResponsesConfig: # Extract custom tool names from the original request custom_tool_names: set[str] = set() + namespace_tool_names: NsMap = {} if responses_api_request and "tools" in responses_api_request: - custom_tool_names = extract_custom_tool_names(responses_api_request["tools"]) + req_tools = responses_api_request["tools"] + custom_tool_names = extract_custom_tool_names(req_tools) + namespace_tool_names = LiteLLMCompletionResponsesConfig._namespace_tool_name_map(req_tools) responses_tools: Final[list[ResponseFunctionToolCall | CustomToolCallOutputItem]] = [] for tool in all_chat_completion_tools: @@ -1430,6 +1518,9 @@ class LiteLLMCompletionResponsesConfig: responses_tools.append(custom_item) else: # Build regular function_call output item + restore_name = LiteLLMCompletionResponsesConfig._restore_namespace_tool_name + tool_name, namespace = restore_name(tool_name, namespace_tool_names) + provider_specific_fields: dict | None = None if hasattr(tool, "provider_specific_fields") and getattr(tool, "provider_specific_fields", None): provider_specific_fields = getattr(tool, "provider_specific_fields") @@ -1454,6 +1545,7 @@ class LiteLLMCompletionResponsesConfig: type="function_call", status=function_definition.get("status") or "completed", ) + LiteLLMCompletionResponsesConfig._set_tool_call_namespace(output_tool_call, namespace) # Pass through provider_specific_fields as-is if present if provider_specific_fields: diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 51f757c9eaf..38c50693759 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -11,10 +11,6 @@ from litellm.responses.litellm_completion_transformation.transformation import ( TOOL_CALLS_CACHE, LiteLLMCompletionResponsesConfig, ) -from litellm.types.llms.openai import ( - ChatCompletionResponseMessage, - ChatCompletionToolMessage, -) from litellm.types.utils import ( ChatCompletionMessageToolCall, Choices, @@ -608,6 +604,71 @@ class TestLiteLLMCompletionResponsesConfig: assert hasattr(responses_api_response, "_hidden_params") assert responses_api_response._hidden_params == {} + def test_transform_chat_completion_response_restores_namespace_tool_call(self): + tool_call_id = "call_namespace_restore" + chat_completion_response = ModelResponse( + id="test-response-id", + created=1234567890, + model="gemini-3.1-pro-preview-customtools", + object="chat.completion", + choices=[ + Choices( + finish_reason="tool_calls", + index=0, + message=Message( + content=None, + role="assistant", + tool_calls=[ + ChatCompletionMessageToolCall( + id=tool_call_id, + type="function", + function=Function( + name="collaboration__spawn_agent", + arguments='{"message":"hello"}', + ), + ) + ], + ), + ) + ], + ) + + try: + responses_api_response = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( + request_input="Spawn an agent", + responses_api_request={ + "tools": [ + { + "type": "namespace", + "name": "collaboration", + "tools": [ + { + "type": "function", + "name": "spawn_agent", + "parameters": { + "type": "object", + "properties": {}, + }, + } + ], + } + ] + }, + chat_completion_response=chat_completion_response, + ) + finally: + TOOL_CALLS_CACHE.delete_cache(key=tool_call_id) + + tool_calls = [ + item + for item in responses_api_response.output + if item.type == "function_call" + ] + assert len(tool_calls) == 1 + assert tool_calls[0].name == "spawn_agent" + assert tool_calls[0].namespace == "collaboration" + assert tool_calls[0].arguments == '{"message":"hello"}' + class TestFunctionCallTransformation: """Test cases for function_call input transformation""" @@ -1037,6 +1098,29 @@ class TestContentTypeTransformation: assert result[0]["text"] == "valid text" assert result[1]["text"] == "another valid" + def test_encrypted_content_blocks_preserved_as_text(self): + """ + OpenAI Responses agent messages can include encrypted_content blocks. + Chat-completions providers need the payload as text instead of silently + dropping it. + """ + content = [ + {"type": "input_text", "text": "Payload:\n"}, + { + "type": "encrypted_content", + "encrypted_content": "Reply exactly INPUT_AGENT_OK", + }, + ] + + result = LiteLLMCompletionResponsesConfig._transform_responses_api_content_to_chat_completion_content( + content + ) + + assert result == [ + {"type": "text", "text": "Payload:\n"}, + {"type": "text", "text": "Reply exactly INPUT_AGENT_OK"}, + ] + class TestToolTransformation: """Test cases for tool transformation from Responses API to Chat Completion format""" @@ -1642,6 +1726,181 @@ class TestToolTransformation: assert "web_search_options" not in result + def test_transform_nested_namespace_tools_to_function_tools(self): + """Codex Responses namespace tools contain nested functions that chat + providers need as flattened function names.""" + namespace_tool = { + "type": "namespace", + "name": "collaboration", + "description": "Multi-agent tools", + "tools": [ + { + "type": "function", + "name": "spawn_agent", + "description": "Spawn an agent", + "parameters": { + "type": "object", + "properties": { + "task_name": {"type": "string"}, + "message": {"type": "string"}, + }, + "required": ["task_name", "message"], + }, + } + ], + } + + result_tools, web_search_options = ( + LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools( + tools=[namespace_tool] + ) + ) + + assert web_search_options is None + assert len(result_tools) == 1 + result_tool = result_tools[0] + assert result_tool["type"] == "function" + assert result_tool["function"]["name"] == "collaboration__spawn_agent" + assert result_tool["function"]["parameters"] == namespace_tool["tools"][0]["parameters"] + assert result_tool["function"]["description"] == "Multi-agent tools\n\nSpawn an agent" + + def test_transform_flat_namespace_tools_to_function_tools(self): + namespace_tool = { + "type": "namespace", + "name": "mcp__node_repl", + "description": "Run JavaScript in the node REPL", + "parameters": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "JavaScript source to evaluate", + } + }, + "required": ["code"], + }, + } + + result_tools, web_search_options = ( + LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools( + tools=[namespace_tool] + ) + ) + + assert web_search_options is None + assert len(result_tools) == 1 + result_tool = result_tools[0] + assert result_tool["type"] == "function" + assert result_tool["function"]["name"] == "mcp__node_repl" + assert result_tool["function"]["description"] == "Run JavaScript in the node REPL" + assert result_tool["function"]["parameters"] == namespace_tool["parameters"] + + def test_namespace_tool_name_map_accepts_unique_unqualified_tool_names(self): + """Some chat providers return the nested tool name without its namespace.""" + namespace_tool = { + "type": "namespace", + "name": "collaboration", + "tools": [ + { + "type": "function", + "name": "wait_agent", + "parameters": {"type": "object", "properties": {}}, + } + ], + } + + result = LiteLLMCompletionResponsesConfig._namespace_tool_name_map( + [namespace_tool] + ) + + assert result["collaboration__wait_agent"] == ("collaboration", "wait_agent") + assert result["wait_agent"] == ("collaboration", "wait_agent") + + def test_namespace_tool_name_map_drops_ambiguous_unqualified_names(self): + tools = [ + {"type": "function", "name": "ordinary"}, + { + "type": "namespace", + "name": "alpha", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object", "properties": {}}, + } + ], + }, + { + "type": "namespace", + "name": "beta", + "tools": [ + {"type": "namespace", "name": "ignored"}, + { + "type": "function", + "name": "run", + "parameters": {"type": "object", "properties": {}}, + }, + ], + }, + { + "type": "namespace", + "name": "gamma", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object", "properties": {}}, + } + ], + }, + ] + + result = LiteLLMCompletionResponsesConfig._namespace_tool_name_map( + tools + ) + + assert result["alpha__run"] == ("alpha", "run") + assert result["beta__run"] == ("beta", "run") + assert result["gamma__run"] == ("gamma", "run") + assert "run" not in result + + def test_restore_namespace_tool_name_leaves_unknown_tool_unchanged(self): + tool_name, namespace = LiteLLMCompletionResponsesConfig._restore_namespace_tool_name( + "mcp__node_repl", + {}, + ) + + assert tool_name == "mcp__node_repl" + assert namespace is None + + def test_transform_nested_namespace_ignores_non_function_subtools(self): + namespace_tool = { + "type": "namespace", + "name": "collaboration", + "tools": [ + "ignored", + {"type": "namespace", "name": "ignored"}, + { + "type": "function", + "name": "spawn_agent", + "parameters": {"properties": {"task_name": {"type": "string"}}}, + }, + ], + } + + result_tools, _ = ( + LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools( + tools=[namespace_tool] + ) + ) + + assert len(result_tools) == 1 + assert result_tools[0]["function"]["name"] == "collaboration__spawn_agent" + assert result_tools[0]["function"]["parameters"] == { + "properties": {"task_name": {"type": "string"}}, + "type": "object", + } + def test_bedrock_anthropic_responses_tools_yield_only_function_toolspec(self): """ End-to-end (no network) of the LIT-3858 acceptance criterion: the mixed tools array @@ -2185,7 +2444,7 @@ class TestStreamingIDConsistency: # Transform chunks to response API events event1 = iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk1) event2 = iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk2) - event3 = iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk3) + iterator._transform_chat_completion_chunk_to_response_api_chunk(chunk3) # Assert: All events should use the same item_id (from the first chunk) assert event1 is not None, "First event should not be None" @@ -2612,8 +2871,6 @@ class TestEnsureOutputItemContentPartAdded: def _make_iterator(self): """Create a minimal LiteLLMCompletionStreamingIterator for testing.""" - from unittest.mock import MagicMock - from litellm.responses.litellm_completion_transformation.streaming_iterator import ( LiteLLMCompletionStreamingIterator, ) @@ -2628,6 +2885,15 @@ class TestEnsureOutputItemContentPartAdded: iterator._cached_reasoning_item_id = None iterator._reasoning_active = False iterator._pending_response_events = [] + iterator._pending_tool_events = [] + iterator._tool_output_index_by_call_id = {} + iterator._tool_args_by_call_id = {} + iterator._tool_call_id_by_index = {} + iterator._ambiguous_tool_call_indexes = set() + iterator._next_tool_output_index = 1 + iterator._final_tool_events_queued = False + iterator._custom_tool_names = set() + iterator.responses_api_request = {} return iterator def _make_text_chunk(self): @@ -2674,6 +2940,187 @@ class TestEnsureOutputItemContentPartAdded: assert events[1].part.type == "output_text" assert iterator.sent_content_part_added_event is True + def test_streaming_namespace_tool_calls_restore_responses_namespace(self): + """Flattened chat-completion namespace tool calls must stream back as + Responses function calls with name + namespace split.""" + iterator = self._make_iterator() + iterator.responses_api_request = { + "tools": [ + { + "type": "namespace", + "name": "collaboration", + "tools": [ + { + "type": "function", + "name": "spawn_agent", + "parameters": {"type": "object", "properties": {}}, + } + ], + } + ] + } + + iterator._queue_tool_call_delta_events( + [ + { + "index": 0, + "id": "call_1", + "function": { + "name": "collaboration__spawn_agent", + "arguments": '{"task_name":"input_test"}', + }, + } + ] + ) + + added = iterator._pending_tool_events[0] + assert added.item.name == "spawn_agent" + assert added.item.namespace == "collaboration" + + def test_streaming_unqualified_namespace_tool_calls_restore_namespace(self): + """A unique nested tool name without the namespace still maps back.""" + iterator = self._make_iterator() + iterator.responses_api_request = { + "tools": [ + { + "type": "namespace", + "name": "collaboration", + "tools": [ + { + "type": "function", + "name": "wait_agent", + "parameters": {"type": "object", "properties": {}}, + } + ], + } + ] + } + + iterator._queue_tool_call_delta_events( + [ + { + "index": 0, + "id": "call_1", + "function": { + "name": "wait_agent", + "arguments": "{}", + }, + } + ] + ) + + added = iterator._pending_tool_events[0] + assert added.item.name == "wait_agent" + assert added.item.namespace == "collaboration" + + def test_streaming_flat_namespace_tool_call_keeps_flat_name(self): + iterator = self._make_iterator() + iterator.responses_api_request = { + "tools": [ + { + "type": "namespace", + "name": "mcp__node_repl", + "description": "Run JavaScript", + "parameters": { + "type": "object", + "properties": {"code": {"type": "string"}}, + }, + } + ] + } + + iterator._queue_tool_call_delta_events( + [ + { + "index": 0, + "id": "call_1", + "function": { + "name": "mcp__node_repl", + "arguments": '{"code":"1+1"}', + }, + } + ] + ) + + chat_completion_response = ModelResponse( + id="chatcmpl-test", + created=1234567890, + model="gemini-3.1-pro-preview-customtools", + object="chat.completion", + choices=[ + Choices( + finish_reason="tool_calls", + index=0, + message=Message( + content=None, + role="assistant", + tool_calls=[ + ChatCompletionMessageToolCall( + id="call_1", + type="function", + function=Function( + name="mcp__node_repl", + arguments='{"code":"1+1"}', + ), + ) + ], + ), + ) + ], + ) + + iterator._queue_final_tool_call_done_events(chat_completion_response) + + added = iterator._pending_tool_events[0] + done = iterator._pending_tool_events[-1] + assert added.item.name == "mcp__node_repl" + assert getattr(added.item, "namespace", None) is None + assert done.item.name == "mcp__node_repl" + assert getattr(done.item, "namespace", None) is None + + def test_streaming_final_only_namespace_tool_call_restores_namespace(self): + from unittest.mock import MagicMock + + iterator = self._make_iterator() + iterator.responses_api_request = { + "tools": [ + { + "type": "namespace", + "name": "collaboration", + "tools": [ + { + "type": "function", + "name": "spawn_agent", + "parameters": {"type": "object", "properties": {}}, + } + ], + } + ] + } + message = MagicMock() + message.tool_calls = [ + { + "id": "call_1", + "function": { + "name": "collaboration__spawn_agent", + "arguments": '{"message":"hello world"}', + }, + } + ] + complete_response = MagicMock() + complete_response.choices = [MagicMock(message=message)] + + iterator._queue_final_tool_call_done_events(complete_response) + + added = iterator._pending_tool_events[0] + delta_events = iterator._pending_tool_events[1:-2] + done = iterator._pending_tool_events[-1] + assert added.item.name == "spawn_agent" + assert added.item.namespace == "collaboration" + assert "".join(event.delta for event in delta_events) == '{"message":"hello world"}' + assert done.item.name == "spawn_agent" + assert done.item.namespace == "collaboration" + def test_emit_response_completed_uses_stream_finish_reason(self): """ When the assembled model response carries finish_reason="content_filter" From 08d4a39f23eac2108b814f50a1127b390be9114a Mon Sep 17 00:00:00 2001 From: Daniel Cadenas Date: Thu, 6 Aug 2026 21:25:57 -0300 Subject: [PATCH 014/279] fix(responses): harden namespace tool mapping --- .../custom_tools.py | 4 +- .../streaming_iterator.py | 7 +- .../transformation.py | 198 ++++++++------ .../test_litellm_completion_responses.py | 251 +++++++++++++++++- 4 files changed, 379 insertions(+), 81 deletions(-) diff --git a/litellm/responses/litellm_completion_transformation/custom_tools.py b/litellm/responses/litellm_completion_transformation/custom_tools.py index de4df3175e4..fa4ed73a1d6 100644 --- a/litellm/responses/litellm_completion_transformation/custom_tools.py +++ b/litellm/responses/litellm_completion_transformation/custom_tools.py @@ -111,7 +111,7 @@ class _CustomToolFormat(BaseModel): _ALLOWED_CALLERS_ADAPTER: Final = TypeAdapter(list[str] | None) -def _validated_allowed_callers(value: object) -> list[str] | None: +def validated_allowed_callers(value: object) -> list[str] | None: try: return _ALLOWED_CALLERS_ADAPTER.validate_python(value, strict=True) except ValidationError as exc: @@ -143,7 +143,7 @@ def convert_custom_tool_to_function_tool(tool: Mapping[str, object]) -> ChatComp name: Final = raw_name if isinstance(raw_name, str) else "" raw_description: Final = tool.get("description") description = (raw_description if isinstance(raw_description, str) else "") + _grammar_suffix(tool.get("format")) - allowed_callers: Final = _validated_allowed_callers(tool.get("allowed_callers")) + allowed_callers: Final = validated_allowed_callers(tool.get("allowed_callers")) function_chunk: Final = ChatCompletionToolParamFunctionChunk( name=name, description=description, diff --git a/litellm/responses/litellm_completion_transformation/streaming_iterator.py b/litellm/responses/litellm_completion_transformation/streaming_iterator.py index 09964d56c81..192f55df481 100644 --- a/litellm/responses/litellm_completion_transformation/streaming_iterator.py +++ b/litellm/responses/litellm_completion_transformation/streaming_iterator.py @@ -105,6 +105,9 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): self._accumulated_reasoning_content_parts: list[str] = [] self._accumulated_provider_specific_fields: dict[str, Any] = {} self._custom_tool_names: set[str] = extract_custom_tool_names(self.responses_api_request.get("tools")) + self._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + self.responses_api_request.get("tools") + ) def _get_or_assign_tool_output_index(self, call_id: str) -> int: existing: Final = self._tool_output_index_by_call_id.get(call_id) @@ -125,9 +128,7 @@ class LiteLLMCompletionStreamingIterator(ResponsesAPIStreamingIterator): return None def _responses_namespace_tool_call_fields(self, fn_name: str) -> tuple[str, str | None]: - tools = self.responses_api_request.get("tools") - namespace_map = LiteLLMCompletionResponsesConfig._namespace_tool_name_map(tools) - mapped = namespace_map.get(fn_name) + mapped: Final = self._namespace_tool_names.get(fn_name) if mapped: namespace, tool_name = mapped return tool_name, namespace diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index 4134a65c95a..1854ce6866a 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -4,8 +4,9 @@ Handles transforming from Responses API -> LiteLLM completion (Chat Completion import json import re -from collections.abc import Sequence -from typing import Any, Final, Literal, cast +from collections.abc import Mapping, Sequence +from types import MappingProxyType +from typing import Any, Final, Literal, TypeAlias, cast from openai.types.chat.chat_completion_named_tool_choice_param import ( ChatCompletionNamedToolChoiceParam, @@ -37,9 +38,11 @@ from litellm.types.llms.openai import ( ChatCompletionToolCallFunctionChunk, ChatCompletionToolMessage, ChatCompletionToolParam, + ChatCompletionToolParamFunctionChunk, ChatCompletionUserMessage, GenericChatCompletionMessage, InputTokensDetails, + OpenAIChatCompletionTextObject, OpenAIMcpServerTool, OpenAIWebSearchOptions, OpenAIWebSearchUserLocation, @@ -76,11 +79,12 @@ from .custom_tools import ( extract_custom_tool_names, is_custom_tool_call, unwrap_custom_tool_arguments, + validated_allowed_callers, ) -NsMap = dict[str, tuple[str, str]] -NsTool = dict[str, Any] -RespTools = list[FunctionToolParam | OpenAIMcpServerTool] | None +NamespaceNameMap: TypeAlias = Mapping[str, tuple[str, str]] +NamespaceTool: TypeAlias = Mapping[str, object] +ResponseTools: TypeAlias = Sequence[Mapping[str, object]] | None ########### Initialize Classes used for Responses API ########### TOOL_CALLS_CACHE: Final = InMemoryCache() @@ -1211,7 +1215,9 @@ class LiteLLMCompletionResponsesConfig: elif item.get("type") == "encrypted_content": encrypted_content = item.get("encrypted_content") if encrypted_content is not None: - content_list.append({"type": "text", "text": str(encrypted_content)}) + content_list.append( + OpenAIChatCompletionTextObject(type="text", text=str(encrypted_content)) + ) else: # Skip text blocks with None text to avoid downstream errors text_value = item.get("text") @@ -1273,43 +1279,88 @@ class LiteLLMCompletionResponsesConfig: return ChatCompletionSystemMessage(role="system", content=instructions or "") @staticmethod - def _build_ns_chat_tool(ns: str, ns_desc: str, ns_tool: NsTool, nested: bool) -> ChatCompletionToolParam | None: - if nested and ns_tool.get("type") != "function": + def _build_ns_chat_tool( + namespace: str, + namespace_description: str, + namespace_tool: NamespaceTool, + nested: bool, + ) -> ChatCompletionToolParam | None: + if nested and namespace_tool.get("type") != "function": return None - raw_parameters = ns_tool.get("parameters") - parameters = dict(raw_parameters) if isinstance(raw_parameters, dict) else {} - normalized_parameters = parameters if parameters and "type" in parameters else {**parameters, "type": "object"} - tool_name = str(ns_tool.get("name") or "") - raw_description = str(ns_tool.get("description") or "") - description = raw_description - if nested and ns_desc: - description = f"{ns_desc}\n\n{raw_description}" if raw_description else ns_desc - chat_tool_name = f"{ns}__{tool_name}" if nested else tool_name - function: dict[str, Any] = {"name": chat_tool_name} - function["description"] = description - function["parameters"] = normalized_parameters - function["strict"] = bool(ns_tool.get("strict", False)) - return {"type": "function", "function": function} + raw_parameters: Final = namespace_tool.get("parameters") + parameters: Final = ( + MappingProxyType(raw_parameters) if isinstance(raw_parameters, Mapping) else MappingProxyType({}) + ) + normalized_parameters: Final = ( + parameters if parameters and "type" in parameters else MappingProxyType({**parameters, "type": "object"}) + ) + tool_name: Final = str(namespace_tool.get("name") or "") + raw_description: Final = str(namespace_tool.get("description") or "") + description: Final = ( + f"{namespace_description}\n\n{raw_description}" + if nested and namespace_description and raw_description + else namespace_description + if nested and namespace_description + else raw_description + ) + chat_tool_name: Final = f"{namespace}__{tool_name}" if nested else tool_name + function: Final = ChatCompletionToolParamFunctionChunk( + name=chat_tool_name, + description=description, + parameters=normalized_parameters, + strict=bool(namespace_tool.get("strict", False)), + ) + allowed_callers: Final = validated_allowed_callers(namespace_tool.get("allowed_callers")) + if allowed_callers is None: + return ChatCompletionToolParam(type="function", function=function) + return ChatCompletionToolParam(type="function", function=function, allowed_callers=allowed_callers) @staticmethod - def _namespace_chat_tools(tool: dict[str, Any]) -> list[ChatCompletionToolParam]: - namespace = str(tool.get("name") or "") - namespace_description = str(tool.get("description") or "") - namespace_tools = tool.get("tools") - if isinstance(namespace_tools, list): - chat_completion_tools: list[ChatCompletionToolParam] = [] - ns = namespace - ns_desc = namespace_description - for ns_tool in namespace_tools: - if not isinstance(ns_tool, dict): - continue - chat_tool = LiteLLMCompletionResponsesConfig._build_ns_chat_tool(ns, ns_desc, ns_tool, True) - if chat_tool is not None: - chat_completion_tools.append(chat_tool) - return chat_completion_tools - flat_tool = LiteLLMCompletionResponsesConfig._build_ns_chat_tool(namespace, namespace_description, tool, False) - return [flat_tool] if flat_tool is not None else [] + def _namespace_chat_tools(tool: NamespaceTool) -> tuple[ChatCompletionToolParam, ...]: + namespace: Final = str(tool.get("name") or "") + namespace_description: Final = str(tool.get("description") or "") + namespace_tools: Final = tool.get("tools") + if isinstance(namespace_tools, Sequence) and not isinstance(namespace_tools, (str, bytes)): + return tuple( + chat_tool + for raw_tool in namespace_tools + if isinstance(raw_tool, Mapping) + if ( + chat_tool := LiteLLMCompletionResponsesConfig._build_ns_chat_tool( + namespace, + namespace_description, + raw_tool, + True, + ) + ) + is not None + ) + flat_tool: Final = LiteLLMCompletionResponsesConfig._build_ns_chat_tool( + namespace, namespace_description, tool, False + ) + return (flat_tool,) if flat_tool is not None else () + + @staticmethod + def _validate_namespace_name_collisions(tools: ResponseTools) -> None: + top_level_function_names: Final = frozenset( + str(tool.get("name") or "") for tool in tools or () if tool.get("type") == "function" + ) + flattened_namespace_names: Final = frozenset( + f"{(tool.get('name') or '')!s}__{(namespace_tool.get('name') or '')!s}" + for tool in tools or () + if tool.get("type") == "namespace" + for namespace_tools in (tool.get("tools"),) + if isinstance(namespace_tools, Sequence) and not isinstance(namespace_tools, (str, bytes)) + for namespace_tool in namespace_tools + if isinstance(namespace_tool, Mapping) and namespace_tool.get("type") == "function" + ) + conflicting_tool_names: Final = top_level_function_names & flattened_namespace_names + if conflicting_tool_names: + raise ValueError( + "Top-level function names conflict with flattened namespace tools: " + + ", ".join(sorted(conflicting_tool_names)) + ) @staticmethod def transform_responses_api_tools_to_chat_completion_tools( @@ -1323,6 +1374,7 @@ class LiteLLMCompletionResponsesConfig: """ if tools is None: return [], None + LiteLLMCompletionResponsesConfig._validate_namespace_name_collisions(tools) chat_completion_tools: Final[list[ChatCompletionToolParam | OpenAIMcpServerTool]] = [] web_search_options: OpenAIWebSearchOptions | None = None for tool in tools: @@ -1429,41 +1481,43 @@ class LiteLLMCompletionResponsesConfig: return result @staticmethod - def _namespace_tool_name_map(tools: RespTools) -> NsMap: - namespace_tool_names: NsMap = {} - ambiguous_unqualified_names: set[str] = set() - for tool in tools or []: - if not isinstance(tool, dict) or tool.get("type") != "namespace": - continue - namespace = str(tool.get("name") or "") - for namespace_tool in tool.get("tools") or []: - if not isinstance(namespace_tool, dict) or namespace_tool.get("type") != "function": - continue - tool_name = str(namespace_tool.get("name") or "") - namespace_tool_names[f"{namespace}__{tool_name}"] = (namespace, tool_name) - if tool_name in ambiguous_unqualified_names: - continue - existing = namespace_tool_names.get(tool_name) - if existing is not None and existing != (namespace, tool_name): - ambiguous_unqualified_names.add(tool_name) - namespace_tool_names.pop(tool_name, None) - continue - namespace_tool_names[tool_name] = (namespace, tool_name) - return namespace_tool_names + def namespace_tool_name_map(tools: ResponseTools) -> NamespaceNameMap: + namespace_entries: Final = tuple( + (str(tool.get("name") or ""), str(namespace_tool.get("name") or "")) + for tool in tools or () + if tool.get("type") == "namespace" + for namespace_tools in (tool.get("tools"),) + if isinstance(namespace_tools, Sequence) and not isinstance(namespace_tools, (str, bytes)) + for namespace_tool in namespace_tools + if isinstance(namespace_tool, Mapping) and namespace_tool.get("type") == "function" + ) + top_level_function_names: Final = frozenset( + str(tool.get("name") or "") for tool in tools or () if tool.get("type") == "function" + ) + unqualified_counts: Final = MappingProxyType( + { + tool_name: sum(1 for _, candidate_name in namespace_entries if candidate_name == tool_name) + for tool_name in frozenset(tool_name for _, tool_name in namespace_entries) + } + ) + unambiguous_entries: Final = tuple( + (tool_name, (namespace, tool_name)) + for namespace, tool_name in namespace_entries + if tool_name not in top_level_function_names and unqualified_counts[tool_name] == 1 + ) + qualified_entries: Final = tuple( + (f"{namespace}__{tool_name}", (namespace, tool_name)) for namespace, tool_name in namespace_entries + ) + return MappingProxyType(dict(qualified_entries + unambiguous_entries)) @staticmethod - def _restore_namespace_tool_name(tool_name: str, names: NsMap) -> tuple[str, str | None]: + def _restore_namespace_tool_name(tool_name: str, names: NamespaceNameMap) -> tuple[str, str | None]: mapped = names.get(tool_name) if mapped is None: return tool_name, None namespace, restored_tool_name = mapped return restored_tool_name, namespace - @staticmethod - def _set_tool_call_namespace(output_tool_call: ResponseFunctionToolCall, namespace: str | None) -> None: - if namespace: - setattr(output_tool_call, "namespace", namespace) - @staticmethod def transform_chat_completion_tools_to_responses_tools( chat_completion_response: ModelResponse, @@ -1487,13 +1541,9 @@ class LiteLLMCompletionResponsesConfig: value=tool_call, ) - # Extract custom tool names from the original request - custom_tool_names: set[str] = set() - namespace_tool_names: NsMap = {} - if responses_api_request and "tools" in responses_api_request: - req_tools = responses_api_request["tools"] - custom_tool_names = extract_custom_tool_names(req_tools) - namespace_tool_names = LiteLLMCompletionResponsesConfig._namespace_tool_name_map(req_tools) + request_tools: Final = responses_api_request.get("tools") if responses_api_request is not None else None + custom_tool_names: Final = extract_custom_tool_names(request_tools) + namespace_tool_names: Final = LiteLLMCompletionResponsesConfig.namespace_tool_name_map(request_tools) responses_tools: Final[list[ResponseFunctionToolCall | CustomToolCallOutputItem]] = [] for tool in all_chat_completion_tools: @@ -1545,7 +1595,7 @@ class LiteLLMCompletionResponsesConfig: type="function_call", status=function_definition.get("status") or "completed", ) - LiteLLMCompletionResponsesConfig._set_tool_call_namespace(output_tool_call, namespace) + output_tool_call.namespace = namespace # Pass through provider_specific_fields as-is if present if provider_specific_fields: diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 38c50693759..f4c744f726d 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -670,6 +670,58 @@ class TestLiteLLMCompletionResponsesConfig: assert tool_calls[0].arguments == '{"message":"hello"}' + def test_transform_top_level_function_collision_stays_unnamespaced(self): + tool_call_id = "call_top_level_collision" + chat_completion_response = ModelResponse( + choices=[ + Choices( + finish_reason="tool_calls", + index=0, + message=Message( + content=None, + role="assistant", + tool_calls=[ + ChatCompletionMessageToolCall( + id=tool_call_id, + type="function", + function=Function(name="run", arguments="{}"), + ) + ], + ), + ) + ] + ) + responses_api_request = { + "tools": [ + {"type": "function", "name": "run", "parameters": {"type": "object"}}, + { + "type": "namespace", + "name": "admin", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object"}, + } + ], + }, + ] + } + + try: + response = LiteLLMCompletionResponsesConfig.transform_chat_completion_response_to_responses_api_response( + request_input="Run the tool", + responses_api_request=responses_api_request, + chat_completion_response=chat_completion_response, + ) + finally: + TOOL_CALLS_CACHE.delete_cache(key=tool_call_id) + + tool_call = next(item for item in response.output if item.type == "function_call") + assert tool_call.name == "run" + assert getattr(tool_call, "namespace", None) is None + + class TestFunctionCallTransformation: """Test cases for function_call input transformation""" @@ -1764,6 +1816,55 @@ class TestToolTransformation: assert result_tool["function"]["parameters"] == namespace_tool["tools"][0]["parameters"] assert result_tool["function"]["description"] == "Multi-agent tools\n\nSpawn an agent" + @pytest.mark.parametrize("nested", [True, False]) + def test_transform_namespace_tools_preserves_allowed_callers(self, nested): + function_tool = { + "type": "function", + "name": "spawn_agent", + "parameters": {"type": "object", "properties": {}}, + "allowed_callers": ["code_execution_20250825"], + } + namespace_tool = ( + { + "type": "namespace", + "name": "collaboration", + "tools": [function_tool], + } + if nested + else {**function_tool, "type": "namespace"} + ) + + result_tools, _ = LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools( + tools=[namespace_tool] + ) + + assert result_tools[0]["allowed_callers"] == ["code_execution_20250825"] + + + @pytest.mark.parametrize("nested", [True, False]) + def test_transform_namespace_tools_rejects_invalid_allowed_callers(self, nested): + function_tool = { + "type": "function", + "name": "spawn_agent", + "parameters": {"type": "object", "properties": {}}, + "allowed_callers": "code_execution_20250825", + } + namespace_tool = ( + { + "type": "namespace", + "name": "collaboration", + "tools": [function_tool], + } + if nested + else {**function_tool, "type": "namespace"} + ) + + with pytest.raises(ValueError, match="allowed_callers must be a list of strings"): + LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools( + tools=[namespace_tool] + ) + + def test_transform_flat_namespace_tools_to_function_tools(self): namespace_tool = { "type": "namespace", @@ -1809,7 +1910,7 @@ class TestToolTransformation: ], } - result = LiteLLMCompletionResponsesConfig._namespace_tool_name_map( + result = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( [namespace_tool] ) @@ -1855,7 +1956,7 @@ class TestToolTransformation: }, ] - result = LiteLLMCompletionResponsesConfig._namespace_tool_name_map( + result = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( tools ) @@ -1864,6 +1965,55 @@ class TestToolTransformation: assert result["gamma__run"] == ("gamma", "run") assert "run" not in result + def test_namespace_tool_name_map_drops_top_level_function_collision(self): + tools = [ + {"type": "function", "name": "run", "parameters": {"type": "object"}}, + { + "type": "namespace", + "name": "admin", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object"}, + } + ], + }, + ] + + result = LiteLLMCompletionResponsesConfig.namespace_tool_name_map(tools) + + assert result["admin__run"] == ("admin", "run") + assert "run" not in result + + + def test_transform_tools_rejects_flattened_name_collision(self): + tools = [ + { + "type": "function", + "name": "admin__run", + "parameters": {"type": "object"}, + }, + { + "type": "namespace", + "name": "admin", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object"}, + } + ], + }, + ] + + with pytest.raises( + ValueError, + match="Top-level function names conflict with flattened namespace tools: admin__run", + ): + LiteLLMCompletionResponsesConfig.transform_responses_api_tools_to_chat_completion_tools(tools=tools) + + def test_restore_namespace_tool_name_leaves_unknown_tool_unchanged(self): tool_name, namespace = LiteLLMCompletionResponsesConfig._restore_namespace_tool_name( "mcp__node_repl", @@ -2894,6 +3044,7 @@ class TestEnsureOutputItemContentPartAdded: iterator._final_tool_events_queued = False iterator._custom_tool_names = set() iterator.responses_api_request = {} + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map(None) return iterator def _make_text_chunk(self): @@ -2960,6 +3111,10 @@ class TestEnsureOutputItemContentPartAdded: ] } + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + iterator.responses_api_request.get("tools") + ) + iterator._queue_tool_call_delta_events( [ { @@ -2996,6 +3151,10 @@ class TestEnsureOutputItemContentPartAdded: ] } + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + iterator.responses_api_request.get("tools") + ) + iterator._queue_tool_call_delta_events( [ { @@ -3029,6 +3188,10 @@ class TestEnsureOutputItemContentPartAdded: ] } + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + iterator.responses_api_request.get("tools") + ) + iterator._queue_tool_call_delta_events( [ { @@ -3097,6 +3260,10 @@ class TestEnsureOutputItemContentPartAdded: } ] } + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + iterator.responses_api_request.get("tools") + ) + message = MagicMock() message.tool_calls = [ { @@ -3121,6 +3288,86 @@ class TestEnsureOutputItemContentPartAdded: assert done.item.name == "spawn_agent" assert done.item.namespace == "collaboration" + def test_streaming_top_level_function_collision_stays_unnamespaced(self): + iterator = self._make_iterator() + iterator.responses_api_request = { + "tools": [ + {"type": "function", "name": "run", "parameters": {"type": "object"}}, + { + "type": "namespace", + "name": "admin", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object"}, + } + ], + }, + ] + } + + iterator._namespace_tool_names = LiteLLMCompletionResponsesConfig.namespace_tool_name_map( + iterator.responses_api_request.get("tools") + ) + + iterator._queue_tool_call_delta_events( + [ + { + "index": 0, + "id": "call_top_level", + "function": {"name": "run", "arguments": "{}"}, + } + ] + ) + + added = iterator._pending_tool_events[0] + assert added.item.name == "run" + assert getattr(added.item, "namespace", None) is None + + + def test_streaming_namespace_map_is_built_once(self): + from unittest.mock import MagicMock, patch + + from litellm.responses.litellm_completion_transformation.streaming_iterator import ( + LiteLLMCompletionStreamingIterator, + ) + + mock_stream_wrapper = MagicMock() + mock_stream_wrapper.logging_obj = MagicMock() + request = { + "tools": [ + { + "type": "namespace", + "name": "admin", + "tools": [ + { + "type": "function", + "name": "run", + "parameters": {"type": "object"}, + } + ], + } + ] + } + + with patch.object( + LiteLLMCompletionResponsesConfig, + "namespace_tool_name_map", + wraps=LiteLLMCompletionResponsesConfig.namespace_tool_name_map, + ) as namespace_map: + iterator = LiteLLMCompletionStreamingIterator( + model="test-model", + litellm_custom_stream_wrapper=mock_stream_wrapper, + request_input="test", + responses_api_request=request, + ) + iterator._responses_namespace_tool_call_fields("admin__run") + iterator._responses_namespace_tool_call_fields("admin__run") + + namespace_map.assert_called_once_with(request["tools"]) + + def test_emit_response_completed_uses_stream_finish_reason(self): """ When the assembled model response carries finish_reason="content_filter" From 8466ed0920021b765c0ec6483b0e96d121f2373b Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 21:05:51 +0000 Subject: [PATCH 015/279] fix(websearch_interception): bill and rate limit intercepted searches against the calling key An intercepted web search called litellm.asearch() with only the search tool's litellm_params, so the search request carried no owner. The proxy's spend hook skips any call with no key, user or team attached, so the search's provider cost never reached SpendLogs; it was missing from the Logs page and never counted against the caller's budget. The same path never ran the rate limiter either, so an intercepted search was free of the key's RPM/TPM limits. The search now carries the originating key's attribution metadata (key hash, alias, user, team, org, plus model_group set to the resolved search tool) and runs the caller's rate limit checks before hitting the provider, matching what a direct /v1/search request gets. SDK calls with no proxy auth context are unchanged. Resolves LIT-5033 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../websearch_interception/handler.py | 46 ++++++++- .../test_websearch_interception_handler.py | 97 +++++++++++++++++-- 2 files changed, 132 insertions(+), 11 deletions(-) diff --git a/litellm/integrations/websearch_interception/handler.py b/litellm/integrations/websearch_interception/handler.py index 71388134e98..6be64c89828 100644 --- a/litellm/integrations/websearch_interception/handler.py +++ b/litellm/integrations/websearch_interception/handler.py @@ -40,7 +40,7 @@ from litellm.types.integrations.websearch_interception import ( WebSearchInterceptionConfig, ) from litellm.types.llms.openai import AllMessageValues -from litellm.types.utils import CallTypes, LlmProviders +from litellm.types.utils import CallTypes, LlmProviders, StandardLoggingUserAPIKeyMetadata from litellm.utils import ProviderConfigManager if TYPE_CHECKING: @@ -1288,10 +1288,14 @@ class WebSearchInterceptionLogger(CustomLogger): search_tool: Final = self._select_search_tool_from_router(llm_router=llm_router) search_provider: str | None = None search_litellm_params: dict[str, Any] = {} + search_tool_name: str | None = None if search_tool is not None: await self._authorize_search_tool(search_tool=search_tool, kwargs=kwargs) search_litellm_params = dict(search_tool.get("litellm_params", {}) or {}) search_provider = search_litellm_params.get("search_provider") + selected_tool_name = search_tool.get("search_tool_name") + if isinstance(selected_tool_name, str) and selected_tool_name: + search_tool_name = selected_tool_name # Fallback to perplexity if no router or no search tools configured if not search_provider: @@ -1304,10 +1308,22 @@ class WebSearchInterceptionLogger(CustomLogger): verbose_logger.debug( "WebSearchInterception: Executing search for '%s' using provider '%s'", query, search_provider ) + user_api_key_auth: Final = self._get_user_api_key_auth_from_kwargs(kwargs) + search_metadata: Final = ( + None + if user_api_key_auth is None + else self._build_search_request_metadata( + user_api_key_auth=user_api_key_auth, + search_tool_name=search_tool_name, + ) + ) search_kwargs: Final = { - key: value - for key, value in search_litellm_params.items() - if key != "search_provider" and value is not None + **{ + key: value + for key, value in search_litellm_params.items() + if key != "search_provider" and value is not None + }, + **({} if search_metadata is None else {"litellm_metadata": search_metadata}), } result: Final = await litellm.asearch(query=query, search_provider=search_provider, **search_kwargs) @@ -1366,6 +1382,28 @@ class WebSearchInterceptionLogger(CustomLogger): team_object=team_object, ) + @staticmethod + def _build_search_request_metadata( + user_api_key_auth: "UserAPIKeyAuth", + search_tool_name: str | None, + ) -> dict[str, object]: + """ + Spend-tracking metadata for the intercepted search, so its provider cost is logged + and billed against the key/user/team that made the originating LLM request instead + of being dropped by the proxy's spend hook for lack of an owner. + """ + from litellm.proxy.litellm_pre_call_utils import LiteLLMProxyRequestSetup + + user_api_key_metadata: StandardLoggingUserAPIKeyMetadata = ( + LiteLLMProxyRequestSetup.get_sanitized_user_information_from_key(user_api_key_dict=user_api_key_auth) + ) + return { + **user_api_key_metadata, + **({} if search_tool_name is None else {"model_group": search_tool_name}), + "user_api_key": user_api_key_auth.api_key, + "user_api_key_auth": user_api_key_auth, + } + @staticmethod def _get_user_api_key_auth_from_kwargs(kwargs: Mapping[str, object] | None) -> "UserAPIKeyAuth | None": if not kwargs: diff --git a/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py b/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py index b6ff3b70a4d..f39f41a6d12 100644 --- a/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py +++ b/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py @@ -221,14 +221,97 @@ async def test_execute_search_passes_selected_search_tool_litellm_params(monkeyp kwargs={"litellm_params": {"metadata": {"user_api_key_auth": user_api_key_auth}}}, ) - mock_asearch.assert_awaited_once_with( - query="what is litellm", - search_provider="tavily", - api_key="fake-ui-key", - api_base="https://api.tavily.com", - timeout=10.0, - max_retries=2, + forwarded_kwargs = mock_asearch.await_args.kwargs + assert forwarded_kwargs["query"] == "what is litellm" + assert forwarded_kwargs["search_provider"] == "tavily" + assert forwarded_kwargs["api_key"] == "fake-ui-key" + assert forwarded_kwargs["api_base"] == "https://api.tavily.com" + assert forwarded_kwargs["timeout"] == 10.0 + assert forwarded_kwargs["max_retries"] == 2 + + +@pytest.mark.asyncio +async def test_execute_search_attributes_spend_to_the_calling_key(monkeypatch): + """An intercepted search is billed and logged against the key that made the LLM request. + + Without the forwarded attribution metadata the proxy's spend hook skips the search + entirely, so its provider cost never reaches SpendLogs or any budget. + """ + import litellm + from litellm.proxy import proxy_server + from litellm.proxy.hooks.proxy_track_cost_callback import _should_track_cost_callback + + logger = WebSearchInterceptionLogger( + enabled_providers=["bedrock"], + search_tool_name="perplexity-sonar-pro", ) + router = MagicMock() + router.search_tools = [ + { + "search_tool_name": "perplexity-sonar-pro", + "litellm_params": {"search_provider": "perplexity", "api_key": "fake-key"}, + } + ] + mock_asearch = AsyncMock(return_value=SearchResponse(object="search", results=[])) + user_api_key_auth = UserAPIKeyAuth( + api_key="hashed-sk-1234", + key_alias="alice-key", + user_id="user-alice", + org_id="org-1", + ) + + monkeypatch.setattr(proxy_server, "llm_router", router) + monkeypatch.setattr(litellm, "asearch", mock_asearch) + + await logger._execute_search( + "what is litellm", + kwargs={"litellm_params": {"metadata": {"user_api_key_auth": user_api_key_auth}}}, + ) + + forwarded_metadata = mock_asearch.await_args.kwargs["litellm_metadata"] + assert forwarded_metadata["user_api_key"] == "hashed-sk-1234" + assert forwarded_metadata["user_api_key_hash"] == "hashed-sk-1234" + assert forwarded_metadata["user_api_key_alias"] == "alice-key" + assert forwarded_metadata["user_api_key_user_id"] == "user-alice" + assert forwarded_metadata["user_api_key_org_id"] == "org-1" + assert forwarded_metadata["model_group"] == "perplexity-sonar-pro" + assert ( + _should_track_cost_callback( + user_api_key=forwarded_metadata["user_api_key"], + user_id=forwarded_metadata["user_api_key_user_id"], + team_id=forwarded_metadata["user_api_key_team_id"], + end_user_id=None, + call_type="asearch", + ) + is True + ) + + +@pytest.mark.asyncio +async def test_execute_search_without_proxy_auth_context_stays_sdk_only(monkeypatch): + """SDK callers have no key to attribute the search to, so no proxy metadata is invented.""" + import litellm + from litellm.proxy import proxy_server + + logger = WebSearchInterceptionLogger( + enabled_providers=["bedrock"], + search_tool_name="perplexity-sonar-pro", + ) + router = MagicMock() + router.search_tools = [ + { + "search_tool_name": "perplexity-sonar-pro", + "litellm_params": {"search_provider": "perplexity", "api_key": "fake-key"}, + } + ] + mock_asearch = AsyncMock(return_value=SearchResponse(object="search", results=[])) + + monkeypatch.setattr(proxy_server, "llm_router", router) + monkeypatch.setattr(litellm, "asearch", mock_asearch) + + await logger._execute_search("what is litellm", kwargs={"litellm_params": {}}) + + assert "litellm_metadata" not in mock_asearch.await_args.kwargs @pytest.mark.asyncio From 8d6247c9c12a3e37359c2287a6c2cc3d1bee61e1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 03:00:04 +0000 Subject: [PATCH 016/279] fix(proxy): send SSE keepalive pings on OpenAI-shaped streaming routes Streaming /chat/completions and /v1/responses emit nothing, not even response headers, until the upstream yields its first chunk, so an ingress with an idle read timeout (nginx proxy-read-timeout) drops long time-to-first-token streams. Reuses the existing Anthropic keepalive wrapper with a configurable ping payload, emitting an SSE comment on the OpenAI-shaped routes so conformant clients ignore it. Off unless litellm_settings.sse_keepalive_ping_interval_seconds is set. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/__init__.py | 6 ++ litellm/proxy/common_request_processing.py | 13 ++- litellm/proxy/common_utils/sse_keepalive.py | 7 +- .../proxy/common_utils/test_sse_keepalive.py | 54 ++++++++++--- .../proxy/test_common_request_processing.py | 81 +++++++++++++++++++ 5 files changed, 148 insertions(+), 13 deletions(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index e0c7d56361c..a29ee73013b 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -245,6 +245,12 @@ use_chat_completions_url_for_anthropic_messages: bool = bool( # config.yaml. strip_anthropic_total_tokens: bool = False anthropic_sse_ping_interval_seconds: float = 15.0 +# Emit an SSE comment (": ping") on OpenAI-shaped streaming routes (/chat/completions, +# /v1/responses, ...) whenever the upstream has sent nothing for this many seconds, so +# intermediaries with an idle read timeout (e.g. nginx `proxy-read-timeout`) don't drop +# long time-to-first-token streams. Disabled unless set, via +# `litellm_settings.sse_keepalive_ping_interval_seconds` in config.yaml. +sse_keepalive_ping_interval_seconds: float | None = None route_all_chat_openai_to_responses: bool = ( os.getenv("LITELLM_ROUTE_ALL_CHAT_OPENAI_TO_RESPONSES", "false").lower() == "true" ) # When True, routes all OpenAI /chat/completions requests through the Responses API bridge diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index 159d7508f4e..49627a91cf6 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -46,7 +46,11 @@ from litellm.proxy.common_utils.callback_utils import ( get_logging_caching_headers, get_remaining_tokens_and_requests_from_request_data, ) -from litellm.proxy.common_utils.sse_keepalive import wrap_sse_stream_with_keepalive_pings +from litellm.proxy.common_utils.sse_keepalive import ( + ANTHROPIC_PING_SSE_CHUNK, + SSE_COMMENT_PING_CHUNK, + wrap_sse_stream_with_keepalive_pings, +) from litellm.proxy.dd_span_tagger import DDSpanTagger from litellm.proxy.route_llm_request import route_request from litellm.proxy.utils import ProxyLogging, _check_and_merge_model_level_guardrails @@ -1984,6 +1988,7 @@ class ProxyBaseLLMRequestProcessing: generator=wrap_sse_stream_with_keepalive_pings( stream=selected_data_generator, ping_interval_seconds=litellm.anthropic_sse_ping_interval_seconds, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, ), media_type="text/event-stream", headers=custom_headers, @@ -2015,7 +2020,11 @@ class ProxyBaseLLMRequestProcessing: ) ) return await create_response( - generator=selected_data_generator, + generator=wrap_sse_stream_with_keepalive_pings( + stream=selected_data_generator, + ping_interval_seconds=litellm.sse_keepalive_ping_interval_seconds, + ping_chunk=SSE_COMMENT_PING_CHUNK, + ), media_type="text/event-stream", headers=custom_headers, request=request, diff --git a/litellm/proxy/common_utils/sse_keepalive.py b/litellm/proxy/common_utils/sse_keepalive.py index 6700700ff7c..d3ff4b0ca30 100644 --- a/litellm/proxy/common_utils/sse_keepalive.py +++ b/litellm/proxy/common_utils/sse_keepalive.py @@ -7,6 +7,7 @@ from typing import Final import anyio ANTHROPIC_PING_SSE_CHUNK: Final = 'event: ping\ndata: {"type": "ping"}\n\n' +SSE_COMMENT_PING_CHUNK: Final = ": ping\n\n" def _coerce_interval(ping_interval_seconds: float | str | None) -> float | None: @@ -24,16 +25,18 @@ def _coerce_interval(ping_interval_seconds: float | str | None) -> float | None: def wrap_sse_stream_with_keepalive_pings( stream: AsyncGenerator[str, None], ping_interval_seconds: float | str | None, + ping_chunk: str, ) -> AsyncGenerator[str, None]: interval: Final = _coerce_interval(ping_interval_seconds) if interval is None: return stream - return _keepalive_ping_stream(stream=stream, ping_interval_seconds=interval) + return _keepalive_ping_stream(stream=stream, ping_interval_seconds=interval, ping_chunk=ping_chunk) async def _keepalive_ping_stream( stream: AsyncGenerator[str, None], ping_interval_seconds: float, + ping_chunk: str, ) -> AsyncGenerator[str, None]: pending = asyncio.ensure_future( stream.__anext__() @@ -42,7 +45,7 @@ async def _keepalive_ping_stream( while True: await asyncio.wait({pending}, timeout=ping_interval_seconds) if not pending.done(): - yield ANTHROPIC_PING_SSE_CHUNK + yield ping_chunk continue try: yield pending.result() diff --git a/tests/test_litellm/proxy/common_utils/test_sse_keepalive.py b/tests/test_litellm/proxy/common_utils/test_sse_keepalive.py index 9cca9bbfe12..e343e46e187 100644 --- a/tests/test_litellm/proxy/common_utils/test_sse_keepalive.py +++ b/tests/test_litellm/proxy/common_utils/test_sse_keepalive.py @@ -22,7 +22,11 @@ async def test_pings_fill_mid_stream_silence_and_preserve_chunk_order(): await asyncio.sleep(0.3) yield TEXT_DELTA_CHUNK - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=gappy_stream(), ping_interval_seconds=0.05) + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=gappy_stream(), + ping_interval_seconds=0.05, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) collected: Final = [chunk async for chunk in wrapped] assert collected[0] == MESSAGE_START_CHUNK @@ -40,7 +44,11 @@ async def test_ping_emitted_while_waiting_for_first_chunk(): await asyncio.sleep(0.2) yield MESSAGE_START_CHUNK - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=slow_start_stream(), ping_interval_seconds=0.05) + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=slow_start_stream(), + ping_interval_seconds=0.05, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) collected: Final = [chunk async for chunk in wrapped] assert collected[0] == ANTHROPIC_PING_SSE_CHUNK @@ -54,7 +62,11 @@ async def test_no_pings_when_chunks_arrive_faster_than_interval(): yield TEXT_DELTA_CHUNK yield TEXT_DELTA_CHUNK - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=fast_stream(), ping_interval_seconds=1.0) + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=fast_stream(), + ping_interval_seconds=1.0, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) collected: Final = [chunk async for chunk in wrapped] assert collected == [MESSAGE_START_CHUNK, TEXT_DELTA_CHUNK, TEXT_DELTA_CHUNK] @@ -66,7 +78,11 @@ async def test_upstream_exception_propagates(): yield MESSAGE_START_CHUNK raise ValueError("upstream broke") - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=failing_stream(), ping_interval_seconds=5.0) + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=failing_stream(), + ping_interval_seconds=5.0, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) assert await wrapped.__anext__() == MESSAGE_START_CHUNK with pytest.raises(ValueError, match="upstream broke"): @@ -85,7 +101,11 @@ async def test_aclose_mid_silence_cancels_upstream_and_runs_its_cleanup(): finally: upstream_cleaned_up.set() - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=hung_stream(), ping_interval_seconds=0.05) + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=hung_stream(), + ping_interval_seconds=0.05, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) assert await wrapped.__anext__() == MESSAGE_START_CHUNK assert await wrapped.__anext__() == ANTHROPIC_PING_SSE_CHUNK @@ -100,7 +120,11 @@ async def test_non_positive_interval_returns_stream_unwrapped(): yield MESSAGE_START_CHUNK stream: Final = any_stream() - assert wrap_sse_stream_with_keepalive_pings(stream=stream, ping_interval_seconds=0) is stream + assert wrap_sse_stream_with_keepalive_pings( + stream=stream, + ping_interval_seconds=0, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) is stream await stream.aclose() @@ -123,7 +147,11 @@ async def test_invalid_config_interval_returns_stream_unwrapped(bad_interval: fl yield MESSAGE_START_CHUNK stream: Final = any_stream() - assert wrap_sse_stream_with_keepalive_pings(stream=stream, ping_interval_seconds=bad_interval) is stream + assert wrap_sse_stream_with_keepalive_pings( + stream=stream, + ping_interval_seconds=bad_interval, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) is stream await stream.aclose() @@ -133,7 +161,11 @@ async def test_numeric_string_interval_from_yaml_config_enables_pings(): await asyncio.sleep(0.2) yield MESSAGE_START_CHUNK - wrapped: Final = wrap_sse_stream_with_keepalive_pings(stream=slow_start_stream(), ping_interval_seconds="0.05") + wrapped: Final = wrap_sse_stream_with_keepalive_pings( + stream=slow_start_stream(), + ping_interval_seconds="0.05", + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ) collected: Final = [chunk async for chunk in wrapped] assert collected[0] == ANTHROPIC_PING_SSE_CHUNK @@ -147,7 +179,11 @@ async def test_create_response_streams_ping_first_for_slow_upstream(): yield MESSAGE_START_CHUNK response: Final = await create_response( - generator=wrap_sse_stream_with_keepalive_pings(stream=slow_start_stream(), ping_interval_seconds=0.05), + generator=wrap_sse_stream_with_keepalive_pings( + stream=slow_start_stream(), + ping_interval_seconds=0.05, + ping_chunk=ANTHROPIC_PING_SSE_CHUNK, + ), media_type="text/event-stream", headers={}, ) diff --git a/tests/test_litellm/proxy/test_common_request_processing.py b/tests/test_litellm/proxy/test_common_request_processing.py index aacc7498ccb..dd19560c166 100644 --- a/tests/test_litellm/proxy/test_common_request_processing.py +++ b/tests/test_litellm/proxy/test_common_request_processing.py @@ -34,10 +34,12 @@ from litellm.proxy.common_request_processing import ( _UpstreamClosingStreamingResponse, create_response, ) +from litellm.proxy.common_utils.sse_keepalive import SSE_COMMENT_PING_CHUNK from litellm.proxy.dd_span_tagger import DDSpanTagger from litellm.proxy._types import ProxyException from litellm.proxy._types import UserAPIKeyAuth as ProxyUserAPIKeyAuth from litellm.proxy.utils import ProxyLogging +from litellm.types.utils import ModelResponseStream class TestProxyBaseLLMRequestProcessing: @@ -5746,3 +5748,82 @@ class TestPerRequestModelGroupAlias: ) assert merged_for == ["group-b"] + + +class TestOpenAISseKeepalivePings: + """ + Regression for a streaming request dying at an ingress idle read timeout + (e.g. nginx `proxy-read-timeout`) when time-to-first-token exceeds it: the + OpenAI-shaped SSE routes must emit a keepalive comment while the upstream is + silent, once `litellm.sse_keepalive_ping_interval_seconds` is configured. + """ + + async def _run(self, monkeypatch, first_chunk_delay: float): + import litellm.proxy.common_request_processing as crp + from litellm.proxy._types import UserAPIKeyAuth as RealUserAPIKeyAuth + + logging_obj = MagicMock() + logging_obj.litellm_call_id = "call-keepalive" + logging_obj.cost_breakdown = None + processing_obj = ProxyBaseLLMRequestProcessing( + data={"model": "gpt-4o", "stream": True, "litellm_logging_obj": logging_obj} + ) + + async def upstream(): + await asyncio.sleep(first_chunk_delay) + yield ModelResponseStream() + + async def fake_route_request(**kwargs): + async def _llm_call(): + return upstream() + + return _llm_call() + + monkeypatch.setattr(crp, "route_request", fake_route_request) + + def select_data_generator(response, user_api_key_dict, request_data, request): + async def _gen(): + async for _ in response: + yield 'data: {"choices": []}\n\n' + + return _gen() + + proxy_logging_obj = MagicMock(spec=ProxyLogging) + proxy_logging_obj.during_call_hook = AsyncMock(return_value=None) + proxy_logging_obj.update_request_status = AsyncMock(return_value=None) + proxy_logging_obj.post_call_response_headers_hook = AsyncMock(return_value=None) + proxy_logging_obj.post_call_success_hook = AsyncMock() + + return await processing_obj.base_process_llm_request( + request=MagicMock(spec=Request, headers={}), + fastapi_response=Response(), + user_api_key_dict=RealUserAPIKeyAuth(api_key="sk-test"), + route_type="acompletion", + proxy_logging_obj=proxy_logging_obj, + general_settings={}, + proxy_config=MagicMock(spec=ProxyConfig), + select_data_generator=select_data_generator, + llm_router=None, + skip_pre_call_logic=True, + ) + + @pytest.mark.asyncio + async def test_ping_precedes_slow_first_chunk_on_chat_completions(self, monkeypatch): + monkeypatch.setattr(litellm, "sse_keepalive_ping_interval_seconds", 0.05) + + result = await self._run(monkeypatch, first_chunk_delay=0.3) + + assert isinstance(result, StreamingResponse) + streamed = [chunk async for chunk in result.body_iterator] + assert streamed[0] == SSE_COMMENT_PING_CHUNK + assert streamed[-1] == 'data: {"choices": []}\n\n' + + @pytest.mark.asyncio + async def test_no_pings_emitted_when_interval_unset(self, monkeypatch): + monkeypatch.setattr(litellm, "sse_keepalive_ping_interval_seconds", None) + + result = await self._run(monkeypatch, first_chunk_delay=0.3) + + assert isinstance(result, StreamingResponse) + streamed = [chunk async for chunk in result.body_iterator] + assert streamed == ['data: {"choices": []}\n\n'] From c597d3fabb969f0ff2eb6b4f9e7df8993f8ef0c4 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 03:28:10 +0000 Subject: [PATCH 017/279] chore: drop source comment on sse_keepalive_ping_interval_seconds Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/__init__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index a29ee73013b..7d5051790cc 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -245,11 +245,6 @@ use_chat_completions_url_for_anthropic_messages: bool = bool( # config.yaml. strip_anthropic_total_tokens: bool = False anthropic_sse_ping_interval_seconds: float = 15.0 -# Emit an SSE comment (": ping") on OpenAI-shaped streaming routes (/chat/completions, -# /v1/responses, ...) whenever the upstream has sent nothing for this many seconds, so -# intermediaries with an idle read timeout (e.g. nginx `proxy-read-timeout`) don't drop -# long time-to-first-token streams. Disabled unless set, via -# `litellm_settings.sse_keepalive_ping_interval_seconds` in config.yaml. sse_keepalive_ping_interval_seconds: float | None = None route_all_chat_openai_to_responses: bool = ( os.getenv("LITELLM_ROUTE_ALL_CHAT_OPENAI_TO_RESPONSES", "false").lower() == "true" From 9d69fdac72b860627f627f9802ceb4758a7c372d Mon Sep 17 00:00:00 2001 From: daleselaji-dev <265319989+daleselaji-dev@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:14:56 +0800 Subject: [PATCH 018/279] fix(bedrock): use deployment credentials for AWS requests --- .../llms/bedrock/batches/transformation.py | 11 ++- litellm/llms/bedrock/files/transformation.py | 11 ++- .../test_bedrock_request_credentials.py | 95 +++++++++++++++++++ 3 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 tests/litellm/llms/bedrock/test_bedrock_request_credentials.py diff --git a/litellm/llms/bedrock/batches/transformation.py b/litellm/llms/bedrock/batches/transformation.py index 9e3dec26673..8b437af8581 100644 --- a/litellm/llms/bedrock/batches/transformation.py +++ b/litellm/llms/bedrock/batches/transformation.py @@ -130,7 +130,8 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): Get the complete URL for Bedrock batch creation. Bedrock batch jobs are created via the model invocation job API. """ - aws_region_name: Final = self._get_aws_region_name(optional_params, model) + request_params: Final = {**litellm_params, **optional_params} + aws_region_name: Final = self._get_aws_region_name(request_params, model) # Bedrock model invocation job endpoint # Format: https://bedrock.{region}.amazonaws.com/model-invocation-job @@ -232,14 +233,15 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): # For Bedrock, we need to return a pre-signed request with AWS auth headers # Use common utility for AWS signing + request_params: Final = {**litellm_params, **optional_params} endpoint_url: Final = ( - f"https://bedrock.{self._get_aws_region_name(optional_params, model)}.amazonaws.com/model-invocation-job" + f"https://bedrock.{self._get_aws_region_name(request_params, model)}.amazonaws.com/model-invocation-job" ) signed_headers, signed_data = self.common_utils.sign_aws_request( service_name="bedrock", data=bedrock_request, endpoint_url=endpoint_url, - optional_params=optional_params, + optional_params=request_params, method="POST", ) @@ -387,11 +389,12 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): endpoint_url: Final = f"https://bedrock.{region}.amazonaws.com/model-invocation-job/{encoded_arn}" # Use common utility for AWS signing + request_params: Final = {**litellm_params, **optional_params} signed_headers, _ = self.common_utils.sign_aws_request( service_name="bedrock", data={}, # GET request has no body endpoint_url=endpoint_url, - optional_params=optional_params, + optional_params=request_params, method="GET", ) diff --git a/litellm/llms/bedrock/files/transformation.py b/litellm/llms/bedrock/files/transformation.py index 728fd02f001..072343ae936 100644 --- a/litellm/llms/bedrock/files/transformation.py +++ b/litellm/llms/bedrock/files/transformation.py @@ -257,6 +257,7 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): """ Get the complete S3 URL for the file upload request """ + request_params: Final = {**litellm_params, **optional_params} bucket_name = litellm_params.get("s3_bucket_name") or os.getenv("AWS_S3_BUCKET_NAME") if not bucket_name: raise ValueError( @@ -265,7 +266,7 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): bucket_name, object_prefix = split_configured_cloud_bucket_name(bucket_name) s3_region_name: Final = litellm_params.get("s3_region_name") or optional_params.get("s3_region_name") - aws_region_name: Final = s3_region_name or self._get_aws_region_name(optional_params, model) + aws_region_name: Final = s3_region_name or self._get_aws_region_name(request_params, model) file_data: Final = data.get("file") purpose: Final = data.get("purpose") @@ -281,7 +282,7 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): # S3 endpoint URL format s3_endpoint_url: Final = ( - optional_params.get("s3_endpoint_url") or f"https://s3.{aws_region_name}.amazonaws.com" + request_params.get("s3_endpoint_url") or f"https://s3.{aws_region_name}.amazonaws.com" ).rstrip("/") return f"{s3_endpoint_url}/{bucket_name}/{encoded_object_name}" @@ -728,14 +729,16 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): if s3_region_name: optional_params = {**optional_params, "aws_region_name": s3_region_name} + request_params: Final = {**litellm_params, **optional_params} + # Sign the request and return a pre-signed request object signed_headers, signed_body = self._sign_s3_request( content=file_content, api_base=api_base, - optional_params=optional_params, + optional_params=request_params, s3_encryption_key_id=resolve_s3_encryption_key_id( litellm_params=litellm_params, - optional_params=optional_params, + optional_params=request_params, ), ) diff --git a/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py b/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py new file mode 100644 index 00000000000..72da2daf9b5 --- /dev/null +++ b/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py @@ -0,0 +1,95 @@ +from litellm.llms.bedrock.batches.transformation import BedrockBatchesConfig +from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + +def test_bedrock_file_upload_signing_uses_deployment_credentials(monkeypatch): + config = BedrockFilesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, "" + + monkeypatch.setattr(config, "_sign_s3_request", capture_signing) + + result = config.transform_create_file_request( + model="", + create_file_data={ + "file": ( + "batch.jsonl", + b'{"custom_id":"req-1","body":{"model":"bedrock/model"}}\n', + "application/jsonl", + ), + "purpose": "batch", + }, + optional_params={}, + litellm_params={ + "s3_bucket_name": "deployment-bucket", + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + }, + ) + + assert "eu-west-1" in result["url"] + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" + + +def test_bedrock_batch_signing_uses_deployment_credentials(monkeypatch): + config = BedrockBatchesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, b"{}" + + monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) + + result = config.transform_create_batch_request( + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", + create_batch_data={ + "input_file_id": "s3://deployment-bucket/input.jsonl", + "completion_window": "24h", + "endpoint": "/v1/chat/completions", + }, + optional_params={}, + litellm_params={ + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + "aws_batch_role_arn": "arn:aws:iam::123456789012:role/bedrock-batch", + }, + ) + + assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" + + +def test_bedrock_batch_retrieval_signing_uses_deployment_credentials(monkeypatch): + config = BedrockBatchesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, b"" + + monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) + + result = config.transform_retrieve_batch_request( + batch_id="arn:aws:bedrock:eu-west-1:123456789012:model-invocation-job/job-1", + optional_params={}, + litellm_params={ + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + }, + ) + + assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" From f9b86b253a3fb87d003bb5ccc80c7d89aa91dd62 Mon Sep 17 00:00:00 2001 From: Harry Qian Date: Tue, 4 Aug 2026 17:14:26 +0800 Subject: [PATCH 019/279] fix(proxy): restore query-param validation under fastapi>=0.140.7 fastapi 0.140.7 removed get_flat_dependant(), which broke the import in management_v1/common.py and took down every /management/v1 route. Switch to get_flat_params() and filter to ParamTypes.query so unknown-query-param rejection keeps matching the old behavior. --- .../management_endpoints/management_v1/common.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/management_endpoints/management_v1/common.py b/litellm/proxy/management_endpoints/management_v1/common.py index 8525d67a041..ec79820465a 100644 --- a/litellm/proxy/management_endpoints/management_v1/common.py +++ b/litellm/proxy/management_endpoints/management_v1/common.py @@ -4,7 +4,8 @@ from typing import Final from urllib.parse import urlencode from fastapi import Request -from fastapi.dependencies.utils import get_flat_dependant +from fastapi.dependencies.utils import get_flat_params +from fastapi.params import ParamTypes from fastapi.responses import JSONResponse from litellm.types.proxy.management_endpoints.management_v1 import ( @@ -42,7 +43,13 @@ def _declared_query_params(request: Request) -> frozenset[str]: dependant: Final = getattr(route, "dependant", None) if dependant is None: return frozenset() - return frozenset(field.alias for field in get_flat_dependant(dependant, skip_repeats=True).query_params) + # fastapi>=0.140.7 removed get_flat_dependant(); get_flat_params() returns the + # flattened (deduped) param list. Filter to query params to match the old behavior. + return frozenset( + field.alias + for field in get_flat_params(dependant) + if getattr(field.field_info, "in_", None) == ParamTypes.query + ) def escape_like(value: str) -> str: From da443d1266615507f52a101b461c80e0265069ae Mon Sep 17 00:00:00 2001 From: Harry Qian Date: Tue, 4 Aug 2026 18:21:22 +0800 Subject: [PATCH 020/279] test(proxy): lock in query-param validation across fastapi param types Guards _declared_query_params against a regression in the get_flat_params migration: the flatten step returns path, query, header and cookie params together, so a dropped ParamTypes.query filter would wrongly treat path or header names as declared query params and accept unknown ones. Removing the filter fails these tests. --- .../management_v1/test_common.py | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 tests/test_litellm/proxy/management_endpoints/management_v1/test_common.py diff --git a/tests/test_litellm/proxy/management_endpoints/management_v1/test_common.py b/tests/test_litellm/proxy/management_endpoints/management_v1/test_common.py new file mode 100644 index 00000000000..167a06ed551 --- /dev/null +++ b/tests/test_litellm/proxy/management_endpoints/management_v1/test_common.py @@ -0,0 +1,95 @@ +from typing import Annotated + +from fastapi import Depends, FastAPI, Header, Query, Request +from fastapi.testclient import TestClient + +from litellm.proxy.management_endpoints.management_v1.common import ( + ManagementProblem, + PROBLEM_CONTENT_TYPE, + _declared_query_params, + problem_response, + reject_unknown_query_params, +) + + +def _client() -> TestClient: + app = FastAPI() + + @app.exception_handler(ManagementProblem) + async def _handle(_request: Request, exc: ManagementProblem): + return problem_response(exc.problem) + + @app.get("/things/{thing_id}", dependencies=[Depends(reject_unknown_query_params)]) + def _handler( + thing_id: str, + request: Request, + status: Annotated[str | None, Query(alias="filter[status]")] = None, + page: Annotated[int, Query(ge=1)] = 1, + x_trace: Annotated[str | None, Header()] = None, + ) -> dict[str, bool]: + return {"ok": True} + + return TestClient(app, raise_server_exceptions=False) + + +def test_a_declared_query_param_is_accepted_by_its_alias(): + response = _client().get("/things/abc", params={"filter[status]": "active", "page": "2"}) + assert response.status_code == 200, response.text + + +def test_an_unknown_query_param_is_rejected_as_a_problem(): + response = _client().get("/things/abc", params={"bogus": "x"}) + assert response.status_code == 400 + assert response.headers["content-type"].startswith(PROBLEM_CONTENT_TYPE) + assert "bogus" in response.json()["detail"] + + +def test_a_path_param_name_is_not_a_declared_query_param(): + """The flatten step returns path+query+header together; only query names count as declared. + + If the ParamTypes.query filter were dropped, `thing_id` (a path param) would leak + into the declared set and this request would be wrongly accepted. + """ + response = _client().get("/things/abc", params={"thing_id": "x"}) + assert response.status_code == 400 + assert "thing_id" in response.json()["detail"] + + +def test_a_header_param_name_is_not_a_declared_query_param(): + response = _client().get("/things/abc", params={"x-trace": "x"}) + assert response.status_code == 400 + assert "x-trace" in response.json()["detail"] + + +def test_declared_query_params_isolates_query_aliases_from_other_param_types(): + captured: dict[str, frozenset[str]] = {} + app = FastAPI() + + @app.get("/things/{thing_id}") + def _handler( + thing_id: str, + request: Request, + status: Annotated[str | None, Query(alias="filter[status]")] = None, + page: Annotated[int, Query(ge=1)] = 1, + x_trace: Annotated[str | None, Header()] = None, + ) -> dict[str, bool]: + captured["declared"] = _declared_query_params(request) + return {"ok": True} + + TestClient(app).get("/things/abc") + assert captured["declared"] == frozenset({"filter[status]", "page"}) + + +def test_declared_query_params_is_empty_when_the_route_has_no_dependant(): + request = Request( + { + "type": "http", + "method": "GET", + "scheme": "http", + "root_path": "", + "path": "/things/abc", + "query_string": b"", + "headers": [(b"host", b"testserver")], + } + ) + assert _declared_query_params(request) == frozenset() From b11d342022e1dfe88ad05438ecab49524173028a Mon Sep 17 00:00:00 2001 From: daleselaji-dev <265319989+daleselaji-dev@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:40:17 +0800 Subject: [PATCH 021/279] chore(bedrock): document mutable signing params --- litellm/llms/bedrock/batches/transformation.py | 15 ++++++++++++--- litellm/llms/bedrock/files/transformation.py | 10 ++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/litellm/llms/bedrock/batches/transformation.py b/litellm/llms/bedrock/batches/transformation.py index 8b437af8581..e92a2e7a00a 100644 --- a/litellm/llms/bedrock/batches/transformation.py +++ b/litellm/llms/bedrock/batches/transformation.py @@ -130,7 +130,10 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): Get the complete URL for Bedrock batch creation. Bedrock batch jobs are created via the model invocation job API. """ - request_params: Final = {**litellm_params, **optional_params} + request_params: Final = { + **litellm_params, + **optional_params, + } # mutable-ok: merged params are read by AWS helpers aws_region_name: Final = self._get_aws_region_name(request_params, model) # Bedrock model invocation job endpoint @@ -233,7 +236,10 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): # For Bedrock, we need to return a pre-signed request with AWS auth headers # Use common utility for AWS signing - request_params: Final = {**litellm_params, **optional_params} + request_params: Final = { + **litellm_params, + **optional_params, + } # mutable-ok: merged params are read by AWS helpers endpoint_url: Final = ( f"https://bedrock.{self._get_aws_region_name(request_params, model)}.amazonaws.com/model-invocation-job" ) @@ -389,7 +395,10 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): endpoint_url: Final = f"https://bedrock.{region}.amazonaws.com/model-invocation-job/{encoded_arn}" # Use common utility for AWS signing - request_params: Final = {**litellm_params, **optional_params} + request_params: Final = { + **litellm_params, + **optional_params, + } # mutable-ok: merged params are read by AWS helpers signed_headers, _ = self.common_utils.sign_aws_request( service_name="bedrock", data={}, # GET request has no body diff --git a/litellm/llms/bedrock/files/transformation.py b/litellm/llms/bedrock/files/transformation.py index 072343ae936..cd4f52ddbfe 100644 --- a/litellm/llms/bedrock/files/transformation.py +++ b/litellm/llms/bedrock/files/transformation.py @@ -257,7 +257,10 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): """ Get the complete S3 URL for the file upload request """ - request_params: Final = {**litellm_params, **optional_params} + request_params: Final = { + **litellm_params, + **optional_params, + } # mutable-ok: merged params are read by AWS helpers bucket_name = litellm_params.get("s3_bucket_name") or os.getenv("AWS_S3_BUCKET_NAME") if not bucket_name: raise ValueError( @@ -729,7 +732,10 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): if s3_region_name: optional_params = {**optional_params, "aws_region_name": s3_region_name} - request_params: Final = {**litellm_params, **optional_params} + request_params: Final = { + **litellm_params, + **optional_params, + } # mutable-ok: merged params are read by AWS helpers # Sign the request and return a pre-signed request object signed_headers, signed_body = self._sign_s3_request( From 8f998a9ca477942815b525656bbc6f52a9fcecef Mon Sep 17 00:00:00 2001 From: daleselaji-dev <265319989+daleselaji-dev@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:45:06 +0800 Subject: [PATCH 022/279] fix(bedrock): prevent caller AWS identity override --- .../llms/bedrock/batches/transformation.py | 21 ++- litellm/llms/bedrock/common_utils.py | 38 +++++ litellm/llms/bedrock/files/transformation.py | 12 +- .../test_bedrock_files_and_batches.py | 130 ++++++++++++++++++ .../test_bedrock_request_credentials.py | 95 ------------- 5 files changed, 179 insertions(+), 117 deletions(-) delete mode 100644 tests/litellm/llms/bedrock/test_bedrock_request_credentials.py diff --git a/litellm/llms/bedrock/batches/transformation.py b/litellm/llms/bedrock/batches/transformation.py index e92a2e7a00a..04f395f2bf1 100644 --- a/litellm/llms/bedrock/batches/transformation.py +++ b/litellm/llms/bedrock/batches/transformation.py @@ -28,7 +28,11 @@ from litellm.types.llms.openai import ( from litellm.types.utils import LiteLLMBatch, LlmProviders from ..base_aws_llm import BaseAWSLLM -from ..common_utils import CommonBatchFilesUtils, resolve_s3_encryption_key_id +from ..common_utils import ( + CommonBatchFilesUtils, + merge_bedrock_aws_request_params, + resolve_s3_encryption_key_id, +) # Bedrock batch input files are uploaded as # s3://bucket/litellm-bedrock-files-{model, ":" -> "-"}-{uuid4}.jsonl (see @@ -130,10 +134,7 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): Get the complete URL for Bedrock batch creation. Bedrock batch jobs are created via the model invocation job API. """ - request_params: Final = { - **litellm_params, - **optional_params, - } # mutable-ok: merged params are read by AWS helpers + request_params: Final = merge_bedrock_aws_request_params(litellm_params, optional_params) aws_region_name: Final = self._get_aws_region_name(request_params, model) # Bedrock model invocation job endpoint @@ -236,10 +237,7 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): # For Bedrock, we need to return a pre-signed request with AWS auth headers # Use common utility for AWS signing - request_params: Final = { - **litellm_params, - **optional_params, - } # mutable-ok: merged params are read by AWS helpers + request_params: Final = merge_bedrock_aws_request_params(litellm_params, optional_params) endpoint_url: Final = ( f"https://bedrock.{self._get_aws_region_name(request_params, model)}.amazonaws.com/model-invocation-job" ) @@ -395,10 +393,7 @@ class BedrockBatchesConfig(BaseAWSLLM, BaseBatchesConfig): endpoint_url: Final = f"https://bedrock.{region}.amazonaws.com/model-invocation-job/{encoded_arn}" # Use common utility for AWS signing - request_params: Final = { - **litellm_params, - **optional_params, - } # mutable-ok: merged params are read by AWS helpers + request_params: Final = merge_bedrock_aws_request_params(litellm_params, optional_params) signed_headers, _ = self.common_utils.sign_aws_request( service_name="bedrock", data={}, # GET request has no body diff --git a/litellm/llms/bedrock/common_utils.py b/litellm/llms/bedrock/common_utils.py index d18cb7d8734..57202f2d626 100644 --- a/litellm/llms/bedrock/common_utils.py +++ b/litellm/llms/bedrock/common_utils.py @@ -36,6 +36,44 @@ class BedrockError(BaseLLMException): pass +_BEDROCK_AWS_AUTH_PARAMETER_KEYS: Final[tuple[str, ...]] = ( + "aws_access_key_id", + "aws_secret_access_key", + "aws_session_token", + "aws_region_name", + "aws_session_name", + "aws_profile_name", + "aws_role_name", + "aws_web_identity_token", + "aws_sts_endpoint", + "aws_external_id", +) + + +def merge_bedrock_aws_request_params( + litellm_params: Mapping[str, Any], + optional_params: Mapping[str, Any], +) -> dict[str, Any]: + """Merge deployment and request parameters without allowing auth escalation. + + Deployment configuration is authoritative for AWS authentication. When a + deployment supplies static credentials, caller-supplied profile/role/token + selectors must not redirect signing to another identity available on the + server. Requests may still provide AWS credentials when the deployment has + no static credentials configured. + """ + request_params: Final = {**optional_params, **litellm_params} # mutable-ok: AWS helpers require a plain dict + has_static_deployment_credentials = all( + isinstance(litellm_params.get(key), str) and bool(litellm_params.get(key)) + for key in ("aws_access_key_id", "aws_secret_access_key", "aws_region_name") + ) + if has_static_deployment_credentials: + for key in _BEDROCK_AWS_AUTH_PARAMETER_KEYS: + if key not in litellm_params: + request_params.pop(key, None) + return request_params + + # Lazy import cache to avoid circular imports and performance impact _get_model_info = None diff --git a/litellm/llms/bedrock/files/transformation.py b/litellm/llms/bedrock/files/transformation.py index cd4f52ddbfe..7663105ba4a 100644 --- a/litellm/llms/bedrock/files/transformation.py +++ b/litellm/llms/bedrock/files/transformation.py @@ -46,7 +46,7 @@ from litellm.types.utils import ExtractedFileData, LlmProviders, SpecialEnums from litellm.utils import get_llm_provider from ..base_aws_llm import BaseAWSLLM -from ..common_utils import BedrockError, resolve_s3_encryption_key_id +from ..common_utils import BedrockError, merge_bedrock_aws_request_params, resolve_s3_encryption_key_id # litellm_params key used to hand the SigV4-signed GET headers from # `transform_file_content_request` to `validate_environment` (the only hook @@ -257,10 +257,7 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): """ Get the complete S3 URL for the file upload request """ - request_params: Final = { - **litellm_params, - **optional_params, - } # mutable-ok: merged params are read by AWS helpers + request_params: Final = merge_bedrock_aws_request_params(litellm_params, optional_params) bucket_name = litellm_params.get("s3_bucket_name") or os.getenv("AWS_S3_BUCKET_NAME") if not bucket_name: raise ValueError( @@ -732,10 +729,7 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): if s3_region_name: optional_params = {**optional_params, "aws_region_name": s3_region_name} - request_params: Final = { - **litellm_params, - **optional_params, - } # mutable-ok: merged params are read by AWS helpers + request_params: Final = merge_bedrock_aws_request_params(litellm_params, optional_params) # Sign the request and return a pre-signed request object signed_headers, signed_body = self._sign_s3_request( diff --git a/tests/batches_tests/test_bedrock_files_and_batches.py b/tests/batches_tests/test_bedrock_files_and_batches.py index 431d5a2a60c..52e88937916 100644 --- a/tests/batches_tests/test_bedrock_files_and_batches.py +++ b/tests/batches_tests/test_bedrock_files_and_batches.py @@ -389,3 +389,133 @@ def test_bedrock_batch_with_encryption_key_in_post_request(): ) print("SUCCESS: s3_encryption_key_id properly included in AWS POST request") + + +def test_bedrock_file_upload_signing_uses_deployment_credentials(monkeypatch): + from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + config = BedrockFilesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, "" + + monkeypatch.setattr(config, "_sign_s3_request", capture_signing) + + result = config.transform_create_file_request( + model="", + create_file_data={ + "file": ( + "batch.jsonl", + b'{"custom_id":"req-1","body":{"model":"bedrock/model"}}\n', + "application/jsonl", + ), + "purpose": "batch", + }, + optional_params={}, + litellm_params={ + "s3_bucket_name": "deployment-bucket", + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + }, + ) + + assert "eu-west-1" in result["url"] + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" + + +def test_bedrock_batch_signing_uses_deployment_credentials(monkeypatch): + from litellm.llms.bedrock.batches.transformation import BedrockBatchesConfig + + config = BedrockBatchesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, b"{}" + + monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) + + result = config.transform_create_batch_request( + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", + create_batch_data={ + "input_file_id": "s3://deployment-bucket/input.jsonl", + "completion_window": "24h", + "endpoint": "/v1/chat/completions", + }, + optional_params={}, + litellm_params={ + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + "aws_batch_role_arn": "arn:aws:iam::123456789012:role/bedrock-batch", + }, + ) + + assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" + + +def test_bedrock_batch_retrieval_signing_uses_deployment_credentials(monkeypatch): + from litellm.llms.bedrock.batches.transformation import BedrockBatchesConfig + + config = BedrockBatchesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, b"" + + monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) + + result = config.transform_retrieve_batch_request( + batch_id="arn:aws:bedrock:eu-west-1:123456789012:model-invocation-job/job-1", + optional_params={}, + litellm_params={ + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + }, + ) + + assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" + assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" + assert captured["optional_params"]["aws_region_name"] == "eu-west-1" + + +def test_bedrock_deployment_credentials_block_caller_profile_override(monkeypatch): + from litellm.llms.bedrock.batches.transformation import BedrockBatchesConfig + + config = BedrockBatchesConfig() + captured = {} + + def capture_signing(**kwargs): + captured.update(kwargs) + return {}, b"{}" + + monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) + + config.transform_create_batch_request( + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", + create_batch_data={ + "input_file_id": "s3://deployment-bucket/input.jsonl", + "completion_window": "24h", + }, + optional_params={"aws_profile_name": "caller-controlled-profile"}, + litellm_params={ + "aws_access_key_id": "deployment-access-key", + "aws_secret_access_key": "deployment-secret", + "aws_region_name": "eu-west-1", + "aws_batch_role_arn": "arn:aws:iam::123456789012:role/bedrock-batch", + }, + ) + + assert "aws_profile_name" not in captured["optional_params"] + assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" diff --git a/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py b/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py deleted file mode 100644 index 72da2daf9b5..00000000000 --- a/tests/litellm/llms/bedrock/test_bedrock_request_credentials.py +++ /dev/null @@ -1,95 +0,0 @@ -from litellm.llms.bedrock.batches.transformation import BedrockBatchesConfig -from litellm.llms.bedrock.files.transformation import BedrockFilesConfig - - -def test_bedrock_file_upload_signing_uses_deployment_credentials(monkeypatch): - config = BedrockFilesConfig() - captured = {} - - def capture_signing(**kwargs): - captured.update(kwargs) - return {}, "" - - monkeypatch.setattr(config, "_sign_s3_request", capture_signing) - - result = config.transform_create_file_request( - model="", - create_file_data={ - "file": ( - "batch.jsonl", - b'{"custom_id":"req-1","body":{"model":"bedrock/model"}}\n', - "application/jsonl", - ), - "purpose": "batch", - }, - optional_params={}, - litellm_params={ - "s3_bucket_name": "deployment-bucket", - "aws_access_key_id": "deployment-access-key", - "aws_secret_access_key": "deployment-secret", - "aws_region_name": "eu-west-1", - }, - ) - - assert "eu-west-1" in result["url"] - assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" - assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" - assert captured["optional_params"]["aws_region_name"] == "eu-west-1" - - -def test_bedrock_batch_signing_uses_deployment_credentials(monkeypatch): - config = BedrockBatchesConfig() - captured = {} - - def capture_signing(**kwargs): - captured.update(kwargs) - return {}, b"{}" - - monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) - - result = config.transform_create_batch_request( - model="us.anthropic.claude-haiku-4-5-20251001-v1:0", - create_batch_data={ - "input_file_id": "s3://deployment-bucket/input.jsonl", - "completion_window": "24h", - "endpoint": "/v1/chat/completions", - }, - optional_params={}, - litellm_params={ - "aws_access_key_id": "deployment-access-key", - "aws_secret_access_key": "deployment-secret", - "aws_region_name": "eu-west-1", - "aws_batch_role_arn": "arn:aws:iam::123456789012:role/bedrock-batch", - }, - ) - - assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") - assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" - assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" - assert captured["optional_params"]["aws_region_name"] == "eu-west-1" - - -def test_bedrock_batch_retrieval_signing_uses_deployment_credentials(monkeypatch): - config = BedrockBatchesConfig() - captured = {} - - def capture_signing(**kwargs): - captured.update(kwargs) - return {}, b"" - - monkeypatch.setattr(config.common_utils, "sign_aws_request", capture_signing) - - result = config.transform_retrieve_batch_request( - batch_id="arn:aws:bedrock:eu-west-1:123456789012:model-invocation-job/job-1", - optional_params={}, - litellm_params={ - "aws_access_key_id": "deployment-access-key", - "aws_secret_access_key": "deployment-secret", - "aws_region_name": "eu-west-1", - }, - ) - - assert result["url"].startswith("https://bedrock.eu-west-1.amazonaws.com/") - assert captured["optional_params"]["aws_access_key_id"] == "deployment-access-key" - assert captured["optional_params"]["aws_secret_access_key"] == "deployment-secret" - assert captured["optional_params"]["aws_region_name"] == "eu-west-1" From 5883aa354d42a3225fef485034e86a52a275cdd7 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 7 Aug 2026 04:45:39 -0700 Subject: [PATCH 023/279] fix(router): keep batch fallbacks inside the model group that owns the file A batch or fine-tuning job is created from a file the caller already uploaded, and that file only exists under the credentials of the deployment that stored it. When the router fell back to a different model group it handed that file id to a provider that has never seen it, so the caller got the second provider's complaint about the file id instead of the error that explains what was actually wrong with their request. run_async_fallback now skips fallback targets outside the original model group whenever the request carries input_file_id or training_file. Order-based fallbacks stay inside the group, so retrying across deployments still works. The same handler also crashed with "'NoneType' object has no attribute 'update'" whenever a fallback fired on a request with metadata set to None, which /v1/batches always does when the caller sends no metadata, turning the provider's 400 into a 500. Record the model group with a merge instead of setdefault, and write it to litellm_metadata on the endpoints that use it so the router's bookkeeping no longer lands in the metadata stored on the provider's batch. --- .../router_utils/fallback_event_handlers.py | 41 ++++- .../test_fallback_event_handlers.py | 141 ++++++++++++++++++ tests/test_litellm/test_router.py | 62 ++++++++ 3 files changed, 241 insertions(+), 3 deletions(-) diff --git a/litellm/router_utils/fallback_event_handlers.py b/litellm/router_utils/fallback_event_handlers.py index 1c6bb52ccb8..c4a84a1d61e 100644 --- a/litellm/router_utils/fallback_event_handlers.py +++ b/litellm/router_utils/fallback_event_handlers.py @@ -9,6 +9,7 @@ from litellm.router_utils.add_retry_fallback_headers import ( add_fallback_headers_to_response, get_fallback_error_info, ) +from litellm.router_utils.batch_utils import _get_router_metadata_variable_name from litellm.types.router import LiteLLMParamsTypedDict if TYPE_CHECKING: @@ -82,6 +83,28 @@ def get_fallback_model_group(fallbacks: list[Any], model_group: str) -> tuple[li return fallback_model_group, generic_fallback_idx +PROVIDER_SCOPED_RESOURCE_KEYS: Final = ("input_file_id", "training_file") + + +def _get_fallback_target_model_group(fallback_entry: str | dict[str, object]) -> str | None: + if isinstance(fallback_entry, str): + return fallback_entry + target: Final = fallback_entry.get("model") + return target if isinstance(target, str) else None + + +def references_provider_scoped_resource(kwargs: dict[str, object]) -> bool: + """ + True when the request names a file that only exists under one provider's credentials. + + Batch and fine-tuning jobs are created from a file the caller already uploaded, and + that file lives in the account of the deployment that stored it. Handing the id to a + different model group can only fail, and the second provider's error replaces the + error the caller actually needs to see. + """ + return any(kwargs.get(key) for key in PROVIDER_SCOPED_RESOURCE_KEYS) + + async def run_async_fallback( *args: tuple[Any], litellm_router: LitellmRouter, @@ -120,10 +143,21 @@ async def run_async_fallback( error_from_fallbacks = original_exception fallback_errors = (get_fallback_error_info(original_exception),) + metadata_variable_name: Final = _get_router_metadata_variable_name( + function_name=getattr(kwargs.get("original_function"), "__name__", None) + ) + same_model_group_only: Final = references_provider_scoped_resource(kwargs) for mg in fallback_model_group: if mg == original_model_group: continue + if same_model_group_only and _get_fallback_target_model_group(mg) != original_model_group: + verbose_router_logger.info( + "Skipping fallback to model_group = %s: request is pinned to model_group = %s by its uploaded file", + mask_sensitive_structure(mg), + original_model_group, + ) + continue try: # LOGGING kwargs = litellm_router.log_retry(kwargs=kwargs, e=original_exception) @@ -132,9 +166,10 @@ async def run_async_fallback( kwargs["model"] = mg elif isinstance(mg, dict): kwargs.update(mg) - kwargs.setdefault("metadata", {}).update( - {"model_group": kwargs.get("model", None)} - ) # update model_group used, if fallbacks are done + kwargs[metadata_variable_name] = { + **(kwargs.get(metadata_variable_name) or {}), + "model_group": kwargs.get("model", None), + } # update model_group used, if fallbacks are done fallback_depth = fallback_depth + 1 kwargs["fallback_depth"] = fallback_depth kwargs["max_fallbacks"] = max_fallbacks diff --git a/tests/test_litellm/router_utils/test_fallback_event_handlers.py b/tests/test_litellm/router_utils/test_fallback_event_handlers.py index 98a34de295c..d93aa4ab023 100644 --- a/tests/test_litellm/router_utils/test_fallback_event_handlers.py +++ b/tests/test_litellm/router_utils/test_fallback_event_handlers.py @@ -142,6 +142,147 @@ async def test_run_async_fallback_skips_original_model_group(): assert response._hidden_params["additional_headers"]["x-litellm-attempted-fallbacks"] == 1 +class AttemptRecordingRouter: + def __init__(self): + self.attempted_model_groups = [] + self.received_kwargs = None + + def log_retry(self, kwargs, e): + return kwargs + + async def async_function_with_fallbacks(self, *args, **kwargs): + self.attempted_model_groups.append(kwargs.get("model")) + self.received_kwargs = kwargs + return StreamingWrapper() + + +async def _acreate_batch(*args, **kwargs): + raise AssertionError("only used for its __name__") + + +@pytest.mark.asyncio +async def test_run_async_fallback_keeps_uploaded_file_requests_in_their_model_group(): + """An input_file_id only exists under the credentials of the group it was uploaded + to, so a cross-group fallback can only fail with the wrong provider's error.""" + router = AttemptRecordingRouter() + owning_provider_error = RuntimeError("openai connection error") + + with pytest.raises(RuntimeError, match="openai connection error"): + await run_async_fallback( + litellm_router=router, + fallback_model_group=["azure-group"], + original_model_group="openai-group", + original_exception=owning_provider_error, + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + input_file_id="file-owned-by-openai", + original_function=_acreate_batch, + ) + + assert router.attempted_model_groups == [] + + +@pytest.mark.asyncio +async def test_run_async_fallback_keeps_fine_tuning_requests_in_their_model_group(): + router = AttemptRecordingRouter() + + with pytest.raises(RuntimeError, match="openai connection error"): + await run_async_fallback( + litellm_router=router, + fallback_model_group=["azure-group"], + original_model_group="openai-group", + original_exception=RuntimeError("openai connection error"), + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + training_file="file-owned-by-openai", + ) + + assert router.attempted_model_groups == [] + + +@pytest.mark.asyncio +async def test_run_async_fallback_allows_same_model_group_retry_for_uploaded_file_requests(): + """Order-based fallbacks stay inside the owning group, so they must still run.""" + router = AttemptRecordingRouter() + + await run_async_fallback( + litellm_router=router, + fallback_model_group=[{"model": "openai-group", "_target_order": 2}], + original_model_group="openai-group", + original_exception=RuntimeError("first deployment failed"), + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + input_file_id="file-owned-by-openai", + original_function=_acreate_batch, + ) + + assert router.attempted_model_groups == ["openai-group"] + + +@pytest.mark.asyncio +async def test_run_async_fallback_still_crosses_model_groups_without_an_uploaded_file(): + router = AttemptRecordingRouter() + + await run_async_fallback( + litellm_router=router, + fallback_model_group=["azure-group"], + original_model_group="openai-group", + original_exception=RuntimeError("openai connection error"), + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + ) + + assert router.attempted_model_groups == ["azure-group"] + + +@pytest.mark.asyncio +async def test_run_async_fallback_handles_explicitly_none_metadata(): + """/v1/batches always sets `metadata`, and sets it to None when the caller sent + none, so setdefault() on it hands back None instead of a dict.""" + router = AttemptRecordingRouter() + + await run_async_fallback( + litellm_router=router, + fallback_model_group=["azure-group"], + original_model_group="openai-group", + original_exception=RuntimeError("openai connection error"), + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + metadata=None, + ) + + assert router.received_kwargs["metadata"] == {"model_group": "azure-group"} + + +@pytest.mark.asyncio +async def test_run_async_fallback_records_batch_model_group_outside_provider_metadata(): + """`metadata` on a batch request is forwarded to the provider and stored on the + batch, so the router's own model_group belongs in litellm_metadata.""" + router = AttemptRecordingRouter() + + await run_async_fallback( + litellm_router=router, + fallback_model_group=[{"model": "openai-group", "_target_order": 2}], + original_model_group="openai-group", + original_exception=RuntimeError("first deployment failed"), + max_fallbacks=3, + fallback_depth=0, + model="openai-group", + input_file_id="file-owned-by-openai", + metadata={"caller": "nightly-job"}, + litellm_metadata={"model_group": "openai-group"}, + original_function=_acreate_batch, + ) + + assert router.received_kwargs["metadata"] == {"caller": "nightly-job"} + assert router.received_kwargs["litellm_metadata"]["model_group"] == "openai-group" + + def test_get_fallback_model_group_does_not_mutate_fallbacks(): """A string fallback must be resolved without mutating the caller's fallbacks list, which is the live router config shared across requests.""" diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 4a3395a7d3f..b76e69bc978 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -6755,6 +6755,68 @@ async def test_acreate_batch_disable_fallbacks_surfaces_owning_provider_error(): assert mock_create.call_args.kwargs["model"] == "owning-model" +@pytest.mark.asyncio +async def test_acreate_batch_surfaces_owning_provider_error_without_disable_fallbacks(): + """The router itself has to keep a batch inside the group that owns the input file: + the proxy only sets disable_fallbacks on the managed-files route, so the caller + otherwise gets the fallback provider's error for a file it never received.""" + from litellm.types.utils import LiteLLMBatch + + router = litellm.Router( + model_list=[ + { + "model_name": "owning-model", + "litellm_params": { + "model": "openai/gpt-4o-mini", + "api_key": "sk-owning", + }, + }, + { + "model_name": "fallback-model", + "litellm_params": { + "model": "azure/gpt-4o-mini", + "api_key": "sk-fallback", + "api_base": "https://fallback.openai.azure.com", + "api_version": "2024-08-01-preview", + }, + }, + ], + fallbacks=[{"owning-model": ["fallback-model"]}], + num_retries=0, + ) + attempted_models = [] + + async def _acreate_batch(model, **kwargs): + attempted_models.append(model) + if model == "owning-model": + raise litellm.APIConnectionError( + message="Connection error - openai is unreachable", + model="openai/gpt-4o-mini", + llm_provider="openai", + ) + return LiteLLMBatch( + id="batch-created-on-the-wrong-provider", + completion_window="24h", + created_at=0, + endpoint="/v1/chat/completions", + input_file_id="file-owned-by-openai", + object="batch", + status="validating", + ) + + with patch.object(router, "_acreate_batch", _acreate_batch): + with pytest.raises(litellm.APIConnectionError, match="openai is unreachable"): + await router.acreate_batch( + model="owning-model", + input_file_id="file-owned-by-openai", + endpoint="/v1/chat/completions", + completion_window="24h", + metadata={"team": "batch-jobs"}, + ) + + assert attempted_models == ["owning-model"] + + @pytest.mark.asyncio async def test_acreate_batch_request_bedrock_tags_override_deployment_tags(): import httpx From d7bc63da5c5eb44daeaaa2a876f757257bb5d68a Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 7 Aug 2026 05:25:48 -0700 Subject: [PATCH 024/279] style(router): drop the inline comment on the fallback metadata merge --- litellm/router_utils/fallback_event_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/router_utils/fallback_event_handlers.py b/litellm/router_utils/fallback_event_handlers.py index c4a84a1d61e..00df20be845 100644 --- a/litellm/router_utils/fallback_event_handlers.py +++ b/litellm/router_utils/fallback_event_handlers.py @@ -169,7 +169,7 @@ async def run_async_fallback( kwargs[metadata_variable_name] = { **(kwargs.get(metadata_variable_name) or {}), "model_group": kwargs.get("model", None), - } # update model_group used, if fallbacks are done + } fallback_depth = fallback_depth + 1 kwargs["fallback_depth"] = fallback_depth kwargs["max_fallbacks"] = max_fallbacks From c19ab70d960f16374b5ee31a171c23aa7bc99897 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 20:51:17 +0000 Subject: [PATCH 025/279] fix(proxy): forward resolved provider and deployment pricing in /cost/estimate estimate_cost resolved on-prem aliases (e.g. nvidia/zai-org/glm-5.2) to their underlying model and custom_llm_provider via the router, then called completion_cost without either, so provider inference ran on the bare model and raised "LLM Provider NOT provided"; deployment-configured per-token pricing was dropped too, so priced on-prem deployments estimated 0. The resolver now returns a frozen ResolvedCostModel(model, provider, custom_cost_per_token) and estimate_cost forwards both into completion_cost and surfaces the configured per-token pricing in the response, deriving that pricing as single Final values. Resolves LIT-5210 --- .../cost_tracking_settings.py | 102 +++++++----- .../test_cost_tracking_settings.py | 146 +++++++++++++++--- 2 files changed, 189 insertions(+), 59 deletions(-) diff --git a/litellm/proxy/management_endpoints/cost_tracking_settings.py b/litellm/proxy/management_endpoints/cost_tracking_settings.py index b1e071fa359..5d0feecfdf3 100644 --- a/litellm/proxy/management_endpoints/cost_tracking_settings.py +++ b/litellm/proxy/management_endpoints/cost_tracking_settings.py @@ -10,6 +10,8 @@ PATCH /config/cost_margin_config - Update cost margin configuration POST /cost/estimate - Estimate cost for a given model and token counts """ +from collections.abc import Mapping +from dataclasses import dataclass from typing import Final from fastapi import APIRouter, Depends, HTTPException @@ -24,29 +26,57 @@ from litellm.proxy._types import ( UserAPIKeyAuth, ) from litellm.proxy.auth.user_api_key_auth import user_api_key_auth -from litellm.types.utils import LlmProvidersSet +from litellm.types.utils import CostPerToken, LlmProvidersSet, ModelInfo router: Final = APIRouter() -def _resolve_model_for_cost_lookup(model: str) -> tuple[str, str | None]: +@dataclass(frozen=True, slots=True) +class ResolvedCostModel: + model: str + provider: str | None + custom_cost_per_token: CostPerToken | None + + +def _extract_custom_pricing(litellm_params: Mapping[str, object]) -> CostPerToken | None: + """ + Pull per-token pricing configured on a deployment so on-prem / self-hosted + models (absent from the public cost map) still estimate a real cost. + """ + input_cost: Final = litellm_params.get("input_cost_per_token") + output_cost: Final = litellm_params.get("output_cost_per_token") + + input_price: Final = float(input_cost) if isinstance(input_cost, (int, float)) else None + output_price: Final = float(output_cost) if isinstance(output_cost, (int, float)) else None + + if input_price is None and output_price is None: + return None + + return CostPerToken( + input_cost_per_token=input_price or 0.0, + output_cost_per_token=output_price or 0.0, + ) + + +def _lookup_model_info(model: str) -> ModelInfo | None: + try: + return litellm.get_model_info(model=model) + except Exception: + return None + + +def _resolve_model_for_cost_lookup(model: str) -> ResolvedCostModel: """ Resolve a model name (which may be a router alias/model_group) to the - underlying litellm model name for cost lookup. + underlying litellm model name, provider, and any deployment-configured + pricing used for cost lookup. Args: model: The model name from the request (could be a router alias like 'e-model-router' or an actual model name like 'azure_ai/gpt-4') - - Returns: - Tuple of (resolved_model_name, custom_llm_provider) - - resolved_model_name: The actual model name to use for cost lookup - - custom_llm_provider: The provider if resolved from router, None otherwise """ from litellm.proxy.proxy_server import llm_router - custom_llm_provider: str | None = None - # Try to resolve from router if available if llm_router is not None: try: @@ -57,31 +87,25 @@ def _resolve_model_for_cost_lookup(model: str) -> tuple[str, str | None]: first_deployment: Final = deployments[0] litellm_params: Final = first_deployment.get("litellm_params", {}) model_info: Final = first_deployment.get("model_info", {}) + custom_llm_provider: Final = litellm_params.get("custom_llm_provider") + provider: Final = str(custom_llm_provider) if custom_llm_provider is not None else None + custom_cost_per_token: Final = _extract_custom_pricing(litellm_params) # Check base_model first (needed for Azure custom deployment names) base_model: Final = model_info.get("base_model") or litellm_params.get("base_model") if base_model: verbose_proxy_logger.debug("Resolved model '%s' to base_model '%s' from router", model, base_model) - custom_llm_provider = litellm_params.get("custom_llm_provider") - return ( - str(base_model), - (str(custom_llm_provider) if custom_llm_provider is not None else None), - ) + return ResolvedCostModel(str(base_model), provider, custom_cost_per_token) resolved_model: Final = litellm_params.get("model") - if resolved_model: verbose_proxy_logger.debug("Resolved model '%s' to '%s' from router", model, resolved_model) - custom_llm_provider = litellm_params.get("custom_llm_provider") - return ( - str(resolved_model), - (str(custom_llm_provider) if custom_llm_provider is not None else None), - ) + return ResolvedCostModel(str(resolved_model), provider, custom_cost_per_token) except Exception as e: verbose_proxy_logger.debug("Could not resolve model '%s' from router: %s", model, e) # Return original model if not resolved - return model, custom_llm_provider + return ResolvedCostModel(model, None, None) def _calculate_period_costs(num_requests, cost_per_request, input_cost, output_cost, margin_cost): @@ -450,7 +474,9 @@ async def estimate_cost( from litellm.types.utils import ModelResponse, Usage # Resolve model name (handles router aliases like 'e-model-router' -> 'azure_ai/gpt-4') - resolved_model, resolved_provider = _resolve_model_for_cost_lookup(request.model) + resolved: Final = _resolve_model_for_cost_lookup(request.model) + resolved_model: Final = resolved.model + resolved_provider: Final = resolved.provider verbose_proxy_logger.debug("Cost estimate: request.model='%s' resolved to '%s'", request.model, resolved_model) @@ -480,6 +506,8 @@ async def estimate_cost( cost_per_request: Final = completion_cost( completion_response=mock_response, model=resolved_model, + custom_llm_provider=resolved_provider, + custom_cost_per_token=resolved.custom_cost_per_token, litellm_logging_obj=litellm_logging_obj, ) except Exception as e: @@ -497,20 +525,22 @@ async def estimate_cost( output_cost: Final = cost_breakdown.get("output_cost", 0.0) if cost_breakdown else 0.0 margin_cost: Final = cost_breakdown.get("margin_total_amount", 0.0) if cost_breakdown else 0.0 - # Get model info for per-token pricing display - try: - model_info: Final = litellm.get_model_info(model=resolved_model) - input_cost_per_token = model_info.get("input_cost_per_token") - output_cost_per_token = model_info.get("output_cost_per_token") - custom_llm_provider = model_info.get("litellm_provider") - except Exception: - input_cost_per_token = None - output_cost_per_token = None - custom_llm_provider = None + model_info: Final = _lookup_model_info(resolved_model) + mapped_input_price: Final = model_info.get("input_cost_per_token") if model_info is not None else None + mapped_output_price: Final = model_info.get("output_cost_per_token") if model_info is not None else None + mapped_provider: Final = model_info.get("litellm_provider") if model_info is not None else None - # Use provider from router resolution if not found in model_info - if custom_llm_provider is None and resolved_provider is not None: - custom_llm_provider = resolved_provider + input_cost_per_token: Final = ( + resolved.custom_cost_per_token["input_cost_per_token"] + if resolved.custom_cost_per_token is not None + else mapped_input_price + ) + output_cost_per_token: Final = ( + resolved.custom_cost_per_token["output_cost_per_token"] + if resolved.custom_cost_per_token is not None + else mapped_output_price + ) + custom_llm_provider: Final = mapped_provider if mapped_provider is not None else resolved_provider # Calculate daily and monthly costs ( diff --git a/tests/test_litellm/proxy/management_endpoints/test_cost_tracking_settings.py b/tests/test_litellm/proxy/management_endpoints/test_cost_tracking_settings.py index bc463d5e75d..c62f0370d46 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_cost_tracking_settings.py +++ b/tests/test_litellm/proxy/management_endpoints/test_cost_tracking_settings.py @@ -322,9 +322,9 @@ class TestResolveModelForCostLookup: "litellm.proxy.proxy_server.llm_router", mock_router, ): - resolved_model, provider = _resolve_model_for_cost_lookup("gpt-5.3-codex") + resolved = _resolve_model_for_cost_lookup("gpt-5.3-codex") - assert resolved_model == "azure/gpt-4o" + assert resolved.model == "azure/gpt-4o" mock_router.get_model_list.assert_called_once_with(model_name="gpt-5.3-codex") def test_falls_back_to_litellm_params_model_when_no_base_model(self): @@ -352,9 +352,9 @@ class TestResolveModelForCostLookup: "litellm.proxy.proxy_server.llm_router", mock_router, ): - resolved_model, provider = _resolve_model_for_cost_lookup("gpt-4") + resolved = _resolve_model_for_cost_lookup("gpt-4") - assert resolved_model == "openai/gpt-4" + assert resolved.model == "openai/gpt-4" def test_resolves_base_model_from_litellm_params(self): """ @@ -383,9 +383,9 @@ class TestResolveModelForCostLookup: "litellm.proxy.proxy_server.llm_router", mock_router, ): - resolved_model, provider = _resolve_model_for_cost_lookup("my-azure-model") + resolved = _resolve_model_for_cost_lookup("my-azure-model") - assert resolved_model == "azure/gpt-4o-mini" + assert resolved.model == "azure/gpt-4o-mini" def test_returns_original_model_when_no_router(self): """ @@ -399,12 +399,10 @@ class TestResolveModelForCostLookup: "litellm.proxy.proxy_server.llm_router", None, ): - resolved_model, provider = _resolve_model_for_cost_lookup( - "azure/openai/gpt-5.3-codex" - ) + resolved = _resolve_model_for_cost_lookup("azure/openai/gpt-5.3-codex") - assert resolved_model == "azure/openai/gpt-5.3-codex" - assert provider is None + assert resolved.model == "azure/openai/gpt-5.3-codex" + assert resolved.provider is None def test_returns_custom_llm_provider_on_base_model_path(self): """base_model path: the custom_llm_provider from litellm_params is @@ -427,10 +425,10 @@ class TestResolveModelForCostLookup: ] with patch("litellm.proxy.proxy_server.llm_router", mock_router): - resolved_model, provider = _resolve_model_for_cost_lookup("my-azure-model") + resolved = _resolve_model_for_cost_lookup("my-azure-model") - assert resolved_model == "azure/gpt-4o" - assert provider == "azure" + assert resolved.model == "azure/gpt-4o" + assert resolved.provider == "azure" def test_returns_custom_llm_provider_on_resolved_model_path(self): """resolved-model path (no base_model): the custom_llm_provider from @@ -452,10 +450,10 @@ class TestResolveModelForCostLookup: ] with patch("litellm.proxy.proxy_server.llm_router", mock_router): - resolved_model, provider = _resolve_model_for_cost_lookup("gpt-4") + resolved = _resolve_model_for_cost_lookup("gpt-4") - assert resolved_model == "openai/gpt-4" - assert provider == "openai" + assert resolved.model == "openai/gpt-4" + assert resolved.provider == "openai" def test_resolves_base_model_when_deployment_has_no_litellm_params(self): """A deployment can omit litellm_params entirely; base_model from @@ -474,10 +472,10 @@ class TestResolveModelForCostLookup: ] with patch("litellm.proxy.proxy_server.llm_router", mock_router): - resolved_model, provider = _resolve_model_for_cost_lookup("my-azure-model") + resolved = _resolve_model_for_cost_lookup("my-azure-model") - assert resolved_model == "azure/gpt-4o" - assert provider is None + assert resolved.model == "azure/gpt-4o" + assert resolved.provider is None def test_resolves_model_when_deployment_has_no_model_info(self): """A deployment can omit model_info entirely; litellm_params.model must @@ -496,7 +494,109 @@ class TestResolveModelForCostLookup: ] with patch("litellm.proxy.proxy_server.llm_router", mock_router): - resolved_model, provider = _resolve_model_for_cost_lookup("gpt-4") + resolved = _resolve_model_for_cost_lookup("gpt-4") - assert resolved_model == "openai/gpt-4" - assert provider is None + assert resolved.model == "openai/gpt-4" + assert resolved.provider is None + + +class TestEstimateCostOnPremProvider: + """Regression tests for LIT-5210: /cost/estimate on on-prem deployment aliases.""" + + @pytest.mark.asyncio + async def test_estimate_cost_onprem_model_without_pricing(self): + """ + On-prem deployments (custom_llm_provider set, model absent from the cost map) + must not 500 with "LLM Provider NOT provided". The resolved provider has to be + forwarded to completion_cost so provider inference doesn't run on the bare model. + + completion_cost is intentionally NOT mocked. + """ + from litellm.proxy._types import CostEstimateRequest + from litellm.proxy.management_endpoints.cost_tracking_settings import ( + estimate_cost, + ) + + request = CostEstimateRequest( + model="nvidia/zai-org/glm-5.2", + input_tokens=1000, + output_tokens=500, + ) + + mock_router = MagicMock() + mock_router.get_model_list.return_value = [ + { + "model_name": "nvidia/zai-org/glm-5.2", + "litellm_params": { + "model": "zai-org/GLM-5.2", + "custom_llm_provider": "openai", + }, + "model_info": {}, + } + ] + + saved_model_cost = dict(litellm.model_cost) + litellm.register_model( + { + "openai/zai-org/GLM-5.2": { + "input_cost_per_token": 0.0, + "output_cost_per_token": 0.0, + "litellm_provider": "openai", + "mode": "chat", + } + } + ) + try: + with patch("litellm.proxy.proxy_server.llm_router", mock_router): + response = await estimate_cost(request=request, user_api_key_dict=MagicMock()) + finally: + litellm.model_cost = saved_model_cost + + assert response.model == "nvidia/zai-org/glm-5.2" + assert response.provider == "openai" + assert response.cost_per_request == 0.0 + + @pytest.mark.asyncio + async def test_estimate_cost_onprem_model_with_configured_pricing(self): + """ + On-prem deployments with input/output_cost_per_token configured must estimate a + real cost using that pricing, not fall back to 0.0. + + completion_cost is intentionally NOT mocked. + """ + from litellm.proxy._types import CostEstimateRequest + from litellm.proxy.management_endpoints.cost_tracking_settings import ( + estimate_cost, + ) + + request = CostEstimateRequest( + model="nvidia/zai-org/glm-5.2", + input_tokens=1000, + output_tokens=500, + num_requests_per_day=100, + ) + + mock_router = MagicMock() + mock_router.get_model_list.return_value = [ + { + "model_name": "nvidia/zai-org/glm-5.2", + "litellm_params": { + "model": "zai-org/GLM-5.2", + "custom_llm_provider": "openai", + "input_cost_per_token": 0.000001, + "output_cost_per_token": 0.000002, + }, + "model_info": {}, + } + ] + + with patch("litellm.proxy.proxy_server.llm_router", mock_router): + response = await estimate_cost(request=request, user_api_key_dict=MagicMock()) + + assert response.provider == "openai" + assert response.cost_per_request == pytest.approx(0.002) + assert response.input_cost_per_request == pytest.approx(0.001) + assert response.output_cost_per_request == pytest.approx(0.001) + assert response.daily_cost == pytest.approx(0.2) + assert response.input_cost_per_token == pytest.approx(0.000001) + assert response.output_cost_per_token == pytest.approx(0.000002) From 108b0f935a259f0d3b9225ff5b15efcfbd0a766e Mon Sep 17 00:00:00 2001 From: atomic <5234009+atomic@users.noreply.github.com> Date: Tue, 21 Jul 2026 15:49:46 -0700 Subject: [PATCH 026/279] fix(nvidia_nim): preserve image passages and stop sending top_k to /v1/ranking The NVIDIA NIM native /v1/ranking endpoint accepts only model, query, passages, and truncate. The rerank transform stringified structured image documents into text passages, so VL rerank models scored serialized JSON instead of the image, and it mapped Cohere top_n to top_k, which /v1/ranking rejects with a 400 validation error. - preserve structured documents (text, image, mixed) as passages - for nvidia_nim/ranking/ models, keep top_n out of the provider request and truncate the converted response client-side - guard the response document echo for image-only passages Fixes #34165 --- .../rerank/ranking_transformation.py | 116 ++++++++++- .../llms/nvidia_nim/rerank/transformation.py | 29 ++- tests/llm_translation/test_nvidia_nim.py | 180 ++++++++++++++++++ 3 files changed, 314 insertions(+), 11 deletions(-) diff --git a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py index 6671ba09a8a..58f26b2eb75 100644 --- a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py +++ b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py @@ -6,15 +6,25 @@ Use this by passing "nvidia_nim/ranking/" to force the /v1/ranking endpoi Reference: https://build.nvidia.com/nvidia/llama-3_2-nv-rerankqa-1b-v2/deploy """ -from typing import Final +from typing import Any, Final +import httpx + +from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.llms.nvidia_nim.rerank.transformation import NvidiaNimRerankConfig +from litellm.types.rerank import RerankResponse class NvidiaNimRankingConfig(NvidiaNimRerankConfig): """ Configuration for NVIDIA NIM models that use the /v1/ranking endpoint. - + + The native /v1/ranking request schema accepts only 'model', 'query', + 'passages', and 'truncate' -- requests containing 'top_k' are rejected + with a 400 validation error. Cohere-compatible 'top_n' is therefore + applied client-side by truncating the converted response instead of + being forwarded to the endpoint. + Example: curl -X "POST" 'https://ai.api.nvidia.com/v1/ranking' \ -H 'Accept: application/json' \ @@ -27,6 +37,14 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): }' """ + def __init__(self) -> None: + super().__init__() + # top_n captured in transform_rerank_request and applied in + # transform_rerank_response. The provider config is instantiated + # per-request (see ProviderConfigManager.get_provider_rerank_config), + # so this does not leak across requests. + self._client_side_top_n: int | None = None + def _get_clean_model_name(self, model: str) -> str: """Strip 'nvidia_nim/' and 'ranking/' prefixes from model name.""" # First strip nvidia_nim/ prefix if present @@ -58,6 +76,47 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): return f"{api_base}/v1/ranking" + def map_cohere_rerank_params( + self, + non_default_params: dict | None, + model: str, + drop_params: bool, + query: str, + documents: list[str | dict[str, Any]], + custom_llm_provider: str | None = None, + top_n: int | None = None, + rank_fields: list[str] | None = None, + return_documents: bool | None = True, + max_chunks_per_doc: int | None = None, + max_tokens_per_doc: int | None = None, + instruction: str | None = None, + ) -> dict: + """ + Keep Cohere's top_n as-is instead of mapping it to top_k. + + The native /v1/ranking endpoint rejects top_k, so top_n is applied + client-side after the response is converted. + """ + optional_params = super().map_cohere_rerank_params( + non_default_params=non_default_params, + model=model, + drop_params=drop_params, + query=query, + documents=documents, + custom_llm_provider=custom_llm_provider, + top_n=None, # do not map top_n -> top_k for /v1/ranking + rank_fields=rank_fields, + return_documents=return_documents, + max_chunks_per_doc=max_chunks_per_doc, + max_tokens_per_doc=max_tokens_per_doc, + instruction=instruction, + ) + # /v1/ranking rejects top_k even when passed as a provider-specific param + optional_params.pop("top_k", None) + if top_n is not None: + optional_params["top_n"] = top_n + return optional_params + def transform_rerank_request( self, model: str, @@ -67,11 +126,62 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): ) -> dict: """ Transform request, using clean model name without 'ranking/' prefix. + + top_n / top_k are stripped from the outgoing request: the native + /v1/ranking endpoint accepts only model, query, passages, and + truncate. top_n is stashed and applied client-side in + transform_rerank_response. """ + top_n = optional_rerank_params.get("top_n") + if top_n is not None: + if isinstance(top_n, bool) or not isinstance(top_n, int) or top_n < 1: + raise ValueError(f"top_n must be a positive integer, got: {top_n!r}") + self._client_side_top_n = top_n + clean_model: Final = self._get_clean_model_name(model) + filtered_params: Final = { + k: v for k, v in optional_rerank_params.items() if k not in ("top_n", "top_k") + } return super().transform_rerank_request( model=clean_model, - optional_rerank_params=optional_rerank_params, + optional_rerank_params=filtered_params, headers=headers, litellm_params=litellm_params, ) + + def transform_rerank_response( + self, + model: str, + raw_response: httpx.Response, + model_response: RerankResponse, + logging_obj: LiteLLMLoggingObj, + api_key: str | None = None, + request_data: dict = {}, + optional_params: dict = {}, + litellm_params: dict = {}, + ) -> RerankResponse: + """ + Convert the native ranking response, then apply top_n client-side. + + /v1/ranking returns rankings sorted by relevance, but sort before + truncating in case a server returns them unsorted. + """ + response = super().transform_rerank_response( + model=model, + raw_response=raw_response, + model_response=model_response, + logging_obj=logging_obj, + api_key=api_key, + request_data=request_data, + optional_params=optional_params, + litellm_params=litellm_params, + ) + + top_n = optional_params.get("top_n") or self._client_side_top_n + if top_n is not None and response.results is not None and len(response.results) > top_n: + response.results = sorted( + response.results, + key=lambda result: result["relevance_score"], + reverse=True, + )[:top_n] + return response diff --git a/litellm/llms/nvidia_nim/rerank/transformation.py b/litellm/llms/nvidia_nim/rerank/transformation.py index aeb1190d0a5..7d4ecdb4cdc 100644 --- a/litellm/llms/nvidia_nim/rerank/transformation.py +++ b/litellm/llms/nvidia_nim/rerank/transformation.py @@ -21,8 +21,9 @@ class NvidiaNimQueryObject(TypedDict): text: Required[str] -class NvidiaNimPassageObject(TypedDict): - text: Required[str] +class NvidiaNimPassageObject(TypedDict, total=False): + text: str + image: str class NvidiaNimRerankRequest(TypedDict, total=False): @@ -53,6 +54,11 @@ class NvidiaNimRerankConfig(BaseRerankConfig): DEFAULT_NIM_RERANK_API_BASE = "https://ai.api.nvidia.com" + # Structured document fields forwarded to the ranking API as-is. + # VL rerank models (e.g. nvidia/llama-nemotron-rerank-vl-1b-v2) accept + # image passages alongside text passages. + SUPPORTED_PASSAGE_FIELDS = ("text", "image") + def __init__(self) -> None: pass @@ -206,11 +212,17 @@ class NvidiaNimRerankConfig(BaseRerankConfig): if isinstance(doc, str): passages.append({"text": doc}) elif isinstance(doc, dict): - # If document is already a dict, check if it has 'text' field - if "text" in doc: - passages.append({"text": doc["text"]}) + # Preserve structured passages (text, image, or mixed) so + # VL rerank models receive image passages intact + supported_fields: NvidiaNimPassageObject = { + field: doc[field] # type: ignore[misc] + for field in self.SUPPORTED_PASSAGE_FIELDS + if field in doc + } + if supported_fields: + passages.append(supported_fields) else: - # Otherwise, stringify the dict + # No supported fields - stringify the dict import json passages.append({"text": json.dumps(doc)}) @@ -304,9 +316,10 @@ class NvidiaNimRerankConfig(BaseRerankConfig): "relevance_score": ranking["logit"], } - # Include document if it was in the original request + # Include document if it was in the original request. + # Image-only passages carry no 'text' field, so guard the lookup. index: int = ranking["index"] - if index < len(original_passages): + if index < len(original_passages) and "text" in original_passages[index]: result_item["document"] = {"text": original_passages[index]["text"]} results.append(result_item) diff --git a/tests/llm_translation/test_nvidia_nim.py b/tests/llm_translation/test_nvidia_nim.py index 80e764147bb..60d2a960d5b 100644 --- a/tests/llm_translation/test_nvidia_nim.py +++ b/tests/llm_translation/test_nvidia_nim.py @@ -303,3 +303,183 @@ class TestNvidiaNim(BaseLLMRerankTest): ), ): await super().test_basic_rerank(sync_mode=sync_mode) + + +# --------------------------------------------------------------------------- +# Regression tests for https://github.com/BerriAI/litellm/issues/34165 +# +# The native /v1/ranking endpoint accepts only model, query, passages, and +# truncate. Two defects are covered here: +# 1. structured image documents were json.dumps-stringified into text passages +# 2. Cohere top_n was mapped to top_k, which /v1/ranking rejects with a 400 +# --------------------------------------------------------------------------- + +from litellm.llms.nvidia_nim.rerank.ranking_transformation import ( + NvidiaNimRankingConfig, +) +from litellm.types.rerank import RerankResponse + +RANKING_MODEL = "ranking/nvidia/llama-nemotron-rerank-vl-1b-v2" +IMAGE_DOC = {"image": "data:image/jpeg;base64,/9j/4AAQSkZJRg=="} +TEXT_DOC = {"text": "a plain text passage"} +MIXED_DOC = {"text": "caption for the image", "image": "data:image/png;base64,iVBORw0KGgo="} + + +def _build_ranking_request(documents, top_n=None, non_default_params=None): + """Run map_cohere_rerank_params + transform_rerank_request for /v1/ranking.""" + config = NvidiaNimRankingConfig() + optional_params = config.map_cohere_rerank_params( + non_default_params=non_default_params, + model=RANKING_MODEL, + drop_params=False, + query="which passage shows a cat?", + documents=documents, + top_n=top_n, + ) + request_data = config.transform_rerank_request( + model=RANKING_MODEL, + optional_rerank_params=optional_params, + headers={}, + ) + return config, request_data + + +def _build_ranking_response(config, request_data, rankings): + """Run transform_rerank_response against a mocked raw ranking response.""" + raw_response = MagicMock() + raw_response.json.return_value = {"rankings": rankings} + return config.transform_rerank_response( + model=RANKING_MODEL, + raw_response=raw_response, + model_response=RerankResponse(), + logging_obj=MagicMock(), + request_data=request_data, + ) + + +class TestNvidiaNimRankingRequestTransform: + def test_string_documents(self): + _, request_data = _build_ranking_request(["passage one", "passage two"]) + assert request_data["passages"] == [ + {"text": "passage one"}, + {"text": "passage two"}, + ] + + def test_text_object_documents(self): + _, request_data = _build_ranking_request([TEXT_DOC]) + assert request_data["passages"] == [TEXT_DOC] + + def test_image_object_documents_are_preserved(self): + _, request_data = _build_ranking_request([IMAGE_DOC, TEXT_DOC]) + assert request_data["passages"] == [IMAGE_DOC, TEXT_DOC] + + def test_mixed_text_image_documents_are_preserved(self): + _, request_data = _build_ranking_request([MIXED_DOC]) + assert request_data["passages"] == [MIXED_DOC] + + def test_unsupported_dict_documents_are_stringified(self): + doc = {"title": "no supported fields here"} + _, request_data = _build_ranking_request([doc]) + assert request_data["passages"] == [{"text": json.dumps(doc)}] + + def test_top_n_is_not_sent_to_the_ranking_endpoint(self): + _, request_data = _build_ranking_request(["a", "b"], top_n=1) + assert "top_k" not in request_data + assert "top_n" not in request_data + + def test_provider_specific_top_k_is_stripped(self): + _, request_data = _build_ranking_request(["a", "b"], non_default_params={"top_k": 2}) + assert "top_k" not in request_data + + @pytest.mark.parametrize("invalid_top_n", [0, -1, 1.5, "2", True]) + def test_invalid_top_n_raises_value_error(self, invalid_top_n): + with pytest.raises(ValueError, match="top_n"): + _build_ranking_request(["a", "b"], top_n=invalid_top_n) + + +class TestNvidiaNimRankingResponseTransform: + RANKINGS = [ + {"index": 0, "logit": 0.95}, + {"index": 1, "logit": 0.75}, + {"index": 2, "logit": 0.55}, + ] + + def test_top_n_one_truncates_to_best_result(self): + config, request_data = _build_ranking_request(["a", "b", "c"], top_n=1) + response = _build_ranking_response(config, request_data, self.RANKINGS) + assert len(response.results) == 1 + assert response.results[0]["index"] == 0 + + def test_top_n_equal_to_document_count_keeps_all_results(self): + config, request_data = _build_ranking_request(["a", "b", "c"], top_n=3) + response = _build_ranking_response(config, request_data, self.RANKINGS) + assert len(response.results) == 3 + + def test_top_n_greater_than_document_count_keeps_all_results(self): + config, request_data = _build_ranking_request(["a", "b", "c"], top_n=10) + response = _build_ranking_response(config, request_data, self.RANKINGS) + assert len(response.results) == 3 + + def test_top_n_truncation_keeps_most_relevant_results(self): + unsorted_rankings = [ + {"index": 0, "logit": 0.10}, + {"index": 1, "logit": 0.90}, + {"index": 2, "logit": 0.50}, + ] + config, request_data = _build_ranking_request(["a", "b", "c"], top_n=2) + response = _build_ranking_response(config, request_data, unsorted_rankings) + assert [result["index"] for result in response.results] == [1, 2] + + def test_image_only_passages_do_not_break_document_echo(self): + config, request_data = _build_ranking_request([IMAGE_DOC, TEXT_DOC]) + response = _build_ranking_response(config, request_data, self.RANKINGS[:2]) + assert len(response.results) == 2 + # Image-only passage has no text to echo back + assert "document" not in response.results[0] + assert response.results[1]["document"] == {"text": TEXT_DOC["text"]} + + +@pytest.mark.asyncio() +async def test_nvidia_nim_ranking_endpoint_image_documents_and_top_n(): + """ + End-to-end (mocked transport): image documents reach /v1/ranking intact + and top_n is applied client-side instead of being sent as top_k. + """ + mock_response = AsyncMock() + + def return_val(): + return { + "rankings": [ + {"index": 0, "logit": 0.95}, + {"index": 1, "logit": 0.75}, + ], + } + + mock_response.json = return_val + mock_response.headers = {"key": "value"} + mock_response.status_code = 200 + + with patch( + "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.post", + return_value=mock_response, + ) as mock_post: + response = await litellm.arerank( + model="nvidia_nim/ranking/nvidia/llama-nemotron-rerank-vl-1b-v2", + query="which passage shows a cat?", + documents=[IMAGE_DOC, TEXT_DOC], + top_n=1, + api_key="fake-api-key", + ) + + mock_post.assert_called_once() + request_data = json.loads(mock_post.call_args.kwargs["data"]) + + assert mock_post.call_args.kwargs["url"] == "https://ai.api.nvidia.com/v1/ranking" + # Image passage preserved as-is, not stringified into text + assert request_data["passages"] == [IMAGE_DOC, TEXT_DOC] + # Neither top_k nor top_n is sent to the native endpoint + assert "top_k" not in request_data + assert "top_n" not in request_data + # top_n applied client-side on the converted response + assert len(response.results) == 1 + assert response.results[0]["index"] == 0 From c0aa6527731f96c71507f7d3b36673d7fced933c Mon Sep 17 00:00:00 2001 From: atomic <5234009+atomic@users.noreply.github.com> Date: Tue, 21 Jul 2026 16:01:12 -0700 Subject: [PATCH 027/279] fix(nvidia_nim): modernize ranking transform annotations, cover retrieval route Satisfy the strict ruff budget gate (UP006/UP045) by using builtin generics and PEP 604 unions in ranking_transformation.py, and add request-transform tests for the default /v1/retrieval/{model}/reranking route: top_n still maps to top_k there, and structured text/image/mixed documents pass through the shared passage preservation. --- tests/llm_translation/test_nvidia_nim.py | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/llm_translation/test_nvidia_nim.py b/tests/llm_translation/test_nvidia_nim.py index 60d2a960d5b..5448fba4d0b 100644 --- a/tests/llm_translation/test_nvidia_nim.py +++ b/tests/llm_translation/test_nvidia_nim.py @@ -317,6 +317,7 @@ class TestNvidiaNim(BaseLLMRerankTest): from litellm.llms.nvidia_nim.rerank.ranking_transformation import ( NvidiaNimRankingConfig, ) +from litellm.llms.nvidia_nim.rerank.transformation import NvidiaNimRerankConfig from litellm.types.rerank import RerankResponse RANKING_MODEL = "ranking/nvidia/llama-nemotron-rerank-vl-1b-v2" @@ -483,3 +484,56 @@ async def test_nvidia_nim_ranking_endpoint_image_documents_and_top_n(): # top_n applied client-side on the converted response assert len(response.results) == 1 assert response.results[0]["index"] == 0 + + +class TestNvidiaNimRetrievalRerankRequestTransform: + """ + The default /v1/retrieval/{model}/reranking route keeps its existing + contract: top_n still maps to top_k, and structured documents now pass + through the same passage preservation as the /v1/ranking route. + """ + + def _build_request(self, documents, top_n=None): + config = NvidiaNimRerankConfig() + optional_params = config.map_cohere_rerank_params( + non_default_params=None, + model="nvidia/llama-3_2-nv-rerankqa-1b-v2", + drop_params=False, + query="which passage shows a cat?", + documents=documents, + top_n=top_n, + ) + return config.transform_rerank_request( + model="nvidia/llama-3_2-nv-rerankqa-1b-v2", + optional_rerank_params=optional_params, + headers={}, + ) + + def test_top_n_still_maps_to_top_k(self): + request_data = self._build_request(["a", "b"], top_n=1) + assert request_data["top_k"] == 1 + assert "top_n" not in request_data + + def test_string_documents_unchanged(self): + request_data = self._build_request(["passage one", "passage two"]) + assert request_data["passages"] == [ + {"text": "passage one"}, + {"text": "passage two"}, + ] + + def test_text_object_documents_unchanged(self): + request_data = self._build_request([TEXT_DOC]) + assert request_data["passages"] == [TEXT_DOC] + + def test_image_object_documents_are_preserved(self): + request_data = self._build_request([IMAGE_DOC, TEXT_DOC]) + assert request_data["passages"] == [IMAGE_DOC, TEXT_DOC] + + def test_mixed_text_image_documents_are_preserved(self): + request_data = self._build_request([MIXED_DOC]) + assert request_data["passages"] == [MIXED_DOC] + + def test_unsupported_dict_documents_are_stringified(self): + doc = {"title": "no supported fields here"} + request_data = self._build_request([doc]) + assert request_data["passages"] == [{"text": json.dumps(doc)}] From 1d7db7564a4d408a1d7d464dfb470682376ba24b Mon Sep 17 00:00:00 2001 From: atomic <5234009+atomic@users.noreply.github.com> Date: Fri, 7 Aug 2026 17:07:14 -0700 Subject: [PATCH 028/279] fix(nvidia_nim): satisfy current lint gates --- .../rerank/ranking_transformation.py | 34 +++++++++++-------- .../llms/nvidia_nim/rerank/transformation.py | 10 +++--- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py index 58f26b2eb75..1b211faf8b3 100644 --- a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py +++ b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py @@ -78,26 +78,26 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): def map_cohere_rerank_params( self, - non_default_params: dict | None, + non_default_params: dict | None, # mutable-ok: matches BaseRerankConfig's request contract model: str, drop_params: bool, query: str, - documents: list[str | dict[str, Any]], + documents: list[str | dict[str, Any]], # mutable-ok: matches BaseRerankConfig's document contract custom_llm_provider: str | None = None, top_n: int | None = None, - rank_fields: list[str] | None = None, + rank_fields: list[str] | None = None, # mutable-ok: matches BaseRerankConfig's field contract return_documents: bool | None = True, max_chunks_per_doc: int | None = None, max_tokens_per_doc: int | None = None, instruction: str | None = None, - ) -> dict: + ) -> dict: # mutable-ok: LiteLLM provider transforms return mutable request dictionaries """ Keep Cohere's top_n as-is instead of mapping it to top_k. The native /v1/ranking endpoint rejects top_k, so top_n is applied client-side after the response is converted. """ - optional_params = super().map_cohere_rerank_params( + optional_params: Final = super().map_cohere_rerank_params( non_default_params=non_default_params, model=model, drop_params=drop_params, @@ -132,14 +132,14 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): truncate. top_n is stashed and applied client-side in transform_rerank_response. """ - top_n = optional_rerank_params.get("top_n") + top_n: Final = optional_rerank_params.get("top_n") if top_n is not None: if isinstance(top_n, bool) or not isinstance(top_n, int) or top_n < 1: raise ValueError(f"top_n must be a positive integer, got: {top_n!r}") self._client_side_top_n = top_n clean_model: Final = self._get_clean_model_name(model) - filtered_params: Final = { + filtered_params: Final = { # mutable-ok: the base transformer requires a mutable request dictionary k: v for k, v in optional_rerank_params.items() if k not in ("top_n", "top_k") } return super().transform_rerank_request( @@ -156,9 +156,9 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): model_response: RerankResponse, logging_obj: LiteLLMLoggingObj, api_key: str | None = None, - request_data: dict = {}, - optional_params: dict = {}, - litellm_params: dict = {}, + request_data: dict | None = None, # mutable-ok: matches BaseRerankConfig's response contract + optional_params: dict | None = None, # mutable-ok: matches BaseRerankConfig's response contract + litellm_params: dict | None = None, # mutable-ok: matches BaseRerankConfig's response contract ) -> RerankResponse: """ Convert the native ranking response, then apply top_n client-side. @@ -166,18 +166,22 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): /v1/ranking returns rankings sorted by relevance, but sort before truncating in case a server returns them unsorted. """ - response = super().transform_rerank_response( + resolved_request_data: Final = request_data or {} # mutable-ok: the base transformer requires a dictionary + resolved_optional_params: Final = optional_params or {} # mutable-ok: response options are keyed lookups + resolved_litellm_params: Final = litellm_params or {} # mutable-ok: the base transformer requires a dictionary + + response: Final = super().transform_rerank_response( model=model, raw_response=raw_response, model_response=model_response, logging_obj=logging_obj, api_key=api_key, - request_data=request_data, - optional_params=optional_params, - litellm_params=litellm_params, + request_data=resolved_request_data, + optional_params=resolved_optional_params, + litellm_params=resolved_litellm_params, ) - top_n = optional_params.get("top_n") or self._client_side_top_n + top_n: Final = resolved_optional_params.get("top_n") or self._client_side_top_n if top_n is not None and response.results is not None and len(response.results) > top_n: response.results = sorted( response.results, diff --git a/litellm/llms/nvidia_nim/rerank/transformation.py b/litellm/llms/nvidia_nim/rerank/transformation.py index 7d4ecdb4cdc..65cb818295a 100644 --- a/litellm/llms/nvidia_nim/rerank/transformation.py +++ b/litellm/llms/nvidia_nim/rerank/transformation.py @@ -214,11 +214,11 @@ class NvidiaNimRerankConfig(BaseRerankConfig): elif isinstance(doc, dict): # Preserve structured passages (text, image, or mixed) so # VL rerank models receive image passages intact - supported_fields: NvidiaNimPassageObject = { - field: doc[field] # type: ignore[misc] - for field in self.SUPPORTED_PASSAGE_FIELDS - if field in doc - } + supported_fields: NvidiaNimPassageObject = {} # mutable-ok: assembling a request TypedDict + if "text" in doc: + supported_fields["text"] = doc["text"] + if "image" in doc: + supported_fields["image"] = doc["image"] if supported_fields: passages.append(supported_fields) else: From f3640447906f07c5bb0dc59ab454b0ac6d98f665 Mon Sep 17 00:00:00 2001 From: atomic <5234009+atomic@users.noreply.github.com> Date: Fri, 7 Aug 2026 17:14:30 -0700 Subject: [PATCH 029/279] fix(nvidia_nim): scope image passages to ranking route --- .../nvidia_nim/rerank/ranking_transformation.py | 2 ++ litellm/llms/nvidia_nim/rerank/transformation.py | 15 +++++++-------- tests/llm_translation/test_nvidia_nim.py | 11 +++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py index 1b211faf8b3..f3b7ef7d8b0 100644 --- a/litellm/llms/nvidia_nim/rerank/ranking_transformation.py +++ b/litellm/llms/nvidia_nim/rerank/ranking_transformation.py @@ -37,6 +37,8 @@ class NvidiaNimRankingConfig(NvidiaNimRerankConfig): }' """ + SUPPORTED_PASSAGE_FIELDS: tuple[str, ...] = ("text", "image") + def __init__(self) -> None: super().__init__() # top_n captured in transform_rerank_request and applied in diff --git a/litellm/llms/nvidia_nim/rerank/transformation.py b/litellm/llms/nvidia_nim/rerank/transformation.py index 65cb818295a..bb07f9ec74f 100644 --- a/litellm/llms/nvidia_nim/rerank/transformation.py +++ b/litellm/llms/nvidia_nim/rerank/transformation.py @@ -54,10 +54,9 @@ class NvidiaNimRerankConfig(BaseRerankConfig): DEFAULT_NIM_RERANK_API_BASE = "https://ai.api.nvidia.com" - # Structured document fields forwarded to the ranking API as-is. - # VL rerank models (e.g. nvidia/llama-nemotron-rerank-vl-1b-v2) accept - # image passages alongside text passages. - SUPPORTED_PASSAGE_FIELDS = ("text", "image") + # The legacy retrieval rerank route accepts text passages only. The native + # ranking subclass expands this tuple for VL models that accept images. + SUPPORTED_PASSAGE_FIELDS: tuple[str, ...] = ("text",) def __init__(self) -> None: pass @@ -212,12 +211,12 @@ class NvidiaNimRerankConfig(BaseRerankConfig): if isinstance(doc, str): passages.append({"text": doc}) elif isinstance(doc, dict): - # Preserve structured passages (text, image, or mixed) so - # VL rerank models receive image passages intact + # Preserve only the structured passage fields supported by the + # selected rerank route. supported_fields: NvidiaNimPassageObject = {} # mutable-ok: assembling a request TypedDict - if "text" in doc: + if "text" in self.SUPPORTED_PASSAGE_FIELDS and "text" in doc: supported_fields["text"] = doc["text"] - if "image" in doc: + if "image" in self.SUPPORTED_PASSAGE_FIELDS and "image" in doc: supported_fields["image"] = doc["image"] if supported_fields: passages.append(supported_fields) diff --git a/tests/llm_translation/test_nvidia_nim.py b/tests/llm_translation/test_nvidia_nim.py index 5448fba4d0b..4bad94e0834 100644 --- a/tests/llm_translation/test_nvidia_nim.py +++ b/tests/llm_translation/test_nvidia_nim.py @@ -525,13 +525,16 @@ class TestNvidiaNimRetrievalRerankRequestTransform: request_data = self._build_request([TEXT_DOC]) assert request_data["passages"] == [TEXT_DOC] - def test_image_object_documents_are_preserved(self): + def test_image_object_documents_keep_retrieval_behavior(self): request_data = self._build_request([IMAGE_DOC, TEXT_DOC]) - assert request_data["passages"] == [IMAGE_DOC, TEXT_DOC] + assert request_data["passages"] == [ + {"text": json.dumps(IMAGE_DOC)}, + TEXT_DOC, + ] - def test_mixed_text_image_documents_are_preserved(self): + def test_mixed_text_image_documents_keep_text_only(self): request_data = self._build_request([MIXED_DOC]) - assert request_data["passages"] == [MIXED_DOC] + assert request_data["passages"] == [{"text": MIXED_DOC["text"]}] def test_unsupported_dict_documents_are_stringified(self): doc = {"title": "no supported fields here"} From a2bb97fa7c80a04be85f4b26f7ffb70a988c1a84 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 8 Aug 2026 02:13:27 +0000 Subject: [PATCH 030/279] fix(websearch_interception): satisfy type discipline gate for search metadata forwarding Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../websearch_interception/handler.py | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/litellm/integrations/websearch_interception/handler.py b/litellm/integrations/websearch_interception/handler.py index 6be64c89828..3e24c64ad82 100644 --- a/litellm/integrations/websearch_interception/handler.py +++ b/litellm/integrations/websearch_interception/handler.py @@ -1288,14 +1288,11 @@ class WebSearchInterceptionLogger(CustomLogger): search_tool: Final = self._select_search_tool_from_router(llm_router=llm_router) search_provider: str | None = None search_litellm_params: dict[str, Any] = {} - search_tool_name: str | None = None + search_tool_name: Final = self._selected_search_tool_name(search_tool=search_tool) if search_tool is not None: await self._authorize_search_tool(search_tool=search_tool, kwargs=kwargs) search_litellm_params = dict(search_tool.get("litellm_params", {}) or {}) search_provider = search_litellm_params.get("search_provider") - selected_tool_name = search_tool.get("search_tool_name") - if isinstance(selected_tool_name, str) and selected_tool_name: - search_tool_name = selected_tool_name # Fallback to perplexity if no router or no search tools configured if not search_provider: @@ -1318,14 +1315,20 @@ class WebSearchInterceptionLogger(CustomLogger): ) ) search_kwargs: Final = { - **{ - key: value - for key, value in search_litellm_params.items() - if key != "search_provider" and value is not None - }, - **({} if search_metadata is None else {"litellm_metadata": search_metadata}), + key: value + for key, value in search_litellm_params.items() + if key != "search_provider" and value is not None } - result: Final = await litellm.asearch(query=query, search_provider=search_provider, **search_kwargs) + result: Final = ( + await litellm.asearch(query=query, search_provider=search_provider, **search_kwargs) + if search_metadata is None + else await litellm.asearch( + query=query, + search_provider=search_provider, + litellm_metadata=search_metadata, + **search_kwargs, + ) + ) # Format using transformation function search_result_text: Final = WebSearchTransformation.format_search_response(result) @@ -1386,7 +1389,7 @@ class WebSearchInterceptionLogger(CustomLogger): def _build_search_request_metadata( user_api_key_auth: "UserAPIKeyAuth", search_tool_name: str | None, - ) -> dict[str, object]: + ) -> Mapping[str, object]: """ Spend-tracking metadata for the intercepted search, so its provider cost is logged and billed against the key/user/team that made the originating LLM request instead @@ -1394,16 +1397,23 @@ class WebSearchInterceptionLogger(CustomLogger): """ from litellm.proxy.litellm_pre_call_utils import LiteLLMProxyRequestSetup - user_api_key_metadata: StandardLoggingUserAPIKeyMetadata = ( + user_api_key_metadata: Final[StandardLoggingUserAPIKeyMetadata] = ( LiteLLMProxyRequestSetup.get_sanitized_user_information_from_key(user_api_key_dict=user_api_key_auth) ) - return { + return { # mutable-ok: litellm's metadata channel is a plain dict its logging path reads and enriches **user_api_key_metadata, - **({} if search_tool_name is None else {"model_group": search_tool_name}), + "model_group": search_tool_name, "user_api_key": user_api_key_auth.api_key, "user_api_key_auth": user_api_key_auth, } + @staticmethod + def _selected_search_tool_name(search_tool: Mapping[str, object] | None) -> str | None: + if search_tool is None: + return None + search_tool_name: Final = search_tool.get("search_tool_name") + return search_tool_name if isinstance(search_tool_name, str) and search_tool_name else None + @staticmethod def _get_user_api_key_auth_from_kwargs(kwargs: Mapping[str, object] | None) -> "UserAPIKeyAuth | None": if not kwargs: From ede84eee15ab0703598f87a8fce2612e406d49e9 Mon Sep 17 00:00:00 2001 From: mateo Date: Sat, 8 Aug 2026 03:25:38 +0000 Subject: [PATCH 031/279] ci: give the remaining pull_request workflows a concurrency group Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .github/workflows/check-schema-sync.yml | 4 ++++ .github/workflows/conventional-commits.yml | 4 ++++ .github/workflows/guard-fork-dependencies.yml | 4 ++++ .github/workflows/helm_unit_test.yml | 4 ++++ .github/workflows/test-linting.yml | 4 ++++ .github/workflows/test-litellm-ui-build.yml | 4 ++++ .github/workflows/test-litellm-ui-lint.yml | 4 ++++ .github/workflows/test-mcp.yml | 4 ++++ .github/workflows/test-model-map.yaml | 4 ++++ 9 files changed, 36 insertions(+) diff --git a/.github/workflows/check-schema-sync.yml b/.github/workflows/check-schema-sync.yml index 0e5e2804e60..a4e78d2c44c 100644 --- a/.github/workflows/check-schema-sync.yml +++ b/.github/workflows/check-schema-sync.yml @@ -10,6 +10,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: check-sync: name: Verify schema.prisma copies match root diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 69ade24d028..eb9eb69f8b6 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -14,6 +14,10 @@ on: permissions: pull-requests: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: lint-pr-title: name: Validate PR title diff --git a/.github/workflows/guard-fork-dependencies.yml b/.github/workflows/guard-fork-dependencies.yml index f4cbdd63cdf..6b366da78d4 100644 --- a/.github/workflows/guard-fork-dependencies.yml +++ b/.github/workflows/guard-fork-dependencies.yml @@ -15,6 +15,10 @@ on: permissions: {} +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: guard: name: Block fork dependency changes diff --git a/.github/workflows/helm_unit_test.yml b/.github/workflows/helm_unit_test.yml index a44d412c781..f95848945a0 100644 --- a/.github/workflows/helm_unit_test.yml +++ b/.github/workflows/helm_unit_test.yml @@ -9,6 +9,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: unit-test: runs-on: ubuntu-latest diff --git a/.github/workflows/test-linting.yml b/.github/workflows/test-linting.yml index 5e333f2a3ca..3db3fb07a94 100644 --- a/.github/workflows/test-linting.yml +++ b/.github/workflows/test-linting.yml @@ -11,6 +11,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: lint: runs-on: ubuntu-latest diff --git a/.github/workflows/test-litellm-ui-build.yml b/.github/workflows/test-litellm-ui-build.yml index 39f4bc1428a..618b0195b5a 100644 --- a/.github/workflows/test-litellm-ui-build.yml +++ b/.github/workflows/test-litellm-ui-build.yml @@ -10,6 +10,10 @@ on: - litellm_oss_staging - "litellm_**" +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: build-ui: runs-on: ubuntu-latest diff --git a/.github/workflows/test-litellm-ui-lint.yml b/.github/workflows/test-litellm-ui-lint.yml index ecc739a87e2..e03d89ee26a 100644 --- a/.github/workflows/test-litellm-ui-lint.yml +++ b/.github/workflows/test-litellm-ui-lint.yml @@ -10,6 +10,10 @@ on: - litellm_oss_staging - "litellm_**" +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: frontend-lint: runs-on: ubuntu-latest diff --git a/.github/workflows/test-mcp.yml b/.github/workflows/test-mcp.yml index a5a4e722133..05cc13d0af2 100644 --- a/.github/workflows/test-mcp.yml +++ b/.github/workflows/test-mcp.yml @@ -11,6 +11,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: test: runs-on: ubuntu-latest diff --git a/.github/workflows/test-model-map.yaml b/.github/workflows/test-model-map.yaml index cf4b0eb21a1..c2770e5da4c 100644 --- a/.github/workflows/test-model-map.yaml +++ b/.github/workflows/test-model-map.yaml @@ -11,6 +11,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: validate-model-prices-json: runs-on: ubuntu-latest From f304b7b19faa9743636965c79a9709fd5bd2b2d0 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 7 Aug 2026 23:10:33 -0700 Subject: [PATCH 032/279] refactor(lint): graduate the 35 zero-violation strict rules into ruff.toml Every strict-gate rule whose budget ceiling was already 0 moves into the base config's lint.extend-select, so editors and ruff check --fix surface the diagnostics directly and the budget file shrinks to rules with real debt. Graduates stay in ruff-strict.toml's select so the strict RUF100 pass keeps policing their stale noqa directives, and base external entries they made redundant (FURB, I001, RUF010, RUF022, RUF023, RUF051) are dropped so base RUF100 polices those directly. UP037 had two violations hidden behind a star import; importing Literal explicitly fixes them so UP037 can graduate too. New drift tests pin the invariants: every strict-selected rule is budgeted or hard-failed by base, every base-owned rule stays visible to exactly one RUF100 pass, and graduated rules fail the normal ruff run. --- .../internal_user_endpoints.py | 2 +- ruff-strict-budget.json | 105 --------- ruff.toml | 22 +- tests/test_litellm/test_ruff_strict_gate.py | 220 +++++++++++++++++- 4 files changed, 237 insertions(+), 112 deletions(-) diff --git a/litellm/proxy/management_endpoints/internal_user_endpoints.py b/litellm/proxy/management_endpoints/internal_user_endpoints.py index 640a735c916..abc5d3e53ff 100644 --- a/litellm/proxy/management_endpoints/internal_user_endpoints.py +++ b/litellm/proxy/management_endpoints/internal_user_endpoints.py @@ -17,7 +17,7 @@ import json import traceback from collections.abc import Mapping, Sequence from datetime import datetime, timezone -from typing import Any, Final, cast +from typing import Any, Final, Literal, cast import fastapi from fastapi import APIRouter, Depends, Header, HTTPException, Request, status diff --git a/ruff-strict-budget.json b/ruff-strict-budget.json index a8af4eabb3f..7e350c184af 100644 --- a/ruff-strict-budget.json +++ b/ruff-strict-budget.json @@ -56,9 +56,6 @@ "B026": { "limit": 3 }, - "B033": { - "limit": 0 - }, "BLE001": { "limit": 2924 }, @@ -113,18 +110,6 @@ "F401": { "limit": 17 }, - "FURB136": { - "limit": 0 - }, - "FURB168": { - "limit": 0 - }, - "FURB188": { - "limit": 0 - }, - "I001": { - "limit": 0 - }, "LOG015": { "limit": 5 }, @@ -137,18 +122,9 @@ "PERF401": { "limit": 12 }, - "PERF402": { - "limit": 0 - }, "PERF403": { "limit": 34 }, - "PIE790": { - "limit": 0 - }, - "PIE800": { - "limit": 0 - }, "PIE804": { "limit": 18 }, @@ -158,9 +134,6 @@ "PLC0206": { "limit": 26 }, - "PLC0208": { - "limit": 0 - }, "PLC0414": { "limit": 46 }, @@ -170,24 +143,12 @@ "PLR0206": { "limit": 1 }, - "PLR0402": { - "limit": 0 - }, "PLR1704": { "limit": 3 }, - "PLR1711": { - "limit": 0 - }, "PLR1714": { "limit": 257 }, - "PLR1730": { - "limit": 0 - }, - "PLR2044": { - "limit": 0 - }, "PLW0127": { "limit": 57 }, @@ -206,27 +167,12 @@ "PLW1510": { "limit": 2 }, - "PYI030": { - "limit": 0 - }, "PYI036": { "limit": 3 }, - "PYI041": { - "limit": 0 - }, - "PYI064": { - "limit": 0 - }, - "RET501": { - "limit": 0 - }, "RET504": { "limit": 177 }, - "RUF010": { - "limit": 0 - }, "RUF012": { "limit": 241 }, @@ -236,18 +182,9 @@ "RUF019": { "limit": 38 }, - "RUF022": { - "limit": 0 - }, - "RUF023": { - "limit": 0 - }, "RUF046": { "limit": 4 }, - "RUF051": { - "limit": 0 - }, "RUF059": { "limit": 67 }, @@ -272,18 +209,12 @@ "SIM113": { "limit": 3 }, - "SIM114": { - "limit": 0 - }, "SIM115": { "limit": 2 }, "SIM117": { "limit": 7 }, - "SIM118": { - "limit": 0 - }, "SIM201": { "limit": 1 }, @@ -302,9 +233,6 @@ "TC004": { "limit": 5 }, - "TC005": { - "limit": 0 - }, "TID251": { "limit": 1240 }, @@ -323,46 +251,13 @@ "TRY300": { "limit": 860 }, - "UP006": { - "limit": 0 - }, - "UP007": { - "limit": 0 - }, - "UP008": { - "limit": 0 - }, - "UP012": { - "limit": 0 - }, - "UP018": { - "limit": 0 - }, - "UP024": { - "limit": 0 - }, "UP028": { "limit": 2 }, "UP031": { "limit": 2 }, - "UP032": { - "limit": 0 - }, - "UP034": { - "limit": 0 - }, - "UP035": { - "limit": 0 - }, "UP036": { "limit": 1 - }, - "UP037": { - "limit": 0 - }, - "UP045": { - "limit": 0 } } diff --git a/ruff.toml b/ruff.toml index 00743e0f38a..9b90910b355 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,14 +1,26 @@ lint.ignore = ["F405", "E402", "F403"] -lint.extend-select = ["T20", "PGH004", "RUF008", "RUF009", "RUF100"] +# The second group is the strict gate's graduates: rules the codebase already has zero +# violations of, so they hard-fail here instead of being ratcheted in ruff-strict-budget.json. +# That gives editors and `ruff check --fix` the diagnostic, which the gate script cannot. +lint.extend-select = [ + "T20", "PGH004", "RUF008", "RUF009", "RUF100", + "B033", "FURB136", "FURB168", "FURB188", "I001", "PERF402", "PIE790", "PIE800", "PLC0208", + "PLR0402", "PLR1711", "PLR1730", "PLR2044", "PYI030", "PYI041", "PYI064", "RET501", "RUF010", + "RUF022", "RUF023", "RUF051", "SIM114", "SIM118", "TC005", "UP006", "UP007", "UP008", "UP012", + "UP018", "UP024", "UP032", "UP034", "UP035", "UP037", "UP045", +] # RUF100 (unused-noqa) only knows the rules enabled in THIS config, so it would strip # `# noqa` directives that protect rules enforced elsewhere. List those codes as external # so RUF100 leaves their directives alone: the strict gate (ruff-strict.toml) and upstream # litellm's own ruff config both rely on suppressions this config can't see. lint.external = [ - # Enforced by the strict-rule gate (scripts/ruff_strict_gate.py + ruff-strict.toml) - "ANN", "ASYNC230", "B", "C", "D419", "DTZ", "EXE", "FURB", "I001", "LOG015", "N999", "PERF", - "PIE", "PL", "PYI", "RET", "RUF010", "RUF012", "RUF015", "RUF019", "RUF022", "RUF023", - "RUF046", "RUF051", "RUF059", "S110", "S112", "SIM", "TC", "TID251", "TRY", "UP", + # Enforced by the strict-rule gate (scripts/ruff_strict_gate.py + ruff-strict.toml). + # Family entries whose every strict rule graduated into extend-select above (FURB), and + # standalone graduated codes (I001, RUF010, RUF022, RUF023, RUF051), are dropped so this + # config's RUF100 polices their directives itself. + "ANN", "ASYNC230", "B", "C", "D419", "DTZ", "EXE", "LOG015", "N999", "PERF", + "PIE", "PL", "PYI", "RET", "RUF012", "RUF015", "RUF019", + "RUF046", "RUF059", "S110", "S112", "SIM", "TC", "TID251", "TRY", "UP", # Enforced by upstream litellm's ruff config, but not run in this repo's CI "PLC0415", "E402", "BLE001", "ARG002", "S102", "S324", "S606", "D401", "F403", "F405", ] diff --git a/tests/test_litellm/test_ruff_strict_gate.py b/tests/test_litellm/test_ruff_strict_gate.py index abdeb6feecc..206207acb09 100644 --- a/tests/test_litellm/test_ruff_strict_gate.py +++ b/tests/test_litellm/test_ruff_strict_gate.py @@ -1,16 +1,24 @@ import importlib.util +import json +import re +import shutil import subprocess +import sys +import tomllib from pathlib import Path import pytest -_MODULE_PATH = Path(__file__).resolve().parents[2] / "scripts" / "ruff_strict_gate.py" +_REPO_ROOT = Path(__file__).resolve().parents[2] +_MODULE_PATH = _REPO_ROOT / "scripts" / "ruff_strict_gate.py" _spec = importlib.util.spec_from_file_location("ruff_strict_gate", _MODULE_PATH) gate = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(gate) Violation = gate.Violation +_ENABLED_BY_RUFF_DEFAULTS = frozenset({"F401"}) + def rule(name, limit): return {name: {"limit": limit}} @@ -151,3 +159,213 @@ def test_base_point_mid_merge_advances_to_the_merged_in_base_tip(tmp_path): repo, _, base_tip = _branched_repo(tmp_path) _git(repo, "merge", "--no-commit", "--no-ff", "main") assert gate.resolve_base_point("main", cwd=repo) == base_tip + + +def _lint_section(config_name: str) -> dict: + return tomllib.loads((_REPO_ROOT / config_name).read_text())["lint"] + + +def _base_external() -> tuple[str, ...]: + return tuple(_lint_section("ruff.toml")["external"]) + + +def _strict_external() -> tuple[str, ...]: + return tuple(_lint_section("ruff-strict.toml")["external"]) + + +def _strict_selected() -> frozenset: + return frozenset(_lint_section("ruff-strict.toml")["select"]) + + +def _prefix_covered(code: str, prefixes: tuple[str, ...]) -> bool: + return any(code.startswith(prefix) for prefix in prefixes) + + +def _selected_by_the_normal_config() -> frozenset: + return frozenset(_lint_section("ruff.toml")["extend-select"]) | _ENABLED_BY_RUFF_DEFAULTS + + +def _budgeted_rules() -> frozenset: + return frozenset(json.loads((_REPO_ROOT / "ruff-strict-budget.json").read_text())) + + +def _ruff_binary() -> str | None: + beside_interpreter = Path(sys.executable).with_name("ruff") + return str(beside_interpreter) if beside_interpreter.exists() else shutil.which("ruff") + + +_RUFF = _ruff_binary() +_needs_ruff = pytest.mark.skipif(_RUFF is None, reason="ruff is not installed in this environment") + + +def _ruff_output_for_noqa(code: str, *extra_args: str) -> str: + proc = subprocess.run( + [ + _RUFF, + "check", + "--no-cache", + "--stdin-filename", + "litellm/types/_external_probe.py", + *extra_args, + "-", + ], + cwd=_REPO_ROOT, + input=f"def _probe(x: int): # noqa: {code}\n return x\n", + capture_output=True, + text=True, + ) + return proc.stdout + + +def test_every_strict_gate_rule_is_protected_from_base_ruf100(): + unprotected = frozenset( + selector + for selector in _strict_selected() + if not _prefix_covered(selector, _base_external()) + and selector not in _selected_by_the_normal_config() + ) + assert unprotected == frozenset(), ( + f"`ruff check` deletes any `# noqa` naming {sorted(unprotected)} as unused, so suppressing " + "one of those strict-gate rules breaks lint. Cover them in ruff.toml's lint.external or " + "enable them in its lint.extend-select." + ) + + +def test_every_selected_rule_keeps_stale_noqa_detection_somewhere(): + policed_by_strict = frozenset( + selector + for selector in _strict_selected() + if not _prefix_covered(selector, _strict_external()) + ) + policed_by_base = frozenset( + selector + for selector in _selected_by_the_normal_config() + if not _prefix_covered(selector, _base_external()) + ) + shadowed = ( + _strict_selected() | _selected_by_the_normal_config() + ) - policed_by_strict - policed_by_base + assert shadowed == frozenset(), ( + f"no config's RUF100 can ever report a stale `# noqa` for {sorted(shadowed)}: every config " + "that selects each of them also shadows it with an external entry. Narrow the external " + "entry in ruff.toml or ruff-strict.toml." + ) + + +_BASE_OWNED_FAMILY = re.compile(r"E[479]\d+|F\d+|T20\d+") +_BASE_OWNED_SINGLES = frozenset({"PGH004", "RUF008", "RUF009", "RUF100"}) + + +@pytest.fixture(scope="module") +def all_ruff_rule_codes() -> frozenset: + listing = subprocess.run( + [_RUFF, "rule", "--all", "--output-format", "json"], + capture_output=True, + text=True, + ) + assert listing.returncode == 0, listing.stderr + return frozenset( + entry["code"] for entry in json.loads(listing.stdout) if "Removed" not in entry["status"] + ) + + +@_needs_ruff +def test_every_base_owned_rule_is_external_or_selected_in_the_strict_config(all_ruff_rule_codes): + base_owned = frozenset( + code + for code in all_ruff_rule_codes + if _BASE_OWNED_FAMILY.fullmatch(code) or code in _BASE_OWNED_SINGLES + ) + stranded = frozenset( + code + for code in base_owned + if code not in _strict_selected() and not _prefix_covered(code, _strict_external()) + ) + assert stranded == frozenset(), ( + f"the strict gate's RUF100 reads a valid `# noqa` for {sorted(stranded)} as unused, the " + "spurious-breach trap ruff-strict.toml's external override exists to prevent. Cover them " + "there." + ) + double_booked = frozenset( + code + for code in base_owned + if code in _strict_selected() and _prefix_covered(code, _strict_external()) + ) + assert double_booked == frozenset(), ( + f"{sorted(double_booked)} are selected by the strict config yet shadowed by its external " + "list, so their stale suppressions can never be reported. Narrow the external entry in " + "ruff-strict.toml." + ) + + +def test_every_budgeted_rule_is_one_the_gate_actually_measures(): + selectors = tuple(_lint_section("ruff-strict.toml")["select"]) + unmeasured = frozenset(code for code in _budgeted_rules() if not code.startswith(selectors)) + assert unmeasured == frozenset(), ( + f"the gate never counts {sorted(unmeasured)}, so their ceilings are dead config that reads " + "as coverage. Either select them in ruff-strict.toml or drop them from the budget." + ) + + +@_needs_ruff +def test_every_strict_selected_rule_is_budgeted_or_hard_failed_by_the_base_config(all_ruff_rule_codes): + strict_enabled = frozenset( + code + for code in all_ruff_rule_codes + if code.startswith(tuple(_lint_section("ruff-strict.toml")["select"])) + ) + base_hard_failed = tuple(_lint_section("ruff.toml")["extend-select"]) + unpoliced = frozenset( + code + for code in strict_enabled + if code not in _budgeted_rules() + and not code.startswith(base_hard_failed) + and code not in _ENABLED_BY_RUFF_DEFAULTS + ) + assert unpoliced == frozenset(), ( + f"nothing enforces {sorted(unpoliced)}: the gate skips rules missing from the budget, and " + "the base config does not hard-fail them. Re-add a budget ceiling or graduate them into " + "ruff.toml's lint.extend-select." + ) + + +@_needs_ruff +def test_a_noqa_for_a_strict_gate_rule_survives_the_normal_ruff_run(): + assert "RUF100" not in _ruff_output_for_noqa("ANN202") + + +@_needs_ruff +def test_the_external_list_is_what_saves_that_noqa(): + assert "RUF100" in _ruff_output_for_noqa("ANN202", "--config", "lint.external=[]") + + +@_needs_ruff +def test_a_stale_noqa_for_a_locally_enabled_rule_is_still_reported(): + assert "RUF100" in _ruff_output_for_noqa("F401") + + +def _ruff_output_for_source(source: str) -> str: + proc = subprocess.run( + [_RUFF, "check", "--no-cache", "--stdin-filename", "litellm/types/_graduate_probe.py", "-"], + cwd=_REPO_ROOT, + input=source, + capture_output=True, + text=True, + ) + return proc.stdout + + +_DEPRECATED_TYPING_ALIAS = "from typing import List # noqa: UP035\n\n\ndef _probe(x: List[int]) -> None: ...\n" + + +@_needs_ruff +def test_a_graduated_rule_now_fails_the_normal_ruff_run_instead_of_waiting_for_the_gate(): + assert "UP006" in _ruff_output_for_source(_DEPRECATED_TYPING_ALIAS) + + +@_needs_ruff +def test_a_graduated_rule_can_still_be_suppressed_without_tripping_unused_noqa(): + suppressed = _DEPRECATED_TYPING_ALIAS.replace("...\n", "... # noqa: UP006\n") + output = _ruff_output_for_source(suppressed) + assert "UP006" not in output + assert "RUF100" not in output From 5cd027cbbca7d731238bd870c01917e9dcf3af97 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Fri, 7 Aug 2026 23:11:23 -0700 Subject: [PATCH 033/279] fix(lint): let the ratchet guard recognise a graduated rule A budget rule that graduates into a config's hard-fail select list rightly leaves the budget file, but the ratchet guard read any disappearance as a silently raised ceiling. Teach it the pairing between ruff-strict-budget.json and ruff.toml: a dropped rule is excused only when the paired config's lint.extend-select (minus lint.ignore) now hard-fails it, so deleting a rule without graduating it still trips the guard. --- scripts/budget_ratchet_check.py | 51 ++++++++++++++++--- .../test_litellm/test_budget_ratchet_check.py | 44 ++++++++++++++++ 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/scripts/budget_ratchet_check.py b/scripts/budget_ratchet_check.py index 10a78483643..e97cd1bca00 100644 --- a/scripts/budget_ratchet_check.py +++ b/scripts/budget_ratchet_check.py @@ -10,7 +10,10 @@ content at the merge-base with the target branch and fails (exits 1, red) if: * a rule was dropped from a budget (its ceiling effectively became infinite), or * an entire budget file was deleted. -New rules and lowered/equal limits are fine. +New rules and lowered/equal limits are fine. So is a rule that graduated: once a +paired config (ruff.toml for the ruff-strict budget) selects the rule outright it +hard-fails at the first violation, which is stricter than any ceiling the budget +could hold, so dropping its entry tightens the guard rather than removing it. This is deliberately NOT a gating check. It should turn the run red so that a loosening is impossible to miss in review, but it must stay OUT of the @@ -30,7 +33,9 @@ import argparse import json import subprocess import sys +import tomllib from pathlib import Path +from types import MappingProxyType from typing import NamedTuple REPO_ROOT = Path(__file__).resolve().parent.parent @@ -40,6 +45,7 @@ DEFAULT_BUDGETS: tuple[str, ...] = ( "type-discipline-budget.json", "basedpyright-code-budget.json", ) +GRADUATION_CONFIGS = MappingProxyType({"ruff-strict-budget.json": "ruff.toml"}) class Regression(NamedTuple): @@ -106,24 +112,57 @@ def _limits(budget: dict) -> dict[str, int]: } +def selectors_hard_failed_by(lint: dict) -> tuple[str, ...]: + """A ruff `[lint]` table's selected codes, minus anything `ignore` turns back off. + + `lint.ignore` wins over `lint.extend-select` in ruff, so an ignored code is not + actually enforced and must not count as a graduation. + """ + ignored = tuple(lint.get("ignore", ())) + return tuple( + selector + for selector in lint.get("extend-select", ()) + if not (ignored and selector.startswith(ignored)) + ) + + +def graduated_selectors(rel: str) -> tuple[str, ...]: + """Selectors the budget's paired ruff config hard-fails, so its ceiling is moot.""" + config = GRADUATION_CONFIGS.get(rel) + if config is None or not (REPO_ROOT / config).exists(): + return () + return selectors_hard_failed_by( + tomllib.loads((REPO_ROOT / config).read_text()).get("lint", {}) + ) + + def _regression_detail( rule: str, base_limits: dict[str, int], head_limits: dict[str, int], + graduated: tuple[str, ...], ) -> str | None: - """Why `rule` regressed vs base, or None when it held flat or fell. + """Why `rule` regressed vs base, or None when it held flat, fell, or graduated. - A dropped rule is terminal; otherwise the only loosening left is a raised limit. + A dropped rule is terminal unless it graduated; otherwise the only loosening + left is a raised limit. """ base_limit = base_limits[rule] if rule not in head_limits: + if graduated and rule.startswith(graduated): + return None return f"rule dropped (limit {base_limit} -> removed)" if head_limits[rule] > base_limit: return f"limit raised {base_limit} -> {head_limits[rule]}" return None -def regressions_for(rel: str, base: dict | None, head: dict | None) -> list[Regression]: +def regressions_for( + rel: str, + base: dict | None, + head: dict | None, + graduated: tuple[str, ...] = (), +) -> list[Regression]: if base is None: return [] # new budget file: nothing to ratchet against yet if head is None: @@ -133,7 +172,7 @@ def regressions_for(rel: str, base: dict | None, head: dict | None) -> list[Regr return [ Regression(rel, rule, detail) for rule in sorted(base_limits) - if (detail := _regression_detail(rule, base_limits, head_limits)) is not None + if (detail := _regression_detail(rule, base_limits, head_limits, graduated)) is not None ] @@ -164,7 +203,7 @@ def main() -> int: print(f"skip {rel}: new file (no base at {args.base} to ratchet against)") continue checked.append(rel) - regressions.extend(regressions_for(rel, base, head)) + regressions.extend(regressions_for(rel, base, head, graduated_selectors(rel))) if regressions: print( diff --git a/tests/test_litellm/test_budget_ratchet_check.py b/tests/test_litellm/test_budget_ratchet_check.py index 1972c1b6386..22d05f4d00d 100644 --- a/tests/test_litellm/test_budget_ratchet_check.py +++ b/tests/test_litellm/test_budget_ratchet_check.py @@ -68,6 +68,50 @@ def test_new_rule_in_head_is_clean(): assert ratchet.regressions_for("b.json", {}, {"new-rule": _spec_of(5)}) == [] +def test_dropped_rule_that_graduated_to_a_hard_failing_config_is_clean(): + base = {"UP006": _spec_of(0)} + assert ratchet.regressions_for("b.json", base, {}, graduated=("UP006",)) == [] + + +def test_graduation_matches_by_prefix_like_ruff_selectors_do(): + base = {"ANN202": _spec_of(865)} + assert ratchet.regressions_for("b.json", base, {}, graduated=("ANN",)) == [] + + +def test_an_unrelated_graduation_does_not_excuse_a_dropped_rule(): + base = {"C901": _spec_of(3)} + regs = ratchet.regressions_for("b.json", base, {}, graduated=("UP006", "SIM118")) + assert [r.rule for r in regs] == ["C901"] + assert "dropped" in regs[0].detail + + +def test_graduation_never_excuses_a_raised_limit(): + base = {"UP006": _spec_of(0)} + regs = ratchet.regressions_for("b.json", base, {"UP006": _spec_of(7)}, graduated=("UP006",)) + assert [r.rule for r in regs] == ["UP006"] + assert "0 -> 7" in regs[0].detail + + +def test_graduated_selectors_come_from_the_paired_ruff_config(): + selectors = ratchet.graduated_selectors("ruff-strict-budget.json") + assert "UP006" in selectors + assert "ANN" not in selectors + + +def test_budgets_without_a_paired_config_can_never_graduate(): + assert ratchet.graduated_selectors("type-discipline-budget.json") == () + assert ratchet.graduated_selectors("basedpyright-code-budget.json") == () + + +def test_a_selector_the_config_also_ignores_does_not_count_as_graduated(): + lint = {"ignore": ["UP006"], "extend-select": ["UP006", "SIM118"]} + assert ratchet.selectors_hard_failed_by(lint) == ("SIM118",) + + +def test_selectors_hard_failed_by_reads_a_config_with_no_ignore_list(): + assert ratchet.selectors_hard_failed_by({"extend-select": ["UP006"]}) == ("UP006",) + + def test_deleted_budget_file_is_a_regression(): regs = ratchet.regressions_for("b.json", {"LIT006": _spec_of(1)}, None) assert [r.rule for r in regs] == ["*"] From 5f7a663005bf3228f913d34cb372b712d318e7de Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 01:33:32 -0700 Subject: [PATCH 034/279] fix(proxy): enforce require_managed_files on every raw provider id route require_managed_files was only checked on upload, so raw provider ids still reached the batch, fine-tuning and vector store file routes. Ownership rows exist only for managed ids, so those requests were forwarded under shared credentials with no tenant check: knowing another tenant's id was enough to read, run against, cancel or delete their object. Generalise the file-id guard to validate_managed_id_requirement(resource_id, resource_kind) and call it on batch create/retrieve/cancel, fine-tuning create/retrieve/cancel (training_file and validation_file both) and the shared vector store file id resolver. Behaviour is unchanged when the setting is off. --- litellm/proxy/batches_endpoints/endpoints.py | 5 + .../proxy/fine_tuning_endpoints/endpoints.py | 8 + .../openai_files_endpoints/common_utils.py | 27 +- .../openai_files_endpoints/files_endpoints.py | 8 +- .../vector_store_files_endpoints/endpoints.py | 5 + .../proxy/batches_endpoints/test_endpoints.py | 117 +++++++++ .../proxy/fine_tuning_endpoints/__init__.py | 0 .../fine_tuning_endpoints/test_endpoints.py | 236 ++++++++++++++++++ .../test_files_endpoint.py | 8 +- .../vector_store_files_endpoints/__init__.py | 0 .../test_endpoints.py | 83 ++++++ 11 files changed, 479 insertions(+), 18 deletions(-) create mode 100644 tests/test_litellm/proxy/fine_tuning_endpoints/__init__.py create mode 100644 tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py create mode 100644 tests/test_litellm/proxy/vector_store_files_endpoints/__init__.py create mode 100644 tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py diff --git a/litellm/proxy/batches_endpoints/endpoints.py b/litellm/proxy/batches_endpoints/endpoints.py index f7c332f2849..c9f66c5a48b 100644 --- a/litellm/proxy/batches_endpoints/endpoints.py +++ b/litellm/proxy/batches_endpoints/endpoints.py @@ -36,6 +36,7 @@ from litellm.proxy.openai_files_endpoints.common_utils import ( get_original_file_id, prepare_data_with_credentials, update_batch_in_database, + validate_managed_id_requirement, ) from litellm.proxy.utils import handle_exception_on_proxy, is_known_model from litellm.repositories.table_repositories import ManagedFileRepository @@ -176,6 +177,7 @@ async def create_batch( } input_file_id: Final = _create_batch_data.get("input_file_id", None) + validate_managed_id_requirement(resource_id=input_file_id, resource_kind="file") unified_file_id: str | Literal[False] = False model_from_file_id = None @@ -392,6 +394,7 @@ async def retrieve_batch( data: dict = {} try: + validate_managed_id_requirement(resource_id=batch_id, resource_kind="batch") model_from_id: Final = decode_model_from_file_id(batch_id) _retrieve_batch_request: Final = RetrieveBatchRequest( batch_id=batch_id, @@ -840,6 +843,8 @@ async def cancel_batch( data: dict = {} try: + validate_managed_id_requirement(resource_id=batch_id, resource_kind="batch") + # Check for encoded batch ID with model info model_from_id: Final = decode_model_from_file_id(batch_id) diff --git a/litellm/proxy/fine_tuning_endpoints/endpoints.py b/litellm/proxy/fine_tuning_endpoints/endpoints.py index f8ffb77edb8..87e9895eed0 100644 --- a/litellm/proxy/fine_tuning_endpoints/endpoints.py +++ b/litellm/proxy/fine_tuning_endpoints/endpoints.py @@ -17,6 +17,7 @@ from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.common_request_processing import ProxyBaseLLMRequestProcessing from litellm.proxy.openai_files_endpoints.common_utils import ( _is_base64_encoded_unified_file_id, + validate_managed_id_requirement, ) from litellm.proxy.utils import handle_exception_on_proxy from litellm.types.utils import LiteLLMFineTuningJob @@ -134,6 +135,11 @@ async def create_fine_tuning_job( ## CHECK IF MANAGED FILE ID unified_file_id: str | Literal[False] = False training_file: Final = fine_tuning_request.training_file + validate_managed_id_requirement(resource_id=training_file, resource_kind="file") + validate_managed_id_requirement( + resource_id=fine_tuning_request.validation_file, + resource_kind="file", + ) response: LiteLLMFineTuningJob | None = None if training_file: unified_file_id = _is_base64_encoded_unified_file_id(training_file) @@ -246,6 +252,7 @@ async def retrieve_fine_tuning_job( try: if premium_user is not True: raise ValueError(f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}") + validate_managed_id_requirement(resource_id=fine_tuning_job_id, resource_kind="fine-tuning job") # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) ( @@ -513,6 +520,7 @@ async def cancel_fine_tuning_job( try: if premium_user is not True: raise ValueError(f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}") + validate_managed_id_requirement(resource_id=fine_tuning_job_id, resource_kind="fine-tuning job") # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) ( diff --git a/litellm/proxy/openai_files_endpoints/common_utils.py b/litellm/proxy/openai_files_endpoints/common_utils.py index b26010c5597..143bd5bc6b5 100644 --- a/litellm/proxy/openai_files_endpoints/common_utils.py +++ b/litellm/proxy/openai_files_endpoints/common_utils.py @@ -881,17 +881,20 @@ def validate_managed_files_requirement( ) -def validate_managed_file_id_requirement(file_id: str) -> None: +def validate_managed_id_requirement( + resource_id: str | None, + resource_kind: Literal["file", "batch", "fine-tuning job"], +) -> None: """ - Enforce proxy-level managed files on the file read/delete routes when - ``litellm.require_managed_files`` is enabled. + Enforce proxy-level managed resources on every route that accepts a provider-issued id + when ``litellm.require_managed_files`` is enabled. - Ownership is only recorded for LiteLLM managed files, so a raw provider file id sent to - retrieve/content/delete is forwarded to the provider under shared credentials without any - tenant check; knowing another tenant's provider file id would be enough to read or delete it. + Ownership is only recorded for LiteLLM managed ids, so a raw provider id is forwarded to the + provider under shared credentials without any tenant check; knowing another tenant's provider + id would be enough to read, reuse, or destroy the object behind it. Raises: - HTTPException: 400 if ``file_id`` is not a LiteLLM managed file id. + HTTPException: 400 if ``resource_id`` is set and is not a LiteLLM managed id. """ from fastapi import HTTPException @@ -900,14 +903,18 @@ def validate_managed_file_id_requirement(file_id: str) -> None: if litellm.require_managed_files is not True: return - if _is_base64_encoded_unified_file_id(file_id): + if not resource_id: + return + + if _is_base64_encoded_unified_file_id(resource_id): return raise HTTPException( status_code=400, detail=( - "Raw provider file ids cannot be used when require_managed_files is enabled in " - "litellm_settings. Use the LiteLLM managed file id returned when the file was created." + f"Raw provider {resource_kind} ids cannot be used when require_managed_files is enabled in " + f"litellm_settings. Use the LiteLLM managed {resource_kind} id returned when the " + f"{resource_kind} was created." ), ) diff --git a/litellm/proxy/openai_files_endpoints/files_endpoints.py b/litellm/proxy/openai_files_endpoints/files_endpoints.py index 5c1a4441d0d..b5950c4f852 100644 --- a/litellm/proxy/openai_files_endpoints/files_endpoints.py +++ b/litellm/proxy/openai_files_endpoints/files_endpoints.py @@ -49,8 +49,8 @@ from litellm.proxy.openai_files_endpoints.common_utils import ( get_credentials_for_model, handle_model_based_routing, prepare_data_with_credentials, - validate_managed_file_id_requirement, validate_managed_files_requirement, + validate_managed_id_requirement, ) from litellm.proxy.utils import ProxyLogging, is_known_model from litellm.repositories.table_repositories import ManagedFileRepository @@ -613,7 +613,7 @@ async def get_file_content( data: dict = {"file_id": file_id} try: - validate_managed_file_id_requirement(file_id=file_id) + validate_managed_id_requirement(resource_id=file_id, resource_kind="file") # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) @@ -911,7 +911,7 @@ async def get_file( data: dict = {"file_id": file_id} try: - validate_managed_file_id_requirement(file_id=file_id) + validate_managed_id_requirement(resource_id=file_id, resource_kind="file") custom_llm_provider: Final = ( provider @@ -1103,7 +1103,7 @@ async def delete_file( data: dict = {"file_id": file_id} try: - validate_managed_file_id_requirement(file_id=file_id) + validate_managed_id_requirement(resource_id=file_id, resource_kind="file") custom_llm_provider: Final = ( provider diff --git a/litellm/proxy/vector_store_files_endpoints/endpoints.py b/litellm/proxy/vector_store_files_endpoints/endpoints.py index 896b7ca33d7..f8fdf607292 100644 --- a/litellm/proxy/vector_store_files_endpoints/endpoints.py +++ b/litellm/proxy/vector_store_files_endpoints/endpoints.py @@ -65,6 +65,11 @@ def _update_request_data_with_managed_file_id( is_base64_encoded_unified_id, parse_unified_id, ) + from litellm.proxy.openai_files_endpoints.common_utils import ( + validate_managed_id_requirement, + ) + + validate_managed_id_requirement(resource_id=file_id, resource_kind="file") # First, check if this is a unified managed file ID (base64 encoded) decoded_id: Final = is_base64_encoded_unified_id(file_id) diff --git a/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py b/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py index e758aa5ca7f..18ca604f88d 100644 --- a/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py +++ b/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py @@ -2253,3 +2253,120 @@ async def test_cancel__provider_only_resolves_named_vertex_credentials(cancel_ha "vertex_location": "us-central1", "vertex_credentials": "/creds/customer-sa.json", } + + +# =========================================================================== # +# require_managed_files - raw provider ids must not reach the provider. # +# # +# Ownership rows only exist for LiteLLM managed ids. A raw provider id sent to # +# these routes is forwarded under the shared provider credentials with no # +# tenant check, so any caller who learns another tenant's id can read its # +# batch, reuse its file as batch input, or cancel its job. These lock the # +# guard on every batches route that accepts a caller-supplied id. # +# =========================================================================== # + + +def _unified_batch_id(model_id: str = "azure/gpt-4o", batch_id: str = "batch-provider-id") -> str: + import base64 + + from litellm.types.utils import SpecialEnums + + unified = SpecialEnums.LITELLM_MANAGED_BATCH_COMPLETE_STR.value.format(model_id, batch_id) + return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") + + +@pytest.mark.asyncio +async def test_create__raw_input_file_id_rejected_when_managed_files_required(harness): + set_body( + harness, + { + "input_file_id": "file-victim-abc123", + "endpoint": "/v1/chat/completions", + "completion_window": "24h", + }, + ) + + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await call_create(harness) + + assert exc.value.code == "400" + harness.litellm_acreate.assert_not_called() + harness.router_acreate.assert_not_called() + + +@pytest.mark.asyncio +async def test_create__model_encoded_input_file_id_rejected_when_managed_files_required(harness): + """A model-encoded id is client-forgeable and has no ownership row, so it is + not a managed file id and must be rejected like any other raw id.""" + set_body( + harness, + { + "input_file_id": AZURE_FILE_ID, + "endpoint": "/v1/chat/completions", + "completion_window": "24h", + }, + ) + + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await call_create(harness) + + assert exc.value.code == "400" + harness.litellm_acreate.assert_not_called() + harness.router_acreate.assert_not_called() + + +@pytest.mark.asyncio +async def test_create__raw_input_file_id_allowed_when_managed_files_not_required(harness): + set_body( + harness, + { + "input_file_id": "file-victim-abc123", + "endpoint": "/v1/chat/completions", + "completion_window": "24h", + }, + ) + + with patch.object(litellm, "require_managed_files", False): + await call_create(harness) + + assert harness.acreate_kwargs()["input_file_id"] == "file-victim-abc123" + + +@pytest.mark.asyncio +async def test_retrieve__raw_batch_id_rejected_when_managed_files_required(retrieve_harness): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await call_retrieve(retrieve_harness, "batch-victim-abc123") + + assert exc.value.code == "400" + retrieve_harness.litellm_aretrieve.assert_not_called() + retrieve_harness.router_aretrieve.assert_not_called() + + +@pytest.mark.asyncio +async def test_retrieve__unified_batch_id_allowed_when_managed_files_required(retrieve_harness): + with patch.object(litellm, "require_managed_files", True): + await call_retrieve(retrieve_harness, _unified_batch_id()) + + assert retrieve_harness.router_aretrieve.call_count == 1 + + +@pytest.mark.asyncio +async def test_cancel__raw_batch_id_rejected_when_managed_files_required(cancel_harness): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await call_cancel(cancel_harness, "batch-victim-abc123") + + assert exc.value.code == "400" + cancel_harness.litellm_acancel.assert_not_called() + cancel_harness.router_acancel.assert_not_called() + + +@pytest.mark.asyncio +async def test_cancel__unified_batch_id_allowed_when_managed_files_required(cancel_harness): + with patch.object(litellm, "require_managed_files", True): + await call_cancel(cancel_harness, _unified_batch_id()) + + assert cancel_harness.router_acancel.call_count == 1 diff --git a/tests/test_litellm/proxy/fine_tuning_endpoints/__init__.py b/tests/test_litellm/proxy/fine_tuning_endpoints/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py b/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py new file mode 100644 index 00000000000..35c202057e7 --- /dev/null +++ b/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py @@ -0,0 +1,236 @@ +""" +require_managed_files enforcement for litellm/proxy/fine_tuning_endpoints/endpoints.py + +Ownership rows only exist for LiteLLM managed ids. A raw provider id sent to these +routes is forwarded to the provider under the shared proxy credentials with no tenant +check, so any caller who learns another tenant's file id can train on it, and any +caller who learns another tenant's job id can read or cancel it. + +Each test asserts BOTH that the request is rejected AND that every downstream provider +seam stayed untouched, so a guard that raises after the provider call would still fail. +""" + +import base64 +import os +import sys +from contextlib import ExitStack +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest + +sys.path.insert(0, os.path.abspath("../../../..")) + +from fastapi import Response + +import litellm +import litellm.proxy.fine_tuning_endpoints.endpoints as endpoints +import litellm.proxy.proxy_server as proxy_server +from litellm.proxy._types import ProxyException, UserAPIKeyAuth +from litellm.proxy.common_request_processing import ProxyBaseLLMRequestProcessing +from litellm.proxy.utils import ProxyLogging +from litellm.router import Router +from litellm.types.llms.openai import LiteLLMFineTuningJobCreate +from litellm.types.utils import LiteLLMFineTuningJob, SpecialEnums + +RAW_FILE_ID = "file-victim-abc123" +RAW_JOB_ID = "ftjob-victim-abc123" + + +def _unified_file_id() -> str: + unified = SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( + "application/json", "victim-unified-id", "gpt-4o-mini", RAW_FILE_ID, "gpt-4o-mini-id" + ) + return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") + + +def _unified_job_id() -> str: + unified = SpecialEnums.LITELLM_MANAGED_GENERIC_RESPONSE_COMPLETE_STR.value.format("gpt-4o-mini-id", RAW_JOB_ID) + return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") + + +def _job() -> LiteLLMFineTuningJob: + job = LiteLLMFineTuningJob( + id=RAW_JOB_ID, + created_at=1234567890, + fine_tuned_model=None, + finished_at=None, + hyperparameters={"n_epochs": 1}, + model="gpt-4o-mini", + object="fine_tuning.job", + organization_id="org-test", + result_files=[], + seed=0, + status="running", + trained_tokens=None, + training_file=RAW_FILE_ID, + validation_file=None, + ) + job._hidden_params = {} + return job + + +class FakeRequest: + def __init__(self): + self.headers = {} + self.query_params = {} + + async def json(self): + return {} + + +class Seams: + def __init__(self, router: MagicMock, litellm_calls: dict[str, AsyncMock]): + self.router = router + self.litellm_calls = litellm_calls + + def assert_no_provider_call(self) -> None: + for name, mock in self.litellm_calls.items(): + assert mock.call_count == 0, f"litellm.{name} was called" + for name in ("acreate_fine_tuning_job", "aretrieve_fine_tuning_job", "acancel_fine_tuning_job"): + assert getattr(self.router, name).call_count == 0, f"router.{name} was called" + + +@pytest.fixture +def seams(): + logging = MagicMock(spec=ProxyLogging) + logging.post_call_success_hook = AsyncMock(side_effect=lambda **kw: kw["response"]) + logging.post_call_failure_hook = AsyncMock() + logging.update_request_status = AsyncMock() + logging.get_proxy_hook = MagicMock(return_value=None) + + router = MagicMock(spec=Router) + router.acreate_fine_tuning_job = AsyncMock(return_value=_job()) + router.aretrieve_fine_tuning_job = AsyncMock(return_value=_job()) + router.acancel_fine_tuning_job = AsyncMock(return_value=_job()) + + litellm_calls = { + name: AsyncMock(return_value=_job()) + for name in ("acreate_fine_tuning_job", "aretrieve_fine_tuning_job", "acancel_fine_tuning_job") + } + + with ExitStack() as stack: + stack.enter_context( + patch.object( + ProxyBaseLLMRequestProcessing, + "common_processing_pre_call_logic", + AsyncMock(side_effect=lambda self=None, **kw: (self.data if self else {}, MagicMock())), + ) + ) + stack.enter_context(patch.object(ProxyBaseLLMRequestProcessing, "get_custom_headers", MagicMock(return_value={}))) + for name, mock in litellm_calls.items(): + stack.enter_context(patch.object(litellm, name, mock)) + stack.enter_context(patch.object(proxy_server, "llm_router", router)) + stack.enter_context(patch.object(proxy_server, "proxy_logging_obj", logging)) + stack.enter_context(patch.object(proxy_server, "premium_user", True)) + stack.enter_context(patch.object(proxy_server, "general_settings", {})) + stack.enter_context(patch.object(proxy_server, "proxy_config", MagicMock())) + stack.enter_context(patch.object(proxy_server, "version", "test-version")) + stack.enter_context(patch.object(endpoints, "fine_tuning_config", [{"custom_llm_provider": "openai"}])) + yield Seams(router=router, litellm_calls=litellm_calls) + + +async def _create(training_file: str, validation_file: str | None = None): + return await endpoints.create_fine_tuning_job( + request=FakeRequest(), + fastapi_response=Response(), + fine_tuning_request=LiteLLMFineTuningJobCreate( + model="gpt-4o-mini", + training_file=training_file, + validation_file=validation_file, + custom_llm_provider="openai", + ), + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + +async def _retrieve(job_id: str): + return await endpoints.retrieve_fine_tuning_job( + request=FakeRequest(), + fastapi_response=Response(), + fine_tuning_job_id=job_id, + custom_llm_provider="openai", + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + +async def _cancel(job_id: str): + return await endpoints.cancel_fine_tuning_job( + request=FakeRequest(), + fastapi_response=Response(), + fine_tuning_job_id=job_id, + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + +@pytest.mark.asyncio +async def test_create__raw_training_file_rejected_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await _create(RAW_FILE_ID) + + assert exc.value.code == "400" + seams.assert_no_provider_call() + + +@pytest.mark.asyncio +async def test_create__raw_validation_file_rejected_when_managed_files_required(seams): + """The validation file is uploaded and readable exactly like the training file, + so a managed training_file must not smuggle a raw validation_file past the guard.""" + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await _create(_unified_file_id(), validation_file=RAW_FILE_ID) + + assert exc.value.code == "400" + seams.assert_no_provider_call() + + +@pytest.mark.asyncio +async def test_create__unified_training_file_allowed_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + await _create(_unified_file_id()) + + assert seams.router.acreate_fine_tuning_job.call_count == 1 + + +@pytest.mark.asyncio +async def test_create__raw_training_file_allowed_when_managed_files_not_required(seams): + with patch.object(litellm, "require_managed_files", False): + await _create(RAW_FILE_ID) + + assert seams.litellm_calls["acreate_fine_tuning_job"].call_count == 1 + + +@pytest.mark.asyncio +async def test_retrieve__raw_job_id_rejected_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await _retrieve(RAW_JOB_ID) + + assert exc.value.code == "400" + seams.assert_no_provider_call() + + +@pytest.mark.asyncio +async def test_retrieve__unified_job_id_allowed_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + await _retrieve(_unified_job_id()) + + assert seams.router.aretrieve_fine_tuning_job.call_count == 1 + + +@pytest.mark.asyncio +async def test_cancel__raw_job_id_rejected_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await _cancel(RAW_JOB_ID) + + assert exc.value.code == "400" + seams.assert_no_provider_call() + + +@pytest.mark.asyncio +async def test_cancel__unified_job_id_allowed_when_managed_files_required(seams): + with patch.object(litellm, "require_managed_files", True): + await _cancel(_unified_job_id()) + + assert seams.router.acancel_fine_tuning_job.call_count == 1 diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py index 24b814bae1f..2e15da7590a 100644 --- a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py @@ -3109,22 +3109,22 @@ def _unified_managed_file_id() -> str: def test_require_managed_files_allows_unified_managed_file_id(monkeypatch): from litellm.proxy.openai_files_endpoints.common_utils import ( - validate_managed_file_id_requirement, + validate_managed_id_requirement, ) monkeypatch.setattr("litellm.require_managed_files", True) - validate_managed_file_id_requirement(file_id=_unified_managed_file_id()) + validate_managed_id_requirement(resource_id=_unified_managed_file_id(), resource_kind="file") def test_managed_file_id_requirement_is_opt_in(monkeypatch): from litellm.proxy.openai_files_endpoints.common_utils import ( - validate_managed_file_id_requirement, + validate_managed_id_requirement, ) monkeypatch.setattr("litellm.require_managed_files", False) - validate_managed_file_id_requirement(file_id="file-victim-abc123") + validate_managed_id_requirement(resource_id="file-victim-abc123", resource_kind="file") def test_raw_provider_file_id_retrieve_allowed_when_managed_files_not_required( diff --git a/tests/test_litellm/proxy/vector_store_files_endpoints/__init__.py b/tests/test_litellm/proxy/vector_store_files_endpoints/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py b/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py new file mode 100644 index 00000000000..c2bdb1d80f2 --- /dev/null +++ b/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py @@ -0,0 +1,83 @@ +""" +require_managed_files enforcement for litellm/proxy/vector_store_files_endpoints/endpoints.py + +Every vector-store file route (create, retrieve, content, update, delete) resolves its +caller-supplied file id through _update_request_data_with_managed_file_id before the +provider call, so the guard lives there once and covers all five. + +A raw provider file id has no ownership row, so without the guard it is attached to a +vector store or read back under the shared provider credentials with no tenant check. +""" + +import base64 +import os +import sys +from unittest.mock import MagicMock, patch + +import pytest + +sys.path.insert(0, os.path.abspath("../../../..")) + +from fastapi import HTTPException + +import litellm +from litellm.proxy.vector_store_files_endpoints.endpoints import ( + _update_request_data_with_managed_file_id, +) +from litellm.types.utils import SpecialEnums + +RAW_FILE_ID = "file-victim-abc123" + + +def _unified_file_id() -> str: + unified = SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( + "application/json", "victim-unified-id", "gpt-4o-mini", RAW_FILE_ID, "gpt-4o-mini-id" + ) + return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") + + +def _resolve(file_id: str): + return _update_request_data_with_managed_file_id( + data={"vector_store_id": "vs-test", "file_id": file_id}, + file_id=file_id, + request=MagicMock(headers={}, query_params={}), + llm_router=None, + ) + + +def test_raw_file_id_rejected_when_managed_files_required(): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(HTTPException) as exc: + _resolve(RAW_FILE_ID) + + assert exc.value.status_code == 400 + + +def test_model_encoded_file_id_rejected_when_managed_files_required(): + """encode_file_id_with_model output is client-forgeable and carries no ownership + row, so it is not a managed file id.""" + from litellm.proxy.openai_files_endpoints.common_utils import encode_file_id_with_model + + encoded = encode_file_id_with_model(RAW_FILE_ID, "gpt-4o-mini", id_type="file") + + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(HTTPException) as exc: + _resolve(encoded) + + assert exc.value.status_code == 400 + + +def test_unified_file_id_allowed_when_managed_files_required(): + with patch.object(litellm, "require_managed_files", True): + data, original = _resolve(_unified_file_id()) + + assert original == _unified_file_id() + assert data["file_id"] == RAW_FILE_ID + + +def test_raw_file_id_allowed_when_managed_files_not_required(): + with patch.object(litellm, "require_managed_files", False): + data, original = _resolve(RAW_FILE_ID) + + assert original is None + assert data["file_id"] == RAW_FILE_ID From b01eacd67c3c8828c464f29ff5fbaee32f0735ce Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 01:36:30 -0700 Subject: [PATCH 035/279] ci: run the new fine-tuning and vector store file test dirs --- .github/workflows/test-unit-proxy-endpoints.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-unit-proxy-endpoints.yml b/.github/workflows/test-unit-proxy-endpoints.yml index 645996f779d..2ea3c521e8b 100644 --- a/.github/workflows/test-unit-proxy-endpoints.yml +++ b/.github/workflows/test-unit-proxy-endpoints.yml @@ -38,6 +38,8 @@ jobs: tests/test_litellm/proxy/google_endpoints tests/test_litellm/proxy/openai_files_endpoint tests/test_litellm/proxy/batches_endpoints + tests/test_litellm/proxy/fine_tuning_endpoints + tests/test_litellm/proxy/vector_store_files_endpoints tests/test_litellm/proxy/video_endpoints tests/test_litellm/proxy/response_api_endpoints tests/test_litellm/proxy/image_endpoints From 855c49d0ef01a09161f8d2ec195be01447669f1a Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 01:44:56 -0700 Subject: [PATCH 036/279] fix(proxy): skip prisma-dependent hooks when no database is attached --- .../storage_backend_service.py | 10 ++ litellm/proxy/utils.py | 5 + .../test_storage_backend_service.py | 127 ++++++++++++++++++ .../utils/proxy_logging/test_lifecycle.py | 94 +++++++++++-- 4 files changed, 228 insertions(+), 8 deletions(-) create mode 100644 tests/test_litellm/proxy/openai_files_endpoint/test_storage_backend_service.py diff --git a/litellm/proxy/openai_files_endpoints/storage_backend_service.py b/litellm/proxy/openai_files_endpoints/storage_backend_service.py index 4c301c96f30..e766f335071 100644 --- a/litellm/proxy/openai_files_endpoints/storage_backend_service.py +++ b/litellm/proxy/openai_files_endpoints/storage_backend_service.py @@ -68,6 +68,16 @@ class StorageBackendFileService: code=400, ) + if target_model_names: + managed_files_hook: Final = proxy_logging_obj.get_proxy_hook("managed_files") + if not isinstance(managed_files_hook, BaseFileEndpoints): + raise ProxyException( + message="Uploading with target_model_names requires a database-connected proxy, and this proxy has no database configured", + type="invalid_request_error", + param="target_model_names", + code=400, + ) + # Extract file information file_content: Final = file_data["content"] filename: Final = file_data.get("filename", "file") diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index e59c6adaf22..5f22ca021ac 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -544,6 +544,11 @@ class ProxyLogging: for hook in PROXY_HOOKS: proxy_hook = get_proxy_hook(hook) expected_args = inspect.getfullargspec(proxy_hook).args + if "prisma_client" in expected_args and prisma_client is None: + verbose_proxy_logger.debug( + "Skipping proxy hook %s: it requires a database and no prisma client is configured", hook + ) + continue passed_in_args: dict[str, Any] = {} if "internal_usage_cache" in expected_args: passed_in_args["internal_usage_cache"] = self.internal_usage_cache diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_storage_backend_service.py b/tests/test_litellm/proxy/openai_files_endpoint/test_storage_backend_service.py new file mode 100644 index 00000000000..07a85a70815 --- /dev/null +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_storage_backend_service.py @@ -0,0 +1,127 @@ +import pytest + +from litellm.llms.base_llm.files.transformation import BaseFileEndpoints +from litellm.proxy._types import ProxyException, UserAPIKeyAuth +from litellm.proxy.openai_files_endpoints import storage_backend_service +from litellm.proxy.openai_files_endpoints.storage_backend_service import ( + StorageBackendFileService, +) + + +class _RecordingStorageBackend: + def __init__(self): + self.upload_calls = [] + + async def upload_file(self, **kwargs): + self.upload_calls.append(kwargs) + return "https://storage.example/blob-1" + + +class _FakeManagedFilesHook(BaseFileEndpoints): + def __init__(self): + self.stored = [] + + async def acreate_file( + self, create_file_request, llm_router, target_model_names_list, litellm_parent_otel_span, user_api_key_dict + ): + raise NotImplementedError + + async def afile_retrieve(self, file_id, litellm_parent_otel_span, llm_router=None): + raise NotImplementedError + + async def afile_list(self, purpose, litellm_parent_otel_span, **data): + raise NotImplementedError + + async def afile_delete(self, file_id, litellm_parent_otel_span, llm_router, **data): + raise NotImplementedError + + async def afile_content(self, file_id, litellm_parent_otel_span, llm_router, **data): + raise NotImplementedError + + async def store_unified_file_id(self, **kwargs): + self.stored.append(kwargs) + + +class _FakeProxyLogging: + def __init__(self, hook): + self._hook = hook + + def get_proxy_hook(self, hook_name): + return self._hook if hook_name == "managed_files" else None + + +def _file_data(): + return {"content": b"x", "filename": "input.jsonl", "content_type": "application/jsonl"} + + +@pytest.mark.asyncio +async def test_upload_with_target_model_names_but_no_hook_raises_before_uploading(monkeypatch): + backend = _RecordingStorageBackend() + monkeypatch.setattr(storage_backend_service, "get_storage_backend", lambda name: backend) + + with pytest.raises(ProxyException) as exc_info: + await StorageBackendFileService.upload_file_to_storage_backend( + file_data=_file_data(), + target_storage="azure_storage", + target_model_names=["gpt-x"], + purpose="batch", + proxy_logging_obj=_FakeProxyLogging(hook=None), + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + snapshot = { + "code": exc_info.value.code, + "message_names_requirement": "requires a database-connected proxy" in exc_info.value.message, + "upload_calls": backend.upload_calls, + } + assert snapshot == {"code": "400", "message_names_requirement": True, "upload_calls": []} + + +@pytest.mark.asyncio +async def test_upload_without_target_model_names_skips_hook_requirement(monkeypatch): + backend = _RecordingStorageBackend() + monkeypatch.setattr(storage_backend_service, "get_storage_backend", lambda name: backend) + + file_object = await StorageBackendFileService.upload_file_to_storage_backend( + file_data=_file_data(), + target_storage="azure_storage", + target_model_names=[], + purpose="batch", + proxy_logging_obj=_FakeProxyLogging(hook=None), + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + snapshot = { + "upload_count": len(backend.upload_calls), + "id_prefix": file_object.id.split("-")[0], + } + assert snapshot == {"upload_count": 1, "id_prefix": "file"} + + +@pytest.mark.asyncio +async def test_upload_with_target_model_names_and_hook_stores_unified_id(monkeypatch): + backend = _RecordingStorageBackend() + monkeypatch.setattr(storage_backend_service, "get_storage_backend", lambda name: backend) + hook = _FakeManagedFilesHook() + + file_object = await StorageBackendFileService.upload_file_to_storage_backend( + file_data=_file_data(), + target_storage="azure_storage", + target_model_names=["gpt-x"], + purpose="batch", + proxy_logging_obj=_FakeProxyLogging(hook=hook), + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + ) + + snapshot = { + "upload_count": len(backend.upload_calls), + "store_count": len(hook.stored), + "stored_id_matches_response": hook.stored[0]["file_id"] == file_object.id, + "model_mappings": hook.stored[0]["model_mappings"], + } + assert snapshot == { + "upload_count": 1, + "store_count": 1, + "stored_id_matches_response": True, + "model_mappings": {"gpt-x": "https://storage.example/blob-1"}, + } diff --git a/tests/test_litellm/proxy/utils/proxy_logging/test_lifecycle.py b/tests/test_litellm/proxy/utils/proxy_logging/test_lifecycle.py index e33da672599..cf906259246 100644 --- a/tests/test_litellm/proxy/utils/proxy_logging/test_lifecycle.py +++ b/tests/test_litellm/proxy/utils/proxy_logging/test_lifecycle.py @@ -8,7 +8,6 @@ because they are direct dependents on the lifecycle state. from __future__ import annotations -import asyncio from typing import Any, Dict, List from unittest.mock import AsyncMock, MagicMock, patch @@ -17,7 +16,6 @@ import pytest import litellm from litellm.proxy.common_utils.user_api_key_cache import UserApiKeyCache from litellm.proxy.utils import ( - InternalUsageCache, ProxyLogging, ) @@ -102,9 +100,7 @@ def test_update_values_with_no_args_is_noop(proxy_logging): def test_update_values_invalid_type_for_alerting_raises(proxy_logging): - proxy_logging.slack_alerting_instance = MagicMock( - update_values=MagicMock(side_effect=TypeError("bad type")) - ) + proxy_logging.slack_alerting_instance = MagicMock(update_values=MagicMock(side_effect=TypeError("bad type"))) with pytest.raises(TypeError): proxy_logging.update_values(alerting={"not": "a list"}) # type: ignore[arg-type] @@ -190,6 +186,90 @@ def test_add_proxy_hooks_registers_callbacks(proxy_logging, monkeypatch): } +def _stub_hook_classes(): + class _PrismaFreeHook: + def __init__(self, internal_usage_cache): + self.internal_usage_cache = internal_usage_cache + + class _PrismaRequiringHook: + def __init__(self, internal_usage_cache, prisma_client): + self.internal_usage_cache = internal_usage_cache + self.prisma_client = prisma_client + + class _PrismaOnlyHook: + def __init__(self, prisma_client): + self.prisma_client = prisma_client + + return { + "cache_control_check": _PrismaFreeHook, + "needs_db_hook": _PrismaRequiringHook, + "db_only_hook": _PrismaOnlyHook, + } + + +def test_add_proxy_hooks_skips_prisma_requiring_hook_when_no_db(proxy_logging, monkeypatch): + hook_classes = _stub_hook_classes() + registered: List[Any] = [] + + from litellm.proxy import utils as utils_mod + + monkeypatch.setattr(utils_mod, "PROXY_HOOKS", list(hook_classes.keys())) + monkeypatch.setattr(utils_mod, "get_proxy_hook", hook_classes.__getitem__) + monkeypatch.setattr( + litellm.logging_callback_manager, + "add_litellm_callback", + lambda cb: registered.append(cb), + ) + + with patch("litellm.proxy.proxy_server.prisma_client", None): + proxy_logging._add_proxy_hooks(llm_router=None) + + snapshot = { + "mapping_keys": list(proxy_logging.proxy_hook_mapping.keys()), + "registered_types": [type(r).__name__ for r in registered], + "needs_db_hook_lookup": proxy_logging.get_proxy_hook("needs_db_hook"), + "db_only_hook_lookup": proxy_logging.get_proxy_hook("db_only_hook"), + } + assert snapshot == { + "mapping_keys": ["cache_control_check"], + "registered_types": ["_PrismaFreeHook"], + "needs_db_hook_lookup": None, + "db_only_hook_lookup": None, + } + + +def test_add_proxy_hooks_registers_prisma_requiring_hook_with_db(proxy_logging, monkeypatch): + hook_classes = _stub_hook_classes() + registered: List[Any] = [] + fake_prisma = MagicMock() + + from litellm.proxy import utils as utils_mod + + monkeypatch.setattr(utils_mod, "PROXY_HOOKS", list(hook_classes.keys())) + monkeypatch.setattr(utils_mod, "get_proxy_hook", hook_classes.__getitem__) + monkeypatch.setattr( + litellm.logging_callback_manager, + "add_litellm_callback", + lambda cb: registered.append(cb), + ) + + with patch("litellm.proxy.proxy_server.prisma_client", fake_prisma): + proxy_logging._add_proxy_hooks(llm_router=None) + + snapshot = { + "mapping_keys": list(proxy_logging.proxy_hook_mapping.keys()), + "registered_count": len(registered), + "needs_db_hook_got_prisma": proxy_logging.proxy_hook_mapping["needs_db_hook"].prisma_client is fake_prisma, + "db_only_hook_got_prisma": proxy_logging.proxy_hook_mapping["db_only_hook"].prisma_client is fake_prisma, + } + assert snapshot == { + "mapping_keys": ["cache_control_check", "needs_db_hook", "db_only_hook"], + "registered_count": 3, + "needs_db_hook_got_prisma": True, + "db_only_hook_got_prisma": True, + } + + def test_add_proxy_hooks_unknown_hook_raises(proxy_logging, monkeypatch): from litellm.proxy import utils as utils_mod @@ -267,9 +347,7 @@ def test_init_litellm_callbacks_replaces_string_with_instance(proxy_logging, mon snapshot = { "replaced_first_item": litellm.callbacks[0] is sentinel_instance, "callbacks_grew_with_service": len(litellm.callbacks) >= 2, - "service_logging_appended": any( - "ServiceLogging" in type(c).__name__ for c in litellm.callbacks - ), + "service_logging_appended": any("ServiceLogging" in type(c).__name__ for c in litellm.callbacks), } assert snapshot == { "replaced_first_item": True, From 8c0556abf6965fde0de260da5ce424aa1daa1a56 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 02:42:34 -0700 Subject: [PATCH 037/279] fix(proxy): authenticate managed ids before routing --- litellm/proxy/batches_endpoints/endpoints.py | 21 ++++- .../proxy/fine_tuning_endpoints/endpoints.py | 25 +++++- .../openai_files_endpoints/common_utils.py | 58 ++++++++++--- .../openai_files_endpoints/files_endpoints.py | 21 ++++- .../vector_store_files_endpoints/endpoints.py | 56 +++++++++--- .../proxy/batches_endpoints/test_endpoints.py | 56 ++++++++++++ .../fine_tuning_endpoints/test_endpoints.py | 46 +++++++++- .../test_files_endpoint.py | 36 +++++++- .../test_endpoints.py | 87 ++++++++++++++++--- 9 files changed, 355 insertions(+), 51 deletions(-) diff --git a/litellm/proxy/batches_endpoints/endpoints.py b/litellm/proxy/batches_endpoints/endpoints.py index c9f66c5a48b..aef1c5ac17e 100644 --- a/litellm/proxy/batches_endpoints/endpoints.py +++ b/litellm/proxy/batches_endpoints/endpoints.py @@ -177,7 +177,12 @@ async def create_batch( } input_file_id: Final = _create_batch_data.get("input_file_id", None) - validate_managed_id_requirement(resource_id=input_file_id, resource_kind="file") + await validate_managed_id_requirement( + resource_id=input_file_id, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) unified_file_id: str | Literal[False] = False model_from_file_id = None @@ -394,7 +399,12 @@ async def retrieve_batch( data: dict = {} try: - validate_managed_id_requirement(resource_id=batch_id, resource_kind="batch") + await validate_managed_id_requirement( + resource_id=batch_id, + resource_kind="batch", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) model_from_id: Final = decode_model_from_file_id(batch_id) _retrieve_batch_request: Final = RetrieveBatchRequest( batch_id=batch_id, @@ -843,7 +853,12 @@ async def cancel_batch( data: dict = {} try: - validate_managed_id_requirement(resource_id=batch_id, resource_kind="batch") + await validate_managed_id_requirement( + resource_id=batch_id, + resource_kind="batch", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) # Check for encoded batch ID with model info model_from_id: Final = decode_model_from_file_id(batch_id) diff --git a/litellm/proxy/fine_tuning_endpoints/endpoints.py b/litellm/proxy/fine_tuning_endpoints/endpoints.py index 87e9895eed0..a13ad00713d 100644 --- a/litellm/proxy/fine_tuning_endpoints/endpoints.py +++ b/litellm/proxy/fine_tuning_endpoints/endpoints.py @@ -135,10 +135,17 @@ async def create_fine_tuning_job( ## CHECK IF MANAGED FILE ID unified_file_id: str | Literal[False] = False training_file: Final = fine_tuning_request.training_file - validate_managed_id_requirement(resource_id=training_file, resource_kind="file") - validate_managed_id_requirement( + await validate_managed_id_requirement( + resource_id=training_file, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) + await validate_managed_id_requirement( resource_id=fine_tuning_request.validation_file, resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), ) response: LiteLLMFineTuningJob | None = None if training_file: @@ -252,7 +259,12 @@ async def retrieve_fine_tuning_job( try: if premium_user is not True: raise ValueError(f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}") - validate_managed_id_requirement(resource_id=fine_tuning_job_id, resource_kind="fine-tuning job") + await validate_managed_id_requirement( + resource_id=fine_tuning_job_id, + resource_kind="fine-tuning job", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) ( @@ -520,7 +532,12 @@ async def cancel_fine_tuning_job( try: if premium_user is not True: raise ValueError(f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}") - validate_managed_id_requirement(resource_id=fine_tuning_job_id, resource_kind="fine-tuning job") + await validate_managed_id_requirement( + resource_id=fine_tuning_job_id, + resource_kind="fine-tuning job", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) ( diff --git a/litellm/proxy/openai_files_endpoints/common_utils.py b/litellm/proxy/openai_files_endpoints/common_utils.py index 143bd5bc6b5..56e986c89cf 100644 --- a/litellm/proxy/openai_files_endpoints/common_utils.py +++ b/litellm/proxy/openai_files_endpoints/common_utils.py @@ -4,7 +4,7 @@ import re from collections.abc import Mapping from dataclasses import dataclass, field from types import MappingProxyType -from typing import TYPE_CHECKING, Final, Literal, Optional +from typing import TYPE_CHECKING, Final, Literal, Optional, Protocol, runtime_checkable from litellm.repositories.table_repositories import ( ManagedFileRepository, @@ -22,6 +22,21 @@ if TYPE_CHECKING: from litellm.types.utils import LiteLLMBatch +@runtime_checkable +class ManagedResourceAccessChecker(Protocol): + async def can_user_call_unified_file_id( + self, + unified_file_id: str, + user_api_key_dict: "UserAPIKeyAuth", + ) -> bool: ... + + async def can_user_call_unified_object_id( + self, + unified_object_id: str, + user_api_key_dict: "UserAPIKeyAuth", + ) -> bool: ... + + def _is_base64_encoded_unified_file_id(b64_uid: str) -> str | Literal[False]: # Ensure b64_uid is a string and not a mock object if not isinstance(b64_uid, str): @@ -881,20 +896,24 @@ def validate_managed_files_requirement( ) -def validate_managed_id_requirement( +async def validate_managed_id_requirement( resource_id: str | None, resource_kind: Literal["file", "batch", "fine-tuning job"], + user_api_key_dict: "UserAPIKeyAuth", + managed_files_obj: object | None, ) -> None: """ Enforce proxy-level managed resources on every route that accepts a provider-issued id - when ``litellm.require_managed_files`` is enabled. + when ``litellm.require_managed_files`` is enabled, and authenticate managed ids against + the caller's stored ownership record. Ownership is only recorded for LiteLLM managed ids, so a raw provider id is forwarded to the provider under shared credentials without any tenant check; knowing another tenant's provider id would be enough to read, reuse, or destroy the object behind it. Raises: - HTTPException: 400 if ``resource_id`` is set and is not a LiteLLM managed id. + HTTPException: 400 for a raw id, 403 for an inaccessible managed id, or 500 when + ownership validation is unavailable. """ from fastapi import HTTPException @@ -906,16 +925,33 @@ def validate_managed_id_requirement( if not resource_id: return - if _is_base64_encoded_unified_file_id(resource_id): + if not _is_base64_encoded_unified_file_id(resource_id): + raise HTTPException( + status_code=400, + detail=( + f"Raw provider {resource_kind} ids cannot be used when require_managed_files is enabled in " + f"litellm_settings. Use the LiteLLM managed {resource_kind} id returned when the " + f"{resource_kind} was created." + ), + ) + + if not isinstance(managed_files_obj, ManagedResourceAccessChecker): + raise HTTPException( + status_code=500, + detail="Managed resource ownership validation is unavailable.", + ) + + can_access: Final = ( + await managed_files_obj.can_user_call_unified_file_id(resource_id, user_api_key_dict) + if resource_kind == "file" + else await managed_files_obj.can_user_call_unified_object_id(resource_id, user_api_key_dict) + ) + if can_access: return raise HTTPException( - status_code=400, - detail=( - f"Raw provider {resource_kind} ids cannot be used when require_managed_files is enabled in " - f"litellm_settings. Use the LiteLLM managed {resource_kind} id returned when the " - f"{resource_kind} was created." - ), + status_code=403, + detail=f"The caller does not have access to this managed {resource_kind} id.", ) diff --git a/litellm/proxy/openai_files_endpoints/files_endpoints.py b/litellm/proxy/openai_files_endpoints/files_endpoints.py index b5950c4f852..0acaac3bf5d 100644 --- a/litellm/proxy/openai_files_endpoints/files_endpoints.py +++ b/litellm/proxy/openai_files_endpoints/files_endpoints.py @@ -613,7 +613,12 @@ async def get_file_content( data: dict = {"file_id": file_id} try: - validate_managed_id_requirement(resource_id=file_id, resource_kind="file") + await validate_managed_id_requirement( + resource_id=file_id, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) # Include original request and headers in the data base_llm_response_processor: Final = ProxyBaseLLMRequestProcessing(data=data) @@ -911,7 +916,12 @@ async def get_file( data: dict = {"file_id": file_id} try: - validate_managed_id_requirement(resource_id=file_id, resource_kind="file") + await validate_managed_id_requirement( + resource_id=file_id, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) custom_llm_provider: Final = ( provider @@ -1103,7 +1113,12 @@ async def delete_file( data: dict = {"file_id": file_id} try: - validate_managed_id_requirement(resource_id=file_id, resource_kind="file") + await validate_managed_id_requirement( + resource_id=file_id, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + ) custom_llm_provider: Final = ( provider diff --git a/litellm/proxy/vector_store_files_endpoints/endpoints.py b/litellm/proxy/vector_store_files_endpoints/endpoints.py index f8fdf607292..c9b89bcd390 100644 --- a/litellm/proxy/vector_store_files_endpoints/endpoints.py +++ b/litellm/proxy/vector_store_files_endpoints/endpoints.py @@ -30,10 +30,12 @@ if TYPE_CHECKING: router: Final = APIRouter() -def _update_request_data_with_managed_file_id( +async def _update_request_data_with_managed_file_id( data: dict, file_id: str, request: Request, + user_api_key_dict: UserAPIKeyAuth, + managed_files_obj: object | None, llm_router: Optional["Router"] = None, ) -> tuple[dict, str | None]: """ @@ -69,7 +71,12 @@ def _update_request_data_with_managed_file_id( validate_managed_id_requirement, ) - validate_managed_id_requirement(resource_id=file_id, resource_kind="file") + await validate_managed_id_requirement( + resource_id=file_id, + resource_kind="file", + user_api_key_dict=user_api_key_dict, + managed_files_obj=managed_files_obj, + ) # First, check if this is a unified managed file ID (base64 encoded) decoded_id: Final = is_base64_encoded_unified_id(file_id) @@ -514,8 +521,13 @@ async def vector_store_file_create( # Handle managed file IDs if present in request body original_managed_file_id = None if "file_id" in data: - data, original_managed_file_id = _update_request_data_with_managed_file_id( - data=data, file_id=data["file_id"], request=request, llm_router=llm_router + data, original_managed_file_id = await _update_request_data_with_managed_file_id( + data=data, + file_id=data["file_id"], + request=request, + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + llm_router=llm_router, ) # Then handle managed vector store IDs @@ -712,8 +724,13 @@ async def vector_store_file_retrieve( ) # Handle managed file IDs first - data, original_managed_file_id = _update_request_data_with_managed_file_id( - data=data, file_id=file_id, request=request, llm_router=llm_router + data, original_managed_file_id = await _update_request_data_with_managed_file_id( + data=data, + file_id=file_id, + request=request, + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + llm_router=llm_router, ) # Then handle managed vector store IDs @@ -814,8 +831,13 @@ async def vector_store_file_content( ) # Handle managed file IDs first - data, original_managed_file_id = _update_request_data_with_managed_file_id( - data=data, file_id=file_id, request=request, llm_router=llm_router + data, original_managed_file_id = await _update_request_data_with_managed_file_id( + data=data, + file_id=file_id, + request=request, + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + llm_router=llm_router, ) # Then handle managed vector store IDs @@ -916,8 +938,13 @@ async def vector_store_file_update( ) # Handle managed file IDs first - data, original_managed_file_id = _update_request_data_with_managed_file_id( - data=data, file_id=file_id, request=request, llm_router=llm_router + data, original_managed_file_id = await _update_request_data_with_managed_file_id( + data=data, + file_id=file_id, + request=request, + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + llm_router=llm_router, ) # Then handle managed vector store IDs @@ -1018,8 +1045,13 @@ async def vector_store_file_delete( ) # Handle managed file IDs first - data, original_managed_file_id = _update_request_data_with_managed_file_id( - data=data, file_id=file_id, request=request, llm_router=llm_router + data, original_managed_file_id = await _update_request_data_with_managed_file_id( + data=data, + file_id=file_id, + request=request, + user_api_key_dict=user_api_key_dict, + managed_files_obj=proxy_logging_obj.get_proxy_hook("managed_files"), + llm_router=llm_router, ) # Then handle managed vector store IDs diff --git a/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py b/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py index 18ca604f88d..f9193db143e 100644 --- a/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py +++ b/tests/test_litellm/proxy/batches_endpoints/test_endpoints.py @@ -2275,6 +2275,37 @@ def _unified_batch_id(model_id: str = "azure/gpt-4o", batch_id: str = "batch-pro return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") +def _unified_file_id() -> str: + import base64 + + from litellm.types.utils import SpecialEnums + + unified = SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( + "application/json", "managed-id", "gpt-4o-mini", "file-provider-id", "gpt-4o-mini-id" + ) + return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") + + +@dataclass(frozen=True) +class ManagedResourceAccessCheckerStub: + file_access: bool = True + object_access: bool = True + + async def can_user_call_unified_file_id( + self, + unified_file_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return self.file_access + + async def can_user_call_unified_object_id( + self, + unified_object_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return self.object_access + + @pytest.mark.asyncio async def test_create__raw_input_file_id_rejected_when_managed_files_required(harness): set_body( @@ -2334,6 +2365,27 @@ async def test_create__raw_input_file_id_allowed_when_managed_files_not_required assert harness.acreate_kwargs()["input_file_id"] == "file-victim-abc123" +@pytest.mark.asyncio +async def test_create__other_teams_unified_input_file_id_rejected(harness): + set_body( + harness, + { + "input_file_id": _unified_file_id(), + "endpoint": "/v1/chat/completions", + "completion_window": "24h", + }, + ) + harness.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub(file_access=False) + + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await call_create(harness) + + assert exc.value.code == "403" + harness.litellm_acreate.assert_not_called() + harness.router_acreate.assert_not_called() + + @pytest.mark.asyncio async def test_retrieve__raw_batch_id_rejected_when_managed_files_required(retrieve_harness): with patch.object(litellm, "require_managed_files", True): @@ -2347,6 +2399,8 @@ async def test_retrieve__raw_batch_id_rejected_when_managed_files_required(retri @pytest.mark.asyncio async def test_retrieve__unified_batch_id_allowed_when_managed_files_required(retrieve_harness): + retrieve_harness.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): await call_retrieve(retrieve_harness, _unified_batch_id()) @@ -2366,6 +2420,8 @@ async def test_cancel__raw_batch_id_rejected_when_managed_files_required(cancel_ @pytest.mark.asyncio async def test_cancel__unified_batch_id_allowed_when_managed_files_required(cancel_harness): + cancel_harness.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): await call_cancel(cancel_harness, _unified_batch_id()) diff --git a/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py b/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py index 35c202057e7..b54787bf428 100644 --- a/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py +++ b/tests/test_litellm/proxy/fine_tuning_endpoints/test_endpoints.py @@ -14,6 +14,7 @@ import base64 import os import sys from contextlib import ExitStack +from dataclasses import dataclass from unittest.mock import AsyncMock, MagicMock, patch import pytest @@ -78,10 +79,31 @@ class FakeRequest: return {} +@dataclass(frozen=True) +class ManagedResourceAccessCheckerStub: + file_access: bool = True + object_access: bool = True + + async def can_user_call_unified_file_id( + self, + unified_file_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return self.file_access + + async def can_user_call_unified_object_id( + self, + unified_object_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return self.object_access + + class Seams: - def __init__(self, router: MagicMock, litellm_calls: dict[str, AsyncMock]): + def __init__(self, router: MagicMock, litellm_calls: dict[str, AsyncMock], logging: MagicMock): self.router = router self.litellm_calls = litellm_calls + self.logging = logging def assert_no_provider_call(self) -> None: for name, mock in self.litellm_calls.items(): @@ -126,7 +148,7 @@ def seams(): stack.enter_context(patch.object(proxy_server, "proxy_config", MagicMock())) stack.enter_context(patch.object(proxy_server, "version", "test-version")) stack.enter_context(patch.object(endpoints, "fine_tuning_config", [{"custom_llm_provider": "openai"}])) - yield Seams(router=router, litellm_calls=litellm_calls) + yield Seams(router=router, litellm_calls=litellm_calls, logging=logging) async def _create(training_file: str, validation_file: str | None = None): @@ -176,6 +198,8 @@ async def test_create__raw_training_file_rejected_when_managed_files_required(se async def test_create__raw_validation_file_rejected_when_managed_files_required(seams): """The validation file is uploaded and readable exactly like the training file, so a managed training_file must not smuggle a raw validation_file past the guard.""" + seams.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): with pytest.raises(ProxyException) as exc: await _create(_unified_file_id(), validation_file=RAW_FILE_ID) @@ -186,12 +210,26 @@ async def test_create__raw_validation_file_rejected_when_managed_files_required( @pytest.mark.asyncio async def test_create__unified_training_file_allowed_when_managed_files_required(seams): + seams.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): await _create(_unified_file_id()) assert seams.router.acreate_fine_tuning_job.call_count == 1 +@pytest.mark.asyncio +async def test_create__other_teams_unified_training_file_rejected(seams): + seams.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub(file_access=False) + + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(ProxyException) as exc: + await _create(_unified_file_id()) + + assert exc.value.code == "403" + seams.assert_no_provider_call() + + @pytest.mark.asyncio async def test_create__raw_training_file_allowed_when_managed_files_not_required(seams): with patch.object(litellm, "require_managed_files", False): @@ -212,6 +250,8 @@ async def test_retrieve__raw_job_id_rejected_when_managed_files_required(seams): @pytest.mark.asyncio async def test_retrieve__unified_job_id_allowed_when_managed_files_required(seams): + seams.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): await _retrieve(_unified_job_id()) @@ -230,6 +270,8 @@ async def test_cancel__raw_job_id_rejected_when_managed_files_required(seams): @pytest.mark.asyncio async def test_cancel__unified_job_id_allowed_when_managed_files_required(seams): + seams.logging.get_proxy_hook.return_value = ManagedResourceAccessCheckerStub() + with patch.object(litellm, "require_managed_files", True): await _cancel(_unified_job_id()) diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py index 2e15da7590a..e68e7102fce 100644 --- a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py @@ -3107,24 +3107,52 @@ def _unified_managed_file_id() -> str: return base64.urlsafe_b64encode(unified_id.encode()).decode().rstrip("=") -def test_require_managed_files_allows_unified_managed_file_id(monkeypatch): +class _ManagedResourceAccessCheckerStub: + async def can_user_call_unified_file_id( + self, + unified_file_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return True + + async def can_user_call_unified_object_id( + self, + unified_object_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return True + + +@pytest.mark.asyncio +async def test_require_managed_files_allows_owned_unified_managed_file_id(monkeypatch): from litellm.proxy.openai_files_endpoints.common_utils import ( validate_managed_id_requirement, ) monkeypatch.setattr("litellm.require_managed_files", True) - validate_managed_id_requirement(resource_id=_unified_managed_file_id(), resource_kind="file") + await validate_managed_id_requirement( + resource_id=_unified_managed_file_id(), + resource_kind="file", + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test", user_id="owner-user"), + managed_files_obj=_ManagedResourceAccessCheckerStub(), + ) -def test_managed_file_id_requirement_is_opt_in(monkeypatch): +@pytest.mark.asyncio +async def test_managed_file_id_requirement_is_opt_in(monkeypatch): from litellm.proxy.openai_files_endpoints.common_utils import ( validate_managed_id_requirement, ) monkeypatch.setattr("litellm.require_managed_files", False) - validate_managed_id_requirement(resource_id="file-victim-abc123", resource_kind="file") + await validate_managed_id_requirement( + resource_id="file-victim-abc123", + resource_kind="file", + user_api_key_dict=UserAPIKeyAuth(api_key="sk-test"), + managed_files_obj=None, + ) def test_raw_provider_file_id_retrieve_allowed_when_managed_files_not_required( diff --git a/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py b/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py index c2bdb1d80f2..da5dd1934e4 100644 --- a/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py +++ b/tests/test_litellm/proxy/vector_store_files_endpoints/test_endpoints.py @@ -5,13 +5,15 @@ Every vector-store file route (create, retrieve, content, update, delete) resolv caller-supplied file id through _update_request_data_with_managed_file_id before the provider call, so the guard lives there once and covers all five. -A raw provider file id has no ownership row, so without the guard it is attached to a -vector store or read back under the shared provider credentials with no tenant check. +A raw or forged managed-looking file id has no ownership row, so without the guard it +is attached to a vector store or read back under shared provider credentials. """ import base64 import os import sys +from dataclasses import dataclass +from typing import Literal from unittest.mock import MagicMock, patch import pytest @@ -21,12 +23,35 @@ sys.path.insert(0, os.path.abspath("../../../..")) from fastapi import HTTPException import litellm +from litellm.proxy._types import UserAPIKeyAuth from litellm.proxy.vector_store_files_endpoints.endpoints import ( _update_request_data_with_managed_file_id, ) from litellm.types.utils import SpecialEnums RAW_FILE_ID = "file-victim-abc123" +CALLER = UserAPIKeyAuth(api_key="sk-test", user_id="attacker-user", team_id="team-b") + + +@dataclass(frozen=True) +class ManagedResourceAccessCheckerStub: + file_access: Literal["allow", "deny", "missing"] + + async def can_user_call_unified_file_id( + self, + unified_file_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + if self.file_access == "missing": + raise HTTPException(status_code=404, detail=f"File not found: {unified_file_id}") + return self.file_access == "allow" + + async def can_user_call_unified_object_id( + self, + unified_object_id: str, + user_api_key_dict: UserAPIKeyAuth, + ) -> bool: + return False def _unified_file_id() -> str: @@ -36,24 +61,31 @@ def _unified_file_id() -> str: return base64.urlsafe_b64encode(unified.encode()).decode().rstrip("=") -def _resolve(file_id: str): - return _update_request_data_with_managed_file_id( +async def _resolve( + file_id: str, + file_access: Literal["allow", "deny", "missing"] = "allow", +): + return await _update_request_data_with_managed_file_id( data={"vector_store_id": "vs-test", "file_id": file_id}, file_id=file_id, request=MagicMock(headers={}, query_params={}), + user_api_key_dict=CALLER, + managed_files_obj=ManagedResourceAccessCheckerStub(file_access=file_access), llm_router=None, ) -def test_raw_file_id_rejected_when_managed_files_required(): +@pytest.mark.asyncio +async def test_raw_file_id_rejected_when_managed_files_required(): with patch.object(litellm, "require_managed_files", True): with pytest.raises(HTTPException) as exc: - _resolve(RAW_FILE_ID) + await _resolve(RAW_FILE_ID) assert exc.value.status_code == 400 -def test_model_encoded_file_id_rejected_when_managed_files_required(): +@pytest.mark.asyncio +async def test_model_encoded_file_id_rejected_when_managed_files_required(): """encode_file_id_with_model output is client-forgeable and carries no ownership row, so it is not a managed file id.""" from litellm.proxy.openai_files_endpoints.common_utils import encode_file_id_with_model @@ -62,22 +94,53 @@ def test_model_encoded_file_id_rejected_when_managed_files_required(): with patch.object(litellm, "require_managed_files", True): with pytest.raises(HTTPException) as exc: - _resolve(encoded) + await _resolve(encoded) assert exc.value.status_code == 400 -def test_unified_file_id_allowed_when_managed_files_required(): +@pytest.mark.asyncio +async def test_forged_unified_file_id_rejected_without_ownership_record(): + forged_id = _unified_file_id() + data = {"vector_store_id": "vs-test", "file_id": forged_id} + with patch.object(litellm, "require_managed_files", True): - data, original = _resolve(_unified_file_id()) + with pytest.raises(HTTPException) as exc: + await _update_request_data_with_managed_file_id( + data=data, + file_id=forged_id, + request=MagicMock(headers={}, query_params={}), + user_api_key_dict=CALLER, + managed_files_obj=ManagedResourceAccessCheckerStub(file_access="missing"), + llm_router=None, + ) + + assert exc.value.status_code == 404 + assert data["file_id"] == forged_id + + +@pytest.mark.asyncio +async def test_other_teams_unified_file_id_rejected(): + with patch.object(litellm, "require_managed_files", True): + with pytest.raises(HTTPException) as exc: + await _resolve(_unified_file_id(), file_access="deny") + + assert exc.value.status_code == 403 + + +@pytest.mark.asyncio +async def test_owned_unified_file_id_allowed_when_managed_files_required(): + with patch.object(litellm, "require_managed_files", True): + data, original = await _resolve(_unified_file_id()) assert original == _unified_file_id() assert data["file_id"] == RAW_FILE_ID -def test_raw_file_id_allowed_when_managed_files_not_required(): +@pytest.mark.asyncio +async def test_raw_file_id_allowed_when_managed_files_not_required(): with patch.object(litellm, "require_managed_files", False): - data, original = _resolve(RAW_FILE_ID) + data, original = await _resolve(RAW_FILE_ID) assert original is None assert data["file_id"] == RAW_FILE_ID From f038be22dbaaf34d4ba695b40c0651d6d576effa Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 03:25:35 -0700 Subject: [PATCH 038/279] build(lint): rename make pre-commit to make check with a working-tree fallback --- CLAUDE.md | 4 +- Makefile | 18 ++- scripts/install_git_hooks.sh | 2 +- scripts/pre_commit_lint.sh | 144 ++++++++++++++------- tests/e2e/CONTRIBUTING.md | 2 +- tests/test_litellm/test_pre_commit_lint.py | 90 ++++++++++++- 6 files changed, 201 insertions(+), 59 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 59929143c46..0354e3def53 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,7 +41,9 @@ Python max line length is 120, not 88 When you fix violations gated by `ruff-strict-budget.json`, `type-discipline-budget.json`, or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered limits so the ceilings ratchet down instead of leaving stale headroom. It measures the working tree, so it must contain exactly the fixes you're committing -`make pre-commit` saves its complete output to a log file in .git (overwriting previous pre-commit logs) and prints that path as its first and last output lines. To inspect a run, read or grep that log instead of re-running the multi-minute checks just to see a different slice +Run `make check` (formerly `make pre-commit`, which still works as an alias) before every commit, merge commits included. It runs the CI-gating lint scoped to your staged files, so stage everything you intend to commit first; it warns about changed files you left unstaged and names the checks that were skipped because of them. With nothing staged it instead checks the working tree's diff against the merge base with origin/litellm_internal_staging, which is how you predict the CI lint on an already-committed branch, e.g. right after a merge commit + +`make check` saves its complete output to a log file in .git (overwriting previous logs) and prints that path as its first and last output lines. To inspect a run, read or grep that log instead of re-running the multi-minute checks just to see a different slice If you're trying to create a new function that relies on untyped stuff, instead of adding more Any's and pushing `reportAny` / `reportExplicitAny` closer to their basedpyright ceilings, just validate it in the caller with Pydantic (a model or `TypeAdapter` that returns the typed thing or raises will do) and then pass the now typed variable in diff --git a/Makefile b/Makefile index 493828571b7..94d8c875af5 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ lint-basedpyright lint-e2e-basedpyright lint-basedpyright-budget-update lint-type-discipline lint-type-discipline-budget-update \ lint-ruff-budget lint-ruff-budget-update lint-budget-update lint-gate \ install-dev install-proxy-dev install-test-deps install-hooks \ - install-helm-unittest check-circular-imports check-import-safety pre-commit \ + install-helm-unittest check-circular-imports check-import-safety check pre-commit \ lint-install lint-fetch-base bootstrap # Default target @@ -22,7 +22,8 @@ help: @echo " make install-test-deps - Install the full local test environment" @echo " make install-helm-unittest - Install helm unittest plugin" @echo " make install-hooks - Install git hooks (Conventional Commits + Branches)" - @echo " make pre-commit - Run CI-equivalent lint on staged files (run before committing)" + @echo " make check - Run CI-equivalent lint on staged files, or on the diff vs the base branch when nothing is staged" + @echo " make pre-commit - Legacy alias for make check" @echo " make format - Apply ruff format code formatting" @echo " make format-check - Check ruff format code formatting (matches CI)" @echo " make lint - Run all linting (Ruff, basedpyright, format check, circular imports, import safety)" @@ -236,13 +237,20 @@ lint-checks: lint-format-check-changed lint-ruff lint-gate lint-type-discipline # Faster linting for local development (only checks changed code) lint-dev: lint-format-changed check-circular-imports check-import-safety -# Run the gating CI checks against your staged files right before committing. Mirrors +# Run the gating CI checks against your changes. Scopes to staged files when anything +# is staged (warning about changed files left unstaged); with nothing staged it falls +# back to the working tree's diff against the merge base with the base branch, so a +# fresh merge commit or an unstaged working tree still gets checked. Mirrors # test-linting.yml (Python), test-litellm-ui-build.yml's frontend-lint (dashboard), and -# check-ui-api-types.yml (API-type drift), skipping any whose files you didn't stage. +# check-ui-api-types.yml (API-type drift), skipping any whose files aren't in scope. # Not auto-installed as a git hook so it never slows an unrelated human commit. -pre-commit: bootstrap +check: bootstrap ./scripts/pre_commit_lint.sh +pre-commit: + @echo "make pre-commit is a legacy alias; use make check" >&2 + @$(MAKE) check + # Testing targets test: install-test-deps $(UV_RUN) pytest tests/ diff --git a/scripts/install_git_hooks.sh b/scripts/install_git_hooks.sh index 7ea8c3ff2e9..8f4e79e4ddd 100755 --- a/scripts/install_git_hooks.sh +++ b/scripts/install_git_hooks.sh @@ -35,7 +35,7 @@ These hooks enforce Conventional Commits and Conventional Branches. Bypass with --no-verify when you need to (e.g. for emergency hotfixes). The CI-equivalent lint is deliberately not installed as an auto-firing hook -(it can take minutes); run it on demand with 'make pre-commit' before committing. +(it can take minutes); run it on demand with 'make check' before committing. To uninstall: git config --unset core.hooksPath EOF diff --git a/scripts/pre_commit_lint.sh b/scripts/pre_commit_lint.sh index af8335e0e84..1bf7fe17832 100755 --- a/scripts/pre_commit_lint.sh +++ b/scripts/pre_commit_lint.sh @@ -1,18 +1,25 @@ #!/usr/bin/env bash # -# pre_commit_lint.sh — shift CI lint left. Run it (via `make pre-commit`) right -# before `git commit`; it inspects your staged files and runs only the matching -# gating CI checks, so a clean run means a green CI lint: -# - litellm/ Python staged -> `make lint` (test-linting.yml's lint job) -# - tests/e2e Python staged -> `make lint-e2e-basedpyright` (test-linting.yml's e2e type-check step) -# + raw HTTP client ban (test-code-quality.yml's check_e2e_no_raw_requests) -# - dashboard staged -> prettier + eslint + lint budgets (test-litellm-ui-build.yml's frontend-lint) -# - proxy/types staged -> regenerate dashboard API types and fail on drift (check-ui-api-types.yml) +# pre_commit_lint.sh — shift CI lint left. Run it (via `make check`, formerly +# `make pre-commit`) before `git commit`, or after committing (e.g. a merge +# commit) to predict CI for the branch. It picks the files in scope and runs +# only the matching gating CI checks, so a clean run means a green CI lint: +# - anything staged -> scope is the staged files; changed-but-unstaged files +# whose checks were skipped are called out +# - nothing staged -> scope is the working tree's diff against the merge base +# with origin/litellm_internal_staging, untracked files included +# The per-area checks: +# - litellm/ Python -> `make lint` (test-linting.yml's lint job) +# - tests/e2e Python -> `make lint-e2e-basedpyright` (test-linting.yml's e2e type-check step) +# + raw HTTP client ban (test-code-quality.yml's check_e2e_no_raw_requests) +# - dashboard -> prettier + eslint + lint budgets (test-litellm-ui-build.yml's frontend-lint) +# - proxy/types -> regenerate dashboard API types and fail on drift (check-ui-api-types.yml) # -# Each block is skipped when no matching files are staged, so unrelated commits stay -# fast. This is intentionally not auto-installed as a git hook (see scripts/install_git_hooks.sh): -# the dashboard and basedpyright passes can take minutes, so it's run on demand rather -# than firing on every human commit. It is hook-compatible if you want that anyway: +# Each block is skipped when no matching files are in scope, so unrelated commits +# stay fast. This is intentionally not auto-installed as a git hook (see +# scripts/install_git_hooks.sh): the dashboard and basedpyright passes can take +# minutes, so it's run on demand rather than firing on every human commit. It is +# hook-compatible if you want that anyway: # `ln -s ../../scripts/pre_commit_lint.sh .git/hooks/pre-commit`. set -eu @@ -20,17 +27,17 @@ set -eu if [ -z "${PRE_COMMIT_LINT_INNER:-}" ]; then log_file=$(git rev-parse --path-format=absolute --git-path pre_commit_lint.log) if : > "$log_file" 2>/dev/null; then - echo "pre-commit: logging full output to $log_file" + echo "check: logging full output to $log_file" PRE_COMMIT_LINT_INNER=1 "$0" "$@" 2>&1 | tee "$log_file" pipe_status=("${PIPESTATUS[@]}") if [ "${pipe_status[1]}" -eq 0 ]; then - echo "pre-commit: full log: $log_file" + echo "check: full log: $log_file" else - echo "pre-commit: WARNING - writing $log_file failed; the log may be incomplete" >&2 + echo "check: WARNING - writing $log_file failed; the log may be incomplete" >&2 fi exit "${pipe_status[0]}" fi - echo "pre-commit: WARNING - cannot write $log_file; output will not be saved" >&2 + echo "check: WARNING - cannot write $log_file; output will not be saved" >&2 PRE_COMMIT_LINT_INNER=1 exec "$0" "$@" fi @@ -38,38 +45,79 @@ repo_root=$(git rev-parse --show-toplevel) cd "$repo_root" staged=$(git diff --cached --name-only --diff-filter=ACMR) -staged_match() { printf '%s\n' "$staged" | grep -E "$1" || true; } +unstaged=$(git diff --name-only) +untracked=$(git ls-files --others --exclude-standard) + +if [ -n "$staged" ]; then + scope=$staged +else + git fetch --quiet origin litellm_internal_staging 2>/dev/null || true + merge_base=$(git merge-base origin/litellm_internal_staging HEAD 2>/dev/null) || { + echo "check: cannot resolve the merge base with origin/litellm_internal_staging." >&2 + echo " Fix: git fetch origin litellm_internal_staging" >&2 + exit 1 + } + scope=$(printf '%s\n' "$(git diff --name-only --diff-filter=ACMR "$merge_base")" "$untracked" | sed '/^$/d' | sort -u) + if [ -z "$scope" ]; then + echo "check: nothing to check (no staged files, no working-tree changes, no branch changes vs origin/litellm_internal_staging)" + exit 0 + fi + echo "check: nothing staged; scoping to the working tree's diff against the merge base with origin/litellm_internal_staging:" + printf '%s\n' "$scope" | sed 's/^/ /' +fi + +scope_match() { printf '%s\n' "$scope" | grep -E "$1" || true; } + +litellm_py_pattern='^litellm/.*\.py$' +e2e_py_pattern='^tests/e2e/.*\.py$' +spec_pattern='^(litellm/(proxy|types)/.*|ui/litellm-dashboard/(scripts/gen-api-types\.mjs|package\.json|package-lock\.json|src/lib/http/schema\.d\.ts))$' +ui_prettier_pattern='^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs|json|css|scss|md|mdx|yml|yaml|html)$' +ui_eslint_pattern='^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs)$' # CI's lint job (test-linting.yml) only inspects litellm/, so a tests-only or # scripts-only commit can't turn it red; scope the trigger there to skip the slow # make lint when it couldn't catch anything. -litellm_py_files=$(staged_match '^litellm/.*\.py$') -e2e_py_files=$(staged_match '^tests/e2e/.*\.py$') +litellm_py_files=$(scope_match "$litellm_py_pattern") +e2e_py_files=$(scope_match "$e2e_py_pattern") # ruff format (and CI's format step) skip enterprise; the rest of make lint covers it. fmt_files=$(printf '%s\n' "$litellm_py_files" | grep -v '^litellm/enterprise/' || true) # check-ui-api-types.yml triggers on any file under litellm/proxy or litellm/types # (Prisma schema and configs included, not just Python) plus the generator and its # lockfiles, so match that whole trigger set rather than a Python subset. -spec_files=$(staged_match '^(litellm/(proxy|types)/.*|ui/litellm-dashboard/(scripts/gen-api-types\.mjs|package\.json|package-lock\.json|src/lib/http/schema\.d\.ts))$') +spec_files=$(scope_match "$spec_pattern") # CI's frontend-lint runs prettier over a wider extension set than eslint; keep that # split so this flags exactly what the job would. -ui_prettier_files=$(staged_match '^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs|json|css|scss|md|mdx|yml|yaml|html)$') -ui_eslint_files=$(staged_match '^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs)$') +ui_prettier_files=$(scope_match "$ui_prettier_pattern") +ui_eslint_files=$(scope_match "$ui_eslint_pattern") -# CI lints the committed tree, so this script predicts CI for what you have STAGED -# (every trigger above reads `git diff --cached`). The tools it runs, though, read -# the working tree, so unstaged edits to tracked files and untracked files fold -# into the result and a green/red here won't match a commit of just the staged -# changes. There's no safe way to lint the index in place, so surface the gap -# instead of hiding it: stage everything you intend to commit before trusting a -# pass. This only warns; it never blocks or touches your changes. -unstaged=$(git diff --name-only) -untracked=$(git ls-files --others --exclude-standard) -if [ -n "$unstaged" ] || [ -n "$untracked" ]; then - echo "pre-commit: NOTE - unstaged/untracked changes are included in these checks but" >&2 - echo " won't be in a commit of only your staged changes, so this result may differ from" >&2 - echo " CI. Stage everything you intend to commit (git add) for an accurate prediction:" >&2 - printf '%s\n' "$unstaged" "$untracked" | sed '/^$/d' | sed 's/^/ /' >&2 +# CI lints the committed tree, so with staged files this script predicts CI for +# what you have STAGED (every trigger above reads `git diff --cached`). The tools +# it runs, though, read the working tree, so unstaged edits to tracked files and +# untracked files fold into the result and a green/red here won't match a commit +# of just the staged changes. There's no safe way to lint the index in place, so +# surface the gap instead of hiding it: stage everything you intend to commit +# before trusting a pass. This only warns; it never blocks or touches your changes. +if [ -n "$staged" ]; then + not_staged=$(printf '%s\n' "$unstaged" "$untracked" | sed '/^$/d' | sort -u) + if [ -n "$not_staged" ]; then + echo "check: NOTE - unstaged/untracked changes are included in these checks but" >&2 + echo " won't be in a commit of only your staged changes, so this result may differ from" >&2 + echo " CI. Stage everything you intend to commit (git add) for an accurate prediction:" >&2 + printf '%s\n' "$not_staged" | sed 's/^/ /' >&2 + fi + warn_skipped() { + local check_name=$1 pattern=$2 triggered=$3 + [ -n "$triggered" ] && return 0 + local missed + missed=$(printf '%s\n' "$not_staged" | grep -E "$pattern" || true) + [ -z "$missed" ] && return 0 + echo "check: SKIPPED $check_name because these changed files are not staged:" >&2 + printf '%s\n' "$missed" | sed 's/^/ /' >&2 + } + warn_skipped "Python lint (make lint)" "$litellm_py_pattern" "$litellm_py_files" + warn_skipped "tests/e2e checks (basedpyright + raw HTTP client ban)" "$e2e_py_pattern" "$e2e_py_files" + warn_skipped "dashboard lint (prettier + eslint + lint budgets)" "$ui_prettier_pattern" "$ui_prettier_files" + warn_skipped "dashboard API-type sync (npm run gen:api)" "$spec_pattern" "$spec_files" fi lint_dashboard() { @@ -114,15 +162,15 @@ bootstrap_hint() { python_checks() { local rc=0 - echo "pre-commit: linting Python (make lint)" - make lint || { echo "✗ Python lint failed. Fix the reds above, then re-run make pre-commit." >&2; rc=1; } + echo "check: linting Python (make lint)" + make lint || { echo "✗ Python lint failed. Fix the reds above, then re-run make check." >&2; rc=1; } # `make lint` format-checks files in origin/base...HEAD, which at pre-commit time - # predates the staged change, so format-check the staged litellm files directly to + # predates the staged change, so format-check the scoped litellm files directly to # cover a brand-new commit before it lands. if [ -n "$fmt_files" ]; then - echo "pre-commit: ruff format --check (staged litellm files)" + echo "check: ruff format --check (scoped litellm files)" printf '%s\n' "$fmt_files" | xargs uv run --no-sync ruff format --check --exclude '/enterprise/' \ - || { echo "✗ Unformatted staged files. Fix with: make format, then re-stage." >&2; rc=1; } + || { echo "✗ Unformatted files in scope. Fix with: make format, then re-stage." >&2; rc=1; } fi return $rc } @@ -146,18 +194,18 @@ if [ -n "$litellm_py_files" ]; then fi if [ -n "$e2e_py_files" ] && [ -z "$litellm_py_files" ]; then - echo "pre-commit: type-checking tests/e2e (make lint-e2e-basedpyright)" - make lint-e2e-basedpyright || { echo "✗ tests/e2e basedpyright failed. Fix the errors above, then re-run make pre-commit." >&2; status=1; } + echo "check: type-checking tests/e2e (make lint-e2e-basedpyright)" + make lint-e2e-basedpyright || { echo "✗ tests/e2e basedpyright failed. Fix the errors above, then re-run make check." >&2; status=1; } fi if [ -n "$e2e_py_files" ]; then - echo "pre-commit: checking tests/e2e raw HTTP client ban (check_e2e_no_raw_requests)" + echo "check: checking tests/e2e raw HTTP client ban (check_e2e_no_raw_requests)" uv run --no-sync python tests/code_coverage_tests/check_e2e_no_raw_requests.py \ - || { echo "✗ Raw HTTP client import in tests/e2e. Route the call through tests/e2e/e2e_http.py, then re-run make pre-commit." >&2; status=1; } + || { echo "✗ Raw HTTP client import in tests/e2e. Route the call through tests/e2e/e2e_http.py, then re-run make check." >&2; status=1; } fi dashboard_checks() { - echo "pre-commit: linting dashboard (prettier + eslint + lint budgets)" + echo "check: linting dashboard (prettier + eslint + lint budgets)" if [ ! -d ui/litellm-dashboard/node_modules ]; then echo "✗ ui/litellm-dashboard/node_modules is missing; dashboard lint cannot run." >&2 bootstrap_hint @@ -176,7 +224,7 @@ fi genapi_checks() { local status=0 - echo "pre-commit: checking dashboard API types are in sync (npm run gen:api)" + echo "check: checking dashboard API types are in sync (npm run gen:api)" # gen-api-types.mjs imports litellm.proxy.proxy_server, which needs the proxy deps # and an up-to-date Prisma client; check-ui-api-types.yml installs those and runs # prisma generate before gen:api, so mirror that here or a stale client can mask @@ -194,7 +242,7 @@ genapi_checks() { status=1 elif ( cd ui/litellm-dashboard && LITELLM_PYTHON="uv run --no-sync python" npm run gen:api ); then if ! git diff --quiet -- ui/litellm-dashboard/src/lib/http/schema.d.ts; then - echo "✗ Dashboard API types are stale; regenerated src/lib/http/schema.d.ts. Stage it and commit; re-run make pre-commit only if other checks failed too." >&2 + echo "✗ Dashboard API types are stale; regenerated src/lib/http/schema.d.ts. Stage it and commit; re-run make check only if other checks failed too." >&2 status=1 fi else diff --git a/tests/e2e/CONTRIBUTING.md b/tests/e2e/CONTRIBUTING.md index 5999e5772d1..dc69bd42171 100644 --- a/tests/e2e/CONTRIBUTING.md +++ b/tests/e2e/CONTRIBUTING.md @@ -138,7 +138,7 @@ Mark live tests with `@pytest.mark.e2e` (on the class or the module). Pure cover Before you push -1. Run `make lint-e2e-basedpyright` (or `make pre-commit` with your changes staged); the harness is fully typed and the gate allows zero basedpyright errors, enforced in CI on any PR touching `tests/e2e/**/*.py` +1. Run `make lint-e2e-basedpyright` (or `make check` with your changes staged); the harness is fully typed and the gate allows zero basedpyright errors, enforced in CI on any PR touching `tests/e2e/**/*.py` 2. Add the models your test needs to the config your local proxy loads diff --git a/tests/test_litellm/test_pre_commit_lint.py b/tests/test_litellm/test_pre_commit_lint.py index 274d3c517f6..12b8d338b49 100644 --- a/tests/test_litellm/test_pre_commit_lint.py +++ b/tests/test_litellm/test_pre_commit_lint.py @@ -129,6 +129,90 @@ def _run(repo: Path, bin_dir: Path, extra_env: dict[str, str]) -> subprocess.Com ) +def _commit_all(repo: Path, message: str) -> None: + subprocess.run(["git", "add", "."], cwd=repo, check=True) + subprocess.run( + ["git", "-c", "user.email=t@t", "-c", "user.name=t", "commit", "-qm", message], + cwd=repo, + check=True, + ) + + +def _set_base_ref(repo: Path) -> None: + subprocess.run( + ["git", "update-ref", "refs/remotes/origin/litellm_internal_staging", "HEAD"], + cwd=repo, + check=True, + ) + + +def test_nothing_staged_scopes_to_working_tree_diff_and_runs_checks(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + (repo / "litellm" / "foo.py").write_text("x = 2\n") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "nothing staged; scoping to the working tree's diff" in proc.stdout + assert "litellm/foo.py" in proc.stdout + assert "linting Python" in proc.stdout + + +def test_nothing_staged_checks_committed_branch_changes(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + (repo / "litellm" / "foo.py").write_text("x = 2\n") + _commit_all(repo, "branch change") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "nothing staged; scoping to the working tree's diff" in proc.stdout + assert "linting Python" in proc.stdout + + +def test_nothing_staged_includes_untracked_files_in_scope(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + (repo / "litellm" / "brand_new.py").write_text("z = 3\n") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "litellm/brand_new.py" in proc.stdout + assert "linting Python" in proc.stdout + + +def test_nothing_staged_and_no_changes_is_an_explicit_no_op(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "nothing to check" in proc.stdout + assert "linting Python" not in proc.stdout + + +def test_nothing_staged_without_a_base_ref_fails_with_a_fetch_hint(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 1 + assert "cannot resolve the merge base" in proc.stdout + assert "git fetch origin litellm_internal_staging" in proc.stdout + + +def test_partial_staging_warns_which_checks_were_skipped(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + (repo / "notes.md").write_text("hi\n") + subprocess.run(["git", "add", "notes.md"], cwd=repo, check=True) + (repo / "litellm" / "foo.py").write_text("x = 4\n") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "SKIPPED Python lint (make lint)" in proc.stdout + assert "litellm/foo.py" in proc.stdout + assert "linting Python" not in proc.stdout + + def test_python_dashboard_and_gen_api_blocks_run_concurrently_with_grouped_output(tmp_path: Path) -> None: repo, bin_dir = _sandbox(tmp_path) barrier_dir = tmp_path / "barrier" @@ -159,8 +243,8 @@ def test_full_output_is_saved_to_a_log_file_in_the_git_dir(tmp_path: Path) -> No assert "linting dashboard" in log assert "API types" in log assert "unstaged/untracked changes" in log - assert f"pre-commit: full log: {log_file}" in proc.stdout - assert "pre-commit: full log:" not in log + assert f"check: full log: {log_file}" in proc.stdout + assert "check: full log:" not in log def test_unwritable_log_warns_and_falls_back_to_running_without_one(tmp_path: Path) -> None: @@ -170,7 +254,7 @@ def test_unwritable_log_warns_and_falls_back_to_running_without_one(tmp_path: Pa assert proc.returncode == 0, proc.stdout + proc.stderr assert "linting Python" in proc.stdout assert "output will not be saved" in proc.stderr - assert "pre-commit: full log:" not in proc.stdout + assert "check: full log:" not in proc.stdout failing = _run(repo, bin_dir, {"STUB_FAIL": "make-lint"}) assert failing.returncode == 1 From 20eb7bb43718958bfac0e06225ead0b5ddb1d5b7 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 08:14:29 -0700 Subject: [PATCH 039/279] chore(typing): clear 1.4k basedpyright Any errors across 21 hotspot files Typing-only pass over the 21 files with the highest reportAny and reportExplicitAny density among self-contained modules: management endpoints, guardrails, streaming internals, response transformations, MCP server, enterprise managed files, and vector store management. Whole-tree basedpyright drops from 148,648 to 146,984 errors (-1,664), with reportAny -1,111 and reportExplicitAny -296. No rule increased repo-wide and no file regressed on any rule. No cast(), type: ignore, noqa, suppression comments, or new Any annotations anywhere in the diff, and no runtime behavior changes. Budgets ratcheted by make lint-budget-update: basedpyright -1,663 across 48 rules, ruff-strict -86, type-discipline -110. --- basedpyright-code-budget.json | 28 +- .../proxy/hooks/managed_files.py | 524 +++++++----------- .../pydantic_ai_agents/transformation.py | 265 +++++---- .../websearch_interception/handler.py | 12 +- .../litellm_core_utils/realtime_streaming.py | 55 +- .../streaming_chunk_builder_utils.py | 97 +++- .../adapters/handler.py | 84 +-- litellm/llms/azure/assistants.py | 36 +- .../mcp_server/rest_endpoints.py | 2 +- .../proxy/_experimental/mcp_server/server.py | 91 +-- .../proxy/guardrails/guardrail_endpoints.py | 173 ++++-- .../cisco_ai_defense/cisco_ai_defense.py | 100 ++-- .../unified_guardrail/unified_guardrail.py | 136 +++-- litellm/proxy/hooks/litellm_skills/main.py | 60 +- .../key_management_endpoints.py | 77 +-- .../model_management_endpoints.py | 160 ++++-- .../management_endpoints/team_endpoints.py | 224 +++++--- litellm/proxy/management_endpoints/ui_sso.py | 187 +++++-- .../proxy_setting_endpoints.py | 123 +++- .../management_endpoints.py | 72 ++- .../transformation.py | 184 +++--- litellm/responses/streaming_iterator.py | 51 +- ruff-strict-budget.json | 10 +- type-discipline-budget.json | 8 +- 24 files changed, 1644 insertions(+), 1115 deletions(-) diff --git a/basedpyright-code-budget.json b/basedpyright-code-budget.json index 32b8eb3d4d0..0385f7a96e7 100644 --- a/basedpyright-code-budget.json +++ b/basedpyright-code-budget.json @@ -1,9 +1,9 @@ { "reportAny": { - "limit": 28842 + "limit": 27731 }, "reportArgumentType": { - "limit": 2634 + "limit": 2626 }, "reportAssignmentType": { "limit": 329 @@ -12,7 +12,7 @@ "limit": 514 }, "reportCallIssue": { - "limit": 117 + "limit": 116 }, "reportConstantRedefinition": { "limit": 40 @@ -24,7 +24,7 @@ "limit": 19 }, "reportExplicitAny": { - "limit": 9103 + "limit": 8807 }, "reportFunctionMemberAccess": { "limit": 7 @@ -54,10 +54,10 @@ "limit": 0 }, "reportMissingParameterType": { - "limit": 5843 + "limit": 5835 }, "reportMissingTypeArgument": { - "limit": 15816 + "limit": 15790 }, "reportMissingTypeStubs": { "limit": 40 @@ -72,7 +72,7 @@ "limit": 0 }, "reportOptionalMemberAccess": { - "limit": 1078 + "limit": 1077 }, "reportOptionalOperand": { "limit": 0 @@ -90,28 +90,28 @@ "limit": 8 }, "reportReturnType": { - "limit": 218 + "limit": 217 }, "reportTypedDictNotRequiredAccess": { - "limit": 27 + "limit": 26 }, "reportUndefinedVariable": { "limit": 0 }, "reportUnknownArgumentType": { - "limit": 45098 + "limit": 45063 }, "reportUnknownLambdaType": { "limit": 113 }, "reportUnknownMemberType": { - "limit": 39826 + "limit": 39773 }, "reportUnknownParameterType": { - "limit": 20237 + "limit": 20207 }, "reportUnknownVariableType": { - "limit": 31371 + "limit": 31281 }, "reportUnnecessaryCast": { "limit": 122 @@ -123,7 +123,7 @@ "limit": 5 }, "reportUnnecessaryIsInstance": { - "limit": 864 + "limit": 862 }, "reportUntypedBaseClass": { "limit": 0 diff --git a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py index d8318962633..f0914240f79 100644 --- a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py +++ b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py @@ -3,9 +3,21 @@ import base64 import json -from collections.abc import Mapping +from collections.abc import Mapping, Sequence from types import MappingProxyType -from typing import TYPE_CHECKING, Any, Dict, Final, List, Literal, Optional, Union, cast +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Final, + List, + Literal, + Optional, + Protocol, + TypedDict, + Union, + cast, +) from uuid import NAMESPACE_URL, uuid5 from fastapi import HTTPException @@ -98,33 +110,76 @@ def _parse_managed_batch_row(row: "PrismaManagedObjectRow") -> Optional[LiteLLMB try: batch_obj: Final = LiteLLMBatch.model_validate(_decode_json_blob(row.file_object)) except Exception as e: - verbose_logger.warning( - f"Failed to parse batch object {row.unified_object_id}: {_sanitized_parse_error(e)}" - ) + verbose_logger.warning(f"Failed to parse batch object {row.unified_object_id}: {_sanitized_parse_error(e)}") return None batch_obj.id = row.unified_object_id return batch_obj -def _parse_managed_file_object( - raw_file_object: object, unified_file_id: str -) -> Optional[OpenAIFileObject]: +def _parse_managed_file_object(raw_file_object: object, unified_file_id: str) -> Optional[OpenAIFileObject]: if raw_file_object is None: return None try: return OpenAIFileObject.model_validate(raw_file_object) except Exception as e: - verbose_logger.warning( - f"Failed to parse managed file object {unified_file_id}: {_sanitized_parse_error(e)}" - ) + verbose_logger.warning(f"Failed to parse managed file object {unified_file_id}: {_sanitized_parse_error(e)}") return None +class _ManagedFileRow(Protocol): + unified_file_id: str + file_object: OpenAIFileObject + storage_backend: Optional[str] + storage_url: Optional[str] + created_by: Optional[str] + team_id: Optional[str] + + def model_dump(self) -> Mapping[str, object]: ... + + +class _ManagedFileTableActions(Protocol): + async def find_first(self, where: Mapping[str, object]) -> Optional[_ManagedFileRow]: ... + + async def find_many(self, where: Mapping[str, object]) -> Sequence[_ManagedFileRow]: ... + + async def upsert(self, where: Mapping[str, str], data: Mapping[str, Mapping[str, object]]) -> _ManagedFileRow: ... + + async def delete(self, where: Mapping[str, str]) -> Optional[_ManagedFileRow]: ... + + +class _ManagedObjectTableActions(Protocol): + async def find_first(self, where: Mapping[str, object]) -> "Optional[PrismaManagedObjectRow]": ... + + async def find_many( + self, + where: Mapping[str, object], + take: int, + order: Union[Mapping[str, str], Sequence[Mapping[str, str]]], + cursor: Mapping[str, str] = ..., + skip: int = ..., + ) -> "Sequence[PrismaManagedObjectRow]": ... + + async def upsert( + self, where: Mapping[str, str], data: Mapping[str, Mapping[str, object]] + ) -> "PrismaManagedObjectRow": ... + + +class _CursorPageArgs(TypedDict, total=False): + cursor: Mapping[str, str] + skip: int + + +def _managed_file_table(prisma_client: PrismaClient) -> _ManagedFileTableActions: + return prisma_client.db.litellm_managedfiletable + + +def _managed_object_table(prisma_client: PrismaClient) -> _ManagedObjectTableActions: + return prisma_client.db.litellm_managedobjecttable + + class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Class variables or attributes - def __init__( - self, internal_usage_cache: InternalUsageCache, prisma_client: PrismaClient - ): + def __init__(self, internal_usage_cache: InternalUsageCache, prisma_client: PrismaClient): self.internal_usage_cache = internal_usage_cache self.prisma_client = prisma_client @@ -143,9 +198,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): model_mappings: Dict[str, str], user_api_key_dict: UserAPIKeyAuth, ) -> None: - verbose_logger.info( - f"Storing LiteLLM Managed File object with id={file_id} in cache" - ) + verbose_logger.info(f"Storing LiteLLM Managed File object with id={file_id} in cache") if file_object is not None: litellm_managed_file_object = LiteLLM_ManagedFileTable( unified_file_id=file_id, @@ -196,13 +249,11 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): f"storage_url={db_data.get('storage_url')}" ) - result = await self.prisma_client.db.litellm_managedfiletable.upsert( + result = await _managed_file_table(self.prisma_client).upsert( where={"unified_file_id": file_id}, data={"create": db_data, "update": update_data}, ) - verbose_logger.debug( - f"LiteLLM Managed File object with id={file_id} stored in db: {result}" - ) + verbose_logger.debug(f"LiteLLM Managed File object with id={file_id} stored in db: {result}") async def store_unified_object_id( self, @@ -213,9 +264,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_purpose: Literal["batch", "fine-tune", "response"], user_api_key_dict: UserAPIKeyAuth, ) -> None: - verbose_logger.info( - f"Storing LiteLLM Managed {file_purpose} object with id={unified_object_id} in cache" - ) + verbose_logger.info(f"Storing LiteLLM Managed {file_purpose} object with id={unified_object_id} in cache") litellm_managed_object = LiteLLM_ManagedObjectTable( unified_object_id=unified_object_id, model_object_id=model_object_id, @@ -228,7 +277,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): litellm_parent_otel_span=litellm_parent_otel_span, ) - await self.prisma_client.db.litellm_managedobjecttable.upsert( + await _managed_object_table(self.prisma_client).upsert( where={"unified_object_id": unified_object_id}, data={ "create": { @@ -265,9 +314,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return LiteLLM_ManagedFileTable.model_validate(result) ## CHECK DB - db_object = await self.prisma_client.db.litellm_managedfiletable.find_first( - where={"unified_file_id": file_id} - ) + db_object = await _managed_file_table(self.prisma_client).find_first(where={"unified_file_id": file_id}) if db_object: return LiteLLM_ManagedFileTable.model_validate(db_object.model_dump()) @@ -277,9 +324,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): self, file_id: str, litellm_parent_otel_span: Optional[Span] = None ) -> OpenAIFileObject: ## get old value - initial_value = await self.prisma_client.db.litellm_managedfiletable.find_first( - where={"unified_file_id": file_id} - ) + initial_value = await _managed_file_table(self.prisma_client).find_first(where={"unified_file_id": file_id}) if initial_value is None: raise Exception(f"LiteLLM Managed File object with id={file_id} not found") ## delete old value @@ -288,15 +333,11 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): value=None, litellm_parent_otel_span=litellm_parent_otel_span, ) - await self.prisma_client.db.litellm_managedfiletable.delete( - where={"unified_file_id": file_id} - ) + await _managed_file_table(self.prisma_client).delete(where={"unified_file_id": file_id}) return initial_value.file_object - async def can_user_call_unified_file_id( - self, unified_file_id: str, user_api_key_dict: UserAPIKeyAuth - ) -> bool: - managed_file = await self.prisma_client.db.litellm_managedfiletable.find_first( + async def can_user_call_unified_file_id(self, unified_file_id: str, user_api_key_dict: UserAPIKeyAuth) -> bool: + managed_file = await _managed_file_table(self.prisma_client).find_first( where={"unified_file_id": unified_file_id} ) @@ -311,13 +352,9 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): detail=f"File not found: {unified_file_id}", ) - async def can_user_call_unified_object_id( - self, unified_object_id: str, user_api_key_dict: UserAPIKeyAuth - ) -> bool: - managed_object = ( - await self.prisma_client.db.litellm_managedobjecttable.find_first( - where={"unified_object_id": unified_object_id} - ) + async def can_user_call_unified_object_id(self, unified_object_id: str, user_api_key_dict: UserAPIKeyAuth) -> bool: + managed_object = await _managed_object_table(self.prisma_client).find_first( + where={"unified_object_id": unified_object_id} ) if managed_object: @@ -339,34 +376,28 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): provider: Optional[str] = None, target_model_names: Optional[str] = None, llm_router: Optional[Router] = None, - ) -> Dict[str, Any]: + ) -> Dict[str, object]: # Provider filtering is not supported for managed batches # This is because the encoded object ids stored in the managed objects table do not contain the provider information # To support provider filtering, we would need to store the provider information in the encoded object ids if provider: - raise Exception( - "Filtering by 'provider' is not supported when using managed batches." - ) + raise Exception("Filtering by 'provider' is not supported when using managed batches.") # Model name filtering is not supported for managed batches # This is because the encoded object ids stored in the managed objects table do not contain the model name # A hash of the model name + litellm_params for the model name is encoded as the model id. This is not sufficient to reliably map the target model names to the model ids. if target_model_names: - raise Exception( - "Filtering by 'target_model_names' is not supported when using managed batches." - ) + raise Exception("Filtering by 'target_model_names' is not supported when using managed batches.") owner_filter = build_owner_filter(user_api_key_dict) if owner_filter is None: return build_list_page([]) - where_clause: Dict[str, Any] = {"file_purpose": "batch", **owner_filter} + where_clause: Dict[str, object] = {"file_purpose": "batch", **owner_filter} if after: - cursor_row = ( - await self.prisma_client.db.litellm_managedobjecttable.find_first( - where={**where_clause, "unified_object_id": after} - ) + cursor_row = await _managed_object_table(self.prisma_client).find_first( + where={**where_clause, "unified_object_id": after} ) if cursor_row is None: raise HTTPException( @@ -375,11 +406,9 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ) page_size: Final = min(limit or 20, 100) - cursor_args: Dict[str, Any] = ( - {"cursor": {"unified_object_id": after}, "skip": 1} if after else {} - ) + cursor_args: _CursorPageArgs = {"cursor": {"unified_object_id": after}, "skip": 1} if after else {} - batches = await self.prisma_client.db.litellm_managedobjecttable.find_many( + batches = await _managed_object_table(self.prisma_client).find_many( where=where_clause, take=page_size + 1, order=[{"created_at": "desc"}, {"unified_object_id": "desc"}], @@ -389,9 +418,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): has_more = len(batches) > page_size parsed_rows: Final = tuple( - (row, batch_obj) - for row in batches[:page_size] - if (batch_obj := _parse_managed_batch_row(row)) is not None + (row, batch_obj) for row in batches[:page_size] if (batch_obj := _parse_managed_batch_row(row)) is not None ) unified_id_by_raw_id: Final = await map_raw_file_ids_to_unified( raw_file_ids=frozenset( @@ -432,14 +459,10 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): verbose_proxy_logger=verbose_logger, user_api_key_dict=user_api_key_dict, db_batch_object=row, - unified_batch_id=_is_base64_encoded_unified_file_id( - row.unified_object_id - ), + unified_batch_id=_is_base64_encoded_unified_file_id(row.unified_object_id), ) except Exception as e: - verbose_logger.warning( - f"Failed to resolve managed file ids for batch {row.unified_object_id}: {e}" - ) + verbose_logger.warning(f"Failed to resolve managed file ids for batch {row.unified_object_id}: {e}") return None return batch_obj @@ -458,7 +481,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): if owner_filter is None: return [] - file_ids = await self.prisma_client.db.litellm_managedfiletable.find_many( + file_ids = await _managed_file_table(self.prisma_client).find_many( where={ **owner_filter, "flat_model_file_ids": {"hasSome": model_object_ids}, @@ -467,27 +490,14 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return [ parsed_file_object.model_copy(update={"id": row.unified_file_id}) for row in file_ids - if ( - parsed_file_object := _parse_managed_file_object( - row.file_object, row.unified_file_id - ) - ) - is not None + if (parsed_file_object := _parse_managed_file_object(row.file_object, row.unified_file_id)) is not None ] - async def check_managed_file_id_access( - self, data: Dict, user_api_key_dict: UserAPIKeyAuth - ) -> bool: + async def check_managed_file_id_access(self, data: Dict, user_api_key_dict: UserAPIKeyAuth) -> bool: retrieve_file_id = cast(Optional[str], data.get("file_id")) - potential_file_id = ( - _is_base64_encoded_unified_file_id(retrieve_file_id) - if retrieve_file_id - else False - ) + potential_file_id = _is_base64_encoded_unified_file_id(retrieve_file_id) if retrieve_file_id else False if potential_file_id and retrieve_file_id: - if await self.can_user_call_unified_file_id( - retrieve_file_id, user_api_key_dict - ): + if await self.can_user_call_unified_file_id(retrieve_file_id, user_api_key_dict): return True else: raise HTTPException( @@ -496,9 +506,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ) return False - async def check_file_ids_access( - self, file_ids: List[str], user_api_key_dict: UserAPIKeyAuth - ) -> None: + async def check_file_ids_access(self, file_ids: List[str], user_api_key_dict: UserAPIKeyAuth) -> None: """ Check if the user has access to a list of file IDs. Only checks managed (unified) file IDs. @@ -513,9 +521,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): for file_id in file_ids: is_unified_file_id = _is_base64_encoded_unified_file_id(file_id) if is_unified_file_id: - if not await self.can_user_call_unified_file_id( - file_id, user_api_key_dict - ): + if not await self.can_user_call_unified_file_id(file_id, user_api_key_dict): raise HTTPException( status_code=403, detail=f"User {user_api_key_dict.user_id} does not have access to the file {file_id}", @@ -543,10 +549,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ### HANDLE TRANSFORMATIONS ### # Check both completion and acompletion call types - is_completion_call = ( - call_type == CallTypes.completion.value - or call_type == CallTypes.acompletion.value - ) + is_completion_call = call_type == CallTypes.completion.value or call_type == CallTypes.acompletion.value if is_completion_call: messages = data.get("messages") @@ -559,9 +562,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Check if any files are stored in storage backends and need base64 conversion # This is needed for Vertex AI/Gemini which requires base64 content - is_vertex_ai = model and ( - "vertex_ai" in model or "gemini" in model.lower() - ) + is_vertex_ai = model and ("vertex_ai" in model or "gemini" in model.lower()) if is_vertex_ai: await self._convert_storage_files_to_base64( messages=messages, @@ -573,10 +574,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_ids, user_api_key_dict.parent_otel_span ) data["model_file_id_mapping"] = model_file_id_mapping - elif ( - call_type == CallTypes.aresponses.value - or call_type == CallTypes.responses.value - ): + elif call_type == CallTypes.aresponses.value or call_type == CallTypes.responses.value: # Handle managed files in responses API input and tools file_ids = [] @@ -603,23 +601,15 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): if tools: unified_vs_ids = self.get_vector_store_ids_from_file_search_tools(tools) if unified_vs_ids: - await self.check_vector_store_ids_access( - unified_vs_ids, user_api_key_dict - ) + await self.check_vector_store_ids_access(unified_vs_ids, user_api_key_dict) elif call_type == CallTypes.afile_content.value: retrieve_file_id = cast(Optional[str], data.get("file_id")) - potential_file_id = ( - _is_base64_encoded_unified_file_id(retrieve_file_id) - if retrieve_file_id - else False - ) + potential_file_id = _is_base64_encoded_unified_file_id(retrieve_file_id) if retrieve_file_id else False if potential_file_id and "llm_output_file_id," in potential_file_id: model_id = self.get_model_id_from_unified_file_id(potential_file_id) if model_id: data["model"] = model_id - data["file_id"] = self.get_output_file_id_from_unified_file_id( - potential_file_id - ) + data["file_id"] = self.get_output_file_id_from_unified_file_id(potential_file_id) elif call_type == CallTypes.acreate_batch.value: input_file_id = cast(Optional[str], data.get("input_file_id")) if input_file_id: @@ -636,10 +626,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ): accessor_key: Optional[str] = None retrieve_object_id: Optional[str] = None - if ( - call_type == CallTypes.aretrieve_batch.value - or call_type == CallTypes.acancel_batch.value - ): + if call_type == CallTypes.aretrieve_batch.value or call_type == CallTypes.acancel_batch.value: accessor_key = "batch_id" elif ( call_type == CallTypes.acancel_fine_tuning_job.value @@ -651,32 +638,24 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): retrieve_object_id = cast(Optional[str], data.get(accessor_key)) potential_llm_object_id = ( - _is_base64_encoded_unified_file_id(retrieve_object_id) - if retrieve_object_id - else False + _is_base64_encoded_unified_file_id(retrieve_object_id) if retrieve_object_id else False ) if potential_llm_object_id and retrieve_object_id: ## VALIDATE USER HAS ACCESS TO THE OBJECT ## - if not await self.can_user_call_unified_object_id( - retrieve_object_id, user_api_key_dict - ): + if not await self.can_user_call_unified_object_id(retrieve_object_id, user_api_key_dict): raise HTTPException( status_code=403, detail=f"User {user_api_key_dict.user_id} does not have access to the object {retrieve_object_id}", ) ## for managed batch id - get the model id - potential_model_id = get_model_id_from_unified_batch_id( - potential_llm_object_id - ) + potential_model_id = get_model_id_from_unified_batch_id(potential_llm_object_id) if potential_model_id is None: raise Exception( f"LiteLLM Managed {accessor_key} with id={retrieve_object_id} is invalid - does not contain encoded model_id." ) data["model"] = potential_model_id - data[accessor_key] = get_batch_id_from_unified_batch_id( - potential_llm_object_id - ) + data[accessor_key] = get_batch_id_from_unified_batch_id(potential_llm_object_id) elif call_type == CallTypes.acreate_fine_tuning_job.value: input_file_id = cast(Optional[str], data.get("training_file")) if input_file_id: @@ -732,24 +711,18 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): if accessor_key: input_file_id = cast(Optional[str], kwargs.get(accessor_key)) - model_file_id_mapping = cast( - Optional[Dict[str, Dict[str, str]]], kwargs.get("model_file_id_mapping") - ) + model_file_id_mapping = cast(Optional[Dict[str, Dict[str, str]]], kwargs.get("model_file_id_mapping")) # model_info may be at top-level or nested under litellm_metadata # (batch/file operations use litellm_metadata) model_id = cast(Optional[str], kwargs.get("model_info", {}).get("id", None)) if model_id is None: model_id = cast( Optional[str], - kwargs.get("litellm_metadata", {}) - .get("model_info", {}) - .get("id", None), + kwargs.get("litellm_metadata", {}).get("model_info", {}).get("id", None), ) mapped_file_id: Optional[str] = None if input_file_id and model_file_id_mapping and model_id: - mapped_file_id = model_file_id_mapping.get(input_file_id, {}).get( - model_id, None - ) + mapped_file_id = model_file_id_mapping.get(input_file_id, {}).get(model_id, None) if mapped_file_id: kwargs[accessor_key] = mapped_file_id @@ -775,9 +748,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_ids.append(file_id) return file_ids - def get_file_ids_from_responses_input( - self, input: Union[str, List[Dict[str, Any]]] - ) -> List[str]: + def get_file_ids_from_responses_input(self, input: Union[str, List[Dict[str, Any]]]) -> List[str]: """ Gets file ids from responses API input. @@ -809,19 +780,14 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): content = item.get("content") if isinstance(content, list): for content_item in content: - if ( - isinstance(content_item, dict) - and content_item.get("type") == "input_file" - ): + if isinstance(content_item, dict) and content_item.get("type") == "input_file": file_id = content_item.get("file_id") if file_id: file_ids.append(file_id) return file_ids - def get_file_ids_from_responses_tools( - self, tools: List[Dict[str, Any]] - ) -> List[str]: + def get_file_ids_from_responses_tools(self, tools: List[Dict[str, object]]) -> List[str]: """ Gets file ids from responses API tools parameter. @@ -854,9 +820,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return file_ids - def get_vector_store_ids_from_file_search_tools( - self, tools: List[Dict[str, Any]] - ) -> List[str]: + def get_vector_store_ids_from_file_search_tools(self, tools: List[Dict[str, object]]) -> List[str]: """ Extract unified vector_store_ids from file_search tools. @@ -949,9 +913,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ), ) - async def get_model_file_id_mapping( - self, file_ids: List[str], litellm_parent_otel_span: Span - ) -> dict: + async def get_model_file_id_mapping(self, file_ids: List[str], litellm_parent_otel_span: Span) -> dict: """ Get model-specific file IDs for a list of proxy file IDs. Returns a dictionary mapping litellm_proxy/ file_id -> model_id -> model_file_id @@ -981,9 +943,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Get all cache keys matching the pattern file_id:* for file_id in litellm_managed_file_ids: # Search for any cache key starting with this file_id - unified_file_object = await self.get_unified_file_id( - file_id, litellm_parent_otel_span - ) + unified_file_object = await self.get_unified_file_id(file_id, litellm_parent_otel_span) if unified_file_object: file_id_mapping[file_id] = unified_file_object.model_mappings @@ -1001,9 +961,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): raise Exception("LLM Router not initialized. Ensure models added to proxy.") responses = [] for model in target_model_names_list: - individual_response = await llm_router.acreate_file( - model=model, **_create_file_request - ) + individual_response = await llm_router.acreate_file(model=model, **_create_file_request) responses.append(individual_response) return responses @@ -1034,9 +992,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): model_mappings: Dict[str, str] = {} for file_object in responses: - model_file_id_mapping = file_object._hidden_params.get( - "model_file_id_mapping" - ) + model_file_id_mapping = file_object._hidden_params.get("model_file_id_mapping") if model_file_id_mapping and isinstance(model_file_id_mapping, dict): model_mappings.update(model_file_id_mapping) @@ -1051,17 +1007,10 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Emit Prometheus metrics for managed file creation prom_logger = self._get_prometheus_logger() if prom_logger: - first_model = ( - target_model_names_list[0] if target_model_names_list else None - ) + first_model = target_model_names_list[0] if target_model_names_list else None first_provider = "" if responses: - first_provider = ( - getattr(responses[0], "_hidden_params", {}).get( - "custom_llm_provider" - ) - or "" - ) + first_provider = getattr(responses[0], "_hidden_params", {}).get("custom_llm_provider") or "" prom_logger.record_managed_file_created( model=first_model or "", api_provider=first_provider, @@ -1104,9 +1053,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ) # Convert to URL-safe base64 and strip padding - base64_unified_file_id = ( - base64.urlsafe_b64encode(unified_file_id.encode()).decode().rstrip("=") - ) + base64_unified_file_id = base64.urlsafe_b64encode(unified_file_id.encode()).decode().rstrip("=") ## CREATE RESPONSE OBJECT @@ -1123,46 +1070,26 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return response - def get_unified_generic_response_id( - self, model_id: str, generic_response_id: str - ) -> str: - unified_generic_response_id = ( - SpecialEnums.LITELLM_MANAGED_GENERIC_RESPONSE_COMPLETE_STR.value.format( - model_id, generic_response_id - ) - ) - return ( - base64.urlsafe_b64encode(unified_generic_response_id.encode()) - .decode() - .rstrip("=") + def get_unified_generic_response_id(self, model_id: str, generic_response_id: str) -> str: + unified_generic_response_id = SpecialEnums.LITELLM_MANAGED_GENERIC_RESPONSE_COMPLETE_STR.value.format( + model_id, generic_response_id ) + return base64.urlsafe_b64encode(unified_generic_response_id.encode()).decode().rstrip("=") def get_unified_batch_id(self, batch_id: str, model_id: str) -> str: - unified_batch_id = SpecialEnums.LITELLM_MANAGED_BATCH_COMPLETE_STR.value.format( - model_id, batch_id - ) + unified_batch_id = SpecialEnums.LITELLM_MANAGED_BATCH_COMPLETE_STR.value.format(model_id, batch_id) return base64.urlsafe_b64encode(unified_batch_id.encode()).decode().rstrip("=") - def get_unified_output_file_id( - self, output_file_id: str, model_id: str, model_name: Optional[str] - ) -> str: - deterministic_uuid: Final = uuid5( - uuid5(NAMESPACE_URL, model_id), output_file_id - ) - unified_output_file_id = ( - SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( - "application/json", - str(deterministic_uuid), - model_name or "", - output_file_id, - model_id, - ) - ) - return ( - base64.urlsafe_b64encode(unified_output_file_id.encode()) - .decode() - .rstrip("=") + def get_unified_output_file_id(self, output_file_id: str, model_id: str, model_name: Optional[str]) -> str: + deterministic_uuid: Final = uuid5(uuid5(NAMESPACE_URL, model_id), output_file_id) + unified_output_file_id = SpecialEnums.LITELLM_MANAGED_FILE_COMPLETE_STR.value.format( + "application/json", + str(deterministic_uuid), + model_name or "", + output_file_id, + model_id, ) + return base64.urlsafe_b64encode(unified_output_file_id.encode()).decode().rstrip("=") def get_model_id_from_unified_file_id(self, file_id: str) -> str: return file_id.split("llm_output_file_model_id,")[1].split(";")[0] @@ -1170,59 +1097,39 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): def get_output_file_id_from_unified_file_id(self, file_id: str) -> str: marker = "llm_output_file_id," if marker not in file_id: - raise ValueError( - f"Unified id does not contain {marker!r}: {file_id[:80]!r}" - ) + raise ValueError(f"Unified id does not contain {marker!r}: {file_id[:80]!r}") return file_id.split(marker, 1)[1].split(";")[0] async def async_post_call_success_hook( self, data: Dict, user_api_key_dict: UserAPIKeyAuth, response: LLMResponseTypes - ) -> Any: + ) -> LLMResponseTypes: if isinstance(response, LiteLLMBatch): ## Check if unified_file_id is in the response - unified_file_id = response._hidden_params.get( - "unified_file_id" - ) # managed file id - unified_batch_id = response._hidden_params.get( - "unified_batch_id" - ) # managed batch id + unified_file_id = response._hidden_params.get("unified_file_id") # managed file id + unified_batch_id = response._hidden_params.get("unified_batch_id") # managed batch id model_id = cast(Optional[str], response._hidden_params.get("model_id")) model_name = cast(Optional[str], response._hidden_params.get("model_name")) resolved_model_name = resolve_managed_output_file_model_name( - unified_input_file_id=unified_file_id - if isinstance(unified_file_id, str) - else response.input_file_id, + unified_input_file_id=unified_file_id if isinstance(unified_file_id, str) else response.input_file_id, fallback_model_name=model_name, ) original_response_id = response.id if (unified_batch_id or unified_file_id) and model_id: - response.id = self.get_unified_batch_id( - batch_id=response.id, model_id=model_id - ) + response.id = self.get_unified_batch_id(batch_id=response.id, model_id=model_id) # Handle both output_file_id and error_file_id for file_attr in ["output_file_id", "error_file_id"]: file_id_value = getattr(response, file_attr, None) if file_id_value and model_id: - decoded_output_file_id = _is_base64_encoded_unified_file_id( - file_id_value - ) - if ( - decoded_output_file_id - and "llm_output_file_id," in decoded_output_file_id - ): - provider_file_id = ( - self.get_output_file_id_from_unified_file_id( - decoded_output_file_id - ) - ) + decoded_output_file_id = _is_base64_encoded_unified_file_id(file_id_value) + if decoded_output_file_id and "llm_output_file_id," in decoded_output_file_id: + provider_file_id = self.get_output_file_id_from_unified_file_id(decoded_output_file_id) unified_file_id = file_id_value elif decoded_output_file_id: verbose_logger.warning( - f"Skipping {file_attr}={file_id_value!r}: " - "unified id is not a managed file output id" + f"Skipping {file_attr}={file_id_value!r}: unified id is not a managed file output id" ) continue else: @@ -1241,23 +1148,18 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Import module and use getattr for better testability with mocks import litellm.proxy.proxy_server as proxy_server_module - _llm_router = getattr( - proxy_server_module, "llm_router", None - ) + _llm_router = getattr(proxy_server_module, "llm_router", None) if _llm_router is not None and model_id: - _creds = ( - _llm_router.get_deployment_credentials_with_provider( - model_id - ) - or {} - ) + _creds = _llm_router.get_deployment_credentials_with_provider(model_id) or {} file_object = await litellm.afile_retrieve( file_id=provider_file_id, **_creds, ) else: file_object = await litellm.afile_retrieve( - custom_llm_provider=model_name.split("/")[0] if model_name and "/" in model_name else "openai", # type: ignore[arg-type] + custom_llm_provider=model_name.split("/")[0] + if model_name and "/" in model_name + else "openai", # type: ignore[arg-type] file_id=provider_file_id, ) verbose_logger.debug( @@ -1311,9 +1213,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): elif isinstance(response, LiteLLMFineTuningJob): ## Check if unified_file_id is in the response - unified_file_id = response._hidden_params.get( - "unified_file_id" - ) # managed file id + unified_file_id = response._hidden_params.get("unified_file_id") # managed file id unified_finetuning_job_id = response._hidden_params.get( "unified_finetuning_job_id" ) # managed finetuning job id @@ -1321,9 +1221,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): model_name = cast(Optional[str], response._hidden_params.get("model_name")) original_response_id = response.id if (unified_file_id or unified_finetuning_job_id) and model_id: - response.id = self.get_unified_generic_response_id( - model_id=model_id, generic_response_id=response.id - ) + response.id = self.get_unified_generic_response_id(model_id=model_id, generic_response_id=response.id) await self.store_unified_object_id( unified_object_id=response.id, file_object=response, @@ -1338,9 +1236,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): """ ## check if file object if hasattr(response, "data") and isinstance(response.data, list): - if all( - isinstance(file_object, FileObject) for file_object in response.data - ): + if all(isinstance(file_object, FileObject) for file_object in response.data): ## Get all file id's ## Check which file id's were created by the user ## Filter the response to only include the files created by the user @@ -1349,9 +1245,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_object.id for file_object in cast(List[FileObject], response.data) # type: ignore ] - user_created_file_ids = await self.get_user_created_file_ids( - user_api_key_dict, file_ids - ) + user_created_file_ids = await self.get_user_created_file_ids(user_api_key_dict, file_ids) ## Filter the response to only include the files created by the user response.data = user_created_file_ids # type: ignore return response @@ -1359,11 +1253,9 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return response async def afile_retrieve( - self, file_id: str, litellm_parent_otel_span: Optional[Span], llm_router=None + self, file_id: str, litellm_parent_otel_span: Optional[Span], llm_router: Optional[Router] = None ) -> OpenAIFileObject: - stored_file_object = await self.get_unified_file_id( - file_id, litellm_parent_otel_span - ) + stored_file_object = await self.get_unified_file_id(file_id, litellm_parent_otel_span) # Case 1 : This is not a managed file if not stored_file_object: @@ -1386,21 +1278,13 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): ) try: - model_id, model_file_id = next( - iter(stored_file_object.model_mappings.items()) - ) - credentials = ( - llm_router.get_deployment_credentials_with_provider(model_id) or {} - ) - response = await litellm.afile_retrieve( - file_id=model_file_id, **credentials - ) + model_id, model_file_id = next(iter(stored_file_object.model_mappings.items())) + credentials = llm_router.get_deployment_credentials_with_provider(model_id) or {} + response = await litellm.afile_retrieve(file_id=model_file_id, **credentials) response.id = file_id # Replace with unified ID return response except Exception as e: - raise Exception( - f"Failed to retrieve file {file_id} from provider: {str(e)}" - ) from e + raise Exception(f"Failed to retrieve file {file_id} from provider: {str(e)}") from e async def afile_list( self, @@ -1437,12 +1321,10 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): return False except Exception as e: - verbose_logger.warning( - f"Error checking batch polling configuration: {e}. Assuming disabled." - ) + verbose_logger.warning(f"Error checking batch polling configuration: {e}. Assuming disabled.") return False - async def _get_batches_referencing_file(self, file_id: str) -> List[Dict[str, Any]]: + async def _get_batches_referencing_file(self, file_id: str) -> List[Dict[str, object]]: """ Find batches that reference this file and still need cost tracking. Find batches that are in non-terminal state and have not yet been processed by CheckBatchCost. @@ -1458,9 +1340,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Get model-specific file IDs for this unified file ID if it's a managed file try: - model_file_id_mapping = await self.get_model_file_id_mapping( - [file_id], litellm_parent_otel_span=None - ) + model_file_id_mapping = await self.get_model_file_id_mapping([file_id], litellm_parent_otel_span=None) if model_file_id_mapping and file_id in model_file_id_mapping: # Add all provider file IDs for this unified file @@ -1468,8 +1348,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_ids_to_check.extend(provider_file_ids) except Exception as e: verbose_logger.debug( - f"Could not get model file ID mapping for {file_id}: {e}. " - f"Will only check unified file ID." + f"Could not get model file ID mapping for {file_id}: {e}. Will only check unified file ID." ) MAX_MATCHES_TO_RETURN = 10 @@ -1487,11 +1366,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): for batch in batches: try: # Parse the batch file_object to check for file references - batch_data = ( - json.loads(batch.file_object) - if isinstance(batch.file_object, str) - else batch.file_object - ) + batch_data = json.loads(batch.file_object) if isinstance(batch.file_object, str) else batch.file_object # Extract file IDs from batch # Batches typically reference the unified file ID in input_file_id @@ -1500,9 +1375,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): output_file_id = batch_data.get("output_file_id") error_file_id = batch_data.get("error_file_id") - referenced_file_ids = [ - fid for fid in [input_file_id, output_file_id, error_file_id] if fid - ] + referenced_file_ids = [fid for fid in [input_file_id, output_file_id, error_file_id] if fid] # Check if any referenced file ID matches the file we're trying to delete if any(ref_id in file_ids_to_check for ref_id in referenced_file_ids): @@ -1514,9 +1387,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): } ) except Exception as e: - verbose_logger.warning( - f"Error parsing batch object {batch.unified_object_id}: {e}" - ) + verbose_logger.warning(f"Error parsing batch object {batch.unified_object_id}: {e}") continue return referencing_batches @@ -1545,21 +1416,15 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): if referencing_batches: # File is referenced by non-terminal batches and polling is enabled - MAX_BATCHES_IN_ERROR = ( - 5 # Limit batches shown in error message for readability - ) + MAX_BATCHES_IN_ERROR = 5 # Limit batches shown in error message for readability # Show up to MAX_BATCHES_IN_ERROR in the error message batches_to_show = referencing_batches[:MAX_BATCHES_IN_ERROR] - batch_statuses = [ - f"{b['batch_id']}: {b['status']}" for b in batches_to_show - ] + batch_statuses = [f"{b['batch_id']}: {b['status']}" for b in batches_to_show] # Determine the count message count_message = f"{len(referencing_batches)}" - if ( - len(referencing_batches) >= 10 - ): # MAX_MATCHES_TO_RETURN from _get_batches_referencing_file + if len(referencing_batches) >= 10: # MAX_MATCHES_TO_RETURN from _get_batches_referencing_file count_message = "10+" error_message = ( @@ -1600,23 +1465,17 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): await self._check_file_deletion_allowed(file_id) # file_id = convert_b64_uid_to_unified_uid(file_id) - model_file_id_mapping = await self.get_model_file_id_mapping( - [file_id], litellm_parent_otel_span - ) + model_file_id_mapping = await self.get_model_file_id_mapping([file_id], litellm_parent_otel_span) delete_response = None specific_model_file_id_mapping = model_file_id_mapping.get(file_id) if specific_model_file_id_mapping: # Remove conflicting keys from data to avoid duplicate keyword arguments - filtered_data = { - k: v for k, v in data.items() if k not in ("model", "file_id") - } + filtered_data = {k: v for k, v in data.items() if k not in ("model", "file_id")} for model_id, model_file_id in specific_model_file_id_mapping.items(): delete_response = await llm_router.afile_delete(model=model_id, file_id=model_file_id, **filtered_data) # type: ignore - stored_file_object = await self.delete_unified_file_id( - file_id, litellm_parent_otel_span - ) + stored_file_object = await self.delete_unified_file_id(file_id, litellm_parent_otel_span) # Record successful deletion metric only on actual success if stored_file_object or delete_response: @@ -1643,9 +1502,8 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): Get the content of a file from first model that has it """ model_file_id_mapping = data.pop("model_file_id_mapping", None) - model_file_id_mapping = ( - model_file_id_mapping - or await self.get_model_file_id_mapping([file_id], litellm_parent_otel_span) + model_file_id_mapping = model_file_id_mapping or await self.get_model_file_id_mapping( + [file_id], litellm_parent_otel_span ) specific_model_file_id_mapping = model_file_id_mapping.get(file_id) @@ -1658,13 +1516,9 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # against the deployment's configured bucket, which they only # trust from this immutable server-side snapshot, never from # request params. - credentials = llm_router.get_deployment_credentials_with_provider( - model_id=model_id - ) + credentials = llm_router.get_deployment_credentials_with_provider(model_id=model_id) if credentials is not None: - data["_litellm_internal_model_credentials"] = cast( - Dict, MappingProxyType(dict(credentials)) - ) + data["_litellm_internal_model_credentials"] = cast(Dict, MappingProxyType(dict(credentials))) else: data.pop("_litellm_internal_model_credentials", None) return await llm_router.afile_content(model=model_id, file_id=provider_file_id, **data) # type: ignore @@ -1699,9 +1553,7 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): # Check database for storage backend info # IMPORTANT: The database stores the base64 encoded unified_file_id (not the decoded version) # So we query with the original file_id (which is base64 encoded) - db_file = await self.prisma_client.db.litellm_managedfiletable.find_first( - where={"unified_file_id": file_id} - ) + db_file = await _managed_file_table(self.prisma_client).find_first(where={"unified_file_id": file_id}) if not db_file or not db_file.storage_backend or not db_file.storage_url: continue @@ -1727,22 +1579,16 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): file_content = await storage_backend.download_file(storage_url) # Determine content type from file object - content_type = self._get_content_type_from_file_object( - db_file.file_object - ) + content_type = self._get_content_type_from_file_object(db_file.file_object) # Convert to base64 base64_data = base64.b64encode(file_content).decode("utf-8") base64_data_uri = f"data:{content_type};base64,{base64_data}" # Update messages to use base64 instead of file_id - self._update_messages_with_base64_data( - messages, file_id, base64_data_uri, content_type - ) + self._update_messages_with_base64_data(messages, file_id, base64_data_uri, content_type) except Exception as e: - verbose_logger.exception( - f"Error converting file {file_id} from storage backend to base64: {str(e)}" - ) + verbose_logger.exception(f"Error converting file {file_id} from storage backend to base64: {str(e)}") # Continue with other files even if one fails continue diff --git a/litellm/a2a_protocol/providers/pydantic_ai_agents/transformation.py b/litellm/a2a_protocol/providers/pydantic_ai_agents/transformation.py index 339da998d56..024e8c179c2 100644 --- a/litellm/a2a_protocol/providers/pydantic_ai_agents/transformation.py +++ b/litellm/a2a_protocol/providers/pydantic_ai_agents/transformation.py @@ -6,16 +6,33 @@ This module provides fake streaming by converting non-streaming responses into s """ import asyncio -from collections.abc import AsyncIterator -from typing import Any, Final, cast +from collections.abc import AsyncIterator, Mapping, Sequence +from typing import Any, Final, Protocol, cast, runtime_checkable from uuid import uuid4 +from pydantic import TypeAdapter + from litellm._logging import verbose_logger from litellm.llms.custom_httpx.http_handler import ( AsyncHTTPHandler, get_async_httpx_client, ) +_ANY_KEY_DICT_ADAPTER: Final = TypeAdapter(dict[object, object]) +_STR_KEY_DICT_ADAPTER: Final = TypeAdapter(dict[str, object]) +_LIST_ADAPTER: Final = TypeAdapter(list[object]) +_TEXT_ADAPTER: Final = TypeAdapter(str) + + +@runtime_checkable +class _SupportsModelDump(Protocol): + def model_dump(self, *, mode: str, exclude_none: bool) -> Mapping[str, object]: ... + + +@runtime_checkable +class _SupportsPydanticDict(Protocol): + def dict(self, *, exclude_none: bool) -> Mapping[str, object]: ... + class PydanticAITransformation: """ @@ -28,7 +45,7 @@ class PydanticAITransformation: """ @staticmethod - def _remove_none_values(obj: Any) -> Any: + def _remove_none_values(obj: object) -> object: """ Recursively remove None values from a dict/list structure. @@ -42,14 +59,18 @@ class PydanticAITransformation: Cleaned object with None values removed """ if isinstance(obj, dict): - return {k: PydanticAITransformation._remove_none_values(v) for k, v in obj.items() if v is not None} + typed_dict: Final = _ANY_KEY_DICT_ADAPTER.validate_python(obj) + return {k: PydanticAITransformation._remove_none_values(v) for k, v in typed_dict.items() if v is not None} elif isinstance(obj, list): - return [PydanticAITransformation._remove_none_values(item) for item in obj if item is not None] + typed_list: Final = _LIST_ADAPTER.validate_python(obj) + return [PydanticAITransformation._remove_none_values(item) for item in typed_list if item is not None] else: return obj @staticmethod - def _params_to_dict(params: Any) -> dict[str, Any]: + def _params_to_dict( + params: "_SupportsModelDump | _SupportsPydanticDict | Mapping[str, object]", + ) -> Mapping[str, object]: """ Convert params to a dict, handling Pydantic models. @@ -59,10 +80,10 @@ class PydanticAITransformation: Returns: Dict representation of params """ - if hasattr(params, "model_dump"): + if isinstance(params, _SupportsModelDump): # Pydantic v2 model return params.model_dump(mode="python", exclude_none=True) - elif hasattr(params, "dict"): + elif isinstance(params, _SupportsPydanticDict): # Pydantic v1 model return params.dict(exclude_none=True) elif isinstance(params, dict): @@ -75,12 +96,12 @@ class PydanticAITransformation: async def _poll_for_completion( client: AsyncHTTPHandler, endpoint: str, - task_id: str, + task_id: object, request_id: str, max_attempts: int = 30, poll_interval: float = 0.5, agent_extra_headers: dict[str, str] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Poll for task completion using tasks/get method. @@ -112,10 +133,10 @@ class PydanticAITransformation: }, ) response.raise_for_status() - poll_data = response.json() + poll_data = _STR_KEY_DICT_ADAPTER.validate_python(response.json()) - result = poll_data.get("result", {}) - status = result.get("status", {}) + result = _STR_KEY_DICT_ADAPTER.validate_python(poll_data.get("result", {})) + status = _STR_KEY_DICT_ADAPTER.validate_python(result.get("status", {})) state = status.get("state", "") verbose_logger.debug("Pydantic AI: Poll attempt %s/%s, state=%s", attempt + 1, max_attempts, state) @@ -133,10 +154,10 @@ class PydanticAITransformation: async def _send_and_poll_raw( api_base: str, request_id: str, - params: Any, + params: "_SupportsModelDump | _SupportsPydanticDict | Mapping[str, object]", timeout: float = 60.0, agent_extra_headers: dict[str, str] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Send a request to Pydantic AI agent and return the raw task response. @@ -153,14 +174,16 @@ class PydanticAITransformation: Raw Pydantic AI task response (with history/artifacts) """ # Convert params to dict if it's a Pydantic model - params_dict = PydanticAITransformation._params_to_dict(params) - # Remove None values - FastA2A doesn't accept null for optional fields - params_dict = PydanticAITransformation._remove_none_values(params_dict) + params_dict: Final = _ANY_KEY_DICT_ADAPTER.validate_python( + PydanticAITransformation._remove_none_values(PydanticAITransformation._params_to_dict(params)) + ) # Ensure the message has 'kind': 'message' as required by FastA2A/Pydantic AI if "message" in params_dict: - params_dict["message"]["kind"] = "message" + message_value: Final = _ANY_KEY_DICT_ADAPTER.validate_python(params_dict["message"]) + message_value["kind"] = "message" + params_dict["message"] = message_value # Build A2A JSON-RPC request using message/send method for FastA2A compatibility a2a_request: Final = { @@ -189,11 +212,11 @@ class PydanticAITransformation: }, ) response.raise_for_status() - response_data = response.json() + response_data = _STR_KEY_DICT_ADAPTER.validate_python(response.json()) # Check if task is already completed - result: Final = response_data.get("result", {}) - status: Final = result.get("status", {}) + result: Final = _STR_KEY_DICT_ADAPTER.validate_python(response_data.get("result", {})) + status: Final = _STR_KEY_DICT_ADAPTER.validate_python(result.get("status", {})) state: Final = status.get("state", "") if state != "completed": @@ -217,10 +240,10 @@ class PydanticAITransformation: async def send_non_streaming_request( api_base: str, request_id: str, - params: Any, + params: "_SupportsModelDump | _SupportsPydanticDict | Mapping[str, object]", timeout: float = 60.0, agent_extra_headers: dict[str, str] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Send a non-streaming A2A request to Pydantic AI agent and wait for completion. @@ -253,10 +276,10 @@ class PydanticAITransformation: async def send_and_get_raw_response( api_base: str, request_id: str, - params: Any, + params: "_SupportsModelDump | _SupportsPydanticDict | Mapping[str, object]", timeout: float = 60.0, agent_extra_headers: dict[str, str] | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Send a request to Pydantic AI agent and return the raw task response. @@ -282,9 +305,9 @@ class PydanticAITransformation: @staticmethod def _transform_to_a2a_response( - response_data: dict[str, Any], + response_data: Mapping[str, object], request_id: str, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Transform Pydantic AI task response to standard A2A non-streaming format. @@ -328,7 +351,7 @@ class PydanticAITransformation: } @staticmethod - def _extract_response_text(response_data: dict[str, Any]) -> tuple[str, str, list]: + def _extract_response_text(response_data: Mapping[str, object]) -> tuple[object, object, Sequence[object]]: """ Extract response text from completed task response. @@ -342,52 +365,53 @@ class PydanticAITransformation: Returns: Tuple of (full_text, message_id, parts) """ - result: Final = response_data.get("result", {}) + result: Final = _STR_KEY_DICT_ADAPTER.validate_python(response_data.get("result", {})) # Try to extract from artifacts first (preferred for results) artifacts: Final = result.get("artifacts", []) if artifacts: - for artifact in artifacts: - parts = artifact.get("parts", []) + for artifact in _LIST_ADAPTER.validate_python(artifacts): + parts = _LIST_ADAPTER.validate_python(_STR_KEY_DICT_ADAPTER.validate_python(artifact).get("parts", [])) for part in parts: - if part.get("kind") == "text": - text = part.get("text", "") + if (part_dict := _STR_KEY_DICT_ADAPTER.validate_python(part)).get("kind") == "text": + text = part_dict.get("text", "") if text: return text, str(uuid4()), parts # Fall back to history - get the last agent message - history: Final = result.get("history", []) + history: Final = _LIST_ADAPTER.validate_python(result.get("history", [])) for msg in reversed(history): - if msg.get("role") == "agent": - parts = msg.get("parts", []) - message_id = msg.get("messageId", str(uuid4())) + if (msg_dict := _STR_KEY_DICT_ADAPTER.validate_python(msg)).get("role") == "agent": + parts = _LIST_ADAPTER.validate_python(msg_dict.get("parts", [])) + message_id = msg_dict.get("messageId", str(uuid4())) full_text = "" for part in parts: - if part.get("kind") == "text": - full_text += part.get("text", "") + if (part_dict := _STR_KEY_DICT_ADAPTER.validate_python(part)).get("kind") == "text": + full_text += _TEXT_ADAPTER.validate_python(part_dict.get("text", "")) if full_text: return full_text, message_id, parts # Fall back to message field (original format) message: Final = result.get("message", {}) if message: - parts = message.get("parts", []) - message_id = message.get("messageId", str(uuid4())) + message_dict: Final = _STR_KEY_DICT_ADAPTER.validate_python(message) + parts = _LIST_ADAPTER.validate_python(message_dict.get("parts", [])) + message_id = message_dict.get("messageId", str(uuid4())) full_text = "" for part in parts: - if part.get("kind") == "text": - full_text += part.get("text", "") + if (part_dict := _STR_KEY_DICT_ADAPTER.validate_python(part)).get("kind") == "text": + full_text += _TEXT_ADAPTER.validate_python(part_dict.get("text", "")) return full_text, message_id, parts return "", str(uuid4()), [] @staticmethod async def fake_streaming_from_response( - response_data: dict[str, Any], + response_data: Mapping[str, object], request_id: str, chunk_size: int = 50, delay_ms: int = 10, - ) -> AsyncIterator[dict[str, Any]]: + ) -> AsyncIterator[dict[str, object]]: """ Convert a non-streaming A2A response into fake streaming chunks. @@ -410,12 +434,12 @@ class PydanticAITransformation: full_text, message_id, parts = PydanticAITransformation._extract_response_text(response_data) # Extract input message from raw response for history - result: Final = response_data.get("result", {}) - history: Final = result.get("history", []) - input_message = {} + result: Final = _STR_KEY_DICT_ADAPTER.validate_python(response_data.get("result", {})) + history: Final = _LIST_ADAPTER.validate_python(result.get("history", [])) + input_message = _STR_KEY_DICT_ADAPTER.validate_python({}) for msg in history: - if msg.get("role") == "user": - input_message = msg + if (msg_dict := _STR_KEY_DICT_ADAPTER.validate_python(msg)).get("role") == "user": + input_message = msg_dict break # Generate IDs for streaming events @@ -426,45 +450,49 @@ class PydanticAITransformation: # 1. Emit initial task event (kind: "task", status: "submitted") # Format matches A2ACompletionBridgeTransformation.create_task_event - task_event: Final = { - "jsonrpc": "2.0", - "id": request_id, - "result": { - "contextId": context_id, - "history": [ - { - "contextId": context_id, - "kind": "message", - "messageId": input_message_id, - "parts": input_message.get("parts", [{"kind": "text", "text": ""}]), - "role": "user", - "taskId": task_id, - } - ], - "id": task_id, - "kind": "task", - "status": { - "state": "submitted", + task_event: Final = _STR_KEY_DICT_ADAPTER.validate_python( + { + "jsonrpc": "2.0", + "id": request_id, + "result": { + "contextId": context_id, + "history": [ + { + "contextId": context_id, + "kind": "message", + "messageId": input_message_id, + "parts": input_message.get("parts", [{"kind": "text", "text": ""}]), + "role": "user", + "taskId": task_id, + } + ], + "id": task_id, + "kind": "task", + "status": { + "state": "submitted", + }, }, - }, - } + } + ) yield task_event # 2. Emit status update (kind: "status-update", status: "working") # Format matches A2ACompletionBridgeTransformation.create_status_update_event - working_event: Final = { - "jsonrpc": "2.0", - "id": request_id, - "result": { - "contextId": context_id, - "final": False, - "kind": "status-update", - "status": { - "state": "working", + working_event: Final = _STR_KEY_DICT_ADAPTER.validate_python( + { + "jsonrpc": "2.0", + "id": request_id, + "result": { + "contextId": context_id, + "final": False, + "kind": "status-update", + "status": { + "state": "working", + }, + "taskId": task_id, }, - "taskId": task_id, - }, - } + } + ) yield working_event # Small delay to simulate processing @@ -473,29 +501,32 @@ class PydanticAITransformation: # 3. Emit artifact update chunks (kind: "artifact-update") # Format matches A2ACompletionBridgeTransformation.create_artifact_update_event if full_text: + full_text_str: Final = _TEXT_ADAPTER.validate_python(full_text) # Split text into chunks - for i in range(0, len(full_text), chunk_size): - chunk_text = full_text[i : i + chunk_size] - is_last_chunk = (i + chunk_size) >= len(full_text) + for i in range(0, len(full_text_str), chunk_size): + chunk_text = full_text_str[i : i + chunk_size] + is_last_chunk = (i + chunk_size) >= len(full_text_str) - artifact_event = { - "jsonrpc": "2.0", - "id": request_id, - "result": { - "contextId": context_id, - "kind": "artifact-update", - "taskId": task_id, - "artifact": { - "artifactId": artifact_id, - "parts": [ - { - "kind": "text", - "text": chunk_text, - } - ], + artifact_event = _STR_KEY_DICT_ADAPTER.validate_python( + { + "jsonrpc": "2.0", + "id": request_id, + "result": { + "contextId": context_id, + "kind": "artifact-update", + "taskId": task_id, + "artifact": { + "artifactId": artifact_id, + "parts": [ + { + "kind": "text", + "text": chunk_text, + } + ], + }, }, - }, - } + } + ) yield artifact_event # Add delay between chunks (except for last chunk) @@ -503,19 +534,21 @@ class PydanticAITransformation: await asyncio.sleep(delay_ms / 1000.0) # 4. Emit final status update (kind: "status-update", status: "completed", final: true) - completed_event: Final = { - "jsonrpc": "2.0", - "id": request_id, - "result": { - "contextId": context_id, - "final": True, - "kind": "status-update", - "status": { - "state": "completed", + completed_event: Final = _STR_KEY_DICT_ADAPTER.validate_python( + { + "jsonrpc": "2.0", + "id": request_id, + "result": { + "contextId": context_id, + "final": True, + "kind": "status-update", + "status": { + "state": "completed", + }, + "taskId": task_id, }, - "taskId": task_id, - }, - } + } + ) yield completed_event verbose_logger.info("Pydantic AI: Fake streaming completed for request_id=%s", request_id) diff --git a/litellm/integrations/websearch_interception/handler.py b/litellm/integrations/websearch_interception/handler.py index 9748db2dcd2..7abbf0c96e5 100644 --- a/litellm/integrations/websearch_interception/handler.py +++ b/litellm/integrations/websearch_interception/handler.py @@ -42,7 +42,7 @@ from litellm.types.integrations.websearch_interception import ( WebSearchInterceptionConfig, ) from litellm.types.llms.openai import AllMessageValues -from litellm.types.utils import CallTypes, LlmProviders +from litellm.types.utils import AgenticLoopParams, CallTypes, LlmProviders from litellm.utils import ProviderConfigManager if TYPE_CHECKING: @@ -265,7 +265,7 @@ class WebSearchInterceptionLogger(CustomLogger): return None # Check if request has tools with native web_search - tools: Final = kwargs.get("tools") + tools: Final[Sequence[dict[str, object]] | None] = kwargs.get("tools") if not tools: return None @@ -314,7 +314,9 @@ class WebSearchInterceptionLogger(CustomLogger): return kwargs - def _convert_responses_tools(self, kwargs: Mapping[str, object], tools: list[dict[str, object]]) -> dict | None: + def _convert_responses_tools( + self, kwargs: Mapping[str, object], tools: Sequence[dict[str, object]] + ) -> dict[str, object] | None: """Convert Responses API web search tools to the LiteLLM standard function tool.""" if not any(is_web_search_tool_responses(tool) for tool in tools): return None @@ -379,7 +381,7 @@ class WebSearchInterceptionLogger(CustomLogger): ) @staticmethod - def _tool_name(tool: dict[str, Any]) -> str | None: + def _tool_name(tool: Mapping[str, object]) -> object: """Effective tool name, handling OpenAI ``function`` wrapper shape.""" fn: Final = tool.get("function") if tool.get("type") == "function" and isinstance(fn, dict): @@ -1271,7 +1273,7 @@ class WebSearchInterceptionLogger(CustomLogger): kwargs_for_followup: Final = self._prepare_followup_kwargs(kwargs) if logging_obj is not None: - agentic_params: Final = logging_obj.model_call_details.get("agentic_loop_params", {}) + agentic_params: Final[AgenticLoopParams] = logging_obj.model_call_details.get("agentic_loop_params", {}) full_model_name = agentic_params.get("model", model) verbose_logger.debug( "WebSearchInterception: Built anthropic request patch [call_id=%s model=%s messages=%d searches=%d]", diff --git a/litellm/litellm_core_utils/realtime_streaming.py b/litellm/litellm_core_utils/realtime_streaming.py index 858d10df53b..d68bdc4a250 100644 --- a/litellm/litellm_core_utils/realtime_streaming.py +++ b/litellm/litellm_core_utils/realtime_streaming.py @@ -1,5 +1,6 @@ import asyncio import json +from collections.abc import Mapping, Sequence from typing import TYPE_CHECKING, Any, Final, Protocol, cast import litellm @@ -20,11 +21,24 @@ from .litellm_logging import Logging as LiteLLMLogging if TYPE_CHECKING: from websockets.asyncio.client import ClientConnection + from litellm.types.guardrails import GuardrailEventHooks + CLIENT_CONNECTION_CLASS = ClientConnection else: CLIENT_CONNECTION_CLASS = Any +class _ClientWebSocketExceptions(Protocol): + ConnectionClosed: type[Exception] + + +class _ClientWebSocket(Protocol): + exceptions: _ClientWebSocketExceptions + + async def send_text(self, data: str) -> None: ... + async def receive_text(self) -> str: ... + + class RealtimeEventNormalizer(Protocol): def should_drop(self, event: object) -> bool: ... def normalize(self, event: dict) -> dict: ... @@ -48,13 +62,13 @@ class RealTimeStreaming: logging_obj: LiteLLMLogging, provider_config: BaseRealtimeConfig | None = None, model: str = "", - user_api_key_dict: Any | None = None, + user_api_key_dict: object | None = None, request_data: dict | None = None, backend_uses_beta_protocol: bool | None = None, force_transcription_model: str | None = None, event_normalizer: RealtimeEventNormalizer | None = None, ): - self.websocket = websocket + self.websocket: _ClientWebSocket = websocket self.backend_ws = backend_ws self.logging_obj = logging_obj self.messages: list[OpenAIRealtimeEvents] = [] @@ -127,7 +141,7 @@ class RealTimeStreaming: ] ) _CLIENT_AUDIO_BUFFER_COMMIT_TYPES = frozenset(["input_audio_buffer.commit", "input_audio_buffer.end"]) - _AUDIO_FORMAT_MAP: dict[str, dict[str, Any]] = { + _AUDIO_FORMAT_MAP: dict[str, dict[str, str | int]] = { "pcm16": {"type": "audio/pcm", "rate": 24000}, "g711_ulaw": {"type": "audio/G711-ulaw", "rate": 8000}, "g711_alaw": {"type": "audio/G711-alaw", "rate": 8000}, @@ -281,6 +295,7 @@ class RealTimeStreaming: if event_obj.get("type") != "response.done": return response: Final = cast(dict[str, Any], event_obj.get("response", {})) + item: Mapping[str, object] for item in response.get("output", []): if item.get("type") == "function_call": self.tool_calls.append( @@ -384,7 +399,7 @@ class RealTimeStreaming: return message try: - message_obj: Final = json.loads(message) + message_obj: Final[Mapping[str, object]] = json.loads(message) except (json.JSONDecodeError, TypeError): return message @@ -487,7 +502,7 @@ class RealTimeStreaming: if self._backend_setup_complete and not self._flushing_pending_messages_until_setup: return False try: - msg_obj: Final = json.loads(message) + msg_obj: Final[Mapping[str, object]] = json.loads(message) except (json.JSONDecodeError, TypeError): return False return msg_obj.get("type") in RealTimeStreaming._CLIENT_AUDIO_BUFFER_TYPES @@ -555,7 +570,7 @@ class RealTimeStreaming: def _event_to_client_json(self, event: dict) -> str: return json.dumps(self._normalize_event_for_ga_client(event)) - async def _send_event_to_client(self, event: Any, event_str: str) -> bool: + async def _send_event_to_client(self, event: object, event_str: str) -> bool: if self._should_drop_event_from_client(event): return False if isinstance(event, dict): @@ -595,12 +610,12 @@ class RealTimeStreaming: def _make_disable_auto_response_message(self) -> str: """Return a session.update that disables VAD auto-response.""" - turn_detection: Final[dict[str, Any]] = { + turn_detection: Final[dict[str, str | bool]] = { "type": "server_vad", "create_response": False, } if self._backend_uses_beta_protocol: - session: dict[str, Any] = {"turn_detection": turn_detection} + session: dict[str, object] = {"turn_detection": turn_detection} else: session = { "type": "realtime", @@ -654,7 +669,7 @@ class RealTimeStreaming: def _has_realtime_guardrails_for_event_hooks( self, - event_hooks: list[Any], + event_hooks: Sequence["GuardrailEventHooks"], ) -> bool: """Return True if any callback would run for one of ``event_hooks``.""" from litellm.integrations.custom_guardrail import CustomGuardrail @@ -699,7 +714,7 @@ class RealTimeStreaming: transcript: str, item_id: str | None = None, pre_block_backend_message: str | None = None, - event_hooks: list[Any] | None = None, + event_hooks: Sequence["GuardrailEventHooks"] | None = None, ) -> bool: """ Run registered guardrails on realtime text (transcript, user message, tool output). @@ -753,7 +768,7 @@ class RealTimeStreaming: raise # Extract the human-readable error from the detail dict (HTTPException) # or fall back to str(e) for plain ValueError. - detail = getattr(e, "detail", None) + detail: object | None = getattr(e, "detail", None) if isinstance(detail, dict): safe_msg = detail.get("error") or str(e) elif detail is not None: @@ -826,7 +841,7 @@ class RealTimeStreaming: return True return False - async def _handle_provider_config_message(self, raw_response) -> None: + async def _handle_provider_config_message(self, raw_response: str) -> None: """Process a backend message when a provider_config is set (transformed path).""" returned_object: Final = self.provider_config.transform_realtime_response( raw_response, @@ -910,7 +925,7 @@ class RealTimeStreaming: await self._send_event_to_client(event, event_str) @staticmethod - def _parse_backend_event(raw_response: str) -> dict | None: + def _parse_backend_event(raw_response: str) -> dict[str, object] | None: """Parse a backend frame once. Returns None for non-JSON or non-object frames.""" try: event: Final = json.loads(raw_response) @@ -1020,7 +1035,7 @@ class RealTimeStreaming: objects and any test doubles that expose a .scope dict. """ try: - headers: Final = websocket.scope.get("headers", []) + headers: Final[Sequence[tuple[bytes | str, bytes | str]]] = websocket.scope.get("headers", []) for name, value in headers: if isinstance(name, bytes): name = name.decode("latin-1") @@ -1071,9 +1086,9 @@ class RealTimeStreaming: session["output_modalities"] = ["text"] # 3-7. Lift flat audio fields into the nested audio object - audio: Final[dict[str, Any]] = {} - inp: Final[dict[str, Any]] = {} - out: Final[dict[str, Any]] = {} + audio: Final[dict[str, object]] = {} + inp: Final[dict[str, object]] = {} + out: Final[dict[str, object]] = {} # voice → audio.output.voice if "voice" in session: @@ -1190,7 +1205,7 @@ class RealTimeStreaming: # model; check them with the same guardrail used for # user text so an attacker cannot smuggle blocked # content into a function_call_output. - output = item.get("output", "") + output: object = item.get("output", "") output_text = output if isinstance(output, str) else json.dumps(output) if output_text: # Build the sanitized function_call_output up @@ -1241,7 +1256,7 @@ class RealTimeStreaming: # interaction turn. continue elif item.get("role") == "user": - content_list = item.get("content", []) + content_list: Sequence[object] = item.get("content", []) texts = [ c.get("text", "") for c in content_list @@ -1280,7 +1295,7 @@ class RealTimeStreaming: and not self._guardrail_turn_detection_update_sent and self._has_audio_transcription_guardrails() ): - session = msg_obj.setdefault("session", {}) + session: object = msg_obj.setdefault("session", {}) if isinstance(session, dict): existing_td = session.get("turn_detection") if not isinstance(existing_td, dict): diff --git a/litellm/litellm_core_utils/streaming_chunk_builder_utils.py b/litellm/litellm_core_utils/streaming_chunk_builder_utils.py index 3f967e29002..886ba6a3a18 100644 --- a/litellm/litellm_core_utils/streaming_chunk_builder_utils.py +++ b/litellm/litellm_core_utils/streaming_chunk_builder_utils.py @@ -3,7 +3,7 @@ import time from collections.abc import Iterator, Mapping, Sequence from itertools import groupby from types import MappingProxyType -from typing import TYPE_CHECKING, Any, Final, Union, cast +from typing import TYPE_CHECKING, Any, Final, TypedDict, Union, cast from litellm._logging import verbose_logger from litellm.types.llms.openai import ( @@ -30,6 +30,7 @@ from litellm.types.utils import ( from litellm.utils import print_verbose, token_counter if TYPE_CHECKING: + from litellm.litellm_core_utils.litellm_logging import Logging from litellm.types.litellm_core_utils.streaming_chunk_builder_utils import ( UsagePerChunk, ) @@ -39,6 +40,60 @@ if TYPE_CHECKING: ) +class _ThinkingBlockFragment(TypedDict, total=False): + type: str | None + data: str | None + thinking: str | None + signature: str | None + + +class _ThinkingDelta(TypedDict, total=False): + thinking_blocks: Sequence[_ThinkingBlockFragment] + + +class _ThinkingChoice(TypedDict, total=False): + delta: _ThinkingDelta + + +class _ThinkingChunk(TypedDict): + choices: Sequence[_ThinkingChoice] + + +class _ContentChoice(TypedDict, total=False): + delta: Mapping[str, str | None] + + +class _ContentChunk(TypedDict): + choices: Sequence[_ContentChoice] + + +class _AudioDelta(TypedDict, total=False): + audio: ChatCompletionAudioDelta | None + + +class _AudioChoice(TypedDict, total=False): + delta: _AudioDelta + + +class _AudioChunk(TypedDict): + choices: Sequence[_AudioChoice] + + +class _UsageBearingChunk(TypedDict, total=False): + usage: Usage | None + _hidden_params: Mapping[str, str] + + +class _UsageSummary(TypedDict): + prompt_tokens: int | None + completion_tokens: int | None + cache_creation_input_tokens: int | None + cache_read_input_tokens: int | None + completion_tokens_details: CompletionTokensDetails | None + prompt_tokens_details: PromptTokensDetailsWrapper | None + cost: float | None + + def capture_cache_creation_token_details( prompt_tokens_details: PromptTokensDetailsWrapper | None, current: CacheCreationTokenDetails | None, @@ -78,7 +133,7 @@ class ChunkProcessor: return [] first_chunk: Final = chunks[0] - first_hidden_params: dict[str, Any] = {} + first_hidden_params: dict[str, object] = {} if isinstance(first_chunk, dict): candidate = first_chunk.get("_hidden_params", {}) if isinstance(candidate, dict): @@ -115,8 +170,8 @@ class ChunkProcessor: @staticmethod def apply_provider_assembled_streaming_metadata( response: ModelResponse, - chunks: list[Any], - logging_obj: Any | None = None, + chunks: list[object], + logging_obj: "Logging | None" = None, ) -> None: if not chunks: return @@ -456,7 +511,7 @@ class ChunkProcessor: ) def get_combined_content( - self, chunks: list[dict[str, Any]], delta_key: str = "content" + self, chunks: Sequence["_ContentChunk"], delta_key: str = "content" ) -> ChatCompletionAssistantContentValue: content_list: Final[list[str]] = [] for chunk in chunks: @@ -475,7 +530,7 @@ class ChunkProcessor: return combined_content def get_combined_thinking_content( - self, chunks: list[dict[str, Any]] + self, chunks: Sequence["_ThinkingChunk"] ) -> list[Union["ChatCompletionThinkingBlock", "ChatCompletionRedactedThinkingBlock"]] | None: from litellm.types.llms.openai import ( ChatCompletionRedactedThinkingBlock, @@ -532,10 +587,10 @@ class ChunkProcessor: return thinking_blocks return None - def get_combined_reasoning_content(self, chunks: list[dict[str, Any]]) -> ChatCompletionAssistantContentValue: + def get_combined_reasoning_content(self, chunks: Sequence["_ContentChunk"]) -> ChatCompletionAssistantContentValue: return self.get_combined_content(chunks, delta_key="reasoning_content") - def get_combined_audio_content(self, chunks: list[dict[str, Any]]) -> ChatCompletionAudioResponse: + def get_combined_audio_content(self, chunks: Sequence["_AudioChunk"]) -> ChatCompletionAudioResponse: base64_data_list: Final[list[str]] = [] transcript_list: Final[list[str]] = [] expires_at: int | None = None @@ -544,7 +599,7 @@ class ChunkProcessor: for chunk in chunks: choices = chunk["choices"] for choice in choices: - delta = choice.get("delta") or {} + delta: _AudioDelta = choice.get("delta") or {} audio: ChatCompletionAudioDelta | None = delta.get("audio") if audio is not None: for k, v in audio.items(): @@ -565,7 +620,7 @@ class ChunkProcessor: id=id, ) - def _usage_chunk_calculation_helper(self, usage_chunk: Usage) -> dict: + def _usage_chunk_calculation_helper(self, usage_chunk: Usage) -> "_UsageSummary": prompt_tokens = 0 completion_tokens = 0 ## anthropic prompt caching information ## @@ -623,8 +678,8 @@ class ChunkProcessor: return reasoning_tokens @staticmethod - def _extract_usage_chunk(chunk: dict[str, Any] | ModelResponse | ModelResponseStream) -> Usage | None: - usage_chunk: Usage | dict[str, Any] | None = None + def _extract_usage_chunk(chunk: "_UsageBearingChunk | ModelResponse | ModelResponseStream") -> Usage | None: + usage_chunk: Usage | None = None if hasattr(chunk, "usage") and chunk.usage is not None: usage_chunk = chunk.usage elif "usage" in chunk: @@ -640,7 +695,7 @@ class ChunkProcessor: def _calculate_usage_per_chunk( self, - chunks: list[dict[str, Any] | ModelResponse], + chunks: Sequence["_UsageBearingChunk | ModelResponse"], ) -> "UsagePerChunk": from litellm.types.litellm_core_utils.streaming_chunk_builder_utils import ( UsagePerChunk, @@ -721,13 +776,7 @@ class ChunkProcessor: "web_search_requests", ) - prompt_tokens_details = ( - cast( - PromptTokensDetailsWrapper | None, - usage_chunk_dict["prompt_tokens_details"], - ) - or prompt_tokens_details - ) + prompt_tokens_details = usage_chunk_dict["prompt_tokens_details"] or prompt_tokens_details cache_creation_token_details = capture_cache_creation_token_details( prompt_tokens_details, cache_creation_token_details @@ -758,7 +807,7 @@ class ChunkProcessor: @staticmethod def _reset_anthropic_cursor_completion_tokens( - chunks: list[dict[str, Any] | ModelResponse], + chunks: Sequence["_UsageBearingChunk | ModelResponse"], completion_tokens: int, completion_usage_updates: int, ) -> int: @@ -797,7 +846,7 @@ class ChunkProcessor: def calculate_usage( self, - chunks: list[dict[str, Any] | ModelResponse], + chunks: Sequence["_UsageBearingChunk | ModelResponse"], model: str, completion_output: str, messages: list | None = None, @@ -851,8 +900,8 @@ class ChunkProcessor: setattr(returned_usage, "cache_read_input_tokens", cache_read_input_tokens) # for anthropic if completion_tokens_details is not None: if isinstance(completion_tokens_details, CompletionTokensDetails): - returned_usage.completion_tokens_details = CompletionTokensDetailsWrapper( - **completion_tokens_details.model_dump() + returned_usage.completion_tokens_details = CompletionTokensDetailsWrapper.model_validate( + completion_tokens_details.model_dump() ) else: returned_usage.completion_tokens_details = completion_tokens_details diff --git a/litellm/llms/anthropic/experimental_pass_through/adapters/handler.py b/litellm/llms/anthropic/experimental_pass_through/adapters/handler.py index a9751489473..36f3e875a7e 100644 --- a/litellm/llms/anthropic/experimental_pass_through/adapters/handler.py +++ b/litellm/llms/anthropic/experimental_pass_through/adapters/handler.py @@ -1,8 +1,9 @@ -from collections.abc import AsyncIterator, Coroutine, Iterator +from collections.abc import AsyncIterator, Coroutine, Iterator, Mapping from typing import ( TYPE_CHECKING, Any, Final, + TypeAlias, cast, ) @@ -33,8 +34,12 @@ if TYPE_CHECKING: # Anthropic-only keys already mapped by the translator; strip on extra_kwargs re-merge. ANTHROPIC_ONLY_REQUEST_KEYS: Final[frozenset[str]] = frozenset({"output_config"}) +_AnthropicMessages: TypeAlias = "list[dict[str, object]]" +_AnthropicSystem: TypeAlias = "str | list[dict[str, object]] | None" +_ContextManagementSpec: TypeAlias = "dict[str, object] | list[dict[str, object]] | None" -def _messages_have_compaction_block(messages: list[dict]) -> bool: + +def _messages_have_compaction_block(messages: _AnthropicMessages) -> bool: """Return True when any message carries a ``compaction`` content block.""" for msg in messages: content = msg.get("content") @@ -54,8 +59,10 @@ def _proxy_router_fallback() -> "Router | None": return _proxy_router -def _extract_proxy_litellm_metadata(kwargs: dict[str, Any]) -> dict[str, Any] | None: - """Return ``kwargs["litellm_metadata"]`` when it's a dict; ``None`` otherwise. +def _extract_proxy_litellm_metadata( + kwargs: Mapping[str, object], +) -> "tuple[dict[str, object], UserAPIKeyAuth | None] | tuple[None, None]": + """Return ``(kwargs["litellm_metadata"], its user_api_key_auth)`` when it's a dict; ``(None, None)`` otherwise. The proxy attaches its auth/spend-attribution fields (``user_api_key``, ``user_api_key_team_id``, ``litellm_call_id``, the full ``UserAPIKeyAuth`` @@ -68,18 +75,19 @@ def _extract_proxy_litellm_metadata(kwargs: dict[str, Any]) -> dict[str, Any] | """ litellm_metadata: Final = kwargs.get("litellm_metadata") if not isinstance(litellm_metadata, dict): - return None - return litellm_metadata + return None, None + user_api_key_auth: Final[UserAPIKeyAuth | None] = litellm_metadata.get("user_api_key_auth") + return litellm_metadata, user_api_key_auth async def _prepare_context_managed_request( *, model: str, - messages: list[dict], - tools: list[dict] | None, - system: Any | None, - context_management_spec: Any, - litellm_metadata: dict | None, + messages: _AnthropicMessages, + tools: list[dict[str, object]] | None, + system: _AnthropicSystem, + context_management_spec: _ContextManagementSpec, + litellm_metadata: dict[str, object] | None, additional_drop_params: list[str] | None, llm_router: "Router | None", user_api_key_auth: "UserAPIKeyAuth | None" = None, @@ -102,11 +110,11 @@ async def _prepare_context_managed_request( if polyfill_will_run: history_result: PolyfillResult | None = None - working_messages: list[dict] = messages - working_system: Any | None = system + working_messages: _AnthropicMessages = messages + working_system: _AnthropicSystem = system else: history_result = apply_client_compaction_block_history( - messages=cast(list[dict[str, Any]], messages), + messages=messages, system=system, ) working_messages = history_result.messages if history_result is not None else messages @@ -136,7 +144,7 @@ async def _prepare_context_managed_request( # to non-Anthropic backends that would reject them. if polyfill_will_run and history_result is None: history_result = apply_client_compaction_block_history( - messages=cast(list[dict[str, Any]], messages), + messages=messages, system=system, ) return history_result @@ -144,7 +152,7 @@ async def _prepare_context_managed_request( def _polyfill_will_run( *, - context_management_spec: Any, + context_management_spec: _ContextManagementSpec, additional_drop_params: list[str] | None, ) -> bool: """Return True when ``compact_20260112`` will run via the polyfill dispatcher. @@ -171,7 +179,7 @@ def _polyfill_will_run( def _spec_has_non_compact_edits( *, - context_management_spec: Any, + context_management_spec: _ContextManagementSpec, additional_drop_params: list[str] | None, ) -> bool: """Return True when the spec includes edits other than ``compact_20260112``. @@ -209,9 +217,9 @@ def _context_management_explicitly_dropped(additional_drop_params: list[str] | N def _normalize_spec_edits( *, - context_management_spec: Any, + context_management_spec: _ContextManagementSpec, additional_drop_params: list[str] | None, -) -> list[dict[str, Any]] | None: +) -> list[dict[str, object]] | None: """Return the normalized ``edits`` list, or ``None`` if the polyfill won't run. Delegates spec-shape normalization to the dispatcher's ``_normalize_spec`` @@ -236,11 +244,11 @@ def _normalize_spec_edits( async def _run_polyfill_if_enabled( *, model: str, - messages: list[dict], - tools: list[dict] | None, - system: Any | None, - context_management_spec: Any, - litellm_metadata: dict | None, + messages: _AnthropicMessages, + tools: list[dict[str, object]] | None, + system: _AnthropicSystem, + context_management_spec: _ContextManagementSpec, + litellm_metadata: dict[str, object] | None, additional_drop_params: list[str] | None, llm_router: "Router | None", user_api_key_auth: "UserAPIKeyAuth | None" = None, @@ -306,7 +314,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: def _route_openai_thinking_to_responses_api_if_needed( completion_kwargs: dict[str, Any], *, - thinking: dict[str, Any] | None, + thinking: Mapping[str, object] | None, ) -> None: """ When users call `litellm.anthropic.messages.*` with a non-Anthropic model and @@ -407,12 +415,12 @@ class LiteLLMMessagesToCompletionTransformationHandler: def _prepare_completion_kwargs( *, max_tokens: int, - messages: list[dict], + messages: _AnthropicMessages, model: str, metadata: dict | None = None, stop_sequences: list[str] | None = None, stream: bool | None = False, - system: str | list[dict[str, Any]] | None = None, + system: _AnthropicSystem = None, temperature: float | None = None, thinking: dict | None = None, tool_choice: dict | None = None, @@ -420,7 +428,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: top_k: int | None = None, top_p: float | None = None, output_format: dict | None = None, - extra_kwargs: dict[str, Any] | None = None, + extra_kwargs: Mapping[str, object] | None = None, ) -> tuple[dict[str, Any], dict[str, str]]: """Prepare kwargs for litellm.completion/acompletion. @@ -433,7 +441,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: Logging as LiteLLMLoggingObject, ) - request_data: Final = { + request_data: Final[dict[str, object]] = { "model": model, "messages": messages, "max_tokens": max_tokens, @@ -528,7 +536,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: @staticmethod async def async_anthropic_messages_handler( max_tokens: int, - messages: list[dict], + messages: _AnthropicMessages, model: str, metadata: dict | None = None, stop_sequences: list[str] | None = None, @@ -537,7 +545,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: temperature: float | None = None, thinking: dict | None = None, tool_choice: dict | None = None, - tools: list[dict] | None = None, + tools: list[dict[str, object]] | None = None, top_k: int | None = None, top_p: float | None = None, output_format: dict | None = None, @@ -551,10 +559,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: requested_router if requested_router is not None else _proxy_router_fallback() ) - proxy_litellm_metadata: Final = _extract_proxy_litellm_metadata(kwargs) - user_api_key_auth: Final[UserAPIKeyAuth | None] = ( - proxy_litellm_metadata.get("user_api_key_auth") if proxy_litellm_metadata is not None else None - ) + proxy_litellm_metadata, user_api_key_auth = _extract_proxy_litellm_metadata(kwargs) polyfill_result: Final = await _prepare_context_managed_request( model=model, @@ -618,7 +623,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: @staticmethod def anthropic_messages_handler( max_tokens: int, - messages: list[dict], + messages: _AnthropicMessages, model: str, metadata: dict | None = None, stop_sequences: list[str] | None = None, @@ -627,7 +632,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: temperature: float | None = None, thinking: dict | None = None, tool_choice: dict | None = None, - tools: list[dict] | None = None, + tools: list[dict[str, object]] | None = None, top_k: int | None = None, top_p: float | None = None, output_format: dict | None = None, @@ -688,10 +693,7 @@ class LiteLLMMessagesToCompletionTransformationHandler: if context_management is None and not _messages_have_compaction_block(messages): polyfill_result: PolyfillResult | None = None else: - proxy_litellm_metadata: Final = _extract_proxy_litellm_metadata(kwargs) - user_api_key_auth: Final[UserAPIKeyAuth | None] = ( - proxy_litellm_metadata.get("user_api_key_auth") if proxy_litellm_metadata is not None else None - ) + proxy_litellm_metadata, user_api_key_auth = _extract_proxy_litellm_metadata(kwargs) polyfill_result = run_async_function( _prepare_context_managed_request, model=model, diff --git a/litellm/llms/azure/assistants.py b/litellm/llms/azure/assistants.py index 671e4633af4..f7b419405ac 100644 --- a/litellm/llms/azure/assistants.py +++ b/litellm/llms/azure/assistants.py @@ -1,8 +1,9 @@ from collections.abc import Coroutine, Iterable -from typing import Any, Final, Literal +from typing import Any, Final, Literal, TypedDict import httpx from openai import AsyncAzureOpenAI, AzureOpenAI +from openai.types.shared_params.metadata import Metadata from typing_extensions import overload from ...types.llms.openai import ( @@ -22,6 +23,16 @@ from ...types.llms.openai import ( from .common_utils import BaseAzureLLM +class _RunThreadStreamData(TypedDict): + thread_id: str + assistant_id: str + additional_instructions: str | None + instructions: str | None + metadata: Metadata | None + model: str | None + tools: Iterable[AssistantToolParam] | None + + class AzureAssistantsAPI(BaseAzureLLM): def __init__(self) -> None: super().__init__() @@ -212,9 +223,9 @@ class AzureAssistantsAPI(BaseAzureLLM): response_obj: OpenAIMessage | None = None if getattr(thread_message, "status", None) is None: thread_message.status = "completed" - response_obj = OpenAIMessage(**thread_message.dict()) + response_obj = OpenAIMessage.model_validate(thread_message.dict()) else: - response_obj = OpenAIMessage(**thread_message.dict()) + response_obj = OpenAIMessage.model_validate(thread_message.dict()) return response_obj # fmt: off @@ -301,9 +312,9 @@ class AzureAssistantsAPI(BaseAzureLLM): response_obj: OpenAIMessage | None = None if getattr(thread_message, "status", None) is None: thread_message.status = "completed" - response_obj = OpenAIMessage(**thread_message.dict()) + response_obj = OpenAIMessage.model_validate(thread_message.dict()) else: - response_obj = OpenAIMessage(**thread_message.dict()) + response_obj = OpenAIMessage.model_validate(thread_message.dict()) return response_obj async def async_get_messages( @@ -443,7 +454,7 @@ class AzureAssistantsAPI(BaseAzureLLM): message_thread: Final = await openai_client.beta.threads.create(**data) - return Thread(**message_thread.dict()) + return Thread.model_validate(message_thread.dict()) # fmt: off @@ -539,7 +550,7 @@ class AzureAssistantsAPI(BaseAzureLLM): message_thread: Final = azure_openai_client.beta.threads.create(**data) - return Thread(**message_thread.dict()) + return Thread.model_validate(message_thread.dict()) async def async_get_thread( self, @@ -566,7 +577,7 @@ class AzureAssistantsAPI(BaseAzureLLM): response: Final = await openai_client.beta.threads.retrieve(thread_id=thread_id) - return Thread(**response.dict()) + return Thread.model_validate(response.dict()) # fmt: off @@ -642,7 +653,7 @@ class AzureAssistantsAPI(BaseAzureLLM): response: Final = openai_client.beta.threads.retrieve(thread_id=thread_id) - return Thread(**response.dict()) + return Thread.model_validate(response.dict()) # def delete_thread(self): # pass @@ -730,7 +741,8 @@ class AzureAssistantsAPI(BaseAzureLLM): event_handler: AssistantEventHandler | None, litellm_params: dict | None = None, ) -> AssistantStreamManager[AssistantEventHandler]: - data: Final[dict[str, Any]] = { + stream_fn: Final = client.beta.threads.runs.stream + base_data: Final[_RunThreadStreamData] = { "thread_id": thread_id, "assistant_id": assistant_id, "additional_instructions": additional_instructions, @@ -740,8 +752,8 @@ class AzureAssistantsAPI(BaseAzureLLM): "tools": tools, } if event_handler is not None: - data["event_handler"] = event_handler - return client.beta.threads.runs.stream(**data) + return stream_fn(**base_data, event_handler=event_handler) + return stream_fn(**base_data) # fmt: off diff --git a/litellm/proxy/_experimental/mcp_server/rest_endpoints.py b/litellm/proxy/_experimental/mcp_server/rest_endpoints.py index 76618e0f742..e285feb77ee 100644 --- a/litellm/proxy/_experimental/mcp_server/rest_endpoints.py +++ b/litellm/proxy/_experimental/mcp_server/rest_endpoints.py @@ -109,7 +109,7 @@ if MCP_AVAILABLE: ############ MCP Server REST API Routes ################# async def _safe_fire_mcp_tool_call_logging( logging_obj: Any | None, - result: Any, + result: "CallToolResult", start_time: datetime, end_time: datetime, user_api_key_auth: UserAPIKeyAuth | None = None, diff --git a/litellm/proxy/_experimental/mcp_server/server.py b/litellm/proxy/_experimental/mcp_server/server.py index 1c6ad84ddb4..49a1f1314f0 100644 --- a/litellm/proxy/_experimental/mcp_server/server.py +++ b/litellm/proxy/_experimental/mcp_server/server.py @@ -13,9 +13,9 @@ import time import traceback import types import uuid -from collections.abc import AsyncIterator, Callable, Mapping +from collections.abc import AsyncIterator, Callable, Mapping, Sequence from datetime import datetime -from typing import TYPE_CHECKING, Any, Final, cast +from typing import TYPE_CHECKING, Any, Final, Protocol import httpx from fastapi import FastAPI, HTTPException @@ -145,7 +145,7 @@ try: ) # Robust auth lookup keyed by session_object. - _session_obj_auth_storage: "weakref.WeakKeyDictionary[Any, MCPAuthenticatedUser]" = weakref.WeakKeyDictionary() + _session_obj_auth_storage: "weakref.WeakKeyDictionary[object, MCPAuthenticatedUser]" = weakref.WeakKeyDictionary() except ImportError as e: verbose_logger.debug("MCP module not found: %s", e) MCP_AVAILABLE = False @@ -493,14 +493,14 @@ if MCP_AVAILABLE: def _gateway_create_initialization_options( self, notification_options: NotificationOptions | None = None, - experimental_capabilities: dict[str, dict[str, Any]] | None = None, + experimental_capabilities: dict[str, dict[str, object]] | None = None, ) -> InitializationOptions: opts: Final = Server.create_initialization_options( self, notification_options=notification_options, experimental_capabilities=experimental_capabilities or {}, ) - updates: Final[dict[str, Any]] = {} + updates: Final[dict[str, str]] = {} merged: Final = _mcp_gateway_initialize_instructions.get() if merged is not None: updates["instructions"] = merged @@ -549,6 +549,17 @@ if MCP_AVAILABLE: _stateful_session_locks: Final[dict[str, asyncio.Lock]] = {} _stateful_session_active_request_counts: Final[dict[str, int]] = {} + class _TerminableTransport(Protocol): + async def terminate(self) -> None: ... + + class _TransportRegistry(Protocol): + def __contains__(self, session_id: object, /) -> bool: ... + + def pop(self, session_id: str, default: None, /) -> "_TerminableTransport | None": ... + + def _stateful_server_instances() -> _TransportRegistry: + return getattr(session_manager_stateful, "_server_instances", {}) + def _remove_stateful_session_tracking(session_id: str) -> None: _stateful_session_auth_contexts.pop(session_id, None) _stateful_session_auth_context_last_seen.pop(session_id, None) @@ -578,8 +589,8 @@ if MCP_AVAILABLE: ) -> None: """Terminate expired stateful sessions and drop their auth contexts.""" now = time.monotonic() if now is None else now - server_instances: Final = getattr(session_manager_stateful, "_server_instances", {}) - expired_session_ids: Final = [] + server_instances: Final = _stateful_server_instances() + expired_session_ids: Final[list[str]] = [] for session_id, last_seen in _stateful_session_auth_context_last_seen.items(): if _stateful_session_active_request_counts.get(session_id, 0) > 0: continue @@ -619,7 +630,7 @@ if MCP_AVAILABLE: session may proceed, or ``False`` when the caller is already at the cap with every session in flight (the new ``initialize`` should be rejected). """ - server_instances: Final = getattr(session_manager_stateful, "_server_instances", {}) + server_instances: Final = _stateful_server_instances() def _owned_live_session_ids() -> list[str]: return [ @@ -778,7 +789,7 @@ if MCP_AVAILABLE: get_virtual_tool_definitions, ) - return [Tool(**d) for d in get_virtual_tool_definitions()] + return [Tool.model_validate(d) for d in get_virtual_tool_definitions()] # Get mcp_servers from context variable verbose_logger.debug("MCP list_tools - Calling _list_mcp_tools") @@ -847,7 +858,7 @@ if MCP_AVAILABLE: async def _build_virtual_call_logging_obj( name: str, - arguments: dict[str, Any], + arguments: dict[str, object], user_api_key_auth: UserAPIKeyAuth, ) -> LiteLLMLoggingObj | None: """Run the pre-call pipeline (guardrails + logging setup) for a virtual @@ -885,7 +896,7 @@ if MCP_AVAILABLE: async def _dispatch_virtual_mcp_tool( name: str, - arguments: dict[str, Any] | None, + arguments: dict[str, object] | None, user_api_key_auth: UserAPIKeyAuth | None, client_ip: str | None, mcp_servers: list[str] | None = None, @@ -957,7 +968,7 @@ if MCP_AVAILABLE: ) @server.call_tool() - async def mcp_server_tool_call(name: str, arguments: dict[str, Any] | None) -> CallToolResult: + async def mcp_server_tool_call(name: str, arguments: dict[str, object] | None) -> CallToolResult: """ Call a specific tool with the provided arguments Args: @@ -1621,7 +1632,7 @@ if MCP_AVAILABLE: async def _get_user_oauth_extra_headers_from_db( server: MCPServer, user_api_key_auth: UserAPIKeyAuth | None, - prefetched_creds: dict[str, dict[str, Any]] | None = None, + prefetched_creds: 'Mapping[str, "OAuthCredentialPayload"] | None' = None, ) -> dict[str, str] | None: """Stored OAuth2 token for (user, server) as an ``Authorization: Bearer`` header, or None. @@ -1646,7 +1657,7 @@ if MCP_AVAILABLE: Returns a dict keyed by server_id to avoid N+1 queries in asyncio.gather loops. """ - user_id: Final = getattr(user_api_key_auth, "user_id", None) if user_api_key_auth else None + user_id: Final[str | None] = getattr(user_api_key_auth, "user_id", None) if user_api_key_auth else None if not user_id: return {} try: @@ -1871,7 +1882,7 @@ if MCP_AVAILABLE: list_tools_start_time: Final = datetime.now() litellm_logging_obj: LiteLLMLoggingObj | None = None - list_tools_request_data: dict[str, Any] = {} + list_tools_request_data: dict[str, object] = {} if log_list_tools_to_spendlogs: # This is intentionally minimal: only async_success_handler / post_call_failure_hook @@ -1879,7 +1890,7 @@ if MCP_AVAILABLE: list_tools_call_id: Final = str(uuid.uuid4()) # Derive trace_id from raw_headers when not explicitly passed (same as A2A / MCP call_tool) effective_litellm_trace_id: Final = litellm_trace_id or get_chain_id_from_headers(raw_headers) - spend_logs_metadata: Final[dict[str, Any]] = { + spend_logs_metadata: Final[dict[str, object]] = { "mcp_operation": "list_tools", } if isinstance(list_tools_log_source, str): @@ -2615,7 +2626,7 @@ if MCP_AVAILABLE: async def execute_mcp_tool( name: str, - arguments: dict[str, Any], + arguments: dict[str, object], allowed_mcp_servers: list[MCPServer], start_time: datetime, user_api_key_auth: UserAPIKeyAuth | None = None, @@ -2882,7 +2893,7 @@ if MCP_AVAILABLE: _request_auth_header.reset(_auth_token) _request_extra_headers.reset(_extra_token) _request_resolved_auth_headers.reset(_resolved_token) - response = CallToolResult(content=cast(Any, local_content), isError=False) + response = CallToolResult(content=local_content, isError=False) # Try managed MCP server tool (the name is bare; the prefix boundary was # already resolved above against this server's registered prefixes) @@ -2956,7 +2967,7 @@ if MCP_AVAILABLE: arguments = hook_result["arguments"] # pyright: ignore[reportAny] # hook returns untyped args local_content = await _handle_local_mcp_tool(original_tool_name, arguments) - response = CallToolResult(content=cast(Any, local_content), isError=False) + response = CallToolResult(content=local_content, isError=False) return await _run_post_mcp_call_guardrails( result=response, @@ -3003,7 +3014,7 @@ if MCP_AVAILABLE: async def _fire_mcp_tool_call_logging( logging_obj: LiteLLMLoggingObj, - result: Any, + result: CallToolResult, start_time: datetime, end_time: datetime, user_api_key_auth: UserAPIKeyAuth | None = None, @@ -3070,7 +3081,7 @@ if MCP_AVAILABLE: @client async def call_mcp_tool( name: str, - arguments: dict[str, Any] | None = None, + arguments: dict[str, object] | None = None, user_api_key_auth: UserAPIKeyAuth | None = None, mcp_auth_header: str | None = None, mcp_servers: list[str] | None = None, @@ -3161,7 +3172,7 @@ if MCP_AVAILABLE: async def mcp_get_prompt( name: str, - arguments: dict[str, Any] | None = None, + arguments: dict[str, object] | None = None, user_api_key_auth: UserAPIKeyAuth | None = None, mcp_auth_header: str | None = None, mcp_servers: list[str] | None = None, @@ -3262,7 +3273,7 @@ if MCP_AVAILABLE: def _get_standard_logging_mcp_tool_call( name: str, - arguments: dict[str, Any], + arguments: dict[str, object], server_name: str | None, session_id: str | None = None, ) -> StandardLoggingMCPToolCall: @@ -3291,13 +3302,13 @@ if MCP_AVAILABLE: async def _handle_managed_mcp_tool( server_name: str, name: str, - arguments: dict[str, Any], + arguments: dict[str, object], user_api_key_auth: UserAPIKeyAuth | None = None, mcp_auth_header: str | None = None, mcp_server_auth_headers: dict[str, dict[str, str]] | None = None, oauth2_headers: dict[str, str] | None = None, raw_headers: dict[str, str] | None = None, - litellm_logging_obj: Any | None = None, + litellm_logging_obj: LiteLLMLoggingObj | None = None, host_progress_callback: Callable | None = None, ) -> CallToolResult: """Handle tool execution for managed server tools""" @@ -3320,7 +3331,7 @@ if MCP_AVAILABLE: return call_tool_result async def _handle_local_mcp_tool( - name: str, arguments: dict[str, Any] + name: str, arguments: dict[str, object] ) -> list[TextContent | ImageContent | EmbeddedResource]: """ Handle tool execution for local registry tools @@ -3426,7 +3437,8 @@ if MCP_AVAILABLE: Extract mcp-session-id from ASGI scope headers. Returns None if not present. """ - for header_name, header_value in scope.get("headers", []): + scope_headers: Final[Sequence[tuple[bytes | str, bytes | str]]] = scope.get("headers", []) + for header_name, header_value in scope_headers: name = header_name if isinstance(header_name, bytes) else header_name.encode() if name.lower() == b"mcp-session-id": return header_value.decode() if isinstance(header_value, bytes) else str(header_value) @@ -3528,7 +3540,7 @@ if MCP_AVAILABLE: if message.get("type") != "http.request": break - body = message.get("body", b"") or b"" + body: bytes = message.get("body", b"") or b"" if body: # Only retain up to the remaining peek budget for sniffing. # The full ``message`` is already in memory (delivered by @@ -3571,9 +3583,9 @@ if MCP_AVAILABLE: Fixes https://github.com/BerriAI/litellm/issues/20992 """ _mcp_session_header: Final = b"mcp-session-id" - _headers: Final = scope.get("headers", []) + _headers: Final[Sequence[tuple[bytes | str, bytes | str]]] = scope.get("headers", []) - def _normalize_header_name(header_name: Any) -> bytes | None: + def _normalize_header_name(header_name: object) -> bytes | None: if isinstance(header_name, bytes): return header_name.lower() if isinstance(header_name, str): @@ -3902,7 +3914,8 @@ if MCP_AVAILABLE: def _get_authorization_header_from_scope(scope: Scope) -> str | None: """First ``Authorization`` header value in the ASGI scope, or None.""" - for key, value in scope.get("headers", []): + scope_headers: Final[Sequence[tuple[bytes, bytes]]] = scope.get("headers", []) + for key, value in scope_headers: if key.lower() == b"authorization": return value.decode("latin-1") return None @@ -3921,7 +3934,8 @@ if MCP_AVAILABLE: ``MCPRequestHandler.process_mcp_request``), and forwarding it upstream would leak the proxy key to a third-party MCP server. """ - has_litellm_key_header: Final = any(key.lower() == b"x-litellm-api-key" for key, _ in scope.get("headers", [])) + scope_headers: Final[Sequence[tuple[bytes, bytes]]] = scope.get("headers", []) + has_litellm_key_header: Final = any(key.lower() == b"x-litellm-api-key" for key, _ in scope_headers) if not has_litellm_key_header: return None return _get_authorization_header_from_scope(scope) @@ -4115,7 +4129,7 @@ if MCP_AVAILABLE: async def handle_streamable_http_mcp(scope: Scope, receive: Receive, send: Send) -> None: """Handle MCP requests through StreamableHTTP.""" try: - path: Final = scope.get("path", "") + path: Final[str] = scope.get("path", "") ( user_api_key_auth, mcp_auth_header, @@ -4135,7 +4149,8 @@ if MCP_AVAILABLE: ) # Strip any client-supplied x-mcp-toolset-id to prevent forgery. - scope["headers"] = [(k, v) for k, v in scope.get("headers", []) if k.lower() != b"x-mcp-toolset-id"] + scope_headers: Final[Sequence[tuple[bytes, bytes]]] = scope.get("headers", []) + scope["headers"] = [(k, v) for k, v in scope_headers if k.lower() != b"x-mcp-toolset-id"] # Apply toolset scope if set server-side via ContextVar (set by # /toolset/{name}/mcp and /{name}/mcp route handlers in proxy_server.py). @@ -4436,7 +4451,7 @@ if MCP_AVAILABLE: async def handle_sse_mcp(scope: Scope, receive: Receive, send: Send) -> None: """Handle MCP requests through SSE.""" try: - path: Final = scope.get("path", "") + path: Final[str] = scope.get("path", "") ( user_api_key_auth, mcp_auth_header, @@ -4456,7 +4471,8 @@ if MCP_AVAILABLE: ) # Strip any client-supplied x-mcp-toolset-id to prevent forgery. - scope["headers"] = [(k, v) for k, v in scope.get("headers", []) if k.lower() != b"x-mcp-toolset-id"] + scope_headers: Final[Sequence[tuple[bytes, bytes]]] = scope.get("headers", []) + scope["headers"] = [(k, v) for k, v in scope_headers if k.lower() != b"x-mcp-toolset-id"] # Apply toolset scope if set server-side via ContextVar so the # downstream probe list matches the fully-authorized server set @@ -4680,7 +4696,8 @@ if MCP_AVAILABLE: ) -> Send: async def wrapped_send(message: Message) -> None: if message.get("type") == "http.response.start": - for key, value in message.get("headers", []): + response_headers: Final[Sequence[tuple[bytes | str, bytes | str]]] = message.get("headers", []) + for key, value in response_headers: header_name = key if isinstance(key, bytes) else str(key).encode() if header_name.lower() == b"mcp-session-id": session_id = value.decode() if isinstance(value, bytes) else str(value) diff --git a/litellm/proxy/guardrails/guardrail_endpoints.py b/litellm/proxy/guardrails/guardrail_endpoints.py index 761d8aabc8a..b68d4a68b79 100644 --- a/litellm/proxy/guardrails/guardrail_endpoints.py +++ b/litellm/proxy/guardrails/guardrail_endpoints.py @@ -6,10 +6,10 @@ import concurrent.futures import inspect import json import os -from collections.abc import Mapping, Sequence +from collections.abc import Awaitable, Callable, Mapping, Sequence from datetime import datetime, timezone from types import UnionType -from typing import TYPE_CHECKING, Any, Final, Literal, TypeVar, Union, cast, get_args, get_origin +from typing import TYPE_CHECKING, Any, Final, Literal, Protocol, TypeVar, Union, cast, get_args, get_origin from urllib.parse import urlparse from fastapi import APIRouter, Depends, HTTPException, Request @@ -54,8 +54,8 @@ from litellm.types.guardrails import ( if TYPE_CHECKING: from types import CodeType - from prisma.actions import LiteLLM_GuardrailsTableActions from prisma.models import LiteLLM_GuardrailsTable + from pydantic.fields import FieldInfo from litellm.proxy.utils import PrismaClient @@ -65,24 +65,44 @@ router: Final = APIRouter() GUARDRAIL_REGISTRY: Final = GuardrailRegistry() -def _guardrails_table(prisma_client: "PrismaClient") -> "LiteLLM_GuardrailsTableActions[LiteLLM_GuardrailsTable]": - table: Final[LiteLLM_GuardrailsTableActions[LiteLLM_GuardrailsTable]] = GuardrailsRepository(prisma_client).table +class _GuardrailsTableActions(Protocol): + async def create(self, data: Mapping[str, object]) -> "LiteLLM_GuardrailsTable": ... + + async def delete(self, where: Mapping[str, object]) -> "LiteLLM_GuardrailsTable | None": ... + + async def find_unique(self, where: Mapping[str, object]) -> "LiteLLM_GuardrailsTable | None": ... + + async def find_many( + self, where: Mapping[str, object], order: Mapping[str, str] + ) -> "Sequence[LiteLLM_GuardrailsTable]": ... + + async def update( + self, where: Mapping[str, object], data: Mapping[str, object] + ) -> "LiteLLM_GuardrailsTable | None": ... + + +def _as_str_object_mapping(mapping: Mapping[str, object]) -> Mapping[str, object]: + return mapping + + +def _guardrails_table(prisma_client: "PrismaClient") -> _GuardrailsTableActions: + table: Final[_GuardrailsTableActions] = GuardrailsRepository(prisma_client).table return table async def _create_guardrail_row(prisma_client: "PrismaClient", data: Mapping[str, object]) -> "LiteLLM_GuardrailsTable": - row: Final[LiteLLM_GuardrailsTable] = await GuardrailsRepository(prisma_client).table.create(data=data) + row: Final = await _guardrails_table(prisma_client).create(data=data) return row async def _delete_guardrail_row(prisma_client: "PrismaClient", where: Mapping[str, object]) -> None: - await GuardrailsRepository(prisma_client).table.delete(where=where) + await _guardrails_table(prisma_client).delete(where=where) async def _find_team_guardrail_rows( prisma_client: "PrismaClient", where: Mapping[str, object] ) -> "Sequence[LiteLLM_GuardrailsTable]": - rows: Final[Sequence[LiteLLM_GuardrailsTable]] = await GuardrailsRepository(prisma_client).table.find_many( + rows: Final = await _guardrails_table(prisma_client).find_many( where=where, order={"created_at": "desc"}, ) @@ -499,10 +519,12 @@ async def update_guardrail( if existing_guardrail is None: raise HTTPException(status_code=404, detail=f"Guardrail with ID {guardrail_id} not found") - result: Final = await GUARDRAIL_REGISTRY.update_guardrail_in_db( - guardrail_id=guardrail_id, - guardrail=request.guardrail, - prisma_client=prisma_client, + result: Final = _as_str_object_mapping( + await GUARDRAIL_REGISTRY.update_guardrail_in_db( + guardrail_id=guardrail_id, + guardrail=request.guardrail, + prisma_client=prisma_client, + ) ) guardrail_name: Final = result.get("guardrail_name", "Unknown") @@ -613,7 +635,7 @@ class RegisterGuardrailRequest(BaseModel): """Request body for POST /guardrails/register. Follows Generic Guardrail API config.""" guardrail_name: str - litellm_params: dict[str, Any] # guardrail, mode, api_base required; api_key, headers, etc. optional + litellm_params: dict[str, object] # guardrail, mode, api_base required; api_key, headers, etc. optional guardrail_info: dict[str, object] | None = None team_id: str | None = None @@ -1172,12 +1194,14 @@ async def patch_guardrail( ) # Update litellm_params if default_on is provided or pii_entities_config is provided - litellm_params = LitellmParams(**dict(existing_guardrail.get("litellm_params", {}))) + existing_litellm_params: Final = _as_str_object_mapping(dict(existing_guardrail.get("litellm_params", {}))) + litellm_params = LitellmParams(**existing_litellm_params) if request.litellm_params is not None: requested_litellm_params: Final = request.litellm_params.model_dump(exclude_unset=True) litellm_params_dict: Final = litellm_params.model_dump(exclude_unset=True) litellm_params_dict.update(requested_litellm_params) - litellm_params = LitellmParams(**litellm_params_dict) + merged_litellm_params: Final = _as_str_object_mapping(litellm_params_dict) + litellm_params = LitellmParams(**merged_litellm_params) # Update guardrail_info if provided guardrail_info: Final = ( @@ -1193,10 +1217,12 @@ async def patch_guardrail( litellm_params=litellm_params, guardrail_info=guardrail_info, ) - result: Final = await GUARDRAIL_REGISTRY.update_guardrail_in_db( - guardrail_id=guardrail_id, - guardrail=guardrail, - prisma_client=prisma_client, + result: Final = _as_str_object_mapping( + await GUARDRAIL_REGISTRY.update_guardrail_in_db( + guardrail_id=guardrail_id, + guardrail=guardrail, + prisma_client=prisma_client, + ) ) guardrail_name = result.get("guardrail_name", "Unknown") @@ -1552,31 +1578,46 @@ async def validate_blocked_words_file(request: dict[str, str]): return {"valid": False, "error": f"Validation error: {e}"} -def _get_field_type_from_annotation(field_annotation: Any) -> str: +def _dunder_origin(annotation: object) -> object: + origin: Final[object] = getattr(annotation, "__origin__", None) + return origin + + +def _dunder_name(annotation: object) -> object: + name: Final[object] = getattr(annotation, "__name__", None) + return name + + +def _dunder_args(annotation: object) -> tuple[object, ...]: + args: Final[tuple[object, ...]] = getattr(annotation, "__args__", ()) + return args + + +def _get_field_type_from_annotation(field_annotation: object) -> str: """ Convert a Python type annotation to a UI-friendly type string """ # Handle Union types (like Optional[T]) if get_origin(field_annotation) is Union or get_origin(field_annotation) is UnionType: # For Optional[T], get the non-None type - args: Final = get_args(field_annotation) + args: Final[tuple[object, ...]] = get_args(field_annotation) non_none_args: Final = [arg for arg in args if arg is not type(None)] if non_none_args: field_annotation = non_none_args[0] # Handle List types - if hasattr(field_annotation, "__origin__") and field_annotation.__origin__ is list: + if hasattr(field_annotation, "__origin__") and _dunder_origin(field_annotation) is list: return "array" # Handle Dict types - if hasattr(field_annotation, "__origin__") and field_annotation.__origin__ is dict: + if hasattr(field_annotation, "__origin__") and _dunder_origin(field_annotation) is dict: return "dict" # Handle Literal types if hasattr(field_annotation, "__origin__") and hasattr(field_annotation, "__args__"): # Check for Literal types (Python 3.8+) - origin: Final = field_annotation.__origin__ - if hasattr(origin, "__name__") and origin.__name__ == "Literal": + origin: Final = _dunder_origin(field_annotation) + if hasattr(origin, "__name__") and _dunder_name(origin) == "Literal": return "select" # For dropdown/select inputs # Handle basic types @@ -1595,66 +1636,66 @@ def _get_field_type_from_annotation(field_annotation: Any) -> str: return "string" -def _extract_literal_values(annotation: Any) -> list[str]: +def _extract_literal_values(annotation: object) -> Sequence[object]: """ Extract literal values from a Literal type annotation """ if hasattr(annotation, "__origin__") and hasattr(annotation, "__args__"): - origin: Final = annotation.__origin__ - if hasattr(origin, "__name__") and origin.__name__ == "Literal": - return list(annotation.__args__) + origin: Final = _dunder_origin(annotation) + if hasattr(origin, "__name__") and _dunder_name(origin) == "Literal": + return list(_dunder_args(annotation)) return [] -def _get_dict_key_options(field_annotation: Any) -> list[str] | None: +def _get_dict_key_options(field_annotation: object) -> Sequence[object] | None: """ Extract key options from Dict[Literal[...], T] types """ if ( hasattr(field_annotation, "__origin__") - and field_annotation.__origin__ is dict + and _dunder_origin(field_annotation) is dict and hasattr(field_annotation, "__args__") ): - args: Final = field_annotation.__args__ + args: Final = _dunder_args(field_annotation) if len(args) >= 2: key_type: Final = args[0] return _extract_literal_values(key_type) return None -def _get_dict_value_type(field_annotation: Any) -> str: +def _get_dict_value_type(field_annotation: object) -> str: """ Get the value type from Dict[K, V] types """ if ( hasattr(field_annotation, "__origin__") - and field_annotation.__origin__ is dict + and _dunder_origin(field_annotation) is dict and hasattr(field_annotation, "__args__") ): - args: Final = field_annotation.__args__ + args: Final = _dunder_args(field_annotation) if len(args) >= 2: value_type: Final = args[1] return _get_field_type_from_annotation(value_type) return "string" -def _get_list_element_options(field_annotation: Any) -> list[str] | None: +def _get_list_element_options(field_annotation: object) -> Sequence[object] | None: """ Extract element options from List[Literal[...]] types """ if ( hasattr(field_annotation, "__origin__") - and field_annotation.__origin__ is list + and _dunder_origin(field_annotation) is list and hasattr(field_annotation, "__args__") ): - args: Final = field_annotation.__args__ + args: Final = _dunder_args(field_annotation) if len(args) >= 1: element_type: Final = args[0] return _extract_literal_values(element_type) return None -def _should_skip_optional_params(field_name: str, field_annotation: Any) -> bool: +def _should_skip_optional_params(field_name: str, field_annotation: object) -> bool: """Check if optional_params field should be skipped (not meaningfully overridden).""" if field_name != "optional_params": return False @@ -1664,12 +1705,12 @@ def _should_skip_optional_params(field_name: str, field_annotation: Any) -> bool # Check if the annotation is still a generic TypeVar (not specialized) if isinstance(field_annotation, TypeVar) or ( - hasattr(field_annotation, "__origin__") and field_annotation.__origin__ is TypeVar + hasattr(field_annotation, "__origin__") and _dunder_origin(field_annotation) is TypeVar ): return True # Also skip if it's a generic type that wasn't specialized - if hasattr(field_annotation, "__name__") and field_annotation.__name__ in ( + if hasattr(field_annotation, "__name__") and _dunder_name(field_annotation) in ( "T", "TypeVar", ): @@ -1677,18 +1718,18 @@ def _should_skip_optional_params(field_name: str, field_annotation: Any) -> bool # Handle Optional[T] where T is still a TypeVar if hasattr(field_annotation, "__args__"): - non_none_args: Final = [arg for arg in field_annotation.__args__ if arg is not type(None)] + non_none_args: Final = [arg for arg in _dunder_args(field_annotation) if arg is not type(None)] if non_none_args and isinstance(non_none_args[0], TypeVar): return True return False -def _unwrap_optional_type(field_annotation: Any) -> Any: +def _unwrap_optional_type(field_annotation: object) -> object: """Unwrap Optional types to get the actual type.""" if get_origin(field_annotation) is Union or get_origin(field_annotation) is UnionType: # For Optional[BaseModel], get the non-None type - args: Final = get_args(field_annotation) + args: Final[tuple[object, ...]] = get_args(field_annotation) non_none_args: Final = [arg for arg in args if arg is not type(None)] if non_none_args: return non_none_args[0] @@ -1696,20 +1737,20 @@ def _unwrap_optional_type(field_annotation: Any) -> Any: def _build_field_dict( - field: Any, - field_annotation: Any, + field: "FieldInfo", + field_annotation: object, description: str, required: bool, -) -> dict[str, Any]: +) -> dict[str, object]: """Build field dictionary for non-nested fields.""" # Determine the field type from annotation field_type = _get_field_type_from_annotation(field_annotation) # Check for custom UI type override - field_json_schema_extra: Final = getattr(field, "json_schema_extra", {}) + field_json_schema_extra: Final[Mapping[str, object]] = getattr(field, "json_schema_extra", {}) if field_json_schema_extra and "ui_type" in field_json_schema_extra: ui_type: Final = field_json_schema_extra["ui_type"] - field_type = ui_type.value if hasattr(ui_type, "value") else ui_type + field_type = getattr(ui_type, "value", ui_type) elif field_json_schema_extra and "type" in field_json_schema_extra: field_type = field_json_schema_extra["type"] @@ -1748,8 +1789,9 @@ def _build_field_dict( field_dict["options"] = literal_options # Add default value if it exists - if field.default is not None and field.default is not ...: - field_dict["default_value"] = field.default + field_default: Final[object] = getattr(field, "default", None) + if field_default is not None and field_default is not ...: + field_dict["default_value"] = field_default # Copy min, max, step from json_schema_extra for number/percentage inputs if field_json_schema_extra: @@ -1763,7 +1805,7 @@ def _build_field_dict( def _extract_fields_recursive( model: type[BaseModel], depth: int = 0, -) -> dict[str, Any]: +) -> dict[str, object]: # Check if we've exceeded the maximum recursion depth if depth > DEFAULT_MAX_RECURSE_DEPTH: raise HTTPException( @@ -1817,7 +1859,7 @@ def _extract_fields_recursive( return fields -def _get_fields_from_model(model_class: type[BaseModel]) -> dict[str, Any]: +def _get_fields_from_model(model_class: type[BaseModel]) -> dict[str, object]: """ Get the fields from a Pydantic model as a nested dictionary structure """ @@ -2141,7 +2183,26 @@ def _resolve_guardrail_input_type(active_guardrail: CustomGuardrail, input_type: return "response" if input_type == "response" else "request" -def _patch_logging_obj_for_guardrail(litellm_logging_obj: Any, request: ApplyGuardrailRequest) -> None: +class _GuardrailLoggingObj(Protocol): + call_type: str + model_call_details: dict[str, object] + + @property + def update_messages(self) -> "Callable[..., object]": ... + + @property + def async_success_handler(self) -> "Callable[..., Awaitable[object]]": ... + + @property + def success_handler(self) -> "Callable[..., object]": ... + + +class _GuardrailProxyLogging(Protocol): + @property + def post_call_success_hook(self) -> "Callable[..., Awaitable[object]]": ... + + +def _patch_logging_obj_for_guardrail(litellm_logging_obj: _GuardrailLoggingObj, request: ApplyGuardrailRequest) -> None: """Configure the logging object so Langfuse/OTEL extract input and output correctly.""" litellm_logging_obj.call_type = "pass_through_endpoint" litellm_logging_obj.model_call_details["call_type"] = "pass_through_endpoint" @@ -2151,8 +2212,8 @@ def _patch_logging_obj_for_guardrail(litellm_logging_obj: Any, request: ApplyGua async def _emit_guardrail_success_logs( - proxy_logging_obj: Any, - litellm_logging_obj: Any, + proxy_logging_obj: _GuardrailProxyLogging, + litellm_logging_obj: _GuardrailLoggingObj | None, data: dict, user_api_key_dict: UserAPIKeyAuth, response: ApplyGuardrailResponse, diff --git a/litellm/proxy/guardrails/guardrail_hooks/cisco_ai_defense/cisco_ai_defense.py b/litellm/proxy/guardrails/guardrail_hooks/cisco_ai_defense/cisco_ai_defense.py index 068a3ecf31b..facb822d00d 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/cisco_ai_defense/cisco_ai_defense.py +++ b/litellm/proxy/guardrails/guardrail_hooks/cisco_ai_defense/cisco_ai_defense.py @@ -19,7 +19,7 @@ request is sent with the ``X-Cisco-AI-Defense-API-Key`` header. import json import os -from collections.abc import AsyncIterator +from collections.abc import AsyncIterator, Mapping, Sequence from dataclasses import dataclass, replace from datetime import datetime from typing import TYPE_CHECKING, Any, Final, Literal @@ -94,13 +94,13 @@ class _CiscoVerdict: is_safe: bool | None classifications: list[str] severity: str | None - rules: list[dict[str, Any]] + rules: list[dict[str, object]] explanation: str | None event_id: str | None action: str | None = None sanitized_text: str | None = None - sanitized_messages: list[dict[str, Any]] | None = None - sanitized_mcp_arguments: dict[str, Any] | None = None + sanitized_messages: list[dict[str, object]] | None = None + sanitized_mcp_arguments: dict[str, object] | None = None class CiscoAIDefenseGuardrailMissingSecrets(Exception): @@ -136,7 +136,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): api_base: str | None = None, inspection_type: str | None = None, inspect_path: str | None = None, - enabled_rules: list[dict[str, Any]] | None = None, + enabled_rules: Sequence[object] | None = None, integration_profile_id: str | None = None, integration_profile_version: str | None = None, integration_tenant_id: str | None = None, @@ -415,7 +415,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): async def async_post_call_streaming_iterator_hook( self, user_api_key_dict: UserAPIKeyAuth, - response: AsyncIterator[Any], + response: AsyncIterator[object], request_data: dict, ): """Buffer and inspect streaming chat output before delivery.""" @@ -437,7 +437,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): self.guardrail_name, ) - all_chunks: Final[list[Any]] = [] + all_chunks: Final[list[object]] = [] try: async for chunk in response: all_chunks.append(chunk) @@ -497,7 +497,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): response_obj=assembled, ) except HTTPException as exc: - error_obj: dict[str, Any] = self._http_exception_to_error_obj(exc) + error_obj: dict[str, object] = self._http_exception_to_error_obj(exc) verbose_proxy_logger.warning( "Cisco AI Defense guardrail (%s): streaming response " "blocked — emitting SSE error event instead of " @@ -531,7 +531,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): for chunk in all_chunks: yield chunk - def _build_block_payload(self, context: _ScanContext, verdict: _CiscoVerdict) -> dict[str, Any]: + def _build_block_payload(self, context: _ScanContext, verdict: _CiscoVerdict) -> dict[str, object]: """Canonical block payload used across all four block paths. Same dict is the ``HTTPException.detail`` for chat / MCP request @@ -555,34 +555,34 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): "event_id": verdict.event_id, } - def _http_exception_to_error_obj(self, exc: HTTPException) -> dict[str, Any]: + def _http_exception_to_error_obj(self, exc: HTTPException) -> dict[str, object]: """Wrap an ``HTTPException`` detail into the SSE ``error`` payload. For Cisco's own blocks the detail is already the canonical block payload, so this is a near-passthrough that just adds ``code`` / ``guardrail`` defaults for non-Cisco / unstructured details. """ - error_obj: dict[str, Any] = dict(exc.detail) if isinstance(exc.detail, dict) else {"message": str(exc.detail)} + error_obj: dict[str, object] = {**exc.detail} if isinstance(exc.detail, dict) else {"message": str(exc.detail)} error_obj.setdefault("message", error_obj.get("error", "Guardrail block")) error_obj.setdefault("code", exc.status_code) error_obj.setdefault("guardrail", self.guardrail_name) return error_obj @classmethod - def _streaming_content_was_modified(cls, original_chunks: list[Any], assembled: ModelResponse) -> bool: + def _streaming_content_was_modified(cls, original_chunks: Sequence[object], assembled: ModelResponse) -> bool: """Decide whether redact changed content or tool/function arguments.""" original_text: Final = cls._extract_streaming_chunk_scan_text(original_chunks) assembled_text: Final = " ".join(m.get("content", "") for m in cls._extract_response_messages(assembled)) return original_text != assembled_text @classmethod - def _extract_streaming_chunk_scan_text(cls, chunks: list[Any]) -> str: + def _extract_streaming_chunk_scan_text(cls, chunks: Sequence[object]) -> str: original_text = "" argument_text = "" for chunk in chunks: choices = getattr(chunk, "choices", None) or [] for c in choices: - delta = getattr(c, "delta", None) + delta: object | None = getattr(c, "delta", None) if delta is None: continue text = getattr(delta, "content", None) @@ -595,7 +595,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): args = cls._extract_tool_call_arguments(tc) if args: argument_text += args - fc = getattr(delta, "function_call", None) + fc: object | None = getattr(delta, "function_call", None) if fc is not None: args = cls._extract_function_call_arguments(fc) if args: @@ -673,7 +673,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): allow, WARNING for intervened/redacted, ERROR is left for upstream API failures. """ - fields: Final[dict[str, Any]] = { + fields: Final[dict[str, object]] = { "guardrail": self.guardrail_name, "surface": context.surface, "direction": context.direction, @@ -752,7 +752,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): user_api_key_dict: UserAPIKeyAuth, direction: str = "input", response_obj: object = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: url: Final = f"{self.api_base}{self.inspect_path}" payload: Final = self._build_chat_payload(messages, request_data, user_api_key_dict) start_time: Final = datetime.now() @@ -784,7 +784,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): messages: list[dict[str, str]], request_data: dict, user_api_key_dict: UserAPIKeyAuth, - ) -> dict[str, Any]: + ) -> dict[str, object]: return { "messages": messages, "metadata": self._build_metadata(request_data, user_api_key_dict), @@ -798,9 +798,9 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): async def _post_inspection( self, url: str, - payload: dict[str, Any], + payload: dict[str, object], surface: str, - ) -> dict[str, Any]: + ) -> dict[str, object]: headers: Final = self._build_headers() verbose_proxy_logger.debug( "Cisco AI Defense guardrail: posting %s inspection to %s", @@ -856,8 +856,8 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): self, request_data: dict, user_api_key_dict: UserAPIKeyAuth, - ) -> dict[str, Any]: - metadata: Final[dict[str, Any]] = {} + ) -> dict[str, object]: + metadata: Final[dict[str, object]] = {} user: Final = request_data.get("user") or getattr(user_api_key_dict, "user_id", None) if user: @@ -884,8 +884,8 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return metadata - def _build_config(self) -> dict[str, Any]: - config: Final[dict[str, Any]] = {} + def _build_config(self) -> dict[str, object]: + config: Final[dict[str, object]] = {} if self.enabled_rules: config["enabled_rules"] = self.enabled_rules if self.integration_profile_id: @@ -899,7 +899,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return config @staticmethod - def _normalize_rule(rule: object) -> dict[str, Any]: + def _normalize_rule(rule: object) -> dict[str, object]: """Coerce a user-supplied rule into the wire-shape dict Cisco expects. Accepts ``str``, ``dict``, and Pydantic model inputs. @@ -922,7 +922,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): rule = dumped if isinstance(rule, dict): - normalized: Final[dict[str, Any]] = {} + normalized: Final[dict[str, object]] = {} rule_name: Final = rule.get("rule_name") if rule_name: normalized["rule_name"] = rule_name @@ -950,7 +950,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): context: _ScanContext, start_time: datetime, response_obj: object = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """Parse, log, and (optionally) raise/redact on the Cisco verdict. ``context.direction`` is ``"input"`` for request scans and ``"output"`` @@ -1119,10 +1119,10 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): @classmethod def _sanitize_response_for_logging( cls, - inspect_response: dict[str, Any], + inspect_response: Mapping[str, object], surface: str, action: str | None = None, - ) -> dict[str, Any]: + ) -> dict[str, object]: """Drop bulky / privacy-sensitive fields, recursing into nested dicts. MCP verdicts are commonly nested under ``result``, so a @@ -1138,9 +1138,9 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return sanitized @classmethod - def _strip_sensitive_keys(cls, d: dict[str, Any]) -> dict[str, Any]: + def _strip_sensitive_keys(cls, d: Mapping[str, object]) -> dict[str, object]: """Recursively strip privacy-sensitive keys from a verdict dict.""" - out: Final[dict[str, Any]] = {} + out: Final[dict[str, object]] = {} for key, value in d.items(): if key.startswith("_") or key in cls._REDACTED_LOG_KEYS: continue @@ -1222,8 +1222,8 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): @staticmethod def _extract_jsonrpc_error( - inspect_response: dict[str, Any], - ) -> dict[str, Any] | None: + inspect_response: Mapping[str, object], + ) -> dict[str, object] | None: """Detect a JSON-RPC error envelope inside an HTTP 200 response. The Cisco Inspect API can return ``{"error": {...}}`` (or nest one @@ -1270,7 +1270,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): @staticmethod def _extract_sanitized_text( - inspect_response: dict[str, Any], + inspect_response: Mapping[str, object], ) -> str | None: """Pull ``sanitized_text`` (or camelCase variant) off the verdict.""" for key in ("sanitized_text", "sanitizedText"): @@ -1287,8 +1287,8 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): @staticmethod def _extract_sanitized_messages( - inspect_response: dict[str, Any], - ) -> list[dict[str, Any]] | None: + inspect_response: Mapping[str, object], + ) -> list[dict[str, object]] | None: """Pull a sanitized OpenAI-format messages array off the verdict. Cisco can return the rewrite under several keys; we accept any of @@ -1354,7 +1354,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): def _redact_mcp_input( request_data: dict, sanitized_text: str | None, - sanitized_mcp_arguments: dict[str, Any] | None, + sanitized_mcp_arguments: dict[str, object] | None, ) -> bool: """Rewrite MCP request arguments in all locations the proxy reads.""" if sanitized_mcp_arguments is not None: @@ -1388,7 +1388,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): self, request_data: dict, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: """Rewrite chat request input (``messages`` or ``input``).""" if sanitized_messages and self._extract_tool_definition_text(request_data): @@ -1444,7 +1444,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): cls, request_data: dict, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: if sanitized_messages: instruction_text: Final = cls._instruction_text_from_messages(sanitized_messages) @@ -1457,7 +1457,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return False @classmethod - def _instruction_text_from_messages(cls, messages: list[dict[str, Any]]) -> str | None: + def _instruction_text_from_messages(cls, messages: list[dict[str, object]]) -> str | None: for message in messages: if not isinstance(message, dict): continue @@ -1468,7 +1468,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return None @classmethod - def _non_instruction_messages(cls, messages: list[dict[str, Any]] | None) -> list[dict[str, Any]] | None: + def _non_instruction_messages(cls, messages: list[dict[str, object]] | None) -> list[dict[str, object]] | None: if messages is None: return None return [ @@ -1499,7 +1499,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): self, response_obj: object, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: """Rewrite chat response (``ModelResponse`` or ``ResponsesAPIResponse``).""" if response_obj is None: @@ -1526,7 +1526,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): def _redact_model_response_choices( choices: list, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: """Redact every returned choice, including tool-call/reasoning fields.""" if sanitized_messages: @@ -1570,7 +1570,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): def _redact_text_completion_choices( choices: list, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: """Rewrite ``/v1/completions`` text choices after Cisco redaction.""" replacement = sanitized_text @@ -1638,7 +1638,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): self, output_items: list, sanitized_text: str | None, - sanitized_messages: list[dict[str, Any]] | None, + sanitized_messages: list[dict[str, object]] | None, ) -> bool: replacement_text: str | None = sanitized_text if not replacement_text and sanitized_messages: @@ -1672,14 +1672,14 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): @staticmethod def _sanitized_messages_to_responses_input( - sanitized_messages: list[dict[str, Any]], - ) -> list[dict[str, Any]] | None: + sanitized_messages: list[dict[str, object]], + ) -> list[dict[str, object]] | None: """Convert chat-shape sanitized_messages to Responses API ``input``. Returns ``None`` if nothing usable could be converted, so the caller falls back to ``on_flagged_action``. """ - out: Final[list[dict[str, Any]]] = [] + out: Final[list[dict[str, object]]] = [] for m in sanitized_messages: if not isinstance(m, dict): continue @@ -1764,7 +1764,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): start_time: datetime | None = None, surface: str = "chat", direction: str = "input", - ) -> dict[str, Any]: + ) -> dict[str, object]: verbose_proxy_logger.error( "Cisco AI Defense guardrail (%s): API communication failed: %s", surface, @@ -2060,7 +2060,7 @@ class CiscoAIDefenseGuardrail(_CiscoAIDefenseMcpMixin, CustomGuardrail): return getattr(obj, key, None) @classmethod - def _field_list(cls, obj: object, key: str) -> list[Any]: + def _field_list(cls, obj: object, key: str) -> list[object]: value: Final = cls._field(obj, key) return value if isinstance(value, list) else [] diff --git a/litellm/proxy/guardrails/guardrail_hooks/unified_guardrail/unified_guardrail.py b/litellm/proxy/guardrails/guardrail_hooks/unified_guardrail/unified_guardrail.py index c29da89b15f..5bbb01c6c8e 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/unified_guardrail/unified_guardrail.py +++ b/litellm/proxy/guardrails/guardrail_hooks/unified_guardrail/unified_guardrail.py @@ -8,8 +8,8 @@ Unified Guardrail, leveraging LiteLLM's /applyGuardrail endpoint import copy import json -from collections.abc import AsyncGenerator -from typing import TYPE_CHECKING, Any, Final +from collections.abc import AsyncGenerator, AsyncIterable, Awaitable, Callable, Mapping, Sequence +from typing import TYPE_CHECKING, Any, Final, Protocol from fastapi import HTTPException @@ -34,6 +34,9 @@ if TYPE_CHECKING: # Imported lazily at runtime (inside the streaming hook) to avoid a # module-level cyclic import with litellm.integrations.custom_guardrail. from litellm.integrations.custom_guardrail import ModifyResponseException + from litellm.llms.base_llm.guardrail_translation.base_translation import ( + BaseTranslation, + ) # Call types that use NDJSON streaming (A2A); guardrail HTTPException is emitted as in-stream error A2A_CALL_TYPES: Final = (CallTypes.asend_message, CallTypes.send_message) @@ -41,12 +44,35 @@ A2A_CALL_TYPES: Final = (CallTypes.asend_message, CallTypes.send_message) GUARDRAIL_NAME: Final = "unified_llm_guardrails" +class _EndpointTranslation(Protocol): + @property + def process_input_messages(self) -> "Callable[..., Awaitable[dict[str, object]]]": ... + + @property + def process_output_response(self) -> "Callable[..., Awaitable[object]]": ... + + @property + def process_output_streaming_response(self) -> "Callable[..., Awaitable[object]]": ... + + @property + def build_block_sse_chunks(self) -> "Callable[..., Sequence[bytes] | None]": ... + + +def _as_endpoint_translation(translation: _EndpointTranslation) -> _EndpointTranslation: + return translation + + +def _chunk_choices(item: object) -> Sequence[object]: + choices: Final[Sequence[object]] = getattr(item, "choices", None) or [] + return choices + + class _StreamTerminated(Exception): """Internal signal that the incremental transform stream has already emitted its terminal chunks (block message or in-stream error) and must stop.""" -def _get_a2a_request_id(responses_so_far: list[Any], request_data: dict) -> str | None: +def _get_a2a_request_id(responses_so_far: Sequence[object], request_data: dict) -> str | None: """Get JSON-RPC request id from first A2A chunk or request body for in-stream error reporting.""" for item in responses_so_far: if isinstance(item, dict) and "id" in item: @@ -138,7 +164,9 @@ class UnifiedLLMGuardrails(CustomLogger): except ValueError: return data # handle unmapped call types - endpoint_translation: Final = endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + endpoint_translation: Final = _as_endpoint_translation( + endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + ) _ensure_litellm_metadata(data, user_api_key_dict) @@ -156,7 +184,7 @@ class UnifiedLLMGuardrails(CustomLogger): async def async_moderation_hook( self, data: dict, user_api_key_dict: UserAPIKeyAuth, call_type: CallTypesLiteral - ) -> Any: + ) -> object: """ Runs in parallel to LLM API call Runs on only Input @@ -187,7 +215,9 @@ class UnifiedLLMGuardrails(CustomLogger): if call_type is not None and CallTypes(call_type) not in endpoint_guardrail_translation_mappings: return data - endpoint_translation: Final = endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + endpoint_translation: Final = _as_endpoint_translation( + endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + ) _ensure_litellm_metadata(data, user_api_key_dict) @@ -202,7 +232,7 @@ class UnifiedLLMGuardrails(CustomLogger): data: dict, user_api_key_dict: UserAPIKeyAuth, response, - ) -> Any: + ) -> object: """ Runs on response from LLM API call @@ -271,7 +301,9 @@ class UnifiedLLMGuardrails(CustomLogger): ) return response - endpoint_translation: Final = endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + endpoint_translation: Final = _as_endpoint_translation( + endpoint_guardrail_translation_mappings[CallTypes(call_type)]() + ) try: response = await endpoint_translation.process_output_response( @@ -299,10 +331,10 @@ class UnifiedLLMGuardrails(CustomLogger): async def _handle_streaming_block( self, exc: "ModifyResponseException", - endpoint_translation: Any, + endpoint_translation: _EndpointTranslation, stream_started: bool, - responses_so_far: list[Any], - ) -> AsyncGenerator[Any, None]: + responses_so_far: Sequence[object], + ) -> AsyncGenerator[object, None]: """ Terminate a streamed response cleanly when a guardrail blocks it. @@ -323,7 +355,7 @@ class UnifiedLLMGuardrails(CustomLogger): @staticmethod def _resolve_transform_call_type( user_api_key_dict: UserAPIKeyAuth, - mappings: dict, + mappings: Mapping[CallTypes, type["BaseTranslation"]], ) -> str | None: """Resolve the call type for the incremental_diff path, or None if the route is unresolvable / unsupported. @@ -356,9 +388,9 @@ class UnifiedLLMGuardrails(CustomLogger): self, exc: HTTPException, call_type: str | None, - responses_so_far: list[Any], + responses_so_far: Sequence[object], request_data: dict, - ) -> AsyncGenerator[Any, None]: + ) -> AsyncGenerator[object, None]: """Surface a mid-stream HTTPException. For A2A (NDJSON) call types the response has already started, so emit an in-stream JSON-RPC error chunk; otherwise re-raise so the proxy can report it. @@ -387,7 +419,7 @@ class UnifiedLLMGuardrails(CustomLogger): def _build_transform_chunk( self, *, - reference_chunk: Any, + reference_chunk: object, mutated_text_per_choice: dict[int, str], emitted_text_per_choice: dict[int, str], holdback_per_choice: dict[int, int], @@ -500,18 +532,18 @@ class UnifiedLLMGuardrails(CustomLogger): async def _emit_transform_round( self, *, - endpoint_translation: Any, + endpoint_translation: _EndpointTranslation, guardrail_to_apply: CustomGuardrail, request_data: dict, user_api_key_dict: UserAPIKeyAuth, call_type: str, - reference_chunk: Any, - responses_so_far: list[Any], - responses_yielded: list[Any], + reference_chunk: object, + responses_so_far: Sequence[object], + responses_yielded: list[object], emitted_text_per_choice: dict[int, str], finish_reason_per_choice: dict[int, str | None], is_final: bool, - ) -> AsyncGenerator[Any, None]: + ) -> AsyncGenerator[object, None]: """Run one guardrail processing round and emit the resulting diff chunk. Raises ``_StreamTerminated`` (after emitting the terminal block message or @@ -564,14 +596,14 @@ class UnifiedLLMGuardrails(CustomLogger): self, *, guardrail_to_apply: CustomGuardrail, - response: Any, + response: AsyncIterable[object], request_data: dict, user_api_key_dict: UserAPIKeyAuth, call_type: str, sampling_rate: int, end_of_stream_only: bool, - mappings: dict, - ) -> AsyncGenerator[Any, None]: + mappings: Mapping[CallTypes, type["BaseTranslation"]], + ) -> AsyncGenerator[object, None]: """Emit guardrail text transformations as new deltas on the stream. Raw chunks are withheld and accumulated; on each sampled processing round @@ -580,15 +612,15 @@ class UnifiedLLMGuardrails(CustomLogger): synthetic chunk. A BLOCK terminates the stream via the shared block handler; an underflow surfaces as an HTTPException. """ - endpoint_translation: Final = mappings[CallTypes(call_type)]() - responses_so_far: Final[list[Any]] = [] - responses_yielded: Final[list[Any]] = [] + endpoint_translation: Final = _as_endpoint_translation(mappings[CallTypes(call_type)]()) + responses_so_far: Final[list[object]] = [] + responses_yielded: Final[list[object]] = [] emitted_text_per_choice: Final[dict[int, str]] = {} finish_reason_per_choice: Final[dict[int, str | None]] = {} chunk_counter = 0 - last_chunk: Any | None = None + last_chunk: object | None = None - def _round(reference_chunk: Any, is_final: bool) -> AsyncGenerator[Any, None]: + def _round(reference_chunk: object, is_final: bool) -> AsyncGenerator[object, None]: return self._emit_transform_round( endpoint_translation=endpoint_translation, guardrail_to_apply=guardrail_to_apply, @@ -694,13 +726,13 @@ class UnifiedLLMGuardrails(CustomLogger): async def _inspect_full_response_for_block( self, *, - endpoint_translation: Any, + endpoint_translation: _EndpointTranslation, guardrail_to_apply: CustomGuardrail, request_data: dict, user_api_key_dict: UserAPIKeyAuth, - responses_so_far: list[Any], - responses_yielded: list[Any], - ) -> AsyncGenerator[Any, None]: + responses_so_far: Sequence[object], + responses_yielded: Sequence[object], + ) -> AsyncGenerator[object, None]: """Run the block-only guardrail inspection over the full assembled response (text + tool calls) so nothing bypasses the block decision. @@ -734,17 +766,17 @@ class UnifiedLLMGuardrails(CustomLogger): raise _StreamTerminated() @staticmethod - def _chunk_has_tool_calls(item: Any) -> bool: - for choice in getattr(item, "choices", None) or []: + def _chunk_has_tool_calls(item: object) -> bool: + for choice in _chunk_choices(item): delta = getattr(choice, "delta", None) if getattr(delta, "tool_calls", None): return True return False @staticmethod - def _chunk_carries_text(item: Any) -> bool: + def _chunk_carries_text(item: object) -> bool: """True if any choice in this chunk has non-empty string ``delta.content``.""" - for choice in getattr(item, "choices", None) or []: + for choice in _chunk_choices(item): delta = getattr(choice, "delta", None) content = getattr(delta, "content", None) if isinstance(content, str) and content != "": @@ -753,7 +785,7 @@ class UnifiedLLMGuardrails(CustomLogger): @staticmethod def _tool_call_passthrough_chunk( - item: Any, + item: object, finish_reason_per_choice: "dict[int, str | None] | None" = None, ) -> ModelResponseStream: """Copy of a chunk carrying tool calls with all text content stripped. @@ -772,7 +804,7 @@ class UnifiedLLMGuardrails(CustomLogger): redaction purpose. """ synthetic_choices: Final[list[StreamingChoices]] = [] - for choice in getattr(item, "choices", None) or []: + for choice in _chunk_choices(item): delta = getattr(choice, "delta", None) idx = getattr(choice, "index", 0) or 0 original_finish = getattr(choice, "finish_reason", None) @@ -801,15 +833,15 @@ class UnifiedLLMGuardrails(CustomLogger): ) @staticmethod - def _record_finish_reasons(item: Any, finish_reason_per_choice: dict[int, str | None]) -> None: - for choice in getattr(item, "choices", None) or []: + def _record_finish_reasons(item: object, finish_reason_per_choice: dict[int, str | None]) -> None: + for choice in _chunk_choices(item): finish_reason = getattr(choice, "finish_reason", None) if finish_reason is not None: finish_reason_per_choice[getattr(choice, "index", 0) or 0] = finish_reason @staticmethod - def _chunk_has_finish_reason(item: Any) -> bool: - choices: Final = getattr(item, "choices", None) or [] + def _chunk_has_finish_reason(item: object) -> bool: + choices: Final = _chunk_choices(item) return any(getattr(choice, "finish_reason", None) is not None for choice in choices) async def async_post_call_streaming_iterator_hook( @@ -845,22 +877,22 @@ class UnifiedLLMGuardrails(CustomLogger): # Get streaming configuration. Resolution order (later wins): default # < guardrail attribute < guardrail_config dict < this callback's # optional_params. - def _streaming_flag(name: str, default: Any) -> Any: + def _streaming_flag(name: str, default: object) -> Any: value = default if guardrail_to_apply is not None: value = getattr(guardrail_to_apply, name, value) - config: Final = getattr(guardrail_to_apply, "guardrail_config", {}) + config: Final[Mapping[str, object]] = getattr(guardrail_to_apply, "guardrail_config", {}) if isinstance(config, dict): value = config.get(name, value) return self.optional_params.get(name, value) - sampling_rate: Final = _streaming_flag("streaming_sampling_rate", 5) + sampling_rate: Final[int] = _streaming_flag("streaming_sampling_rate", 5) # Only apply the guardrail at end of stream (not per chunk). - end_of_stream_only = _streaming_flag("streaming_end_of_stream_only", False) + end_of_stream_only: bool = _streaming_flag("streaming_end_of_stream_only", False) # "block_only" (default) drops guardrail text rewrites on the streaming # path; "incremental_diff" emits them as synthetic deltas (see # _run_incremental_transform_stream). - streaming_transform_mode: Final = _streaming_flag("streaming_transform_mode", "block_only") + streaming_transform_mode: Final[str] = _streaming_flag("streaming_transform_mode", "block_only") # Withhold every chunk until end-of-stream moderation passes, then # release the original chunks (clean) or only the block message # (blocked) -- moderating the whole response *before* any content @@ -868,7 +900,9 @@ class UnifiedLLMGuardrails(CustomLogger): # release the original chunks are replayed as-is, so a # content-rewriting guardrail (e.g. PII masking) would leak # unredacted content. Guarded below via mask_response_content. - buffer_until_moderated = _streaming_flag("streaming_buffer_until_moderated", buffer_until_moderated_default) + buffer_until_moderated: bool = _streaming_flag( + "streaming_buffer_until_moderated", buffer_until_moderated_default + ) if ( buffer_until_moderated @@ -939,9 +973,9 @@ class UnifiedLLMGuardrails(CustomLogger): # Infer call type from first chunk call_type = None chunk_counter = 0 - responses_so_far: Final[list[Any]] = [] - responses_yielded: Final[list[Any]] = [] - pending_end_of_stream_items: Final[list[Any]] = [] + responses_so_far: Final[list[object]] = [] + responses_yielded: Final[list[object]] = [] + pending_end_of_stream_items: Final[list[object]] = [] # Whether any real response chunk has been forwarded to the client. # Drives how a block terminates the stream: continue the in-progress # message (True) vs emit a standalone block message (False, buffered). diff --git a/litellm/proxy/hooks/litellm_skills/main.py b/litellm/proxy/hooks/litellm_skills/main.py index dd61cad15a1..a64ed764a67 100644 --- a/litellm/proxy/hooks/litellm_skills/main.py +++ b/litellm/proxy/hooks/litellm_skills/main.py @@ -26,7 +26,8 @@ Usage: import base64 import json -from typing import Any, Final +from collections.abc import Mapping, Sequence +from typing import TYPE_CHECKING, Any, Final from litellm._logging import verbose_proxy_logger from litellm.caching.caching import DualCache @@ -36,7 +37,10 @@ from litellm.llms.litellm_proxy.skills.prompt_injection import ( SkillPromptInjectionHandler, ) from litellm.proxy._types import LiteLLM_SkillsTable, UserAPIKeyAuth -from litellm.types.utils import CallTypes, CallTypesLiteral +from litellm.types.utils import CallTypes, CallTypesLiteral, LLMResponseTypes + +if TYPE_CHECKING: + from litellm.llms.litellm_proxy.skills.sandbox_executor import SkillsSandboxExecutor class SkillsInjectionHook(CustomLogger): @@ -99,7 +103,7 @@ class SkillsInjectionHook(CustomLogger): verbose_proxy_logger.debug("SkillsInjectionHook: Processing %s skills", len(skills)) litellm_skills: Final[list[LiteLLM_SkillsTable]] = [] - anthropic_skills: Final[list[dict[str, Any]]] = [] + anthropic_skills: Final[list[dict[str, object]]] = [] # Separate skills by prefix for skill in skills: @@ -324,9 +328,9 @@ class SkillsInjectionHook(CustomLogger): async def async_post_call_success_deployment_hook( self, request_data: dict, - response: Any, + response: LLMResponseTypes, call_type: CallTypes | None, - ) -> Any | None: + ) -> LLMResponseTypes | None: """ Post-call hook to handle automatic code execution. @@ -372,7 +376,7 @@ class SkillsInjectionHook(CustomLogger): # Check if any tool call needs execution (litellm_code_execution or skill tool) has_executable_tool = False for tc in tool_calls: - tool_name = tc.get("name", "") + tool_name: str = tc.get("name", "") # Execute if it's litellm_code_execution OR a skill tool (litellm_skill_xxx) if tool_name == LiteLLMInternalTools.CODE_EXECUTION.value or tool_name.startswith(LITELLM_SKILL_ID_PREFIX): has_executable_tool = True @@ -441,7 +445,7 @@ class SkillsInjectionHook(CustomLogger): data: dict, response: Any, skill_files: dict[str, bytes], - ) -> Any: + ) -> LLMResponseTypes | None: """ Execute the code execution loop for messages API (Anthropic format). @@ -466,7 +470,7 @@ class SkillsInjectionHook(CustomLogger): max_tokens: Final = data.get("max_tokens", 4096) executor: Final = SkillsSandboxExecutor(timeout=self.sandbox_timeout) - generated_files: Final[list[dict[str, Any]]] = [] + generated_files: Final[list[dict[str, object]]] = [] current_response = response for iteration in range(self.max_iterations): @@ -511,9 +515,9 @@ class SkillsInjectionHook(CustomLogger): # Process tool calls tool_results = [] for tc in tool_calls: - tool_name = tc.get("name", "") + tool_name: str = tc.get("name", "") tool_id = tc.get("id", "") - tool_input = tc.get("input", {}) + tool_input: Mapping[str, str] = tc.get("input", {}) # Execute if it's litellm_code_execution OR a skill tool if tool_name == LiteLLMInternalTools.CODE_EXECUTION.value: @@ -561,8 +565,8 @@ class SkillsInjectionHook(CustomLogger): self, code: str, skill_files: dict[str, bytes], - executor: Any, - generated_files: list[dict[str, Any]], + executor: "SkillsSandboxExecutor", + generated_files: list[dict[str, object]], ) -> str: """Execute code in sandbox and return result string.""" try: @@ -574,7 +578,8 @@ class SkillsInjectionHook(CustomLogger): # Collect generated files if exec_result.get("files"): - for f in exec_result["files"]: + files: Final[Sequence[Mapping[str, str]]] = exec_result["files"] + for f in files: generated_files.append( { "name": f["name"], @@ -595,10 +600,10 @@ class SkillsInjectionHook(CustomLogger): async def _execute_skill_tool( self, tool_name: str, - tool_input: dict[str, Any], + tool_input: Mapping[str, str], skill_files: dict[str, bytes], - executor: Any, - generated_files: list[dict[str, Any]], + executor: "SkillsSandboxExecutor", + generated_files: list[dict[str, object]], ) -> str: """Execute a skill tool by generating and running code based on skill content.""" # Generate code based on available skill modules @@ -670,7 +675,7 @@ print('No executable skill module found') data: dict, response: Any, skill_files: dict[str, bytes], - ) -> Any: + ) -> LLMResponseTypes: """ Execute the code execution loop until model gives final response. @@ -704,7 +709,7 @@ print('No executable skill module found') kwargs: Final = {k: v for k, v in data.items() if k not in _EXCLUDED_ACOMPLETION_KEYS} executor: Final = SkillsSandboxExecutor(timeout=self.sandbox_timeout) - generated_files: Final[list[dict[str, Any]]] = [] + generated_files: Final[list[dict[str, object]]] = [] current_response: Any = response for iteration in range(self.max_iterations): @@ -713,7 +718,7 @@ print('No executable skill module found') stop_reason = current_response.choices[0].finish_reason # Build assistant message for conversation history - assistant_msg_dict: dict[str, Any] = { + assistant_msg_dict: dict[str, object] = { "role": "assistant", "content": assistant_message.content, } @@ -781,13 +786,13 @@ print('No executable skill module found') self, tool_call: Any, skill_files: dict[str, bytes], - executor: Any, - generated_files: list[dict[str, Any]], + executor: "SkillsSandboxExecutor", + generated_files: list[dict[str, object]], ) -> str: """Execute a litellm_code_execution tool call and return result string.""" try: args: Final = json.loads(tool_call.function.arguments) - code: Final = args.get("code", "") + code: Final[str] = args.get("code", "") verbose_proxy_logger.debug("SkillsInjectionHook: Executing code (%s chars)", len(code)) @@ -802,7 +807,8 @@ print('No executable skill module found') # Collect generated files if exec_result.get("files"): tool_result += "\n\nGenerated files:" - for f in exec_result["files"]: + files: Final[Sequence[Mapping[str, str]]] = exec_result["files"] + for f in files: file_content = base64.b64decode(f["content_base64"]) generated_files.append( { @@ -830,8 +836,8 @@ print('No executable skill module found') def _attach_files_to_response( self, response: Any, - generated_files: list[dict[str, Any]], - ) -> Any: + generated_files: list[dict[str, object]], + ) -> LLMResponseTypes: """ Attach generated files to the response object. @@ -841,11 +847,13 @@ print('No executable skill module found') if not generated_files: return response + raw_response: Final = response + # Handle dict response (Anthropic/messages API format) if isinstance(response, dict): response["_litellm_generated_files"] = generated_files verbose_proxy_logger.debug("SkillsInjectionHook: Attached %s files to dict response", len(generated_files)) - return response + return raw_response # Handle object response (OpenAI format) try: diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index f2cb1124fa0..2de1d177b33 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -18,7 +18,7 @@ import os import re import secrets import traceback -from collections.abc import Callable, Mapping, Sequence +from collections.abc import Awaitable, Callable, Mapping, Sequence from datetime import datetime, timedelta, timezone from typing import Any, Final, Literal, Optional, Protocol, TypeVar, cast @@ -171,8 +171,12 @@ class _PrismaTableActions(Protocol[_PrismaRowT]): async def count(self, *, where: Mapping[str, object] | None = None) -> int: ... + async def create(self, *, data: Mapping[str, object]) -> _PrismaRowT: ... + async def create_many(self, *, data: Sequence[Mapping[str, object]]) -> int: ... + async def delete_many(self, *, where: Mapping[str, object] | None = None) -> int: ... + async def update( self, *, @@ -181,6 +185,10 @@ class _PrismaTableActions(Protocol[_PrismaRowT]): ) -> _PrismaRowT | None: ... +class _TxTables(Protocol): + litellm_proxymodeltable: _PrismaTableActions[object] + + def _prisma_table( repository: BaseRepository[_RepositoryModelT], ) -> _PrismaTableActions[_RepositoryModelT]: @@ -1650,9 +1658,12 @@ async def generate_key_fn( detail={"error": f"soft_budget must be a non-negative finite number. Received: {data.soft_budget}"}, ) - if user_custom_key_generate is not None: - if inspect.iscoroutinefunction(user_custom_key_generate): - result: Final = await user_custom_key_generate(data) + custom_key_generate_hook: Final[Callable[..., Awaitable[Mapping[str, object]]] | None] = ( + user_custom_key_generate + ) + if custom_key_generate_hook is not None: + if inspect.iscoroutinefunction(custom_key_generate_hook): + result: Final = await custom_key_generate_hook(data) else: raise ValueError("user_custom_key_generate must be a coroutine") decision: Final = result.get("decision", True) @@ -1847,9 +1858,10 @@ async def generate_service_account_key_fn( verbose_proxy_logger.debug("entered /key/generate") - if user_custom_key_generate is not None: - if inspect.iscoroutinefunction(user_custom_key_generate): - result: Final = await user_custom_key_generate(data) + custom_key_generate_hook: Final[Callable[..., Awaitable[Mapping[str, object]]] | None] = user_custom_key_generate + if custom_key_generate_hook is not None: + if inspect.iscoroutinefunction(custom_key_generate_hook): + result: Final = await custom_key_generate_hook(data) else: raise ValueError("user_custom_key_generate must be a coroutine") decision: Final = result.get("decision", True) @@ -1918,7 +1930,7 @@ def prepare_metadata_fields(data: BaseModel, non_default_values: dict, existing_ ) casted_metadata[reserved_field] = existing_value - data_json: Final = data.model_dump(exclude_unset=True, exclude_none=True) + data_json: Final[Mapping[str, object]] = data.model_dump(exclude_unset=True, exclude_none=True) try: for k, v in data_json.items(): @@ -2179,7 +2191,7 @@ async def _process_single_key_update( llm_router: Router | None, user_custom_key_update: Callable | None = None, existing_key_row: LiteLLM_VerificationToken | None = None, -) -> dict[str, Any]: +) -> dict[str, object]: """ Process a single key update with all validations and checks. @@ -2722,9 +2734,10 @@ async def update_key_fn( ) # Custom key update hook - if user_custom_key_update is not None: - if inspect.iscoroutinefunction(user_custom_key_update): - result: Final = await user_custom_key_update(data) + custom_key_update_hook: Final[Callable[..., Awaitable[Mapping[str, object]]] | None] = user_custom_key_update + if custom_key_update_hook is not None: + if inspect.iscoroutinefunction(custom_key_update_hook): + result: Final = await custom_key_update_hook(data) else: raise ValueError("user_custom_key_update must be a coroutine") decision: Final = result.get("decision", True) @@ -4089,10 +4102,11 @@ async def delete_verification_tokens( failed_tokens: list = [] try: if prisma_client: - tokens = [_hash_token_if_needed(token=key) for key in tokens] - _keys_being_deleted: Final[list[LiteLLM_VerificationToken]] = await VerificationTokenRepository( - prisma_client - ).table.find_many(where={"token": {"in": tokens}}) + hashed_tokens: Final[list[str]] = [_hash_token_if_needed(token=key) for key in tokens] + tokens = hashed_tokens + _keys_being_deleted: Final[list[LiteLLM_VerificationToken]] = await _prisma_table( + VerificationTokenRepository(prisma_client) + ).find_many(where={"token": {"in": hashed_tokens}}) if len(_keys_being_deleted) == 0: raise HTTPException( @@ -4291,7 +4305,7 @@ async def _rotate_master_key( if models: decrypted_models: Final = proxy_config.decrypt_model_list_from_db(new_models=models) verbose_proxy_logger.debug("ABLE TO DECRYPT MODELS - len(decrypted_models): %s", len(decrypted_models)) - new_models: Final = [] + new_models: Final[list[dict[str, object]]] = [] for model in decrypted_models: new_model = await _add_model_to_db( model_params=Deployment(**model), @@ -4306,7 +4320,8 @@ async def _rotate_master_key( _dumped["model_info"] = prisma.Json(_dumped["model_info"]) new_models.append(_dumped) verbose_proxy_logger.debug("Resetting proxy model table") - async with prisma_client.db.tx() as tx: + async with prisma_client.db.tx() as tx_ctx: + tx: Final[_TxTables] = tx_ctx await tx.litellm_proxymodeltable.delete_many() verbose_proxy_logger.debug("Creating %s models", len(new_models)) await tx.litellm_proxymodeltable.create_many( @@ -4630,7 +4645,7 @@ async def _execute_virtual_key_regeneration( _validate_key_alias_format(key_alias=new_key_alias) verbose_proxy_logger.debug("non_default_values: %s", non_default_values) update_data.update(non_default_values) - update_data = prisma_client.jsonify_object(data=update_data) + jsonified_update_data: Final[Mapping[str, object]] = prisma_client.jsonify_object(data=update_data) # If grace period set, insert deprecated key so old key remains valid await _insert_deprecated_key( @@ -4642,9 +4657,9 @@ async def _execute_virtual_key_regeneration( updated_token: Final = await VerificationTokenRepository(prisma_client).table.update( where={"token": hashed_api_key}, - data=update_data, + data=jsonified_update_data, ) - updated_token_dict: Final = dict(updated_token) if updated_token is not None else {} + updated_token_dict: Final[dict[str, object]] = dict(updated_token) if updated_token is not None else {} updated_token_dict["key"] = new_token updated_token_dict["token_id"] = updated_token_dict.pop("token") @@ -5589,7 +5604,7 @@ async def key_aliases( where_sql: Final = " AND ".join(where_parts) count_sql: Final = f'SELECT COUNT(*) AS count FROM "LiteLLM_VerificationToken" WHERE {where_sql}' - count_rows: Final = await prisma_client.db.query_raw(count_sql, *query_params) + count_rows: Final[Sequence[Mapping[str, int]]] = await prisma_client.db.query_raw(count_sql, *query_params) total_count: Final = int(count_rows[0]["count"]) if count_rows else 0 aliases_params: Final = query_params + [size, (page - 1) * size] @@ -5602,7 +5617,7 @@ async def key_aliases( f" ORDER BY key_alias ASC" f" LIMIT ${limit_idx} OFFSET ${offset_idx}" ) - alias_rows: Final = await prisma_client.db.query_raw(aliases_sql, *aliases_params) + alias_rows: Final[Sequence[Mapping[str, str]]] = await prisma_client.db.query_raw(aliases_sql, *aliases_params) aliases: Final[list[str]] = [row["key_alias"] for row in alias_rows if row.get("key_alias")] total_pages: Final = -(-total_count // size) if total_count > 0 else 0 @@ -5695,7 +5710,7 @@ def _build_key_filter_conditions( agent_id: str | None = None, use_substring_matching: bool = False, expires_filter: str | None = None, -) -> dict[str, str | dict[str, Any] | list[dict[str, Any]]]: +) -> Mapping[str, object]: """Build filter conditions for key listing. Visibility rules: @@ -5707,14 +5722,14 @@ def _build_key_filter_conditions( so former members cannot see service accounts they created after leaving. """ # Prepare filter conditions - where: dict[str, str | dict[str, Any] | list[dict[str, Any]]] = {} + where: dict[str, object] = {} where.update(_get_condition_to_filter_out_ui_session_tokens()) # Build the OR conditions for user's keys and admin team keys - or_conditions: Final[list[dict[str, Any]]] = [] + or_conditions: Final[list[dict[str, object]]] = [] # Base conditions for user's own keys - user_condition: Final[dict[str, Any]] = {} + user_condition: Final[dict[str, object]] = {} if user_id and isinstance(user_id, str): if use_substring_matching: user_condition["user_id"] = { @@ -5784,7 +5799,7 @@ def _build_key_filter_conditions( # Apply team_id, project_id and access_group_id as global AND filters so they # narrow results across all visibility conditions (own keys, team keys, etc.) - global_filters: tuple[dict[str, Any], ...] = ( + global_filters: Final[tuple[dict[str, object], ...]] = ( *( ( {"key_alias": {"contains": key_alias, "mode": "insensitive"}} @@ -5805,7 +5820,7 @@ def _build_key_filter_conditions( else () ), ) - combined_where = {"AND": [where, *global_filters]} if global_filters else where + combined_where: Final[Mapping[str, object]] = {"AND": [where, *global_filters]} if global_filters else where verbose_proxy_logger.debug("Filter conditions: %s", combined_where) return combined_where @@ -5986,7 +6001,7 @@ async def _list_key_helper( ) -def _get_condition_to_filter_out_ui_session_tokens() -> dict[str, Any]: +def _get_condition_to_filter_out_ui_session_tokens() -> Mapping[str, object]: """ Condition to filter out UI session tokens """ @@ -6395,7 +6410,7 @@ async def _can_user_query_key_info( async def test_key_logging( user_api_key_dict: UserAPIKeyAuth, request: Request, - key_logging: list[dict[str, Any]], + key_logging: Sequence[Mapping[str, str]], ) -> LoggingCallbackStatus: """ Test the key-based logging diff --git a/litellm/proxy/management_endpoints/model_management_endpoints.py b/litellm/proxy/management_endpoints/model_management_endpoints.py index 71407c89813..c2087005863 100644 --- a/litellm/proxy/management_endpoints/model_management_endpoints.py +++ b/litellm/proxy/management_endpoints/model_management_endpoints.py @@ -13,9 +13,9 @@ model/{model_id}/update - PATCH endpoint for model update. import asyncio import datetime import json -from collections.abc import Mapping, Sequence +from collections.abc import Awaitable, Mapping, Sequence from json import JSONDecodeError -from typing import Any, Final, Literal, cast +from typing import Final, Literal, Protocol, cast from fastapi import APIRouter, Depends, Header, HTTPException, Request, status from pydantic import BaseModel, ConfigDict, Field, ValidationError @@ -78,9 +78,7 @@ from litellm.types.proxy.management_endpoints.model_management_endpoints import from litellm.types.router import ( SPECIAL_MODEL_INFO_PARAMS, Deployment, - DeploymentTypedDict, GenericLiteLLMParams, - LiteLLMParamsTypedDict, updateDeployment, ) from litellm.utils import get_utc_datetime @@ -104,10 +102,80 @@ class UpdatePublicModelGroupsRequest(BaseModel): model_config = ConfigDict(extra="forbid") +class _ProxyModelRow(Protocol): + model_id: str + model_name: str + model_info: Mapping[str, object] | None + + def model_dump_json(self, *, exclude_none: bool = False) -> str: ... + + +class _ProxyModelTable(Protocol): + def find_unique(self, *, where: Mapping[str, object]) -> Awaitable[_ProxyModelRow | None]: ... + + def find_many(self, *, where: Mapping[str, object]) -> Awaitable[Sequence[_ProxyModelRow]]: ... + + def update(self, *, where: Mapping[str, object], data: Mapping[str, object]) -> Awaitable[_ProxyModelRow]: ... + + def delete(self, *, where: Mapping[str, object]) -> Awaitable[_ProxyModelRow | None]: ... + + def delete_many(self, *, where: Mapping[str, object]) -> Awaitable[int]: ... + + +class _TxModelTables(Protocol): + litellm_proxymodeltable: _ProxyModelTable + + +class _TeamRow(Protocol): + models: Sequence[str] + + def model_dump(self) -> Mapping[str, object]: ... + + +class _TeamTable(Protocol): + def find_unique(self, *, where: Mapping[str, object]) -> Awaitable[_TeamRow | None]: ... + + def update( + self, *, where: Mapping[str, object], data: Mapping[str, object], include: Mapping[str, bool] + ) -> Awaitable[LiteLLM_TeamTable]: ... + + +class _TeamIdRef(Protocol): + team_id: str + + +class _ModelAliasRow(Protocol): + id: int + model_aliases: dict[str, str] + team: _TeamIdRef | None + + +class _ModelAliasTable(Protocol): + def find_many(self, *, include: Mapping[str, bool]) -> Awaitable[Sequence[_ModelAliasRow]]: ... + + def update(self, *, where: Mapping[str, object], data: Mapping[str, object]) -> Awaitable[object]: ... + + +def _proxy_model_table(prisma_client: PrismaClient) -> _ProxyModelTable: + return ModelRepository(prisma_client).table + + +def _repo_team_table(prisma_client: PrismaClient) -> _TeamTable: + return TeamRepository(prisma_client).table + + +def _db_team_table(prisma_client: PrismaClient) -> _TeamTable: + return prisma_client.db.litellm_teamtable + + +def _model_alias_table(prisma_client: PrismaClient) -> _ModelAliasTable: + return ModelTableRepository(prisma_client).table + + async def get_db_model(model_id: str, prisma_client: PrismaClient) -> Deployment | None: db_model: Final = cast( BaseModel | None, - await ModelRepository(prisma_client).table.find_unique(where={"model_id": model_id}), + await _proxy_model_table(prisma_client).find_unique(where={"model_id": model_id}), ) if not db_model: @@ -166,14 +234,9 @@ def _raise_on_strategy_router_write_violation( def update_db_model(db_model: Deployment, updated_patch: updateDeployment) -> PrismaCompatibleUpdateDBModel: - merged_deployment_dict: Final = DeploymentTypedDict( - model_name=db_model.model_name, - litellm_params=LiteLLMParamsTypedDict(**db_model.litellm_params.model_dump(exclude_none=True)), - model_info=db_model.model_info.model_dump(exclude_none=True), - ) - # update model name - if updated_patch.model_name: - merged_deployment_dict["model_name"] = updated_patch.model_name + merged_model_name: Final = updated_patch.model_name or db_model.model_name + merged_litellm_params: Final = db_model.litellm_params.model_dump(exclude_none=True) + merged_model_info: Final = db_model.model_info.model_dump(exclude_none=True) # update litellm params if updated_patch.litellm_params: @@ -182,13 +245,11 @@ def update_db_model(db_model: Deployment, updated_patch: updateDeployment) -> Pr k: encrypt_value_helper(v) for k, v in updated_patch.litellm_params.model_dump(exclude_none=True).items() } - merged_deployment_dict["litellm_params"].update(encrypted_params) + merged_litellm_params.update(encrypted_params) # update model info if updated_patch.model_info: - if "model_info" not in merged_deployment_dict: - merged_deployment_dict["model_info"] = {} - merged_deployment_dict["model_info"].update(updated_patch.model_info.model_dump(exclude_none=True)) + merged_model_info.update(updated_patch.model_info.model_dump(exclude_none=True)) # Honor explicit-null clears LAST, after both merges, so a model_info blob the UI # passes through (which today re-sends the OLD pricing on every save) cannot @@ -202,29 +263,25 @@ def update_db_model(db_model: Deployment, updated_patch: updateDeployment) -> Pr if updated_patch.litellm_params: for field in updated_patch.litellm_params.model_fields_set: if field in SPECIAL_MODEL_INFO_PARAMS and getattr(updated_patch.litellm_params, field) is None: - merged_deployment_dict["litellm_params"].pop(field, None) - merged_deployment_dict.get("model_info", {}).pop(field, None) + merged_litellm_params.pop(field, None) + merged_model_info.pop(field, None) if updated_patch.model_info: for field in updated_patch.model_info.model_fields_set: if field in SPECIAL_MODEL_INFO_PARAMS and getattr(updated_patch.model_info, field) is None: - merged_deployment_dict["model_info"].pop(field, None) - merged_deployment_dict.get("litellm_params", {}).pop(field, None) + merged_model_info.pop(field, None) + merged_litellm_params.pop(field, None) # convert to prisma compatible format - prisma_compatible_model_dict: Final = PrismaCompatibleUpdateDBModel() - if "model_name" in merged_deployment_dict: - prisma_compatible_model_dict["model_name"] = merged_deployment_dict["model_name"] + for key, value in merged_model_info.items(): + if isinstance(value, datetime.datetime): + merged_model_info[key] = value.isoformat() - if "litellm_params" in merged_deployment_dict: - prisma_compatible_model_dict["litellm_params"] = json.dumps(merged_deployment_dict["litellm_params"]) - - if "model_info" in merged_deployment_dict: - model_info: Final = merged_deployment_dict["model_info"] - for key, value in model_info.items(): - if isinstance(value, datetime.datetime): - model_info[key] = value.isoformat() - prisma_compatible_model_dict["model_info"] = json.dumps(model_info) + prisma_compatible_model_dict: Final = PrismaCompatibleUpdateDBModel( + model_name=merged_model_name, + litellm_params=json.dumps(merged_litellm_params), + model_info=json.dumps(merged_model_info), + ) if updated_patch.blocked is not None: prisma_compatible_model_dict["blocked"] = updated_patch.blocked @@ -338,7 +395,7 @@ async def patch_model( update_data["updated_at"] = cast(str, get_utc_datetime()) # Perform partial update - updated_model: Final = await ModelRepository(prisma_client).table.update( + updated_model: Final = await _proxy_model_table(prisma_client).update( where={"model_id": model_id}, data=update_data, ) @@ -769,8 +826,8 @@ async def _setup_new_team_model_assignment( async def _get_team_deployments( - team_id: str, prisma_client: PrismaClient, table: Any | None = None -) -> list[LiteLLM_ProxyModelTable]: + team_id: str, prisma_client: PrismaClient, table: _ProxyModelTable | None = None +) -> Sequence[_ProxyModelRow]: """ Fetch all deployments for a given team_id from the database. @@ -785,7 +842,7 @@ async def _get_team_deployments( existing transaction. """ prefix: Final = f"model_name_{team_id}_" - table = table or ModelRepository(prisma_client).table + table = table or _proxy_model_table(prisma_client) response: Final = await table.find_many( where={ "model_name": {"startswith": prefix}, @@ -806,7 +863,7 @@ async def _get_team_deployments( async def delete_team_models( team_ids: list[str], prisma_client: PrismaClient, - llm_router: Any | None, + llm_router: Router | None, ) -> list[str]: """ Delete every BYOK model owned by the given teams, from the DB and the router. @@ -820,7 +877,8 @@ async def delete_team_models( Returns the model_ids that were deleted. """ deleted_model_ids: Final[list[str]] = [] - async with prisma_client.db.tx() as tx: + async with prisma_client.db.tx() as tx_ctx: + tx: Final[_TxModelTables] = tx_ctx for team_id in team_ids: rows = await _get_team_deployments(team_id, prisma_client, table=tx.litellm_proxymodeltable) model_ids = [row.model_id for row in rows] @@ -920,11 +978,11 @@ async def _remove_unbacked_team_models( if not names_to_remove: return - existing_team_row: Final = await prisma_client.db.litellm_teamtable.find_unique(where={"team_id": team_id}) + existing_team_row: Final = await _db_team_table(prisma_client).find_unique(where={"team_id": team_id}) if existing_team_row is None: return - updated_team_row: Final[LiteLLM_TeamTable] = await prisma_client.db.litellm_teamtable.update( + updated_team_row: Final[LiteLLM_TeamTable] = await _db_team_table(prisma_client).update( where={"team_id": team_id}, data={"models": [model for model in existing_team_row.models if model not in names_to_remove]}, include={"object_permission": True}, @@ -953,7 +1011,7 @@ async def _update_existing_team_model_assignment( """ def _get_team_public_model_name( - model_info: dict | str | None, + model_info: object, ) -> str | None: parsed: Final = model_info_as_mapping(model_info) if parsed is None: @@ -1062,7 +1120,7 @@ class ModelManagementAuthChecks: detail={"error": CommonProxyErrors.not_premium_user.value}, ) - _existing_team_row: Final = await TeamRepository(prisma_client).table.find_unique( + _existing_team_row: Final = await _repo_team_table(prisma_client).find_unique( where={"team_id": model_params.model_info.team_id} ) @@ -1091,7 +1149,7 @@ class ModelManagementAuthChecks: ) -> Literal[True]: ## Check team model auth if model_params.model_info is not None and model_params.model_info.team_id is not None: - team_obj_row: Final = await TeamRepository(prisma_client).table.find_unique( + team_obj_row: Final = await _repo_team_table(prisma_client).find_unique( where={"team_id": model_params.model_info.team_id} ) if team_obj_row is None: @@ -1192,7 +1250,7 @@ async def delete_model( - store keys separately """ # encrypt litellm params # - result: Final = await ModelRepository(prisma_client).table.delete(where={"model_id": model_info.id}) + result: Final = await _proxy_model_table(prisma_client).delete(where={"model_id": model_info.id}) if result is None: raise HTTPException( @@ -1265,9 +1323,9 @@ async def delete_team_model_alias( Returns: - List of team id + model alias pairs that were removed """ - team_model_aliases: Final = await ModelTableRepository(prisma_client).table.find_many(include={"team": True}) + team_model_aliases: Final = await _model_alias_table(prisma_client).find_many(include={"team": True}) tasks: Final = [] - removed_model_aliases: Final = [] + removed_model_aliases: Final[list[tuple[str, str]]] = [] for team_model_alias in team_model_aliases: model_aliases = team_model_alias.model_aliases # {"alias": "public model name"} id = team_model_alias.id @@ -1278,7 +1336,7 @@ async def delete_team_model_alias( removed_model_aliases.append((team_model_alias.team.team_id, key)) del model_aliases[key] tasks.append( - ModelTableRepository(prisma_client).table.update( + _model_alias_table(prisma_client).update( where={"id": id}, data={"model_aliases": json.dumps(model_aliases)}, ) @@ -1492,7 +1550,7 @@ async def update_model( }, ) - _model_id = None + _model_id: str | None = None _model_info: Final = getattr(model_params, "model_info", None) if _model_info is None: raise Exception("model_info not provided") @@ -1551,11 +1609,11 @@ async def update_model( else: pass - _data: Final[dict] = { + _data: Final[dict[str, str]] = { "litellm_params": json.dumps(merged_dictionary), "updated_by": user_api_key_dict.user_id or LITELLM_PROXY_ADMIN_NAME, } - model_response: Final = await ModelRepository(prisma_client).table.update( + model_response: Final = await _proxy_model_table(prisma_client).update( where={"model_id": _model_id}, data=_data, ) diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index 0b99879f9fe..97f494c51de 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -15,11 +15,11 @@ import math import traceback from collections.abc import Mapping, Sequence from datetime import datetime, timezone -from typing import Annotated, Final, Protocol, TypeVar, cast +from typing import Annotated, Final, Protocol, TypedDict, TypeVar, cast import fastapi from fastapi import APIRouter, Depends, Header, HTTPException, Request, status -from pydantic import BaseModel +from pydantic import BaseModel, JsonValue import litellm from litellm._logging import verbose_proxy_logger @@ -29,6 +29,7 @@ from litellm.litellm_core_utils.safe_json_dumps import safe_dumps from litellm.proxy._types import ( UI_TEAM_ID, BlockTeamRequest, + BudgetNewRequest, CommonProxyErrors, DeleteTeamRequest, LiteLLM_AccessGroupTable, @@ -156,6 +157,15 @@ router: Final = APIRouter() _DbRecordT = TypeVar("_DbRecordT") +class _TeamIdKeyCount(TypedDict): + team_id: int + + +class _TeamIdGroupRow(TypedDict): + team_id: str + _count: _TeamIdKeyCount + + class _PrismaTableActions(Protocol[_DbRecordT]): async def find_unique( self, @@ -220,59 +230,127 @@ class _PrismaTableActions(Protocol[_DbRecordT]): where: Mapping[str, object] | None = None, ) -> int: ... + async def group_by( + self, + by: Sequence[str], + where: Mapping[str, object] | None = None, + count: Mapping[str, bool] | None = None, + ) -> Sequence[_TeamIdGroupRow]: ... + + +class _HasTableActions(Protocol[_DbRecordT]): + @property + def table(self) -> "_PrismaTableActions[_DbRecordT]": ... + + +def _typed_table( + repo: "_HasTableActions[_DbRecordT]", record_type: type[_DbRecordT] +) -> "_PrismaTableActions[_DbRecordT]": + return repo.table + + +def _as_object(value: object) -> object: + return value + + +def _nullable(value: _DbRecordT | None) -> _DbRecordT | None: + return value + + +class _UserIdRow(Protocol): + @property + def user_id(self) -> str | None: ... + + +class _HasUserIdTable(Protocol): + @property + def table(self) -> "_PrismaTableActions[_UserIdRow]": ... + + +def _user_id_rows_db(repo: "_HasUserIdTable") -> "_PrismaTableActions[_UserIdRow]": + return repo.table + + +class _RawTeamRow(Protocol): + @property + def members_with_roles(self) -> Sequence[Mapping[str, object]] | None: ... + + +class _HasRawTeamTable(Protocol): + @property + def table(self) -> "_PrismaTableActions[_RawTeamRow]": ... + + +def _raw_team_db(repo: "_HasRawTeamTable") -> "_PrismaTableActions[_RawTeamRow]": + return repo.table + + +class _BudgetWriteCall(Protocol): + async def __call__( + self, budget_obj: BudgetNewRequest, user_api_key_dict: UserAPIKeyAuth + ) -> LiteLLM_BudgetTableFull: ... + + +def _as_budget_write(fn: "_BudgetWriteCall") -> "_BudgetWriteCall": + return fn + + +class _TeamFindManyArgs(TypedDict, total=False): + take: int + skip: int + order: Mapping[str, str] + cursor: Mapping[str, object] + + +class _TeamUiViewFilters(TypedDict, total=False): + team_id: Mapping[str, str] + team_alias: Mapping[str, str] + + +class _TeamIdInFilter(TypedDict, total=False): + team_id: Mapping[str, Sequence[str]] + def _team_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_TeamTable]": - team_table: Final[_PrismaTableActions[LiteLLM_TeamTable]] = TeamRepository(prisma_client).table - return team_table + return _typed_table(TeamRepository(prisma_client), LiteLLM_TeamTable) def _team_membership_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_TeamMembership]": - membership_table: Final[_PrismaTableActions[LiteLLM_TeamMembership]] = TeamMembershipRepository(prisma_client).table - return membership_table + return _typed_table(TeamMembershipRepository(prisma_client), LiteLLM_TeamMembership) def _user_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_UserTable]": - user_table: Final[_PrismaTableActions[LiteLLM_UserTable]] = UserRepository(prisma_client).table - return user_table + return _typed_table(UserRepository(prisma_client), LiteLLM_UserTable) def _model_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_ModelTable]": - model_table: Final[_PrismaTableActions[LiteLLM_ModelTable]] = ModelTableRepository(prisma_client).table - return model_table + return _typed_table(ModelTableRepository(prisma_client), LiteLLM_ModelTable) def _org_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_OrganizationTable]": - org_table: Final[_PrismaTableActions[LiteLLM_OrganizationTable]] = OrganizationRepository(prisma_client).table - return org_table + return _typed_table(OrganizationRepository(prisma_client), LiteLLM_OrganizationTable) def _org_membership_db( prisma_client: PrismaClient | None, ) -> "_PrismaTableActions[LiteLLM_OrganizationMembershipTable]": - org_membership_table: _PrismaTableActions[LiteLLM_OrganizationMembershipTable] = OrganizationMembershipRepository( - prisma_client - ).table - return org_membership_table + return _typed_table(OrganizationMembershipRepository(prisma_client), LiteLLM_OrganizationMembershipTable) def _budget_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_BudgetTableFull]": - budget_table: Final[_PrismaTableActions[LiteLLM_BudgetTableFull]] = BudgetRepository(prisma_client).table - return budget_table + return _typed_table(BudgetRepository(prisma_client), LiteLLM_BudgetTableFull) def _deleted_team_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_DeletedTeamTable]": - deleted_team_table: _PrismaTableActions[LiteLLM_DeletedTeamTable] = DeletedTeamRepository(prisma_client).table - return deleted_team_table + return _typed_table(DeletedTeamRepository(prisma_client), LiteLLM_DeletedTeamTable) def _access_group_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_AccessGroupTable]": - access_group_table: _PrismaTableActions[LiteLLM_AccessGroupTable] = AccessGroupRepository(prisma_client).table - return access_group_table + return _typed_table(AccessGroupRepository(prisma_client), LiteLLM_AccessGroupTable) def _tokens_db(prisma_client: PrismaClient | None) -> "_PrismaTableActions[LiteLLM_VerificationToken]": - tokens_table: _PrismaTableActions[LiteLLM_VerificationToken] = VerificationTokenRepository(prisma_client).table - return tokens_table + return _typed_table(VerificationTokenRepository(prisma_client), LiteLLM_VerificationToken) def _sanitize_for_log(value: object) -> str: @@ -408,7 +486,7 @@ class TeamMemberBudgetHandler: if team_member_budget_duration is not None: budget_request.budget_duration = team_member_budget_duration - team_member_budget_table: Final = await new_budget( + team_member_budget_table: Final = await _as_budget_write(new_budget)( budget_obj=budget_request, user_api_key_dict=user_api_key_dict, ) @@ -456,7 +534,7 @@ class TeamMemberBudgetHandler: if team_member_budget_duration is not None: budget_request.budget_duration = team_member_budget_duration - budget_row: Final = await update_budget( + budget_row: Final = await _as_budget_write(update_budget)( budget_obj=budget_request, user_api_key_dict=user_api_key_dict, ) @@ -571,7 +649,7 @@ class TeamMemberBudgetHandler: ) if missing: - await TeamMembershipRepository(prisma_client).table.create_many( + await _team_membership_db(prisma_client).create_many( data=missing, skip_duplicates=True, # safety net against concurrent races ) @@ -1407,9 +1485,10 @@ async def new_team( complete_team_data_dict["metadata"] = encrypt_callback_vars(complete_team_data_dict["metadata"]) complete_team_data_dict = prisma_client.jsonify_team_object(db_data=complete_team_data_dict) + team_creation_data: Final[Mapping[str, object]] = complete_team_data_dict - team_row: Final[LiteLLM_TeamTable] = await TeamRepository(prisma_client).table.create( - data=complete_team_data_dict, + team_row: Final[LiteLLM_TeamTable] = await _team_db(prisma_client).create( + data=team_creation_data, include={"litellm_model_table": True}, ) @@ -1856,7 +1935,7 @@ async def update_team( detail={"error": f"soft_budget must be a non-negative finite number. Received: {data.soft_budget}"}, ) - existing_team_row = await TeamRepository(prisma_client).table.find_unique(where={"team_id": data.team_id}) + existing_team_row = await _team_db(prisma_client).find_unique(where={"team_id": data.team_id}) if existing_team_row is None: raise HTTPException( @@ -1884,7 +1963,7 @@ async def update_team( ) if data.max_budget is not None: - existing_soft_budget: Final = getattr(existing_team_row, "soft_budget", None) + existing_soft_budget: Final[object] = _as_object(getattr(existing_team_row, "soft_budget", None)) soft_budget_to_check: Final = data.soft_budget if data.soft_budget is not None else existing_soft_budget if soft_budget_to_check is not None and isinstance(soft_budget_to_check, (int, float)): if data.max_budget <= soft_budget_to_check: @@ -1943,7 +2022,7 @@ async def update_team( data.organization_id = None # check org team limits - if updating team that belongs to an org - org_id_to_check: Final = ( + org_id_to_check: Final[object] = _as_object( data.organization_id if data.organization_id is not None else existing_team_row.organization_id ) if org_id_to_check is not None and isinstance(org_id_to_check, str) and prisma_client is not None: @@ -1976,7 +2055,7 @@ async def update_team( TeamMemberBudgetHandler.strip_system_managed_metadata_keys(updated_kv["metadata"]) if "metadata" in updated_kv: - stored_metadata: Final = ( + stored_metadata: Final[Mapping[str, JsonValue] | None] = ( { # mutable-ok: the validator payload's isinstance guard requires a plain dict key: value for key, value in existing_team_row.metadata.items() @@ -2079,16 +2158,19 @@ async def update_team( updated_kv["router_settings"] = safe_dumps(updated_kv["router_settings"]) updated_kv = prisma_client.jsonify_team_object(db_data=updated_kv) - team_row: Final[LiteLLM_TeamTable | None] = await TeamRepository(prisma_client).table.update( - where={"team_id": data.team_id}, - data=updated_kv, - # `object_permission` is included so `_refresh_cached_team` - # doesn't write a cached team with the relation nulled out — - # see team_model_add for the full rationale. - include={ - "litellm_model_table": True, - "object_permission": True, - }, + team_update_data: Final[Mapping[str, object]] = updated_kv + team_row: Final[LiteLLM_TeamTable | None] = _nullable( + await _team_db(prisma_client).update( + where={"team_id": data.team_id}, + data=team_update_data, + # `object_permission` is included so `_refresh_cached_team` + # doesn't write a cached team with the relation nulled out — + # see team_model_add for the full rationale. + include={ + "litellm_model_table": True, + "object_permission": True, + }, + ) ) if team_row is None or team_row.team_id is None: @@ -2603,7 +2685,7 @@ async def _resolve_existing_member_user_ids( if not requested_user_ids: return frozenset() - found: Final = await UserRepository(prisma_client).table.find_many( + found: Final = await _user_id_rows_db(UserRepository(prisma_client)).find_many( where={ # mutable-ok: Prisma query filters are dict-shaped "user_id": { # mutable-ok: Prisma query filters are dict-shaped "in": sorted(requested_user_ids) @@ -3098,7 +3180,9 @@ async def team_member_delete( key_val["user_id"] = data.user_id elif data.user_email is not None: key_val["user_email"] = data.user_email - existing_user_rows: Final = await UserRepository(prisma_client).table.find_many(where=key_val) + existing_user_rows: Final[Sequence[LiteLLM_UserTable] | None] = await UserRepository(prisma_client).table.find_many( + where=key_val + ) if existing_user_rows is not None and (isinstance(existing_user_rows, list) and len(existing_user_rows) > 0): for existing_user in existing_user_rows: @@ -3106,7 +3190,7 @@ async def team_member_delete( if data.team_id in existing_user.teams: team_list = existing_user.teams team_list.remove(data.team_id) - await UserRepository(prisma_client).table.update( + await _user_db(prisma_client).update( where={ "user_id": existing_user.user_id, }, @@ -3114,7 +3198,7 @@ async def team_member_delete( ) # Also clean up any existing team membership rows for this user and team - user_ids_to_delete: Final = set() + user_ids_to_delete: Final = set[str]() if data.user_id is not None: user_ids_to_delete.add(data.user_id) if existing_user_rows is not None and isinstance(existing_user_rows, list): @@ -3123,9 +3207,7 @@ async def team_member_delete( user_ids_to_delete.add(existing_user.user_id) for _uid in user_ids_to_delete: - await TeamMembershipRepository(prisma_client).table.delete_many( - where={"team_id": data.team_id, "user_id": _uid} - ) + await _team_membership_db(prisma_client).delete_many(where={"team_id": data.team_id, "user_id": _uid}) ## DELETE KEYS CREATED BY USER FOR THIS TEAM if user_ids_to_delete: @@ -3134,9 +3216,7 @@ async def team_member_delete( ) # Fetch keys before deletion to persist them - keys_to_delete: Final[list[LiteLLM_VerificationToken]] = await VerificationTokenRepository( - prisma_client - ).table.find_many( + keys_to_delete: Final[list[LiteLLM_VerificationToken]] = await _tokens_db(prisma_client).find_many( where={ "user_id": {"in": list(user_ids_to_delete)}, "team_id": data.team_id, @@ -3151,7 +3231,7 @@ async def team_member_delete( litellm_changed_by=None, ) - await VerificationTokenRepository(prisma_client).table.delete_many( + await _tokens_db(prisma_client).delete_many( where={ "user_id": {"in": list(user_ids_to_delete)}, "team_id": data.team_id, @@ -3311,7 +3391,7 @@ async def team_member_update( ### upsert new budget budget_patch: Final = _build_member_budget_patch(data) - async with prisma_client.db.tx() as tx: + async with prisma_client.tx() as tx: await _upsert_budget_and_membership( tx=tx, team_id=data.team_id, @@ -3654,7 +3734,7 @@ async def delete_team( _persist_deleted_verification_tokens, ) - keys_to_delete: list[LiteLLM_VerificationToken] = await VerificationTokenRepository(prisma_client).table.find_many( + keys_to_delete: list[LiteLLM_VerificationToken] = await _tokens_db(prisma_client).find_many( where={"team_id": {"in": data.team_ids}} ) @@ -4469,7 +4549,7 @@ async def _get_keys_count_by_team( if not page_team_ids: return {} - grouped: Final = await VerificationTokenRepository(prisma_client).table.group_by( + grouped: Final = await _tokens_db(prisma_client).group_by( by=["team_id"], where={"team_id": {"in": page_team_ids}}, count={"team_id": True}, @@ -4786,7 +4866,7 @@ async def _authorize_and_filter_teams( if allowed_org_ids is not None: # Org admin: query DB for teams in their orgs - org_teams: Final = await TeamRepository(prisma_client).table.find_many( + org_teams: Final = await _raw_team_db(TeamRepository(prisma_client)).find_many( where={"organization_id": {"in": allowed_org_ids}}, include={"litellm_model_table": True}, ) @@ -4800,7 +4880,9 @@ async def _authorize_and_filter_teams( ] elif user_id: # Regular user: fetch all and filter by membership (Prisma can't filter JSON arrays) - response: Final = await TeamRepository(prisma_client).table.find_many(include={"litellm_model_table": True}) + response: Final = await _raw_team_db(TeamRepository(prisma_client)).find_many( + include={"litellm_model_table": True} + ) return [ team for team in response @@ -4808,7 +4890,7 @@ async def _authorize_and_filter_teams( ] else: # Proxy admin: all teams - return list(await TeamRepository(prisma_client).table.find_many(include={"litellm_model_table": True})) + return list(await _raw_team_db(TeamRepository(prisma_client)).find_many(include={"litellm_model_table": True})) @router.get("/team/list", tags=["team management"], dependencies=[Depends(user_api_key_auth)]) @@ -4860,7 +4942,7 @@ async def list_team( _team_memberships.append(tm) # add all keys that belong to the team - keys = await VerificationTokenRepository(prisma_client).table.find_many(where={"team_id": team.team_id}) + keys = await _tokens_db(prisma_client).find_many(where={"team_id": team.team_id}) try: returned_responses.append( @@ -4911,7 +4993,7 @@ async def get_paginated_teams( total_count: Final = await _team_db(prisma_client).count() # Get paginated teams - teams: Final = await TeamRepository(prisma_client).table.find_many( + teams: Final = await _team_db(prisma_client).find_many( skip=skip, take=page_size, order={"team_alias": "asc"}, # Sort by team_alias @@ -4961,7 +5043,7 @@ async def ui_view_teams( skip: Final = (page - 1) * page_size # Build where conditions based on provided parameters - where_conditions: Final = {} + where_conditions: Final[_TeamUiViewFilters] = {} if team_id: where_conditions["team_id"] = { @@ -4976,7 +5058,7 @@ async def ui_view_teams( } # Query users with pagination and filters - teams: Final = await TeamRepository(prisma_client).table.find_many( + teams: Final = await _team_db(prisma_client).find_many( where=where_conditions, skip=skip, take=page_size, @@ -5166,13 +5248,13 @@ async def team_model_delete( ) # Get current models list - current_models: Final = team_obj.models or [] + current_models: Final[Sequence[str]] = team_obj.models or [] # Remove specified models updated_models: Final = [m for m in current_models if m not in data.models] # Update team. See team_model_add for the rationale on `include`. - updated_team: Final = await TeamRepository(prisma_client).table.update( + updated_team: Final = await _team_db(prisma_client).update( where={"team_id": data.team_id}, data={"models": updated_models}, include={"object_permission": True}, @@ -5425,7 +5507,7 @@ async def _append_permissions_to_all_teams(prisma_client: PrismaClient, permissi BATCH_SIZE: Final = 500 while True: - find_args: dict = { + find_args: _TeamFindManyArgs = { "take": BATCH_SIZE, "order": {"team_id": "asc"}, } @@ -5433,7 +5515,7 @@ async def _append_permissions_to_all_teams(prisma_client: PrismaClient, permissi find_args["cursor"] = {"team_id": cursor} find_args["skip"] = 1 - teams = await TeamRepository(prisma_client).table.find_many(**find_args) + teams = await _team_db(prisma_client).find_many(**find_args) if not teams: break @@ -5528,11 +5610,11 @@ async def get_team_daily_activity( ) ## Fetch team aliases and check team admin status - where_condition: Final = {} + where_condition: Final[_TeamIdInFilter] = {} if team_ids_list: where_condition["team_id"] = {"in": list(team_ids_list)} - team_aliases: Final = await TeamRepository(prisma_client).table.find_many(where=where_condition) - team_alias_metadata: Final = {t.team_id: {"team_alias": t.team_alias} for t in team_aliases} + team_aliases: Final = await _team_db(prisma_client).find_many(where=where_condition) + team_alias_metadata: Final = {t.team_id: {"team_alias": _as_object(t.team_alias)} for t in team_aliases} # Check if user is team admin or has /team/daily/activity permission # If not, filter by user's API keys. diff --git a/litellm/proxy/management_endpoints/ui_sso.py b/litellm/proxy/management_endpoints/ui_sso.py index 44abc56713f..a2c50590dd5 100644 --- a/litellm/proxy/management_endpoints/ui_sso.py +++ b/litellm/proxy/management_endpoints/ui_sso.py @@ -16,9 +16,22 @@ import json import os import re import secrets +from collections.abc import Mapping, Sequence from copy import deepcopy from html import escape -from typing import TYPE_CHECKING, Any, Final, Literal, NoReturn, Optional, Union, cast +from typing import ( + TYPE_CHECKING, + Any, + Final, + Literal, + NoReturn, + Optional, + Protocol, + TypeVar, + Union, + cast, + overload, +) from urllib.parse import parse_qs, urlencode, urlparse if TYPE_CHECKING: @@ -155,6 +168,102 @@ _CLI_SSO_SECRET_KEY_FRAGMENTS: Final = frozenset( } ) +_DbRecordT: Final = TypeVar("_DbRecordT", covariant=True) + + +class _PrismaTableActions(Protocol[_DbRecordT]): + async def find_unique( + self, + where: Mapping[str, object], + ) -> _DbRecordT | None: ... + + async def find_first( + self, + where: Mapping[str, object] | None = None, + ) -> _DbRecordT | None: ... + + async def find_many( + self, + where: Mapping[str, object] | None = None, + ) -> Sequence[_DbRecordT]: ... + + async def update( + self, + where: Mapping[str, object], + data: Mapping[str, object], + ) -> _DbRecordT: ... + + async def update_many( + self, + where: Mapping[str, object], + data: Mapping[str, object], + ) -> int: ... + + +class _UserMetadataRow(Protocol): + @property + def metadata(self) -> Mapping[str, object] | None: ... + + +class _HasUserMetadataTable(Protocol): + @property + def table(self) -> "_PrismaTableActions[_UserMetadataRow]": ... + + +def _user_meta_db(repo: "_HasUserMetadataTable") -> "_PrismaTableActions[_UserMetadataRow]": + return repo.table + + +class _SsoConfigRow(Protocol): + @property + def sso_settings(self) -> Mapping[str, object] | None: ... + + +class _HasSsoConfigTable(Protocol): + @property + def table(self) -> "_PrismaTableActions[_SsoConfigRow]": ... + + +def _sso_config_db(repo: "_HasSsoConfigTable") -> "_PrismaTableActions[_SsoConfigRow]": + return repo.table + + +class _TeamDetailRow(Protocol): + def model_dump(self) -> Mapping[str, object]: ... + + +class _HasTeamDetailTable(Protocol): + @property + def table(self) -> "_PrismaTableActions[_TeamDetailRow]": ... + + +def _team_detail_db(repo: "_HasTeamDetailTable") -> "_PrismaTableActions[_TeamDetailRow]": + return repo.table + + +class _CustomSsoCall(Protocol): + async def __call__(self, sso_response: object) -> SSOUserDefinedValues | None: ... + + +class _ServicePrincipalAssignment(Protocol): + def get(self, key: str) -> str: ... + + +class _ServicePrincipalPage(Protocol): + @overload + def get( + self, + key: Literal["value"], + default: Sequence["_ServicePrincipalAssignment"], + ) -> Sequence["_ServicePrincipalAssignment"]: ... + + @overload + def get(self, key: Literal["@odata.nextLink"]) -> str | None: ... + + +def _as_object(value: object) -> object: + return value + def _hash_cli_sso_secret(secret: str) -> str: return hashlib.sha256(secret.encode("utf-8")).hexdigest() @@ -256,7 +365,7 @@ def _get_cli_sso_flow_or_raise(login_id: str | None, cache: DualCache) -> dict: flow = cache.get_cache(key=cache_key) if isinstance(flow, str): try: - flow = json.loads(flow) + flow = _as_object(json.loads(flow)) except ValueError: flow = None if not isinstance(flow, dict) or "poll_secret_hash" not in flow: @@ -421,7 +530,7 @@ def _flatten_cli_sso_metadata_for_poll( def build_cli_sso_attribution_metadata( result: CustomOpenID | OpenID | dict, -) -> dict[str, Any]: +) -> dict[str, object]: """ Build allowlisted, non-secret scalar attribution metadata from an SSO result. @@ -432,7 +541,7 @@ def build_cli_sso_attribution_metadata( if not claim_map: return {} - metadata: Final[dict[str, Any]] = {} + metadata: Final[dict[str, object]] = {} for source_claim, dest_key in claim_map: if not _is_safe_cli_sso_metadata_dest_key(dest_key): verbose_proxy_logger.debug("Skipping unsafe CLI SSO metadata destination key: %s", dest_key) @@ -474,14 +583,14 @@ def _merge_cli_sso_attribution_metadata( async def _persist_cli_sso_user_metadata( prisma_client: PrismaClient, user_id: str, - attribution_metadata: dict[str, Any], + attribution_metadata: dict[str, object], ) -> None: if not attribution_metadata: return try: - user_row: Final = await UserRepository(prisma_client).table.find_unique(where={"user_id": user_id}) - existing_metadata: dict[str, Any] = {} + user_row: Final = await _user_meta_db(UserRepository(prisma_client)).find_unique(where={"user_id": user_id}) + existing_metadata: dict[str, object] = {} if user_row is not None: row_metadata: Final = user_row.metadata if isinstance(row_metadata, dict): @@ -491,7 +600,7 @@ async def _persist_cli_sso_user_metadata( existing_metadata=existing_metadata, attribution_metadata=attribution_metadata, ) - await UserRepository(prisma_client).table.update_many( + await _user_meta_db(UserRepository(prisma_client)).update_many( where={"user_id": user_id}, data={"metadata": merged_metadata}, ) @@ -1104,7 +1213,7 @@ def generic_response_convertor( ) # Build extra_fields dict from GENERIC_USER_EXTRA_ATTRIBUTES if specified - extra_fields: dict[str, Any] | None = None + extra_fields: dict[str, object] | None = None if generic_user_extra_attributes: extra_fields = {} for attr_name in generic_user_extra_attributes.split(","): @@ -1193,7 +1302,9 @@ async def _setup_team_mappings() -> Optional["TeamMappings"]: prisma_client: Final = get_prisma_client_or_throw("Prisma client is None, connect a database to your proxy") - sso_db_record: Final = await SSOConfigRepository(prisma_client).table.find_unique(where={"id": "sso_config"}) + sso_db_record: Final = await _sso_config_db(SSOConfigRepository(prisma_client)).find_unique( + where={"id": "sso_config"} + ) if sso_db_record and sso_db_record.sso_settings: sso_settings_dict: Final = dict(sso_db_record.sso_settings) @@ -1225,7 +1336,9 @@ async def _setup_role_mappings() -> Optional["RoleMappings"]: prisma_client: Final = get_prisma_client_or_throw("Prisma client is None, connect a database to your proxy") - sso_db_record: Final = await SSOConfigRepository(prisma_client).table.find_unique(where={"id": "sso_config"}) + sso_db_record: Final = await _sso_config_db(SSOConfigRepository(prisma_client)).find_unique( + where={"id": "sso_config"} + ) if sso_db_record and sso_db_record.sso_settings: sso_settings_dict: Final = dict(sso_db_record.sso_settings) @@ -1273,7 +1386,7 @@ async def _setup_role_mappings() -> Optional["RoleMappings"]: return role_mappings -def _parse_generic_sso_headers() -> dict: +def _parse_generic_sso_headers() -> dict[str, str]: """Parse comma-separated GENERIC_SSO_HEADERS env var into a dict.""" raw: Final = os.getenv("GENERIC_SSO_HEADERS", None) if raw is None: @@ -1677,7 +1790,7 @@ def _build_sso_user_update_data( result: Union["CustomOpenID", OpenID, dict] | None, user_email: str | None, user_id: str | None, -) -> dict: +) -> dict[str, object]: """ Build the update data dictionary for SSO user upsert. @@ -1689,7 +1802,7 @@ def _build_sso_user_update_data( Returns: dict: Update data containing user_email and optionally user_role if valid """ - update_data: Final[dict] = {"user_email": normalize_email(user_email)} + update_data: Final[dict[str, object]] = {"user_email": normalize_email(user_email)} # Get SSO role from result and include if valid sso_role: Final = getattr(result, "user_role", None) @@ -1740,7 +1853,7 @@ async def _sync_user_role_from_jwt_role_map( # Update existing DB record if role differs if user_info is not None and user_info.user_role != mapped_role.value: - await UserRepository(prisma_client).table.update( + await _user_meta_db(UserRepository(prisma_client)).update( where={"user_id": user_info.user_id}, data={"user_role": mapped_role.value}, ) @@ -1796,7 +1909,7 @@ async def check_and_update_if_proxy_admin_id(user_role: str, user_id: str, prism return user_role if prisma_client: - await UserRepository(prisma_client).table.update( + await _user_meta_db(UserRepository(prisma_client)).update( where={"user_id": user_id}, data={"user_role": LitellmUserRoles.PROXY_ADMIN.value}, ) @@ -2016,10 +2129,11 @@ async def _build_cli_sso_user_defined_values( ) -> SSOUserDefinedValues | None: from litellm.proxy.proxy_server import user_custom_sso + custom_sso_handler: Final[_CustomSsoCall | None] = user_custom_sso user_id: Final = parsed_openid_result.get("user_id") - if user_custom_sso is not None: - if inspect.iscoroutinefunction(user_custom_sso): - return await user_custom_sso(result) + if custom_sso_handler is not None: + if inspect.iscoroutinefunction(custom_sso_handler): + return await custom_sso_handler(result) raise ValueError("user_custom_sso must be a coroutine function") if user_id is None: return None @@ -2035,12 +2149,14 @@ async def _build_cli_sso_user_defined_values( async def _fetch_cli_sso_team_details( prisma_client: PrismaClient, - teams: list[str], -) -> list[dict[str, Any]]: - team_details: Final[list[dict[str, Any]]] = [] + teams: Sequence[str], +) -> list[dict[str, object]]: + team_details: Final[list[dict[str, object]]] = [] try: if teams: - prisma_teams: Final = await TeamRepository(prisma_client).table.find_many(where={"team_id": {"in": teams}}) + prisma_teams: Final = await _team_detail_db(TeamRepository(prisma_client)).find_many( + where={"team_id": {"in": teams}} + ) for team_row in prisma_teams: team_dict = team_row.model_dump() team_details.append( @@ -2257,12 +2373,12 @@ async def cli_poll_key( verbose_proxy_logger.info("Returning teams list for user %s to select from: %s", user_id, user_teams) # Best-effort construction of team_details if it wasn't # already cached for some reason. - team_details_response: list[dict[str, Any]] | None = None + team_details_response: list[dict[str, object]] | None = None if isinstance(user_team_details, list) and user_team_details: team_details_response = user_team_details elif user_teams: team_details_response = [{"team_id": t, "team_alias": None} for t in user_teams] - poll_response: dict[str, Any] = { + poll_response: dict[str, object] = { "status": "ready", "user_id": user_id, "teams": user_teams, @@ -2997,7 +3113,9 @@ class SSOAuthenticationHandler: user_id=user_id, ) - await UserRepository(prisma_client).table.update_many(where={"user_id": user_id}, data=update_data) + await _user_meta_db(UserRepository(prisma_client)).update_many( + where={"user_id": user_id}, data=update_data + ) else: verbose_proxy_logger.info("user not in DB, inserting user into LiteLLM DB") # user not in DB, insert User into LiteLLM DB @@ -3089,7 +3207,9 @@ class SSOAuthenticationHandler: code=status.HTTP_500_INTERNAL_SERVER_ERROR, ) try: - team_obj: Final = await TeamRepository(prisma_client).table.find_first(where={"team_id": litellm_team_id}) + team_obj: Final = await _team_detail_db(TeamRepository(prisma_client)).find_first( + where={"team_id": litellm_team_id} + ) verbose_proxy_logger.debug("Team object: %s", team_obj) # only create a new team if it doesn't exist @@ -3278,9 +3398,10 @@ class SSOAuthenticationHandler: # But if it is, we want their models preferences user_defined_values: SSOUserDefinedValues | None = None - if user_custom_sso is not None: - if inspect.iscoroutinefunction(user_custom_sso): - user_defined_values = await user_custom_sso(result) + custom_sso_handler: Final[_CustomSsoCall | None] = user_custom_sso + if custom_sso_handler is not None: + if inspect.iscoroutinefunction(custom_sso_handler): + user_defined_values = await custom_sso_handler(result) else: raise ValueError("user_custom_sso must be a coroutine function") elif user_id is not None: @@ -3448,7 +3569,7 @@ class SSOAuthenticationHandler: dict: Token exchange parameters """ # Prepare token exchange parameters (may add code_verifier: str later) - token_params: Final[dict[str, Any]] = {"include_client_id": generic_include_client_id} + token_params: Final[dict[str, object]] = {"include_client_id": generic_include_client_id} # Retrieve PKCE code_verifier if PKCE was used in authorization. # Gate on GENERIC_CLIENT_USE_PKCE to avoid an unnecessary Redis round-trip @@ -3663,7 +3784,7 @@ class SSOAuthenticationHandler: access_token string. Raises ProxyException on any validation failure. """ try: - token_response_raw: Final = response.json() + token_response_raw: Final[object] = _as_object(response.json()) except Exception as json_err: verbose_proxy_logger.error( "Failed to parse token response as JSON: %s. Body: %s", @@ -4253,7 +4374,7 @@ class MicrosoftSSOHandler: while next_link is not None and page_count < MicrosoftSSOHandler.MAX_GRAPH_API_PAGES: response = await async_client.get(next_link, headers=headers) - response_json = response.json() + response_json: _ServicePrincipalPage = response.json() verbose_proxy_logger.debug("Response from service principal app role assigned to: %s", response_json) for _object in response_json.get("value", []): diff --git a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py index 382df608a0c..08bb8698cac 100644 --- a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py +++ b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py @@ -4,11 +4,11 @@ import json import os from collections import Counter from collections.abc import Mapping -from typing import Any, Final +from typing import Any, Final, Protocol, TypeVar from urllib.parse import urlparse from fastapi import APIRouter, Body, Depends, File, HTTPException, UploadFile -from pydantic import ConfigDict, ValidationError, create_model +from pydantic import ConfigDict, JsonValue, ValidationError, create_model from pydantic.fields import FieldInfo import litellm @@ -36,6 +36,73 @@ from litellm.types.proxy.management_endpoints.ui_sso import ( router: Final = APIRouter() +_DbRecordT: Final = TypeVar("_DbRecordT", covariant=True) + + +class _PrismaTableActions(Protocol[_DbRecordT]): + async def find_unique(self, where: Mapping[str, object]) -> _DbRecordT | None: ... + + async def update(self, where: Mapping[str, object], data: Mapping[str, object]) -> _DbRecordT: ... + + async def upsert(self, where: Mapping[str, object], data: Mapping[str, object]) -> _DbRecordT: ... + + +class _SsoSettingsMappingRow(Protocol): + @property + def sso_settings(self) -> Mapping[str, object] | None: ... + + +class _HasSsoSettingsMappingTable(Protocol): + @property + def table(self) -> _PrismaTableActions[_SsoSettingsMappingRow]: ... + + +def _sso_settings_mapping_db(repo: _HasSsoSettingsMappingTable) -> _PrismaTableActions[_SsoSettingsMappingRow]: + return repo.table + + +class _StoredSsoSettingsRow(Protocol): + @property + def sso_settings(self) -> object: ... + + +class _HasStoredSsoSettingsTable(Protocol): + @property + def table(self) -> _PrismaTableActions[_StoredSsoSettingsRow]: ... + + +def _stored_sso_settings_db(repo: _HasStoredSsoSettingsTable) -> _PrismaTableActions[_StoredSsoSettingsRow]: + return repo.table + + +class _UiSettingsRow(Protocol): + @property + def ui_settings(self) -> str | Mapping[str, JsonValue] | None: ... + + +class _HasUiSettingsTable(Protocol): + @property + def table(self) -> _PrismaTableActions[_UiSettingsRow]: ... + + +def _ui_settings_db(repo: _HasUiSettingsTable) -> _PrismaTableActions[_UiSettingsRow]: + return repo.table + + +class _ConfigParamRow(Protocol): + @property + def param_value(self) -> str | Mapping[str, object] | None: ... + + +class _HasConfigParamTable(Protocol): + @property + def table(self) -> _PrismaTableActions[_ConfigParamRow]: ... + + +def _config_param_db(repo: _HasConfigParamTable) -> _PrismaTableActions[_ConfigParamRow]: + return repo.table + + # Maps each UIThemeConfig field to the env var the UI branding path reads it # from. /update/ui_theme_settings writes both the stored ui_theme_config and # these env vars, so /get/ui_theme_settings resolves the same env vars to @@ -54,7 +121,7 @@ def _is_public_http_url(value: str | None) -> bool: return parsed.scheme in ("http", "https") and bool(parsed.netloc) -def _resolve_ui_theme_field(stored_values: Mapping[str, Any], field_name: str) -> str | None: +def _resolve_ui_theme_field(stored_values: Mapping[str, object], field_name: str) -> str | None: """Resolve one UI theme field to the value the branding path actually uses. The stored ui_theme_config wins; a field absent or blank there falls back to @@ -263,7 +330,7 @@ _RUNTIME_GENERAL_SETTINGS_FLAGS: Final = [ # include generics like ``Optional[int]`` / ``List[str]`` that are not # instances of ``type`` — so tightening this to ``type`` would reject # valid inputs. -_EXTRA_UI_SETTINGS_FIELDS: Final[dict[str, tuple[Any, FieldInfo]]] = {} +_EXTRA_UI_SETTINGS_FIELDS: Final[dict[str, tuple[object, FieldInfo]]] = {} # Settings OSS knows about as enterprise-gated. If a caller sends one of # these keys and no extension package has registered it, the PATCH @@ -275,7 +342,7 @@ _ENTERPRISE_ONLY_UI_SETTINGS: Final[set[str]] = {"enable_projects_ui"} _EFFECTIVE_UI_SETTINGS_CLASS: type[UISettings] | None = None -def register_extra_ui_setting(name: str, annotation: Any, field: FieldInfo) -> None: +def register_extra_ui_setting(name: str, annotation: object, field: FieldInfo) -> None: """Register an additional UI settings field contributed by an extension package. ``field`` must be a ``FieldInfo`` instance — construct it directly @@ -470,7 +537,7 @@ async def delete_allowed_ip( async def _get_settings_with_schema( settings_key: str, - settings_class: Any, + settings_class: type[BaseModel], config: dict, ) -> dict: """ @@ -842,7 +909,9 @@ async def get_sso_settings(): # Resolve the effective SSO config: the stored row wins, else the process # environment, else each field's default. Unlike the legacy read path this # does not write os.environ; a GET has no business mutating the environment. - sso_db_record: Final = await SSOConfigRepository(prisma_client).table.find_unique(where={"id": "sso_config"}) + sso_db_record: Final = await _sso_settings_mapping_db(SSOConfigRepository(prisma_client)).find_unique( + where={"id": "sso_config"} + ) sso_db_settings: Final = dict(sso_db_record.sso_settings) if sso_db_record and sso_db_record.sso_settings else None resolved: Final = resolve_sso_config(sso_db_settings, os.environ) @@ -914,8 +983,10 @@ async def update_sso_settings( # before-snapshot has the same shape as after_value, and rely on # create_config_audit_log's secret-name redaction to mask the # *_client_secret fields before the audit row is written. - existing_sso_record: Final = await SSOConfigRepository(prisma_client).table.find_unique(where={"id": "sso_config"}) - before_sso_data: dict[str, Any] | None = None + existing_sso_record: Final = await _stored_sso_settings_db(SSOConfigRepository(prisma_client)).find_unique( + where={"id": "sso_config"} + ) + before_sso_data: dict[str, JsonValue] | None = None if existing_sso_record and existing_sso_record.sso_settings: stored = existing_sso_record.sso_settings if isinstance(stored, str): @@ -948,7 +1019,7 @@ async def update_sso_settings( encrypted_sso_data: Final = proxy_config._encrypt_env_variables(environment_variables=sso_data) # Save to dedicated SSO table - await SSOConfigRepository(prisma_client).table.upsert( + await _stored_sso_settings_db(SSOConfigRepository(prisma_client)).upsert( where={"id": "sso_config"}, data={ "create": { @@ -974,7 +1045,7 @@ async def update_sso_settings( # Remove SSO-related env vars from config.environment_variables try: - env_var_entry: Final = await ConfigRepository(prisma_client).table.find_unique( + env_var_entry: Final = await _config_param_db(ConfigRepository(prisma_client)).find_unique( where={"param_name": "environment_variables"} ) @@ -982,7 +1053,7 @@ async def update_sso_settings( if env_var_entry is not None: if env_var_entry.param_value is not None: if isinstance(env_var_entry.param_value, str): - environment_variables = json.loads(env_var_entry.param_value) + environment_variables: Mapping[str, object] = json.loads(env_var_entry.param_value) else: environment_variables = dict(env_var_entry.param_value) else: @@ -993,7 +1064,7 @@ async def update_sso_settings( key: value for key, value in environment_variables.items() if key not in env_vars_to_remove } - await ConfigRepository(prisma_client).table.update( + await _config_param_db(ConfigRepository(prisma_client)).update( where={"param_name": "environment_variables"}, data={ "param_value": json.dumps(filtered_env_vars, default=str), @@ -1239,8 +1310,10 @@ async def get_ui_settings_cached() -> dict[str, Any]: if prisma_client is None: return {} - db_record: Final = await UISettingsRepository(prisma_client).table.find_unique(where={"id": "ui_settings"}) - ui_settings: dict[str, Any] = {} + db_record: Final = await _ui_settings_db(UISettingsRepository(prisma_client)).find_unique( + where={"id": "ui_settings"} + ) + ui_settings: dict[str, JsonValue] = {} if db_record and db_record.ui_settings: raw: Final = db_record.ui_settings ui_settings = json.loads(raw) if isinstance(raw, str) else dict(raw) @@ -1272,9 +1345,11 @@ async def get_ui_settings(): detail={"error": "Database not connected. Please connect a database."}, ) - ui_settings: dict[str, Any] = {} + ui_settings: Mapping[str, JsonValue] = {} - db_record: Final = await UISettingsRepository(prisma_client).table.find_unique(where={"id": "ui_settings"}) + db_record: Final = await _ui_settings_db(UISettingsRepository(prisma_client)).find_unique( + where={"id": "ui_settings"} + ) if db_record and db_record.ui_settings: ui_settings_json: Final = db_record.ui_settings @@ -1300,7 +1375,7 @@ async def get_ui_settings(): await user_api_key_cache.async_set_cache(key=UI_SETTINGS_CACHE_KEY, value=ui_settings, ttl=UI_SETTINGS_CACHE_TTL) # Build config-like object for schema helper - config: Final[dict[str, Any]] = {"litellm_settings": {"ui_settings": ui_settings}} + config: Final[dict[str, object]] = {"litellm_settings": {"ui_settings": ui_settings}} return await _get_settings_with_schema( settings_key="ui_settings", @@ -1315,7 +1390,7 @@ async def get_ui_settings(): dependencies=[Depends(user_api_key_auth)], ) async def update_ui_settings( - settings_body: dict[str, Any] = Body(...), + settings_body: dict[str, object] = Body(...), user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), ): """ @@ -1352,7 +1427,7 @@ async def update_ui_settings( raise HTTPException(status_code=422, detail=e.errors()) # Only include fields the caller actually sent (not Pydantic defaults). - settings_dict: Final = settings.model_dump(exclude_unset=True) + settings_dict: Final[Mapping[str, JsonValue]] = settings.model_dump(exclude_unset=True) # Reject enterprise-only settings up front so the caller gets a clear # signal instead of a silent drop. @@ -1373,15 +1448,17 @@ async def update_ui_settings( # Merge with existing persisted settings so a partial PATCH doesn't # overwrite fields the caller didn't send. - existing: dict = {} - db_existing: Final = await UISettingsRepository(prisma_client).table.find_unique(where={"id": "ui_settings"}) + existing: dict[str, JsonValue] = {} + db_existing: Final = await _ui_settings_db(UISettingsRepository(prisma_client)).find_unique( + where={"id": "ui_settings"} + ) if db_existing and db_existing.ui_settings: raw: Final = db_existing.ui_settings existing = json.loads(raw) if isinstance(raw, str) else dict(raw) ui_settings: Final = {**existing, **incoming} - await UISettingsRepository(prisma_client).table.upsert( + await _ui_settings_db(UISettingsRepository(prisma_client)).upsert( where={"id": "ui_settings"}, data={ "create": { diff --git a/litellm/proxy/vector_store_endpoints/management_endpoints.py b/litellm/proxy/vector_store_endpoints/management_endpoints.py index 6b40281198c..2b037bef795 100644 --- a/litellm/proxy/vector_store_endpoints/management_endpoints.py +++ b/litellm/proxy/vector_store_endpoints/management_endpoints.py @@ -10,10 +10,17 @@ All /vector_store management endpoints import copy import json -from typing import Any, Final +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, Final, Protocol from fastapi import APIRouter, Depends, HTTPException +if TYPE_CHECKING: + from prisma.models import LiteLLM_ManagedVectorStoresTable as _VectorStoreRow + + from litellm.proxy.utils import PrismaClient + from litellm.router import Router + import litellm from litellm._logging import verbose_proxy_logger from litellm.caching.in_memory_cache import InMemoryCache @@ -43,6 +50,25 @@ from litellm.vector_stores.vector_store_registry import VectorStoreRegistry router: Final = APIRouter() + +class _VectorStoreTableActions(Protocol): + async def find_unique(self, where: Mapping[str, str]) -> "_VectorStoreRow | None": ... + + async def create(self, data: Mapping[str, object]) -> "_VectorStoreRow": ... + + async def update(self, where: Mapping[str, str], data: Mapping[str, object]) -> "_VectorStoreRow": ... + + async def delete(self, where: Mapping[str, str]) -> "_VectorStoreRow | None": ... + + +def _vector_store_table(prisma_client: "PrismaClient") -> _VectorStoreTableActions: + return ManagedVectorStoresRepository(prisma_client).table + + +def _row_to_vector_store(row: "_VectorStoreRow") -> LiteLLM_ManagedVectorStore: + return LiteLLM_ManagedVectorStore(**row.model_dump()) + + _LITELLM_PARAMS_MASKER: Final = SensitiveDataMasker() @@ -117,22 +143,20 @@ def _redact_sensitive_litellm_params(litellm_params: Any, _depth: int = 0) -> An async def _fetch_and_authorize_vector_store( vector_store_id: str, user_api_key_dict: UserAPIKeyAuth, - prisma_client: Any, + prisma_client: "PrismaClient", ) -> "LiteLLM_ManagedVectorStore": """ Look up a vector store by id and confirm the caller can access it. Raises HTTPException(404) on miss and HTTPException(403) on access denial. """ - row: Final = await ManagedVectorStoresRepository(prisma_client).table.find_unique( - where={"vector_store_id": vector_store_id} - ) + row: Final = await _vector_store_table(prisma_client).find_unique(where={"vector_store_id": vector_store_id}) if row is None: raise HTTPException( status_code=404, detail=f"Vector store with ID {vector_store_id} not found", ) - typed: Final = LiteLLM_ManagedVectorStore(**row.model_dump()) + typed: Final = _row_to_vector_store(row) if not await _check_vector_store_access(typed, user_api_key_dict): raise HTTPException( status_code=403, @@ -141,7 +165,7 @@ async def _fetch_and_authorize_vector_store( return typed -def _resolve_embedding_config_from_router(embedding_model: str, llm_router) -> dict[str, Any] | None: +def _resolve_embedding_config_from_router(embedding_model: str, llm_router) -> dict[str, object] | None: """ Resolve embedding config from router's config-defined models. @@ -177,7 +201,7 @@ def _resolve_embedding_config_from_router(embedding_model: str, llm_router) -> d litellm_params = deployment.litellm_params # Build embedding config from model params - embedding_config: dict[str, Any] = {} + embedding_config: dict[str, object] = {} # Extract api_key api_key = getattr(litellm_params, "api_key", None) @@ -217,7 +241,9 @@ def _resolve_embedding_config_from_router(embedding_model: str, llm_router) -> d return None -async def _resolve_embedding_config_from_db(embedding_model: str, prisma_client) -> dict[str, Any] | None: +async def _resolve_embedding_config_from_db( + embedding_model: str, prisma_client: "PrismaClient" +) -> dict[str, object] | None: """ Resolve embedding config from database model configuration. @@ -307,7 +333,9 @@ async def _resolve_embedding_config_from_db(embedding_model: str, prisma_client) return None -async def _resolve_embedding_config(embedding_model: str, prisma_client, llm_router=None) -> dict[str, Any] | None: +async def _resolve_embedding_config( + embedding_model: str, prisma_client: "PrismaClient | None", llm_router: "Router | None" = None +) -> dict[str, object] | None: """ Resolve embedding config from either router (config-defined) or database models. @@ -388,7 +416,7 @@ async def _check_vector_store_access( async def create_vector_store_in_db( vector_store_id: str, custom_llm_provider: str, - prisma_client, + prisma_client: "PrismaClient | None", vector_store_name: str | None = None, vector_store_description: str | None = None, vector_store_metadata: dict | None = None, @@ -417,7 +445,7 @@ async def create_vector_store_in_db( raise HTTPException(status_code=500, detail="Database not connected") # Check if vector store already exists - existing_vector_store: Final = await ManagedVectorStoresRepository(prisma_client).table.find_unique( + existing_vector_store: Final = await _vector_store_table(prisma_client).find_unique( where={"vector_store_id": vector_store_id} ) if existing_vector_store is not None: @@ -427,7 +455,7 @@ async def create_vector_store_in_db( ) # Prepare data for database - data_to_create: Final[dict[str, Any]] = { + data_to_create: Final[dict[str, object]] = { "vector_store_id": vector_store_id, "custom_llm_provider": custom_llm_provider, } @@ -463,9 +491,9 @@ async def create_vector_store_in_db( data_to_create["litellm_params"] = safe_dumps({}) # Create in database - _new_vector_store: Final = await ManagedVectorStoresRepository(prisma_client).table.create(data=data_to_create) + _new_vector_store: Final = await _vector_store_table(prisma_client).create(data=data_to_create) - new_vector_store: Final[LiteLLM_ManagedVectorStore] = LiteLLM_ManagedVectorStore(**_new_vector_store.model_dump()) + new_vector_store: Final[LiteLLM_ManagedVectorStore] = _row_to_vector_store(_new_vector_store) # Add vector store to registry if litellm.vector_store_registry is not None: @@ -682,12 +710,12 @@ async def delete_vector_store( memory_vector_store_exists = False vector_store_to_check = None - existing_vector_store: Final = await ManagedVectorStoresRepository(prisma_client).table.find_unique( + existing_vector_store: Final = await _vector_store_table(prisma_client).find_unique( where={"vector_store_id": data.vector_store_id} ) if existing_vector_store is not None: db_vector_store_exists = True - vector_store_to_check = LiteLLM_ManagedVectorStore(**existing_vector_store.model_dump()) + vector_store_to_check = _row_to_vector_store(existing_vector_store) # Check in-memory registry if litellm.vector_store_registry is not None: @@ -715,9 +743,7 @@ async def delete_vector_store( # Delete from database if exists if db_vector_store_exists: - await ManagedVectorStoresRepository(prisma_client).table.delete( - where={"vector_store_id": data.vector_store_id} - ) + await _vector_store_table(prisma_client).delete(where={"vector_store_id": data.vector_store_id}) # Delete from in-memory registry if exists if memory_vector_store_exists and litellm.vector_store_registry is not None: @@ -829,7 +855,7 @@ async def update_vector_store( try: update_data: Final = data.model_dump(exclude_unset=True) - vector_store_id: Final = update_data.pop("vector_store_id") + vector_store_id: Final[str] = update_data.pop("vector_store_id") # Per-store access control: anyone authenticated who passes the # premium-feature gate could otherwise update *any* vector store — @@ -857,12 +883,12 @@ async def update_vector_store( update_data["litellm_params"] = safe_dumps(litellm_params_dict) # Update in database - updated: Final = await ManagedVectorStoresRepository(prisma_client).table.update( + updated: Final = await _vector_store_table(prisma_client).update( where={"vector_store_id": vector_store_id}, data=update_data, ) - updated_vs: Final = LiteLLM_ManagedVectorStore(**updated.model_dump()) + updated_vs: Final = _row_to_vector_store(updated) # Immediately update in-memory registry to keep it in sync if litellm.vector_store_registry is not None: diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index f54023836e5..b2d065ea23b 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -4,8 +4,8 @@ Handles transforming from Responses API -> LiteLLM completion (Chat Completion import json import re -from collections.abc import Sequence -from typing import Any, Final, Literal, cast +from collections.abc import Iterator, Mapping, Sequence +from typing import TYPE_CHECKING, Any, Final, Literal, Protocol, cast, runtime_checkable from openai.types.chat.chat_completion_named_tool_choice_param import ( ChatCompletionNamedToolChoiceParam, @@ -16,6 +16,7 @@ from openai.types.chat.chat_completion_named_tool_choice_param import ( from openai.types.responses import ResponseFunctionToolCall from openai.types.responses.response_create_params import ResponseInputParam from openai.types.responses.tool_param import FunctionToolParam +from pydantic import TypeAdapter from typing_extensions import TypedDict from litellm._logging import verbose_logger @@ -78,9 +79,35 @@ from .custom_tools import ( unwrap_custom_tool_arguments, ) +if TYPE_CHECKING: + from openai.types.responses.response_apply_patch_tool_call import ( + ResponseApplyPatchToolCall, + ) + ########### Initialize Classes used for Responses API ########### TOOL_CALLS_CACHE: Final = InMemoryCache() +_ANY_KEY_DICT_ADAPTER: Final = TypeAdapter(dict[object, object]) +_STR_KEY_DICT_ADAPTER: Final = TypeAdapter(dict[str, object]) +_OBJECT_LIST_ADAPTER: Final = TypeAdapter(list[object]) +_DICT_ITEMS_LIST_ADAPTER: Final = TypeAdapter(list[dict[object, object]]) +_TEXT_ADAPTER: Final = TypeAdapter(str) + + +@runtime_checkable +class _SupportsIter(Protocol): + def __iter__(self) -> Iterator[object]: ... + + +@runtime_checkable +class _HasToolCalls(Protocol): + tool_calls: object + + +@runtime_checkable +class _HasId(Protocol): + id: object + class ChatCompletionSession(TypedDict, total=False): messages: list[ @@ -205,7 +232,7 @@ class LiteLLMCompletionResponsesConfig: responses_api_request: ResponsesAPIOptionalRequestParams, custom_llm_provider: str | None = None, stream: bool | None = None, - extra_headers: dict[str, Any] | None = None, + extra_headers: Mapping[str, object] | None = None, **kwargs, ) -> dict: """ @@ -462,7 +489,9 @@ class LiteLLMCompletionResponsesConfig: if not chat_completion_messages: continue - deduped_in_place: list[Any] = [] + deduped_in_place: list[ + AllMessageValues | GenericChatCompletionMessage | ChatCompletionResponseMessage + ] = [] for m in chat_completion_messages: role = "" if isinstance(m, dict): @@ -472,7 +501,7 @@ class LiteLLMCompletionResponsesConfig: # Drop assistant tool_calls wrappers if we already have this call_id if role == "assistant": - tool_calls: Any = ( + tool_calls: object = ( m.get("tool_calls") if isinstance(m, dict) else getattr(m, "tool_calls", None) ) call_id = "" @@ -534,7 +563,7 @@ class LiteLLMCompletionResponsesConfig: call_id = "" if role == "assistant": - tool_calls: Any = None + tool_calls: object = None if isinstance(tool_call_message, dict): tool_calls = tool_call_message.get("tool_calls") else: @@ -578,7 +607,16 @@ class LiteLLMCompletionResponsesConfig: return False @staticmethod - def _find_previous_assistant_idx(messages: list[Any], current_idx: int) -> int | None: + def _find_previous_assistant_idx( + messages: Sequence[ + AllMessageValues + | GenericChatCompletionMessage + | ChatCompletionResponseMessage + | ChatCompletionMessageToolCall + | Message + ], + current_idx: int, + ) -> int | None: """Find the index of the previous assistant message.""" for j in range(current_idx - 1, -1, -1): if messages[j].get("role") == "assistant": @@ -586,7 +624,18 @@ class LiteLLMCompletionResponsesConfig: return None @staticmethod - def _recover_tool_call_id_from_assistant(assistant_message: Any, message: Any) -> str: + def _recover_tool_call_id_from_assistant( + assistant_message: AllMessageValues + | GenericChatCompletionMessage + | ChatCompletionResponseMessage + | ChatCompletionMessageToolCall + | Message, + message: AllMessageValues + | GenericChatCompletionMessage + | ChatCompletionResponseMessage + | ChatCompletionMessageToolCall + | Message, + ) -> str: """Try to recover empty tool_call_id from assistant message's tool_calls.""" tool_calls_raw: Final = ( assistant_message.get("tool_calls") @@ -594,17 +643,23 @@ class LiteLLMCompletionResponsesConfig: else getattr(assistant_message, "tool_calls", None) ) if tool_calls_raw and isinstance(tool_calls_raw, list) and len(tool_calls_raw) > 0: - first_tool_call: Final = tool_calls_raw[0] + first_tool_call: Final = _OBJECT_LIST_ADAPTER.validate_python(tool_calls_raw)[0] if isinstance(first_tool_call, dict): - tool_call_id_raw = first_tool_call.get("id", "") + tool_call_id_raw = _ANY_KEY_DICT_ADAPTER.validate_python(first_tool_call).get("id", "") return str(tool_call_id_raw) if tool_call_id_raw is not None else "" - elif hasattr(first_tool_call, "id"): - tool_call_id_raw = getattr(first_tool_call, "id", None) + elif isinstance(first_tool_call, _HasId): + tool_call_id_raw = first_tool_call.id return str(tool_call_id_raw) if tool_call_id_raw is not None else "" return "" @staticmethod - def _get_tool_calls_list(assistant_message: Any) -> list[Any]: + def _get_tool_calls_list( + assistant_message: AllMessageValues + | GenericChatCompletionMessage + | ChatCompletionResponseMessage + | ChatCompletionMessageToolCall + | Message, + ) -> Sequence[object]: """Extract tool_calls as a list from assistant message.""" tool_calls_raw: Final = ( assistant_message.get("tool_calls") @@ -614,18 +669,18 @@ class LiteLLMCompletionResponsesConfig: if tool_calls_raw is None: return [] if isinstance(tool_calls_raw, list): - return tool_calls_raw - if hasattr(tool_calls_raw, "__iter__") and not isinstance(tool_calls_raw, (str, bytes)): + return _OBJECT_LIST_ADAPTER.validate_python(tool_calls_raw) + if isinstance(tool_calls_raw, _SupportsIter) and not isinstance(tool_calls_raw, (str, bytes)): return list(tool_calls_raw) return [] @staticmethod - def _check_tool_call_exists(tool_calls: list[Any], tool_call_id: str) -> bool: + def _check_tool_call_exists(tool_calls: Sequence[object], tool_call_id: str) -> bool: """Check if a tool_call with the given ID exists in the list.""" for tool_call in tool_calls: - tool_call_id_to_check: str | None = None + tool_call_id_to_check: object = None if isinstance(tool_call, dict): - tool_call_id_to_check = tool_call.get("id") + tool_call_id_to_check = _ANY_KEY_DICT_ADAPTER.validate_python(tool_call).get("id") elif hasattr(tool_call, "id"): tool_call_id_to_check = getattr(tool_call, "id", None) if tool_call_id_to_check == tool_call_id: @@ -633,12 +688,13 @@ class LiteLLMCompletionResponsesConfig: return False @staticmethod - def _reconstruct_tool_call_from_tools(tool_call_id: str, tools: list[Any]) -> dict[str, Any] | None: + def _reconstruct_tool_call_from_tools(tool_call_id: str, tools: Sequence[object]) -> dict[str, object] | None: """Reconstruct a minimal tool_call definition from tools list.""" for tool in tools: if isinstance(tool, dict): - tool_function = tool.get("function") or {} - tool_name = tool_function.get("name") or tool.get("name") or "" + tool_map = _ANY_KEY_DICT_ADAPTER.validate_python(tool) + tool_function = _ANY_KEY_DICT_ADAPTER.validate_python(tool_map.get("function") or {}) + tool_name = tool_function.get("name") or tool_map.get("name") or "" if tool_name: return { "id": tool_call_id, @@ -651,7 +707,7 @@ class LiteLLMCompletionResponsesConfig: return None @staticmethod - def _get_mapping_or_attr_value(obj: Any, key: str, default: Any = None) -> Any: + def _get_mapping_or_attr_value(obj: object, key: str, default: object = None) -> object: """ Safely read a field from dict-like or attribute-based objects. """ @@ -659,7 +715,7 @@ class LiteLLMCompletionResponsesConfig: return default if isinstance(obj, dict): - return obj.get(key, default) + return _ANY_KEY_DICT_ADAPTER.validate_python(obj).get(key, default) getter: Final = getattr(obj, "get", None) if callable(getter): @@ -672,13 +728,13 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def _create_tool_call_chunk( - tool_use_definition: dict[str, Any], tool_call_id: str, index: int + tool_use_definition: Mapping[object, object], tool_call_id: str, index: int ) -> ChatCompletionToolCallChunk: """Create a ChatCompletionToolCallChunk from tool_use_definition.""" function_raw = LiteLLMCompletionResponsesConfig._get_mapping_or_attr_value(tool_use_definition, "function") function_name_raw: Final = LiteLLMCompletionResponsesConfig._get_mapping_or_attr_value(function_raw, "name") function_arguments_raw = LiteLLMCompletionResponsesConfig._get_mapping_or_attr_value(function_raw, "arguments") - function: Final[dict[str, Any]] = { + function: Final[dict[str, object]] = { "name": function_name_raw or "", "arguments": function_arguments_raw or "{}", } @@ -697,7 +753,7 @@ class LiteLLMCompletionResponsesConfig: ) @staticmethod - def _normalize_tool_use_definition(tool_use_definition: Any, tool_call_id: str) -> dict[str, Any] | None: + def _normalize_tool_use_definition(tool_use_definition: object, tool_call_id: str) -> dict[object, object] | None: """ Normalize cached tool_call definitions to a dict-like shape consumed by _create_tool_call_chunk. """ @@ -705,7 +761,7 @@ class LiteLLMCompletionResponsesConfig: return None if isinstance(tool_use_definition, dict): - normalized_definition: dict[str, Any] = dict(tool_use_definition) + normalized_definition: dict[object, object] = _ANY_KEY_DICT_ADAPTER.validate_python(tool_use_definition) else: tool_use_id_raw = LiteLLMCompletionResponsesConfig._get_mapping_or_attr_value(tool_use_definition, "id") tool_use_type_raw = LiteLLMCompletionResponsesConfig._get_mapping_or_attr_value(tool_use_definition, "type") @@ -738,7 +794,7 @@ class LiteLLMCompletionResponsesConfig: return normalized_definition @staticmethod - def _add_tool_call_to_assistant(assistant_message: Any, tool_call_chunk: ChatCompletionToolCallChunk) -> None: + def _add_tool_call_to_assistant(assistant_message: object, tool_call_chunk: ChatCompletionToolCallChunk) -> None: """Add a tool_call to an assistant message.""" if isinstance(assistant_message, dict): prev_assistant_dict: Final = cast(dict[str, Any], assistant_message) @@ -747,7 +803,7 @@ class LiteLLMCompletionResponsesConfig: tool_calls_list: Final = prev_assistant_dict["tool_calls"] if isinstance(tool_calls_list, list): tool_calls_list.append(tool_call_chunk) - elif hasattr(assistant_message, "tool_calls"): + elif isinstance(assistant_message, _HasToolCalls): if assistant_message.tool_calls is None: assistant_message.tool_calls = [] if isinstance(assistant_message.tool_calls, list): @@ -762,7 +818,7 @@ class LiteLLMCompletionResponsesConfig: | ChatCompletionMessageToolCall | Message ], - tools: list[Any] | None = None, + tools: Sequence[object] | None = None, ) -> list[ AllMessageValues | GenericChatCompletionMessage @@ -851,7 +907,7 @@ class LiteLLMCompletionResponsesConfig: tool_calls = LiteLLMCompletionResponsesConfig._get_tool_calls_list(prev_assistant) if not LiteLLMCompletionResponsesConfig._check_tool_call_exists(tool_calls, tool_call_id): - _tool_use_definition = TOOL_CALLS_CACHE.get_cache(key=tool_call_id) + _tool_use_definition: object = TOOL_CALLS_CACHE.get_cache(key=tool_call_id) if not _tool_use_definition and tools: _tool_use_definition = LiteLLMCompletionResponsesConfig._reconstruct_tool_call_from_tools( @@ -908,7 +964,7 @@ class LiteLLMCompletionResponsesConfig: function_call=input_item ) else: - content: Final = input_item.get("content") + content: Final[object] = input_item.get("content") # Handle None content: Responses API allows None content, but GenericChatCompletionMessage requires content # Since guardrails skip None content anyway, we return empty list to exclude it from structured messages if content is None: @@ -923,7 +979,7 @@ class LiteLLMCompletionResponsesConfig: ] @staticmethod - def _is_input_item_tool_call_output(input_item: Any) -> bool: + def _is_input_item_tool_call_output(input_item: Mapping[str, object]) -> bool: """ Check if the input item is a tool call output """ @@ -936,7 +992,7 @@ class LiteLLMCompletionResponsesConfig: ] @staticmethod - def _is_input_item_function_call(input_item: Any) -> bool: + def _is_input_item_function_call(input_item: Mapping[str, object]) -> bool: """ Check if the input item is a function call or custom tool call. Both need to be reconstructed as assistant tool_calls for Chat @@ -946,7 +1002,7 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def _transform_responses_api_tool_call_output_to_chat_completion_message( - tool_call_output: dict[str, Any], + tool_call_output: Mapping[str, object], ) -> list[AllMessageValues | GenericChatCompletionMessage | ChatCompletionResponseMessage]: """ ChatCompletionToolMessage is used to indicate the output from a tool call @@ -958,7 +1014,7 @@ class LiteLLMCompletionResponsesConfig: return [] def _normalize_function_call_output_to_tool_content( - output: Any, + output: object, ) -> Any: """ Normalize Responses API function_call_output.output into a shape that downstream @@ -981,7 +1037,7 @@ class LiteLLMCompletionResponsesConfig: # Some adapters represent tool output as a list of "input_*" parts if isinstance(output, list): - normalized_blocks: Final[list[dict[str, Any]]] = [] + normalized_blocks: Final[list[dict[str, object]]] = [] text_acc: Final[list[str]] = [] for part in output: if not isinstance(part, dict): @@ -1082,7 +1138,7 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def _transform_responses_api_function_call_to_chat_completion_message( - function_call: dict[str, Any], + function_call: Mapping[str, str], ) -> list[AllMessageValues | GenericChatCompletionMessage | ChatCompletionResponseMessage]: """ Transform a Responses API function_call into a Chat Completion message with tool calls @@ -1127,7 +1183,7 @@ class LiteLLMCompletionResponsesConfig: return [chat_completion_response_message] @staticmethod - def _resolve_file_id(item: dict[str, Any]) -> str | None: + def _resolve_file_id(item: Mapping[str, object]) -> object: """ Return the effective file_id for a Responses API input_file item. Explicit file_id takes precedence; file_url is used as fallback so @@ -1136,7 +1192,7 @@ class LiteLLMCompletionResponsesConfig: return item.get("file_id") or item.get("file_url") or None @staticmethod - def _transform_input_file_item_to_file_item(item: dict[str, Any]) -> dict[str, Any]: + def _transform_input_file_item_to_file_item(item: Mapping[str, object]) -> dict[str, object]: """ Transform a Responses API input_file item to a Chat Completion file item @@ -1146,21 +1202,21 @@ class LiteLLMCompletionResponsesConfig: Returns: Dictionary with transformed file structure for Chat Completion """ - file_dict: Final[dict[str, Any]] = {} + file_dict: Final[dict[str, object]] = {} file_id: Final = LiteLLMCompletionResponsesConfig._resolve_file_id(item) if file_id: file_dict["file_id"] = file_id if item.get("file_data"): file_dict["file_data"] = item["file_data"] - new_item: Final[dict[str, Any]] = {"type": "file", "file": file_dict} + new_item: Final[dict[str, object]] = {"type": "file", "file": file_dict} if "cache_control" in item: new_item["cache_control"] = item["cache_control"] return new_item @staticmethod def _transform_input_image_item_to_image_item( - item: dict[str, Any], + item: Mapping[str, str], ) -> ChatCompletionImageObject: """ Transform a Responses API input_image item to a Chat Completion image item @@ -1173,8 +1229,8 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def _transform_responses_api_content_to_chat_completion_content( - content: Any, - ) -> str | list[str | dict[str, Any]]: + content: object, + ) -> str | list[str | dict[str, object]]: """ Transform a Responses API content into a Chat Completion content @@ -1188,7 +1244,7 @@ class LiteLLMCompletionResponsesConfig: elif isinstance(content, str): return content elif isinstance(content, list): - content_list: Final[list[str | dict[str, Any]]] = [] + content_list: Final[list[str | dict[str, object]]] = [] for item in content: if isinstance(item, str): content_list.append(item) @@ -1198,8 +1254,8 @@ class LiteLLMCompletionResponsesConfig: LiteLLMCompletionResponsesConfig._transform_input_file_item_to_file_item(item) ) elif item.get("type") == "input_image": - image_block = dict( - LiteLLMCompletionResponsesConfig._transform_input_image_item_to_image_item(item) + image_block = _STR_KEY_DICT_ADAPTER.validate_python( + dict(LiteLLMCompletionResponsesConfig._transform_input_image_item_to_image_item(item)) ) if "cache_control" in item: image_block["cache_control"] = item["cache_control"] @@ -1209,7 +1265,7 @@ class LiteLLMCompletionResponsesConfig: text_value = item.get("text") if text_value is None: continue - content_block: dict[str, Any] = { + content_block: dict[str, object] = { "type": LiteLLMCompletionResponsesConfig._get_chat_completion_request_content_type( item.get("type") or "text" ), @@ -1299,7 +1355,7 @@ class LiteLLMCompletionResponsesConfig: parameters = dict(typed_tool.get("parameters", {}) or {}) if not parameters or "type" not in parameters: parameters["type"] = "object" - chat_completion_tool: dict[str, Any] = { + chat_completion_tool: dict[str, object] = { "type": "function", "function": { "name": typed_tool.get("name") or "", @@ -1340,7 +1396,7 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def transform_chat_completion_tool_params_to_responses_api_tools( chat_completion_tools: list[ChatCompletionToolParam | OpenAIMcpServerTool] | None, - ) -> list[dict[str, Any]]: + ) -> list[dict[str, object]]: """ Transform Chat Completion tool params (e.g. from guardrail output) back to Responses API request tool format. Inverse of @@ -1348,7 +1404,7 @@ class LiteLLMCompletionResponsesConfig: """ if chat_completion_tools is None or not chat_completion_tools: return [] - result: Final[list[dict[str, Any]]] = [] + result: Final[list[dict[str, object]]] = [] for tool in chat_completion_tools: if not isinstance(tool, dict): result.append(tool) @@ -1358,7 +1414,7 @@ class LiteLLMCompletionResponsesConfig: parameters = dict(fn.get("parameters", {}) or {}) if not parameters or "type" not in parameters: parameters["type"] = "object" - responses_tool: dict[str, Any] = { + responses_tool: dict[str, object] = { "type": "function", "name": fn.get("name") or "", "description": fn.get("description") or "", @@ -1510,7 +1566,7 @@ class LiteLLMCompletionResponsesConfig: def convert_response_function_tool_call_to_chat_completion_tool_call( tool_call_item: Any, index: int = 0, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Convert ResponseFunctionToolCall to ChatCompletionToolCallChunk format. @@ -1536,7 +1592,7 @@ class LiteLLMCompletionResponsesConfig: else (dict(provider_fields) if hasattr(provider_fields, "__dict__") else {}) ) - function_dict: Final[dict[str, Any]] = { + function_dict: Final[dict[str, object]] = { "name": tool_call_item.name, "arguments": tool_call_item.arguments, } @@ -1544,7 +1600,7 @@ class LiteLLMCompletionResponsesConfig: if provider_specific_fields: function_dict["provider_specific_fields"] = provider_specific_fields - tool_call_dict: Final[dict[str, Any]] = { + tool_call_dict: Final[dict[str, object]] = { "id": LiteLLMCompletionResponsesConfig._tool_call_id_from_responses_item( getattr(tool_call_item, "id", None), getattr(tool_call_item, "call_id", None), @@ -1561,9 +1617,9 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def convert_apply_patch_tool_call_to_chat_completion_tool_call( - tool_call_item: Any, + tool_call_item: "ResponseApplyPatchToolCall", index: int = 0, - ) -> dict[str, Any]: + ) -> dict[str, object]: """ Convert ResponseApplyPatchToolCall to ChatCompletionToolCallChunk format. @@ -1581,7 +1637,7 @@ class LiteLLMCompletionResponsesConfig: import json operation_dict: Final = tool_call_item.operation.model_dump() - tool_call_dict: Final[dict[str, Any]] = { + tool_call_dict: Final[dict[str, object]] = { "id": tool_call_item.call_id, "function": { "name": "apply_patch", @@ -1795,9 +1851,11 @@ class LiteLLMCompletionResponsesConfig: if not images: return image_generation_items - for idx, image_item in enumerate(images): + for idx, image_item in enumerate(_DICT_ITEMS_LIST_ADAPTER.validate_python(images)): # Extract base64 from data URL - image_url = image_item.get("image_url", {}).get("url", "") + image_url = _TEXT_ADAPTER.validate_python( + _ANY_KEY_DICT_ADAPTER.validate_python(image_item.get("image_url", {})).get("url", "") + ) base64_data = LiteLLMCompletionResponsesConfig._extract_base64_from_data_url(image_url) if base64_data: @@ -2048,8 +2106,8 @@ class LiteLLMCompletionResponsesConfig: @staticmethod def _transform_text_format_to_response_format( - text_param: dict[str, Any] | Any, - ) -> dict[str, Any] | None: + text_param: object, + ) -> dict[str, object] | None: """ Transform Responses API text.format parameter to Chat Completion response_format parameter. diff --git a/litellm/responses/streaming_iterator.py b/litellm/responses/streaming_iterator.py index 820839fc6bf..2e1e1a44594 100644 --- a/litellm/responses/streaming_iterator.py +++ b/litellm/responses/streaming_iterator.py @@ -5,7 +5,7 @@ import json import time import traceback import uuid -from collections.abc import Mapping +from collections.abc import Awaitable, Callable, Mapping from datetime import datetime from functools import lru_cache from types import MappingProxyType @@ -33,6 +33,7 @@ from litellm.llms.base_llm.responses.transformation import BaseResponsesAPIConfi from litellm.responses.utils import ResponseAPILoggingUtils, ResponsesAPIRequestUtils from litellm.types.llms.openai import ( PART_UNION_TYPES, + ResponseAPIUsage, ResponsesAPIResponse, ResponsesAPIStreamEvents, ResponsesAPIStreamingResponse, @@ -112,7 +113,7 @@ _ERROR_CODE_HTTP_STATUS: Final[Mapping[str, int]] = MappingProxyType( def _error_event_fields(error_obj: object) -> tuple[str, str | None, str | None]: - if isinstance(error_obj, dict): + if _is_json_object(error_obj): raw_message = error_obj.get("message") raw_type = error_obj.get("type") raw_code = error_obj.get("code") @@ -243,7 +244,9 @@ class BaseResponsesAPIStreamingIterator: # Using getattr(..., "response") alone is unsafe with Mocks: they synthesize a # truthy child Mock for any attribute, which breaks tests and is wrong on stream. if "response" in parsed_chunk: - response_object: Final = getattr(openai_responses_api_chunk, "response", None) + response_object: Final[ResponsesAPIResponse | None] = getattr( + openai_responses_api_chunk, "response", None + ) if response_object is not None: response: Final = ResponsesAPIRequestUtils._update_responses_api_response_id_with_model_id( responses_api_response=response_object, @@ -279,7 +282,9 @@ class BaseResponsesAPIStreamingIterator: model_id=_stream_model_id, ) elif _event_type == ResponsesAPIStreamEvents.CONTENT_PART_DONE: - _part: Final = getattr(openai_responses_api_chunk, "part", None) + _part: Final[PART_UNION_TYPES | Mapping[str, object] | None] = getattr( + openai_responses_api_chunk, "part", None + ) if _part is not None: if isinstance(_part, dict): ResponsesAPIRequestUtils._encode_container_ids_in_annotations( @@ -302,7 +307,7 @@ class BaseResponsesAPIStreamingIterator: openai_types.ResponsesAPIStreamEvents.OUTPUT_ITEM_ADDED, openai_types.ResponsesAPIStreamEvents.OUTPUT_ITEM_DONE, ): - item: Final = getattr(openai_responses_api_chunk, "item", None) + item: Final[object | None] = getattr(openai_responses_api_chunk, "item", None) if item: encrypted_content: Final = getattr(item, "encrypted_content", None) if encrypted_content and isinstance(encrypted_content, str): @@ -324,9 +329,11 @@ class BaseResponsesAPIStreamingIterator: self.completed_response = openai_responses_api_chunk # Add cost to usage object if include_cost_in_streaming_usage is True if litellm.include_cost_in_streaming_usage and self.logging_obj is not None: - response_obj: Final[Any | None] = getattr(openai_responses_api_chunk, "response", None) + response_obj: Final[ResponsesAPIResponse | None] = getattr( + openai_responses_api_chunk, "response", None + ) if response_obj: - usage_obj: Final[Any | None] = getattr(response_obj, "usage", None) + usage_obj: Final[ResponseAPIUsage | None] = getattr(response_obj, "usage", None) if usage_obj is not None: try: cost: float | None = self.logging_obj._response_cost_calculator(result=response_obj) @@ -414,7 +421,9 @@ class BaseResponsesAPIStreamingIterator: async_failure_handler / failure_handler so logging integrations correctly record the call as failed. """ - response_obj: Final = getattr(self.completed_response, "response", None) if self.completed_response else None + response_obj: Final[ResponsesAPIResponse | None] = ( + getattr(self.completed_response, "response", None) if self.completed_response else None + ) error_info: Final = getattr(response_obj, "error", None) if response_obj else None error_message, error_type, error_code = _error_event_fields(error_info) self._record_failed_response_usage(response_obj) @@ -429,7 +438,7 @@ class BaseResponsesAPIStreamingIterator: def _record_failed_response_usage(self, response_obj: ResponsesAPIResponse | None) -> None: if response_obj is None or self.logging_obj is None: return - usage_obj: Final = getattr(response_obj, "usage", None) + usage_obj: Final[ResponseAPIUsage | None] = getattr(response_obj, "usage", None) if usage_obj is None: return try: @@ -506,7 +515,7 @@ class BaseResponsesAPIStreamingIterator: return request_kwargs = getattr(caching_handler, "request_kwargs", None) - if not isinstance(request_kwargs, dict) or request_kwargs.get("stream") is not True: + if not _is_json_object(request_kwargs) or request_kwargs.get("stream") is not True: return request_kwargs = request_kwargs.copy() preset_cache_key = getattr(caching_handler, "preset_cache_key", None) @@ -606,7 +615,7 @@ class BaseResponsesAPIStreamingIterator: if self.completed_response is None: return - request_payload: Final[dict[str, Any]] = {} + request_payload: Final[dict[str, object]] = {} if isinstance(self.request_data, dict): request_payload.update(self.request_data) try: @@ -695,11 +704,15 @@ class BaseResponsesAPIStreamingIterator: pass -async def call_post_streaming_hooks_for_testing(iterator, chunk): +async def call_post_streaming_hooks_for_testing( + iterator: object, chunk: ResponsesAPIStreamingResponse +) -> ResponsesAPIStreamingResponse: """ Module-level helper for tests to ensure hooks can be invoked even if the iterator is wrapped. """ - hook_fn: Final = getattr(iterator, "_call_post_streaming_deployment_hook", None) + hook_fn: Final[Callable[[ResponsesAPIStreamingResponse], Awaitable[ResponsesAPIStreamingResponse]] | None] = ( + getattr(iterator, "_call_post_streaming_deployment_hook", None) + ) if hook_fn is None: return chunk return await hook_fn(chunk) @@ -1019,7 +1032,7 @@ class CachedResponsesAPIStreamingIterator(BaseResponsesAPIStreamingIterator): def _dump_response_object(obj: Any) -> dict[str, Any]: if hasattr(obj, "model_dump"): return obj.model_dump() - if isinstance(obj, dict): + if _is_json_object(obj): return obj return {} @@ -1684,7 +1697,7 @@ class ResponsesWebSocketStreaming: return response_str try: - evt_obj: Final = json.loads(response_str) + evt_obj: Final[Mapping[str, object]] = json.loads(response_str) except (json.JSONDecodeError, TypeError): return response_str @@ -1925,7 +1938,7 @@ class ManagedResponsesWebSocketHandler: @staticmethod def _extract_output_messages( - completed_event: dict[str, Any], + completed_event: dict[str, object], ) -> list[dict[str, object]]: """ Convert the output items in a ``response.completed`` event into @@ -2065,7 +2078,7 @@ class ManagedResponsesWebSocketHandler: Flat: {"type": "response.create", "input": [...], "model": "...", ...} """ nested: Final = msg_obj.get("response") - response_params: Final[dict[str, Any]] = ( + response_params: Final[dict[str, object]] = ( nested if _is_json_object(nested) and nested else {k: v for k, v in msg_obj.items() if k != "type"} ) return { @@ -2076,7 +2089,7 @@ class ManagedResponsesWebSocketHandler: def _apply_history( self, - call_kwargs: dict[str, Any], + call_kwargs: dict[str, object], previous_response_id: str | None, current_messages: list[dict[str, object]], prior_history: list[dict[str, object]], @@ -2129,7 +2142,7 @@ class ManagedResponsesWebSocketHandler: return False return event_provider == self._connection_provider - def _inject_credentials(self, call_kwargs: dict[str, Any], model: str | None = None) -> None: + def _inject_credentials(self, call_kwargs: dict[str, object], model: str | None = None) -> None: """Inject connection-level credentials and metadata into call_kwargs.""" if self.api_key is not None: call_kwargs["api_key"] = self.api_key diff --git a/ruff-strict-budget.json b/ruff-strict-budget.json index a8af4eabb3f..68a6451e273 100644 --- a/ruff-strict-budget.json +++ b/ruff-strict-budget.json @@ -1,6 +1,6 @@ { "ANN001": { - "limit": 3121 + "limit": 3114 }, "ANN002": { "limit": 71 @@ -9,7 +9,7 @@ "limit": 834 }, "ANN201": { - "limit": 2032 + "limit": 2031 }, "ANN202": { "limit": 865 @@ -24,7 +24,7 @@ "limit": 133 }, "ANN401": { - "limit": 1630 + "limit": 1555 }, "ASYNC230": { "limit": 11 @@ -81,7 +81,7 @@ "limit": 1 }, "C901": { - "limit": 315 + "limit": 314 }, "D419": { "limit": 6 @@ -306,7 +306,7 @@ "limit": 0 }, "TID251": { - "limit": 1240 + "limit": 1238 }, "TRY002": { "limit": 528 diff --git a/type-discipline-budget.json b/type-discipline-budget.json index 0a0cfe9a617..3a670bc7345 100644 --- a/type-discipline-budget.json +++ b/type-discipline-budget.json @@ -1,9 +1,9 @@ { "LIT001": { - "limit": 23235 + "limit": 23149 }, "LIT002": { - "limit": 27176 + "limit": 27166 }, "LIT003": { "limit": 269 @@ -15,7 +15,7 @@ "limit": 0 }, "LIT006": { - "limit": 1091 + "limit": 1086 }, "LIT007": { "limit": 0 @@ -27,7 +27,7 @@ "limit": 0 }, "LIT010": { - "limit": 16769 + "limit": 16760 }, "LIT011": { "limit": 5598 From fb7861fbfd9273ff081d496745456a772b2a36a2 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 10:41:06 -0700 Subject: [PATCH 040/279] build(lint): count deleted files toward check triggers --- CLAUDE.md | 2 +- scripts/pre_commit_lint.sh | 22 ++++++++----- tests/test_litellm/test_pre_commit_lint.py | 36 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0354e3def53..abd5993eb1a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,7 +41,7 @@ Python max line length is 120, not 88 When you fix violations gated by `ruff-strict-budget.json`, `type-discipline-budget.json`, or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered limits so the ceilings ratchet down instead of leaving stale headroom. It measures the working tree, so it must contain exactly the fixes you're committing -Run `make check` (formerly `make pre-commit`, which still works as an alias) before every commit, merge commits included. It runs the CI-gating lint scoped to your staged files, so stage everything you intend to commit first; it warns about changed files you left unstaged and names the checks that were skipped because of them. With nothing staged it instead checks the working tree's diff against the merge base with origin/litellm_internal_staging, which is how you predict the CI lint on an already-committed branch, e.g. right after a merge commit +Run `make check` (formerly `make pre-commit`, which still works as an alias) before every commit, merge commits included. It runs the CI-gating lint scoped to your staged files, so stage everything you intend to commit first; it warns about changed files you left unstaged and names the checks that were skipped because of them. With nothing staged it instead checks the working tree's diff against the merge base with origin/litellm_internal_staging, which is how you predict the CI lint on an already-committed branch, e.g. right after a merge commit. Deleted files count toward which checks run (a deletion alone can turn CI red) in both modes `make check` saves its complete output to a log file in .git (overwriting previous logs) and prints that path as its first and last output lines. To inspect a run, read or grep that log instead of re-running the multi-minute checks just to see a different slice diff --git a/scripts/pre_commit_lint.sh b/scripts/pre_commit_lint.sh index 1bf7fe17832..afe55603466 100755 --- a/scripts/pre_commit_lint.sh +++ b/scripts/pre_commit_lint.sh @@ -44,7 +44,7 @@ fi repo_root=$(git rev-parse --show-toplevel) cd "$repo_root" -staged=$(git diff --cached --name-only --diff-filter=ACMR) +staged=$(git diff --cached --name-only --diff-filter=ACMRD) unstaged=$(git diff --name-only) untracked=$(git ls-files --others --exclude-standard) @@ -57,7 +57,7 @@ else echo " Fix: git fetch origin litellm_internal_staging" >&2 exit 1 } - scope=$(printf '%s\n' "$(git diff --name-only --diff-filter=ACMR "$merge_base")" "$untracked" | sed '/^$/d' | sort -u) + scope=$(printf '%s\n' "$(git diff --name-only --diff-filter=ACMRD "$merge_base")" "$untracked" | sed '/^$/d' | sort -u) if [ -z "$scope" ]; then echo "check: nothing to check (no staged files, no working-tree changes, no branch changes vs origin/litellm_internal_staging)" exit 0 @@ -68,6 +68,12 @@ fi scope_match() { printf '%s\n' "$scope" | grep -E "$1" || true; } +existing_files() { + while IFS= read -r f; do + if [ -f "$f" ]; then printf '%s\n' "$f"; fi + done +} + litellm_py_pattern='^litellm/.*\.py$' e2e_py_pattern='^tests/e2e/.*\.py$' spec_pattern='^(litellm/(proxy|types)/.*|ui/litellm-dashboard/(scripts/gen-api-types\.mjs|package\.json|package-lock\.json|src/lib/http/schema\.d\.ts))$' @@ -80,15 +86,17 @@ ui_eslint_pattern='^ui/litellm-dashboard/.*\.(js|jsx|ts|tsx|mjs|cjs)$' litellm_py_files=$(scope_match "$litellm_py_pattern") e2e_py_files=$(scope_match "$e2e_py_pattern") # ruff format (and CI's format step) skip enterprise; the rest of make lint covers it. -fmt_files=$(printf '%s\n' "$litellm_py_files" | grep -v '^litellm/enterprise/' || true) +fmt_files=$(printf '%s\n' "$litellm_py_files" | grep -v '^litellm/enterprise/' | existing_files) # check-ui-api-types.yml triggers on any file under litellm/proxy or litellm/types # (Prisma schema and configs included, not just Python) plus the generator and its # lockfiles, so match that whole trigger set rather than a Python subset. spec_files=$(scope_match "$spec_pattern") # CI's frontend-lint runs prettier over a wider extension set than eslint; keep that # split so this flags exactly what the job would. -ui_prettier_files=$(scope_match "$ui_prettier_pattern") -ui_eslint_files=$(scope_match "$ui_eslint_pattern") +ui_prettier_changed=$(scope_match "$ui_prettier_pattern") +ui_eslint_changed=$(scope_match "$ui_eslint_pattern") +ui_prettier_files=$(printf '%s\n' "$ui_prettier_changed" | existing_files) +ui_eslint_files=$(printf '%s\n' "$ui_eslint_changed" | existing_files) # CI lints the committed tree, so with staged files this script predicts CI for # what you have STAGED (every trigger above reads `git diff --cached`). The tools @@ -116,7 +124,7 @@ if [ -n "$staged" ]; then } warn_skipped "Python lint (make lint)" "$litellm_py_pattern" "$litellm_py_files" warn_skipped "tests/e2e checks (basedpyright + raw HTTP client ban)" "$e2e_py_pattern" "$e2e_py_files" - warn_skipped "dashboard lint (prettier + eslint + lint budgets)" "$ui_prettier_pattern" "$ui_prettier_files" + warn_skipped "dashboard lint (prettier + eslint + lint budgets)" "$ui_prettier_pattern" "$ui_prettier_changed" warn_skipped "dashboard API-type sync (npm run gen:api)" "$spec_pattern" "$spec_files" fi @@ -214,7 +222,7 @@ dashboard_checks() { lint_dashboard || { echo "✗ Dashboard lint failed. See above; format with: (cd ui/litellm-dashboard && npm run format)." >&2; return 1; } } -if [ -n "$ui_prettier_files" ] || [ -n "$ui_eslint_files" ]; then +if [ -n "$ui_prettier_changed" ] || [ -n "$ui_eslint_changed" ]; then dash_log=$(mktemp) set -m dashboard_checks > "$dash_log" 2>&1 & diff --git a/tests/test_litellm/test_pre_commit_lint.py b/tests/test_litellm/test_pre_commit_lint.py index 12b8d338b49..35d98903226 100644 --- a/tests/test_litellm/test_pre_commit_lint.py +++ b/tests/test_litellm/test_pre_commit_lint.py @@ -181,6 +181,42 @@ def test_nothing_staged_includes_untracked_files_in_scope(tmp_path: Path) -> Non assert "linting Python" in proc.stdout +def test_nothing_staged_deletion_only_branch_triggers_checks(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + (repo / "litellm" / "foo.py").unlink() + _commit_all(repo, "delete module") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "nothing to check" not in proc.stdout + assert "litellm/foo.py" in proc.stdout + assert "linting Python" in proc.stdout + assert "ruff format --check" not in proc.stdout + + +def test_staged_deletion_triggers_checks_without_feeding_missing_files_to_tools(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + subprocess.run(["git", "rm", "-q", "litellm/foo.py"], cwd=repo, check=True) + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "nothing staged" not in proc.stdout + assert "linting Python" in proc.stdout + assert "ruff format --check" not in proc.stdout + + +def test_deleted_dashboard_file_still_triggers_dashboard_lint(tmp_path: Path) -> None: + repo, bin_dir = _sandbox(tmp_path) + _commit_all(repo, "base") + _set_base_ref(repo) + (repo / "ui" / "litellm-dashboard" / "src" / "app.ts").unlink() + _commit_all(repo, "delete dashboard file") + proc = _run(repo, bin_dir, {}) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "linting dashboard" in proc.stdout + + def test_nothing_staged_and_no_changes_is_an_explicit_no_op(tmp_path: Path) -> None: repo, bin_dir = _sandbox(tmp_path) _commit_all(repo, "base") From f6df762b2537b797b2562af44ac9107ed4fe5c77 Mon Sep 17 00:00:00 2001 From: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 10:45:43 -0700 Subject: [PATCH 041/279] test: roll back live router replay membership between tests (#36278) Since #35491, every Router joins the module-global _live_routers weak set at construction, and every model cost map swap replays the deployments of every member on top of the freshly adopted map. #36039 isolated the register_model ledger half of that replay but not this half: under pytest-xdist, a Router created by an earlier test in the same worker that was still referenced (or simply not yet garbage collected) re-registered its deployments during TestPriceDataReloadIntegration::test_distributed_reload_check_function, and register_model hydrated the sparse mocked gpt-3.5-turbo entry into a full ModelInfo dict, failing the exact-equality assert (reruns cannot help since the polluting router survives in the worker process) The autouse isolate_litellm_state fixture now snapshots _live_routers before each test and restores its membership on teardown, so a test's routers stop contributing to cost map rebuilds once the test ends. A canary pair in test_conftest_isolation.py asserts the rollback --- tests/test_litellm/conftest.py | 8 +++++++ tests/test_litellm/test_conftest_isolation.py | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/tests/test_litellm/conftest.py b/tests/test_litellm/conftest.py index c0993051d33..0dc8f56f3ce 100644 --- a/tests/test_litellm/conftest.py +++ b/tests/test_litellm/conftest.py @@ -19,6 +19,7 @@ sys.path.insert( import asyncio import litellm +from litellm import router as litellm_router_module from litellm import utils as litellm_utils_module from litellm._logging import ALL_LOGGERS from litellm.litellm_core_utils.prompt_templates import ( @@ -244,6 +245,8 @@ def isolate_litellm_state(): for model_key, model_value in litellm_utils_module._runtime_registered_model_cost.items() } + original_live_routers = set(litellm_router_module._live_routers) + # Store LiteLLM logger state. Some tests reconfigure handlers/propagation for # JSON logging and do not restore them, which breaks later caplog-based tests. logger_state = {} @@ -313,6 +316,11 @@ def isolate_litellm_state(): litellm_utils_module._runtime_registered_model_cost.clear() litellm_utils_module._runtime_registered_model_cost.update(original_runtime_registered_model_cost) + for _router in tuple(litellm_router_module._live_routers): + litellm_router_module._live_routers.discard(_router) + for _router in original_live_routers: + litellm_router_module._live_routers.add(_router) + # Restore logger configuration mutated by logging-focused tests. for logger in ALL_LOGGERS: original_logger_state = logger_state.get(logger.name) diff --git a/tests/test_litellm/test_conftest_isolation.py b/tests/test_litellm/test_conftest_isolation.py index 88889ad7740..15183e68f66 100644 --- a/tests/test_litellm/test_conftest_isolation.py +++ b/tests/test_litellm/test_conftest_isolation.py @@ -1,9 +1,15 @@ import litellm +from litellm import Router +from litellm import router as litellm_router_module from litellm import utils as litellm_utils_module CANARY_MODEL = "conftest-isolation-canary-model" +class _CanaryRouterHolder: + router: Router | None = None + + def test_register_model_ledger_entry_is_scoped_to_this_test(): litellm.register_model({CANARY_MODEL: {"litellm_provider": "openai", "input_cost_per_token": 0.001}}) assert CANARY_MODEL in litellm_utils_module._runtime_registered_model_cost @@ -11,3 +17,20 @@ def test_register_model_ledger_entry_is_scoped_to_this_test(): def test_register_model_ledger_entry_was_rolled_back(): assert CANARY_MODEL not in litellm_utils_module._runtime_registered_model_cost + + +def test_live_router_membership_is_scoped_to_this_test(): + _CanaryRouterHolder.router = Router( + model_list=[ + { + "model_name": "conftest-isolation-canary-router", + "litellm_params": {"model": "openai/conftest-isolation-canary-backend", "api_key": "sk-canary"}, + } + ] + ) + assert _CanaryRouterHolder.router in litellm_router_module._live_routers + + +def test_live_router_membership_was_rolled_back(): + assert _CanaryRouterHolder.router is not None + assert _CanaryRouterHolder.router not in litellm_router_module._live_routers From 0d7f7c689a58aeea6cd26b8cb9fba90b31be8955 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Sat, 8 Aug 2026 12:19:22 -0700 Subject: [PATCH 042/279] test: repair stale CircleCI contracts --- litellm/proxy/db/autorouter_session_rollup.py | 47 +++++++++++++++++ .../auto_router_endpoints.py | 50 +------------------ tests/agent_tests/test_a2a_agent.py | 2 +- .../test_proxy_budget_reset.py | 24 ++++++--- .../base_responses_api.py | 4 +- .../spend/test_autorouter_session_rollup.py | 16 +++--- .../src/components/team/TeamInfo.test.tsx | 23 +-------- ui/litellm-dashboard/src/lib/http/schema.d.ts | 2 +- 8 files changed, 81 insertions(+), 87 deletions(-) diff --git a/litellm/proxy/db/autorouter_session_rollup.py b/litellm/proxy/db/autorouter_session_rollup.py index b1f074c26b7..9732b1d7402 100644 --- a/litellm/proxy/db/autorouter_session_rollup.py +++ b/litellm/proxy/db/autorouter_session_rollup.py @@ -33,6 +33,53 @@ if TYPE_CHECKING: CACHE_TTL_5M_SECONDS: Final = 300 CACHE_TTL_1H_SECONDS: Final = 3600 +AUTOROUTER_BENCHMARKS_SQL: Final = """ +WITH windowed AS ( + SELECT * FROM "LiteLLM_AutoRouterSession" + WHERE last_turn_at >= $1::timestamp AND first_turn_at < $2::timestamp +), +tier_maps AS ( + SELECT router_name, router_type, jsonb_object_agg(tier, tier_turns) AS tier_turns + FROM ( + SELECT router_name, router_type, kv.key AS tier, SUM((kv.value)::int)::int AS tier_turns + FROM windowed, LATERAL jsonb_each_text(tier_turns) AS kv + GROUP BY router_name, router_type, kv.key + ) per_tier + GROUP BY router_name, router_type +) +SELECT + agg.*, + COALESCE(tier_maps.tier_turns, '{}'::jsonb) AS tier_turns +FROM ( +SELECT + router_name, + router_type, + COUNT(*)::int AS sessions, + COALESCE(SUM(turns), 0)::int AS turns, + COALESCE(SUM(unordered_turns), 0)::int AS unordered_turns, + COALESCE(SUM(covered_turns), 0)::int AS covered_turns, + COALESCE(SUM(cache_hits), 0)::int AS cache_hits, + COALESCE(SUM(same_model_turns), 0)::int AS same_model_turns, + COALESCE(SUM(same_model_hits), 0)::int AS same_model_hits, + COALESCE(SUM(first_visit_turns), 0)::int AS first_visit_turns, + COALESCE(SUM(first_visit_hits), 0)::int AS first_visit_hits, + COALESCE(SUM(return_turns), 0)::int AS return_turns, + COALESCE(SUM(return_hits), 0)::int AS return_hits, + COALESCE(SUM(return_expired_misses), 0)::int AS return_expired_misses, + COALESCE(SUM(return_within_ttl_misses), 0)::int AS return_within_ttl_misses, + COALESCE(SUM(ttl_5m_turns), 0)::int AS ttl_5m_turns, + COALESCE(SUM(ttl_1h_turns), 0)::int AS ttl_1h_turns, + COALESCE(SUM(total_tokens), 0)::bigint AS total_tokens, + COALESCE(SUM(spend), 0)::float8 AS spend, + COALESCE(SUM(saved_spend), 0)::float8 AS saved_spend, + COALESCE(SUM(EXTRACT(EPOCH FROM (last_turn_at - first_turn_at))), 0)::float8 AS session_seconds +FROM windowed +GROUP BY router_name, router_type +) agg +LEFT JOIN tier_maps USING (router_name, router_type) +ORDER BY agg.spend DESC +""" + @dataclass(frozen=True, slots=True) class AutoRouterTurnTransaction: diff --git a/litellm/proxy/management_endpoints/auto_router_endpoints.py b/litellm/proxy/management_endpoints/auto_router_endpoints.py index d4221845b0c..8b6aafea751 100644 --- a/litellm/proxy/management_endpoints/auto_router_endpoints.py +++ b/litellm/proxy/management_endpoints/auto_router_endpoints.py @@ -26,6 +26,7 @@ from litellm.proxy.auth.auth_checks import ( can_key_call_resolved_model, ) from litellm.proxy.auth.user_api_key_auth import user_api_key_auth +from litellm.proxy.db.autorouter_session_rollup import AUTOROUTER_BENCHMARKS_SQL from litellm.proxy.litellm_pre_call_utils import LiteLLMProxyRequestSetup from litellm.repositories.team_repository import TeamRepository from litellm.router_strategy.complexity_router import ComplexityRouter @@ -285,53 +286,6 @@ class _SessionAggRow(BaseModel): _SESSION_AGG_ROWS: Final = TypeAdapter(list[_SessionAggRow]) -_BENCHMARKS_SQL: Final = """ -WITH windowed AS ( - SELECT * FROM "LiteLLM_AutoRouterSession" - WHERE last_turn_at >= $1::timestamp AND first_turn_at < $2::timestamp -), -tier_maps AS ( - SELECT router_name, router_type, jsonb_object_agg(tier, tier_turns) AS tier_turns - FROM ( - SELECT router_name, router_type, kv.key AS tier, SUM((kv.value)::int)::int AS tier_turns - FROM windowed, LATERAL jsonb_each_text(tier_turns) AS kv - GROUP BY router_name, router_type, kv.key - ) per_tier - GROUP BY router_name, router_type -) -SELECT - agg.*, - COALESCE(tier_maps.tier_turns, '{}'::jsonb) AS tier_turns -FROM ( -SELECT - router_name, - router_type, - COUNT(*)::int AS sessions, - COALESCE(SUM(turns), 0)::int AS turns, - COALESCE(SUM(unordered_turns), 0)::int AS unordered_turns, - COALESCE(SUM(covered_turns), 0)::int AS covered_turns, - COALESCE(SUM(cache_hits), 0)::int AS cache_hits, - COALESCE(SUM(same_model_turns), 0)::int AS same_model_turns, - COALESCE(SUM(same_model_hits), 0)::int AS same_model_hits, - COALESCE(SUM(first_visit_turns), 0)::int AS first_visit_turns, - COALESCE(SUM(first_visit_hits), 0)::int AS first_visit_hits, - COALESCE(SUM(return_turns), 0)::int AS return_turns, - COALESCE(SUM(return_hits), 0)::int AS return_hits, - COALESCE(SUM(return_expired_misses), 0)::int AS return_expired_misses, - COALESCE(SUM(return_within_ttl_misses), 0)::int AS return_within_ttl_misses, - COALESCE(SUM(ttl_5m_turns), 0)::int AS ttl_5m_turns, - COALESCE(SUM(ttl_1h_turns), 0)::int AS ttl_1h_turns, - COALESCE(SUM(total_tokens), 0)::bigint AS total_tokens, - COALESCE(SUM(spend), 0)::float8 AS spend, - COALESCE(SUM(saved_spend), 0)::float8 AS saved_spend, - COALESCE(SUM(EXTRACT(EPOCH FROM (last_turn_at - first_turn_at))), 0)::float8 AS session_seconds -FROM windowed -GROUP BY router_name, router_type -) agg -LEFT JOIN tier_maps USING (router_name, router_type) -ORDER BY agg.spend DESC -""" - def _parse_benchmark_day(value: str) -> datetime: try: @@ -455,7 +409,7 @@ async def get_auto_router_benchmarks( raise HTTPException(status_code=400, detail="end_date must not be earlier than start_date") raw_rows: Final = await prisma_client.db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, start_day.isoformat(), (end_day + timedelta(days=1)).isoformat(), ) diff --git a/tests/agent_tests/test_a2a_agent.py b/tests/agent_tests/test_a2a_agent.py index f5ad9601369..1f72ced64f1 100644 --- a/tests/agent_tests/test_a2a_agent.py +++ b/tests/agent_tests/test_a2a_agent.py @@ -40,7 +40,7 @@ class MockA2AClient: name="mock-agent", url="http://mock-agent.local" ) - async def send_message(self, request): + async def send_message(self, request, *, context=None): from a2a.compat.v0_3.conversions import pb2_v10 for text in ("hel", "hello"): diff --git a/tests/litellm_utils_tests/test_proxy_budget_reset.py b/tests/litellm_utils_tests/test_proxy_budget_reset.py index 44da3ea06a0..00d5380b2f4 100644 --- a/tests/litellm_utils_tests/test_proxy_budget_reset.py +++ b/tests/litellm_utils_tests/test_proxy_budget_reset.py @@ -622,8 +622,12 @@ async def test_service_logger_keys_success(): logger success hook is called with the correct event metadata and no exception is logged. """ keys = [ - {"id": "key1", "spend": 10.0, "budget_duration": 60, "token": "key1"}, - {"id": "key2", "spend": 15.0, "budget_duration": 60, "token": "key2"}, + _attrify( + {"id": "key1", "spend": 10.0, "budget_duration": 60, "token": "key1"} + ), + _attrify( + {"id": "key2", "spend": 15.0, "budget_duration": 60, "token": "key2"} + ), ] prisma_client = MagicMock() prisma_client.get_data = AsyncMock(return_value=keys) @@ -740,8 +744,12 @@ async def test_service_logger_users_success(): the correct metadata and no exception is logged. """ users = [ - {"id": "user1", "spend": 20.0, "budget_duration": 120, "user_id": "user1"}, - {"id": "user2", "spend": 25.0, "budget_duration": 120, "user_id": "user2"}, + _attrify( + {"id": "user1", "spend": 20.0, "budget_duration": 120, "user_id": "user1"} + ), + _attrify( + {"id": "user2", "spend": 25.0, "budget_duration": 120, "user_id": "user2"} + ), ] prisma_client = MagicMock() prisma_client.get_data = AsyncMock(return_value=users) @@ -853,8 +861,12 @@ async def test_service_logger_teams_success(): the proper metadata and nothing is logged as an exception. """ teams = [ - {"id": "team1", "spend": 30.0, "budget_duration": 180, "team_id": "team1"}, - {"id": "team2", "spend": 35.0, "budget_duration": 180, "team_id": "team2"}, + _attrify( + {"id": "team1", "spend": 30.0, "budget_duration": 180, "team_id": "team1"} + ), + _attrify( + {"id": "team2", "spend": 35.0, "budget_duration": 180, "team_id": "team2"} + ), ] prisma_client = MagicMock() prisma_client.get_data = AsyncMock(return_value=teams) diff --git a/tests/llm_responses_api_testing/base_responses_api.py b/tests/llm_responses_api_testing/base_responses_api.py index 407091a65b3..f5751aa79e8 100644 --- a/tests/llm_responses_api_testing/base_responses_api.py +++ b/tests/llm_responses_api_testing/base_responses_api.py @@ -338,7 +338,7 @@ class BaseResponsesAPITest(ABC): ) assert result is not None assert result.id == response.id - assert result.output == response.output + assert result.output_text == response.output_text else: raise ValueError("response is not a ResponsesAPIResponse") else: @@ -352,7 +352,7 @@ class BaseResponsesAPITest(ABC): ) assert result is not None assert result.id == response.id - assert result.output == response.output + assert result.output_text == response.output_text else: raise ValueError("response is not a ResponsesAPIResponse") diff --git a/tests/proxy_behavior/spend/test_autorouter_session_rollup.py b/tests/proxy_behavior/spend/test_autorouter_session_rollup.py index 65b70f13a3b..7bc61c40ea0 100644 --- a/tests/proxy_behavior/spend/test_autorouter_session_rollup.py +++ b/tests/proxy_behavior/spend/test_autorouter_session_rollup.py @@ -12,8 +12,10 @@ from typing import Final import pytest -from litellm.proxy.db.autorouter_session_rollup import UPSERT_AUTOROUTER_SESSION_SQL -from litellm.proxy.management_endpoints.auto_router_endpoints import _BENCHMARKS_SQL +from litellm.proxy.db.autorouter_session_rollup import ( + AUTOROUTER_BENCHMARKS_SQL, + UPSERT_AUTOROUTER_SESSION_SQL, +) pytestmark = pytest.mark.asyncio(loop_scope="session") @@ -164,7 +166,7 @@ async def test_the_benchmarks_aggregate_reads_only_overlapping_sessions(db): await _turn(db, key, "A", T0 - timedelta(days=40), session_id=out_of_window, router=router) rows = await db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, (T0 - timedelta(days=1)).isoformat(), (T0 + timedelta(days=1)).isoformat(), ) @@ -186,7 +188,7 @@ async def test_a_reconfigured_alias_reports_each_router_type_as_its_own_group(db await _turn(db, key, "A", T0 + timedelta(seconds=10), session_id=f"s-{uuid.uuid4()}", router=router, router_type="quality") rows = await db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, (T0 - timedelta(days=1)).isoformat(), (T0 + timedelta(days=1)).isoformat(), ) @@ -248,7 +250,7 @@ async def test_the_benchmarks_aggregate_sums_tier_turns_across_sessions(db): await _turn(db, key, "C", T0 + timedelta(seconds=30), session_id=f"s-{uuid.uuid4()}", router=router, tier=None) rows = await db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, (T0 - timedelta(days=1)).isoformat(), (T0 + timedelta(days=1)).isoformat(), ) @@ -275,7 +277,7 @@ async def test_tier_maps_stay_separate_per_router_type_on_a_reconfigured_alias(d ) rows = await db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, (T0 - timedelta(days=1)).isoformat(), (T0 + timedelta(days=1)).isoformat(), ) @@ -289,7 +291,7 @@ async def test_a_window_with_no_tiered_turns_aggregates_to_an_empty_map(db): await _turn(db, key, "A", T0, session_id=f"s-{uuid.uuid4()}", router=router, tier=None) rows = await db.query_raw( - _BENCHMARKS_SQL, + AUTOROUTER_BENCHMARKS_SQL, (T0 - timedelta(days=1)).isoformat(), (T0 + timedelta(days=1)).isoformat(), ) diff --git a/ui/litellm-dashboard/src/components/team/TeamInfo.test.tsx b/ui/litellm-dashboard/src/components/team/TeamInfo.test.tsx index 513719a2ad9..50e10285148 100644 --- a/ui/litellm-dashboard/src/components/team/TeamInfo.test.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamInfo.test.tsx @@ -919,7 +919,7 @@ describe("TeamInfoView", () => { }); }; - it("prefills pairs from team metadata, hides UI-managed keys, and round-trips typed values on save", async () => { + it("should preserve metadata types and hide managed keys", async () => { const user = userEvent.setup({ delay: null }); vi.mocked(networking.teamInfoCall).mockResolvedValue( createMockTeamData({ @@ -964,27 +964,6 @@ describe("TeamInfoView", () => { expect(updateArg.model_tpm_limit).toEqual({ "gpt-4": 100 }); }); - it("includes a newly added pair in the team update", async () => { - const user = userEvent.setup({ delay: null }); - vi.mocked(networking.teamInfoCall).mockResolvedValue(createMockTeamData({ models: ["gpt-4"] })); - vi.mocked(networking.teamUpdateCall).mockResolvedValue({ data: {}, team_id: "123" } as any); - - renderWithProviders(); - await openSettingsEditor(user); - - await user.click(screen.getByRole("button", { name: /add key-value pair/i })); - await user.type(screen.getByPlaceholderText("Key"), "cost_center"); - await user.type(screen.getByPlaceholderText("Value"), "eng-1"); - - await user.click(screen.getByRole("button", { name: /save changes/i })); - - await waitFor(() => { - expect(networking.teamUpdateCall).toHaveBeenCalled(); - }); - - expect(vi.mocked(networking.teamUpdateCall).mock.calls[0][1].metadata).toMatchObject({ cost_center: "eng-1" }); - }); - it("should keep declared keys as ordinary prefilled rows and submit the edited value", async () => { const user = userEvent.setup({ delay: null }); vi.mocked(useTeamMetadataSchema).mockReturnValue({ diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index a75c23da1cf..2fc70883c5e 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -24313,7 +24313,7 @@ export interface components { * @description Default role assigned to new users created * @default internal_user_viewer */ - user_role: ("proxy_admin" | "proxy_admin_viewer" | "internal_user" | "internal_user_viewer") | null; + user_role: ("internal_user" | "internal_user_viewer" | "proxy_admin" | "proxy_admin_viewer") | null; }; /** * DefaultTeamSSOParams From cfd64d45a85fba07e83a5a734b6ab5b1bcc8af44 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 8 Aug 2026 19:28:57 +0000 Subject: [PATCH 043/279] fix(ui): show team BYOK models in team fallback settings (#36241) * fix(ui): show team BYOK models in team fallback settings Team router settings loaded fallback options from /model_group/info, which resolves models without a team, so a team's own BYOK deployments were never selectable in its own fallback config. Load the team-scoped listing when a team id is present. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(ui): ignore stale team model responses in router settings Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(ui): use react-query for fallback model listing in router settings accordion --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: ryan-crabbe-berri --- .../RouterSettingsAccordion.test.tsx | 71 +++++++++++++++++-- .../RouterSettingsAccordion.tsx | 27 +++---- .../llm_calls/fetch_models.test.tsx | 33 +++++++++ .../src/components/llm_calls/fetch_models.tsx | 12 +++- .../src/components/team/TeamInfo.tsx | 1 + 5 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/llm_calls/fetch_models.test.tsx diff --git a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx index a70b7602e5b..5ac3b8b2b64 100644 --- a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx +++ b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx @@ -1,7 +1,9 @@ -import { act, fireEvent, render, screen } from "@testing-library/react"; -import type { ReactNode } from "react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { act, fireEvent, render, screen, waitFor } from "@testing-library/react"; +import type { ReactElement, ReactNode } from "react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { RouterSettingsFormValue } from "../router_settings/RouterSettingsForm"; +import { fetchAvailableModels, fetchAvailableModelsForTeam } from "@/components/llm_calls/fetch_models"; import RouterSettingsAccordion, { RouterSettingsAccordionValue } from "./RouterSettingsAccordion"; vi.mock("../networking", () => ({ @@ -9,11 +11,14 @@ vi.mock("../networking", () => ({ })); vi.mock("@/components/llm_calls/fetch_models", () => ({ - fetchAvailableModels: vi.fn().mockResolvedValue([]), + fetchAvailableModels: vi.fn().mockResolvedValue([{ model_group: "global-model" }]), + fetchAvailableModelsForTeam: vi.fn().mockResolvedValue([{ model_group: "openai/*" }, { model_group: "gpt-5" }]), })); vi.mock("../Settings/RouterSettings/Fallbacks/FallbackSelectionForm", () => ({ - FallbackSelectionForm: () => null, + FallbackSelectionForm: ({ availableModels }: { availableModels: string[] }) => ( +
{availableModels.join(",")}
+ ), })); vi.mock("@tremor/react", () => ({ @@ -39,9 +44,19 @@ vi.mock("../router_settings/RouterSettingsForm", () => ({ ), })); +const renderWithQueryClient = (ui: ReactElement) => { + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + return render(ui, { + wrapper: ({ children }: { children: ReactNode }) => ( + {children} + ), + }); +}; + describe("RouterSettingsAccordion", () => { beforeEach(() => { - vi.useFakeTimers(); + vi.clearAllMocks(); + vi.useFakeTimers({ shouldAdvanceTime: true }); }); afterEach(() => { @@ -58,7 +73,7 @@ describe("RouterSettingsAccordion", () => { it("debounces propagation and calls onChange once with the last value", async () => { const onChange = vi.fn<(value: RouterSettingsAccordionValue) => void>(); - render(); + renderWithQueryClient(); await flushInitialPropagation(onChange); fireEvent.click(screen.getByText("set-least-busy")); @@ -81,9 +96,51 @@ describe("RouterSettingsAccordion", () => { expect(onChange.mock.calls[0][0].router_settings.routing_strategy).toBe("usage-based-routing"); }); + it("offers the team's own models, including team-scoped BYOK ones, when a teamId is given", async () => { + renderWithQueryClient(); + + await waitFor(() => { + expect(screen.getByTestId("available-models")).toHaveTextContent("gpt-5,openai/*"); + }); + expect(fetchAvailableModelsForTeam).toHaveBeenCalledWith("test-token", "team-123"); + expect(fetchAvailableModels).not.toHaveBeenCalled(); + }); + + it("falls back to the proxy-wide model listing when no teamId is given", async () => { + renderWithQueryClient(); + + await waitFor(() => { + expect(screen.getByTestId("available-models")).toHaveTextContent("global-model"); + }); + expect(fetchAvailableModelsForTeam).not.toHaveBeenCalled(); + }); + + it("ignores a stale team's model response that resolves after a newer team was selected", async () => { + const resolvers: ((models: { model_group: string }[]) => void)[] = []; + vi.mocked(fetchAvailableModelsForTeam).mockImplementation( + () => new Promise((resolve) => resolvers.push(resolve)) as Promise<{ model_group: string }[]>, + ); + + const { rerender } = renderWithQueryClient(); + await waitFor(() => expect(resolvers).toHaveLength(1)); + + rerender(); + await waitFor(() => expect(resolvers).toHaveLength(2)); + + await act(async () => { + resolvers[1]([{ model_group: "fast-team-model" }]); + resolvers[0]([{ model_group: "slow-team-model" }]); + }); + + await waitFor(() => { + expect(screen.getByTestId("available-models")).toHaveTextContent("fast-team-model"); + }); + expect(screen.getByTestId("available-models")).not.toHaveTextContent("slow-team-model"); + }); + it("does not call onChange when unmounted mid-wait", async () => { const onChange = vi.fn<(value: RouterSettingsAccordionValue) => void>(); - const { unmount } = render(); + const { unmount } = renderWithQueryClient(); await flushInitialPropagation(onChange); fireEvent.click(screen.getByText("set-least-busy")); diff --git a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx index 08b917e302f..56227abe9ea 100644 --- a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx +++ b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx @@ -1,12 +1,13 @@ import React, { useEffect, useState, useImperativeHandle, forwardRef, useRef } from "react"; import { TabPanel, TabPanels, TabGroup, TabList, Tab } from "@tremor/react"; +import { useQuery } from "@tanstack/react-query"; import { useDebouncedCallback } from "@tanstack/react-pacer/debouncer"; import { getRouterSettingsCall } from "../networking"; import RouterSettingsForm, { RouterSettingsFormValue } from "../router_settings/RouterSettingsForm"; import { Fallbacks } from "../Settings/RouterSettings/Fallbacks/AddFallbacks"; import { FallbackSelectionForm } from "../Settings/RouterSettings/Fallbacks/FallbackSelectionForm"; import { FallbackGroup } from "../Settings/RouterSettings/Fallbacks/FallbackGroupConfig"; -import { fetchAvailableModels, ModelGroup } from "@/components/llm_calls/fetch_models"; +import { fetchAvailableModels, fetchAvailableModelsForTeam, ModelGroup } from "@/components/llm_calls/fetch_models"; export interface RouterSettingsAccordionValue { router_settings: { @@ -30,6 +31,7 @@ interface RouterSettingsAccordionProps { value?: RouterSettingsAccordionValue; onChange?: (value: RouterSettingsAccordionValue) => void; modelData?: any; + teamId?: string | null; } export interface RouterSettingsAccordionRef { @@ -39,7 +41,7 @@ export interface RouterSettingsAccordionRef { const PROPAGATE_WAIT_MS = 100; const RouterSettingsAccordion = forwardRef( - ({ accessToken, value, onChange, modelData }, ref) => { + ({ accessToken, value, onChange, modelData, teamId }, ref) => { const [formValue, setFormValue] = useState({ routerSettings: {}, selectedStrategy: null, @@ -47,7 +49,6 @@ const RouterSettingsAccordion = forwardRef([]); const [fallbackGroups, setFallbackGroups] = useState([]); - const [modelInfo, setModelInfo] = useState([]); const [availableRoutingStrategies, setAvailableRoutingStrategies] = useState([]); const [routerFieldsMetadata, setRouterFieldsMetadata] = useState<{ [key: string]: any }>({}); const [routingStrategyDescriptions, setRoutingStrategyDescriptions] = useState<{ [key: string]: string }>({}); @@ -175,21 +176,11 @@ const RouterSettingsAccordion = forwardRef { - if (!accessToken) { - return; - } - const loadModels = async () => { - try { - const uniqueModels = await fetchAvailableModels(accessToken); - setModelInfo(uniqueModels); - } catch (error) { - console.error("Error fetching model info for fallbacks:", error); - } - }; - loadModels(); - }, [accessToken]); + const { data: modelInfo = [] } = useQuery({ + queryKey: ["fallbackAvailableModels", accessToken, teamId ?? null], + queryFn: () => (teamId ? fetchAvailableModelsForTeam(accessToken, teamId) : fetchAvailableModels(accessToken)), + enabled: Boolean(accessToken), + }); // Helper function to build router_settings from current state const buildRouterSettings = (): RouterSettingsAccordionValue["router_settings"] => { diff --git a/ui/litellm-dashboard/src/components/llm_calls/fetch_models.test.tsx b/ui/litellm-dashboard/src/components/llm_calls/fetch_models.test.tsx new file mode 100644 index 00000000000..bd691c7f629 --- /dev/null +++ b/ui/litellm-dashboard/src/components/llm_calls/fetch_models.test.tsx @@ -0,0 +1,33 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { modelAvailableCall } from "@/components/networking"; +import { fetchAvailableModelsForTeam } from "./fetch_models"; + +vi.mock("@/components/networking", () => ({ + modelAvailableCall: vi.fn(), + modelHubCall: vi.fn(), +})); + +const modelAvailableCallMock = vi.mocked(modelAvailableCall); + +describe("fetchAvailableModelsForTeam", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("requests the models scoped to the team so team-only BYOK models are included", async () => { + modelAvailableCallMock.mockResolvedValue({ + data: [{ id: "all-proxy-models" }, { id: "openai/*" }, { id: "gpt-5-mini" }, { id: "openai/*" }], + }); + + const models = await fetchAvailableModelsForTeam("token", "team-123"); + + expect(modelAvailableCallMock).toHaveBeenCalledWith("token", "", "", false, "team-123"); + expect(models).toEqual([{ model_group: "gpt-5-mini" }, { model_group: "openai/*" }]); + }); + + it("returns an empty list when the team has no models", async () => { + modelAvailableCallMock.mockResolvedValue({ data: [] }); + + expect(await fetchAvailableModelsForTeam("token", "team-123")).toEqual([]); + }); +}); diff --git a/ui/litellm-dashboard/src/components/llm_calls/fetch_models.tsx b/ui/litellm-dashboard/src/components/llm_calls/fetch_models.tsx index 0de98330c2e..a1690b1307e 100644 --- a/ui/litellm-dashboard/src/components/llm_calls/fetch_models.tsx +++ b/ui/litellm-dashboard/src/components/llm_calls/fetch_models.tsx @@ -1,12 +1,22 @@ // fetch_models.ts -import { modelHubCall } from "@/components/networking"; +import { excludeProxyWideSentinel } from "@/components/key_team_helpers/fetch_available_models_team_key"; +import { modelAvailableCall, modelHubCall } from "@/components/networking"; export interface ModelGroup { model_group: string; mode?: string; } +export const fetchAvailableModelsForTeam = async (accessToken: string, teamId: string): Promise => { + const response = await modelAvailableCall(accessToken, "", "", false, teamId); + const modelNames: string[] = (response?.data ?? []).map((model: { id: string }) => model.id); + + return excludeProxyWideSentinel(Array.from(new Set(modelNames))) + .sort((a, b) => a.localeCompare(b)) + .map((model) => ({ model_group: model })); +}; + /** * Fetches available models using modelHubCall and formats them for the selection dropdown. */ diff --git a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx index e57bf59b2da..6c6fdcaedd6 100644 --- a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx @@ -1215,6 +1215,7 @@ const TeamInfoView: React.FC = ({ From 4150248095bd5a43e44d70c3b3d94eea74069611 Mon Sep 17 00:00:00 2001 From: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 8 Aug 2026 12:38:23 -0700 Subject: [PATCH 044/279] chore: remove pre-commit rule some users do not use make pre-commit as it is a multi-minute process. I personally use it but I want users themselves to decide whether to pre-commit before each commit or not, based on what works best for them --- CLAUDE.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index abd5993eb1a..b0da2970fc8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,9 +41,7 @@ Python max line length is 120, not 88 When you fix violations gated by `ruff-strict-budget.json`, `type-discipline-budget.json`, or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered limits so the ceilings ratchet down instead of leaving stale headroom. It measures the working tree, so it must contain exactly the fixes you're committing -Run `make check` (formerly `make pre-commit`, which still works as an alias) before every commit, merge commits included. It runs the CI-gating lint scoped to your staged files, so stage everything you intend to commit first; it warns about changed files you left unstaged and names the checks that were skipped because of them. With nothing staged it instead checks the working tree's diff against the merge base with origin/litellm_internal_staging, which is how you predict the CI lint on an already-committed branch, e.g. right after a merge commit. Deleted files count toward which checks run (a deletion alone can turn CI red) in both modes - -`make check` saves its complete output to a log file in .git (overwriting previous logs) and prints that path as its first and last output lines. To inspect a run, read or grep that log instead of re-running the multi-minute checks just to see a different slice +`make check` (f.k.a. `make pre-commit`, which still works identically as an alias) saves its complete output to a log file in .git (overwriting previous logs) and prints that path as its first and last output lines. To inspect a run, read or grep that log instead of re-running the multi-minute checks just to see a different slice If you're trying to create a new function that relies on untyped stuff, instead of adding more Any's and pushing `reportAny` / `reportExplicitAny` closer to their basedpyright ceilings, just validate it in the caller with Pydantic (a model or `TypeAdapter` that returns the typed thing or raises will do) and then pass the now typed variable in From 12aeb53aec57b2967a50cb826bf0ef2167bc632c Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 8 Aug 2026 12:40:00 -0700 Subject: [PATCH 045/279] fix(otel): mark v2 server spans as failed for pre-call errors (#34546) * fix(otel): mark v2 server spans as failed for pre-call errors (LIT-4780) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(otel): authenticate malformed-body requests before rejecting them (LIT-4780) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(auth): cover malformed-body rejection when auth error is recovered Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(auth): skip authorization for a request whose body never parsed Deferring the parse failure ran the full auth phase, including budget reservation, whose reserved amount is only released by the endpoint's post call path; the endpoint never runs, so malformed requests leaked reservations and locked a budgeted key out. Authorization now runs only when the body parsed, and a parse failure with a rejected key keeps returning the 400 it returned before. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: shivam Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/integrations/otel/logger.py | 20 ++- litellm/proxy/auth/user_api_key_auth.py | 170 ++++++++++++------ .../integrations/otel/test_otel_v2_logger.py | 35 +++- .../proxy/auth/test_user_api_key_auth.py | 111 ++++++++++++ 4 files changed, 269 insertions(+), 67 deletions(-) diff --git a/litellm/integrations/otel/logger.py b/litellm/integrations/otel/logger.py index e273289168a..2c83406afed 100644 --- a/litellm/integrations/otel/logger.py +++ b/litellm/integrations/otel/logger.py @@ -33,6 +33,7 @@ from litellm.integrations.otel.model.payloads import ( is_mcp_list_tools, is_mcp_tool_call, ) +from litellm.integrations.otel.model.semconv import Error from litellm.integrations.otel.model.spans import SpanRole, span_role_for_service from litellm.integrations.otel.model.utils import to_ns from litellm.integrations.otel.plumbing.context import ( @@ -634,18 +635,23 @@ class OpenTelemetryV2(CustomLogger): """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.""" + ``_close_dangling_otel_server_span``, which swallows the exception into a + ``JSONResponse`` so the instrumentor never sees it and leaves the span + ``UNSET``; the status is set here instead (v1 did the same from the handler) + so a failed request reads as failed and not merely as a span carrying an + error message. The instrumentor still owns the span's lifecycle, so this + never ends it. The exception event is recorded only when nothing stamped + this span already — ``async_post_call_failure_hook`` and the ``auth`` phase + span record their own, and a second event would duplicate it — while the + attributes are always restamped so ``error.code`` stays pinned to the real + response status.""" if span is None or not is_recordable_span(span): return + already_stamped: Final = Error.TYPE in (getattr(span, "attributes", None) or ()) stamp_error( span, _span_error_from_exception(exception, status_code=status_code), - record_event=False, - set_status=False, + record_event=not already_stamped, ) async def async_post_call_failure_hook( diff --git a/litellm/proxy/auth/user_api_key_auth.py b/litellm/proxy/auth/user_api_key_auth.py index 9dc450befc2..4baa7b99a4f 100644 --- a/litellm/proxy/auth/user_api_key_auth.py +++ b/litellm/proxy/auth/user_api_key_auth.py @@ -1044,6 +1044,22 @@ def _ensure_parent_otel_span_on_request_state(request: Request) -> None: request.state.parent_otel_span = parent_otel_span +async def _read_request_body_deferring_parse_failure( + request: Request, +) -> tuple[dict, ProxyException | None]: + """Parse the body, returning a parse failure instead of raising it. + + A body that fails to parse is still a request from a known caller, so auth + must run (resolving identity onto the request's trace) before the 400 goes + out; the caller re-raises the returned exception once identity is seeded. + """ + try: + parsed_body: Final = await _read_request_body(request=request) + except ProxyException as parse_exception: + return {}, parse_exception # mutable-ok: request_data is a plain dict across the whole auth path + return populate_request_with_path_params(request_data=parsed_body, request=request), None + + async def _user_api_key_auth_builder( request: Request, api_key: str, @@ -2516,6 +2532,72 @@ def _resolve_request_principal(request: Request, valid_token: UserAPIKeyAuth) -> ) +async def _authorize_authenticated_request( + user_api_key_auth_obj: UserAPIKeyAuth, + request: Request, + request_data: dict, + route: str, + api_key: str, +) -> UserAPIKeyAuth | None: + """Authorize an already-authenticated request: disabled-route check, the single + ``common_checks`` gate (which also reserves budget), and end-user fallback + resolution. Returns the auth object the exception handler recovered when a check + failed but the request may proceed anyway, else ``None``. + """ + ## ENSURE DISABLE ROUTE WORKS ACROSS ALL USER AUTH FLOWS ## + RouteChecks.should_call_route(route=route, valid_token=user_api_key_auth_obj, request=request) + + # Single authorization point. Builder paths MUST NOT call common_checks. + # Route through the same exception handler the builder uses so + # authorization failures (ProxyException, or plain Exception from + # admin-only-route / model-access / budget checks) surface as + # ProxyException consistently with pre-refactor behavior. + try: + await _run_centralized_common_checks( + user_api_key_auth_obj=user_api_key_auth_obj, + request=request, + request_data=request_data, + route=route, + ) + except Exception as e: + return await UserAPIKeyAuthExceptionHandler._handle_authentication_error( + e=e, + request=request, + request_data=request_data, + route=route, + parent_otel_span=user_api_key_auth_obj.parent_otel_span, + api_key=api_key, + resolved_identity=user_api_key_auth_obj, + ) + + # Defense-in-depth: ``_user_api_key_auth_builder`` has multiple early-return + # paths (no master key, /user/auth route, JWT short-circuits) that bypass + # the end-user resolution block. If those paths produced an auth obj + # without an ``end_user_id`` set, fall back to extracting from the request + # body so spend logs are still attributed correctly. Validation honours + # ``litellm.validate_end_user_id_in_db``. + if user_api_key_auth_obj.end_user_id is None: + from litellm.proxy.proxy_server import ( + prisma_client, + proxy_logging_obj, + user_api_key_cache, + ) + + raw_end_user_id: Final = get_end_user_id_from_request_body(request_data, _safe_get_request_headers(request)) + if raw_end_user_id is not None: + resolved_end_user_id: Final = await resolve_and_validate_end_user_id( + raw_end_user_id=raw_end_user_id, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + parent_otel_span=user_api_key_auth_obj.parent_otel_span, + proxy_logging_obj=proxy_logging_obj, + route=route, + ) + if resolved_end_user_id is not None: + user_api_key_auth_obj.end_user_id = resolved_end_user_id + return None + + @tracer.wrap() async def user_api_key_auth( request: Request, @@ -2536,8 +2618,7 @@ async def user_api_key_auth( # close, and the trace never reaches the backend. _ensure_parent_otel_span_on_request_state(request) - request_data = await _read_request_body(request=request) - request_data = populate_request_with_path_params(request_data=request_data, request=request) + request_data, body_parse_exception = await _read_request_body_deferring_parse_failure(request=request) route: Final[str] = get_request_route(request=request) ## CHECK IF ROUTE IS ALLOWED @@ -2545,69 +2626,41 @@ async def user_api_key_auth( # triggers (key/user/team object reads) nest under it instead of flattening # onto the server span. No-op when OTel V2 isn't active. with phase_span(f"auth {route}"): - user_api_key_auth_obj: Final = await _user_api_key_auth_builder( - request=request, - api_key=api_key, - azure_api_key_header=azure_api_key_header, - anthropic_api_key_header=anthropic_api_key_header, - google_ai_studio_api_key_header=google_ai_studio_api_key_header, - azure_apim_header=azure_apim_header, - request_data=request_data, - custom_litellm_key_header=custom_litellm_key_header, - ) + try: + user_api_key_auth_obj: Final = await _user_api_key_auth_builder( + request=request, + api_key=api_key, + azure_api_key_header=azure_api_key_header, + anthropic_api_key_header=anthropic_api_key_header, + google_ai_studio_api_key_header=google_ai_studio_api_key_header, + azure_apim_header=azure_apim_header, + request_data=request_data, + custom_litellm_key_header=custom_litellm_key_header, + ) + except Exception: + # The body was read first, so a caller who sent both a malformed body and + # a rejected key used to get the 400; the response is unchanged, and the + # auth failure is still recorded on the trace by the handler that ran. + if body_parse_exception is not None: + raise body_parse_exception + raise user_api_key_auth_obj.budget_reservation = None - ## ENSURE DISABLE ROUTE WORKS ACROSS ALL USER AUTH FLOWS ## - RouteChecks.should_call_route(route=route, valid_token=user_api_key_auth_obj, request=request) - - # Single authorization point. Builder paths MUST NOT call common_checks. - # Route through the same exception handler the builder uses so - # authorization failures (ProxyException, or plain Exception from - # admin-only-route / model-access / budget checks) surface as - # ProxyException consistently with pre-refactor behavior. - try: - await _run_centralized_common_checks( + # A body that never parsed is authenticated (so the trace carries identity + # and this ``auth`` span) but not authorized: there is no model to check it + # against, and budget reservation would increment live spend counters that + # only the endpoint's post-call path releases; the endpoint never runs, since + # the parse failure is raised below. + if body_parse_exception is None: + recovered_auth_obj: Final = await _authorize_authenticated_request( user_api_key_auth_obj=user_api_key_auth_obj, request=request, request_data=request_data, route=route, - ) - except Exception as e: - return await UserAPIKeyAuthExceptionHandler._handle_authentication_error( - e=e, - request=request, - request_data=request_data, - route=route, - parent_otel_span=user_api_key_auth_obj.parent_otel_span, api_key=api_key, - resolved_identity=user_api_key_auth_obj, ) - - # Defense-in-depth: ``_user_api_key_auth_builder`` has multiple early-return - # paths (no master key, /user/auth route, JWT short-circuits) that bypass - # the end-user resolution block. If those paths produced an auth obj - # without an ``end_user_id`` set, fall back to extracting from the request - # body so spend logs are still attributed correctly. Validation honours - # ``litellm.validate_end_user_id_in_db``. - if user_api_key_auth_obj.end_user_id is None: - from litellm.proxy.proxy_server import ( - prisma_client, - proxy_logging_obj, - user_api_key_cache, - ) - - raw_end_user_id: Final = get_end_user_id_from_request_body(request_data, _safe_get_request_headers(request)) - if raw_end_user_id is not None: - resolved_end_user_id: Final = await resolve_and_validate_end_user_id( - raw_end_user_id=raw_end_user_id, - prisma_client=prisma_client, - user_api_key_cache=user_api_key_cache, - parent_otel_span=user_api_key_auth_obj.parent_otel_span, - proxy_logging_obj=proxy_logging_obj, - route=route, - ) - if resolved_end_user_id is not None: - user_api_key_auth_obj.end_user_id = resolved_end_user_id + if recovered_auth_obj is not None: + return recovered_auth_obj # Identity is now resolved. Seed it AFTER the auth span closes so the Baggage # persists on the request task (detaching the span's context token inside the @@ -2619,6 +2672,9 @@ async def user_api_key_auth( ) user_api_key_auth_obj.request_route = normalize_request_route(route) + if body_parse_exception is not None: + raise body_parse_exception + # Resolve caller identity once, here at the seam, into a single per-request # Principal projected off the key object the builder already fetched (no # second lookup). Downstream consumers read identity off this instead of 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 2573ad5a375..82b074220fa 100644 --- a/tests/test_litellm/integrations/otel/test_otel_v2_logger.py +++ b/tests/test_litellm/integrations/otel/test_otel_v2_logger.py @@ -1195,8 +1195,13 @@ def test_async_post_call_failure_hook_skips_a_transport_that_already_answered(): 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).""" + not end the span, and must pin error.code to the real response status (not the + exception's own code). + + LIT-4780: the instrumentor never sees the exception (the proxy handler turns it + into a JSONResponse), so nothing else marks the span as failed; the status and + the exception event have to come from here or the trace shows the error message + on an otherwise successful-looking request.""" 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) @@ -1206,7 +1211,31 @@ def test_record_error_attributes_on_span_decorates_without_ending(): 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) + assert span.status.status_code is StatusCode.ERROR + assert [e.name for e in span.events] == ["exception"] + + +def test_record_error_attributes_on_span_does_not_duplicate_an_already_stamped_error(): + """A failure that already went through ``async_post_call_failure_hook`` reaches + the exception handler too; the second stamp must keep one exception event while + still repinning error.code to the real response status.""" + 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("Authentication Error, invalid key", 401) + asyncio.run( + logger.async_post_call_failure_hook( + request_data={}, original_exception=exc, user_api_key_dict=UserAPIKeyAuth() + ) + ) + logger.record_error_attributes_on_span(server, exc, 400) + server.end() + (span,) = exporter.get_finished_spans() + assert [e.name for e in span.events] == ["exception"] + assert span.attributes["litellm.provider.error.code"] == "400" + assert span.status.status_code is StatusCode.ERROR def test_record_error_attributes_on_span_ignores_below_400_and_missing_span(): diff --git a/tests/test_litellm/proxy/auth/test_user_api_key_auth.py b/tests/test_litellm/proxy/auth/test_user_api_key_auth.py index 6fc44ef7519..60d9689dc0b 100644 --- a/tests/test_litellm/proxy/auth/test_user_api_key_auth.py +++ b/tests/test_litellm/proxy/auth/test_user_api_key_auth.py @@ -4786,6 +4786,117 @@ async def test_user_api_key_auth_does_not_overwrite_end_user_id_set_by_builder() setattr(_proxy_server_mod, k, v) +@pytest.mark.asyncio +async def test_user_api_key_auth_authenticates_before_raising_malformed_body_error(): + """Regression (LIT-4780): a body that fails to parse must still be authenticated + first, so the rejected request's trace carries the caller's key / team / user + identity instead of an anonymous root span. The parse error is re-raised + unchanged once identity is seeded.""" + from fastapi import Request + from starlette.datastructures import URL + + import litellm.proxy.proxy_server as _proxy_server_mod + + builder_token = UserAPIKeyAuth(api_key="sk-test", user_id="u1", team_id="team-1") + + request = Request( + scope={ + "type": "http", + "headers": [(b"content-type", b"application/json")], + "method": "POST", + } + ) + request._url = URL(url="/chat/completions") + request._body = b'{}{"model": "gpt-4o"}' + + attrs = _proxy_attrs_for_centralized_checks(user_custom_auth=None) + originals = {a: getattr(_proxy_server_mod, a, None) for a in attrs} + try: + for k, v in attrs.items(): + setattr(_proxy_server_mod, k, v) + with ( + patch( + "litellm.proxy.auth.user_api_key_auth._user_api_key_auth_builder", + new_callable=AsyncMock, + return_value=builder_token, + ) as mock_builder, + patch( + "litellm.proxy.auth.user_api_key_auth._run_centralized_common_checks", + new_callable=AsyncMock, + ) as mock_common_checks, + patch( + "litellm.proxy.auth.user_api_key_auth.RouteChecks.should_call_route", + ), + patch( + "litellm.proxy.auth.user_api_key_auth.seed_request_identity", + ) as mock_seed, + ): + with pytest.raises(ProxyException) as exc_info: + await user_api_key_auth(request=request, api_key="Bearer sk-test") + + assert "Invalid JSON payload" in str(exc_info.value.message) + assert exc_info.value.code == str(status.HTTP_400_BAD_REQUEST) + mock_builder.assert_awaited_once() + assert mock_seed.call_args.args[0] is builder_token + # authorization must not run for a request that is about to be rejected: + # ``common_checks`` reserves budget against live spend counters that only the + # endpoint's post-call path releases, and the endpoint never runs here + mock_common_checks.assert_not_awaited() + finally: + for k, v in originals.items(): + setattr(_proxy_server_mod, k, v) + + +@pytest.mark.asyncio +async def test_user_api_key_auth_malformed_body_with_rejected_key_still_returns_the_parse_error(): + """The body is read before the key is authenticated, so a caller who sends both a + malformed body and a key that fails auth gets the 400. Authenticating the request + first (LIT-4780) must not turn that into the auth status code.""" + from fastapi import Request + from starlette.datastructures import URL + + import litellm.proxy.proxy_server as _proxy_server_mod + + request = Request( + scope={ + "type": "http", + "headers": [(b"content-type", b"application/json")], + "method": "POST", + } + ) + request._url = URL(url="/chat/completions") + request._body = b'{}{"model": "gpt-4o"}' + + attrs = _proxy_attrs_for_centralized_checks(user_custom_auth=None) + originals = {a: getattr(_proxy_server_mod, a, None) for a in attrs} + try: + for k, v in attrs.items(): + setattr(_proxy_server_mod, k, v) + with ( + patch( + "litellm.proxy.auth.user_api_key_auth._user_api_key_auth_builder", + new_callable=AsyncMock, + side_effect=ProxyException( + message="Authentication Error, invalid key", + type="auth_error", + param="None", + code=status.HTTP_401_UNAUTHORIZED, + ), + ), + patch( + "litellm.proxy.auth.user_api_key_auth.RouteChecks.should_call_route", + ), + ): + with pytest.raises(ProxyException) as exc_info: + await user_api_key_auth(request=request, api_key="Bearer sk-bad") + + assert "Invalid JSON payload" in str(exc_info.value.message) + assert exc_info.value.code == str(status.HTTP_400_BAD_REQUEST) + finally: + for k, v in originals.items(): + setattr(_proxy_server_mod, k, v) + + def _proxy_attrs_for_db_lookup(): """Minimal proxy_server attributes for driving the real ``_user_api_key_auth_builder`` down to the DB key lookup.""" From 1a40a673942a52830155a8d414c046a4f9376223 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Sat, 8 Aug 2026 12:54:23 -0700 Subject: [PATCH 046/279] fix: stabilize generated user role ordering --- litellm/proxy/_types.py | 4 ++-- ui/litellm-dashboard/src/lib/http/schema.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 1fc05ac4653..fa89df39c5f 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -4557,10 +4557,10 @@ class DefaultInternalUserParams(LiteLLMPydanticObjectBase): user_role: ( Literal[ - LitellmUserRoles.INTERNAL_USER, - LitellmUserRoles.INTERNAL_USER_VIEW_ONLY, LitellmUserRoles.PROXY_ADMIN, LitellmUserRoles.PROXY_ADMIN_VIEW_ONLY, + LitellmUserRoles.INTERNAL_USER, + LitellmUserRoles.INTERNAL_USER_VIEW_ONLY, ] | None ) = Field( diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 2fc70883c5e..a75c23da1cf 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -24313,7 +24313,7 @@ export interface components { * @description Default role assigned to new users created * @default internal_user_viewer */ - user_role: ("internal_user" | "internal_user_viewer" | "proxy_admin" | "proxy_admin_viewer") | null; + user_role: ("proxy_admin" | "proxy_admin_viewer" | "internal_user" | "internal_user_viewer") | null; }; /** * DefaultTeamSSOParams From ff5f8132d178ee700d23bff3e97d639ea5027cbd Mon Sep 17 00:00:00 2001 From: mateo Date: Sat, 8 Aug 2026 19:55:37 +0000 Subject: [PATCH 047/279] docs: clarify guideline priority ordering in CLAUDE.md Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- CLAUDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index b0da2970fc8..f1bb46c1fd3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ Don't assume that the existing code is correct or the right way of doing things - easy to maintain/change - modern -In that order of importance +In descending order of importance When adding new features, add meaningful tests. Don't add tests that don't check anything substantial and is there just to make the code coverage pass. Yes, code coverage is important, but I'd rather have no signal whether the code is working than tests that don't fail when code is broken. The goal is to have tests that would fail before the feature was added/if the code was mutated in a way that breaks the feature and succeed only when the feature is fully working. I should run mutation testing and see > 90% kill rate From e35ee4e5fa3e25a5f750fa0ee23525a8277a4f62 Mon Sep 17 00:00:00 2001 From: tin-berri Date: Sat, 8 Aug 2026 13:02:29 -0700 Subject: [PATCH 048/279] feat(router): independent, default-on deployment affinity for the auto-router (#36146) --- litellm/constants.py | 1 + litellm/proxy/common_utils/callback_utils.py | 3 +- litellm/proxy/litellm_pre_call_utils.py | 2 + litellm/router.py | 96 ++-- .../complexity_router/complexity_router.py | 50 +- .../complexity_router/config.py | 30 +- .../deployment_affinity_check.py | 266 ++++++++--- litellm/types/router.py | 1 + .../proxy/test_litellm_pre_call_utils.py | 2 + .../router_strategy/test_complexity_router.py | 97 ++++ .../test_deployment_affinity_check.py | 9 +- .../test_session_id_affinity.py | 441 +++++++++++++++++- tests/test_litellm/test_router.py | 65 +++ type-discipline-budget.json | 2 +- ui/litellm-dashboard/src/lib/http/schema.d.ts | 10 +- 15 files changed, 964 insertions(+), 111 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 30d3bb1f26e..3b91f23fe39 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -1322,6 +1322,7 @@ X_LITELLM_DISABLE_CALLBACKS: Final = "x-litellm-disable-callbacks" LITELLM_METADATA_FIELD: Final = "litellm_metadata" OLD_LITELLM_METADATA_FIELD: Final = "metadata" RETURN_RAW_MODEL_NAME_METADATA_KEY: Final = "_complexity_router_return_raw_model_name" +SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: Final = "_session_deployment_affinity_ttl" INTERNAL_CALL_ORIGIN_METADATA_KEY: Final = "internal_call_origin" LITELLM_TRUNCATED_PAYLOAD_FIELD: Final = "litellm_truncated" LITELLM_TRUNCATION_DB_SAFEGUARD_NOTE: Final = ( diff --git a/litellm/proxy/common_utils/callback_utils.py b/litellm/proxy/common_utils/callback_utils.py index 22200567012..fbf28e223c1 100644 --- a/litellm/proxy/common_utils/callback_utils.py +++ b/litellm/proxy/common_utils/callback_utils.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, Final, Optional import litellm from litellm import get_secret from litellm._logging import verbose_proxy_logger -from litellm.constants import PRE_CALL_EXECUTED_GUARDRAILS_KEY +from litellm.constants import PRE_CALL_EXECUTED_GUARDRAILS_KEY, SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY from litellm.integrations.custom_logger import CustomLogger from litellm.litellm_core_utils.core_helpers import ( get_metadata_variable_name_from_kwargs, @@ -425,6 +425,7 @@ LITELLM_PROXY_INTERNAL_METADATA_KEYS: Final = frozenset( "_guardrail_pipelines", "_pipeline_managed_guardrails", PRE_CALL_EXECUTED_GUARDRAILS_KEY, + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, "disable_global_guardrails", "disable_global_guardrail", "opted_out_global_guardrails", diff --git a/litellm/proxy/litellm_pre_call_utils.py b/litellm/proxy/litellm_pre_call_utils.py index 83ae59ef050..c48fee96646 100644 --- a/litellm/proxy/litellm_pre_call_utils.py +++ b/litellm/proxy/litellm_pre_call_utils.py @@ -18,6 +18,7 @@ from litellm.constants import ( INTERNAL_CALL_ORIGIN_METADATA_KEY, LITELLM_PROXY_MASTER_KEY_ALIAS, PRE_CALL_EXECUTED_GUARDRAILS_KEY, + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, ) from litellm.litellm_core_utils.credential_accessor import CredentialAccessor from litellm.litellm_core_utils.initialize_dynamic_callback_params import ( @@ -226,6 +227,7 @@ _UNTRUSTED_METADATA_CONTROL_FIELDS: Final = ( "applied_policies", "policy_sources", "routing_decision", + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, INTERNAL_CALL_ORIGIN_METADATA_KEY, "standard_logging_object", "proxy_server_request", diff --git a/litellm/router.py b/litellm/router.py index 1a76eb5d59b..feaf69a44ae 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -46,6 +46,7 @@ from litellm.constants import ( DEFAULT_HEALTH_CHECK_INTERVAL, DEFAULT_HEALTH_CHECK_STALENESS_MULTIPLIER, DEFAULT_MAX_LRU_CACHE_SIZE, + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, ) from litellm.integrations.custom_logger import CustomLogger from litellm.litellm_core_utils.asyncify import run_async_function @@ -135,6 +136,7 @@ from litellm.router_utils.handle_error import ( from litellm.router_utils.health_state_cache import DeploymentHealthCache from litellm.router_utils.pre_call_checks.deployment_affinity_check import ( DeploymentAffinityCheck, + warn_on_unknown_model_group_affinity_flags, ) from litellm.router_utils.pre_call_checks.io_token_rate_limit_check import ( build_io_token_rate_limit_headers, @@ -603,6 +605,10 @@ class Router: # ``litellm.proxy.auth.auth_checks._is_model_cost_zero``. self._zero_cost_cache: dict[str, bool] = {} + self.deployment_affinity_ttl_seconds = deployment_affinity_ttl_seconds + self.model_group_affinity_config = model_group_affinity_config + warn_on_unknown_model_group_affinity_flags(model_group_affinity_config) + if model_list is not None: # set_model_list will build indices automatically self.set_model_list(model_list) @@ -744,7 +750,6 @@ class Router: litellm.failure_callback = [self.deployment_callback_on_failure] self.routing_strategy_args = routing_strategy_args self.provider_budget_config = provider_budget_config - self.deployment_affinity_ttl_seconds = deployment_affinity_ttl_seconds self.router_budget_logger: RouterBudgetLimiting | None = None if RouterBudgetLimiting.should_init_router_budget_limiter( model_list=model_list, provider_budget_config=self.provider_budget_config @@ -766,7 +771,6 @@ class Router: ) self.model_group_retry_policy: dict[str, RetryPolicy] | None = model_group_retry_policy - self.model_group_affinity_config: dict[str, list[str]] | None = model_group_affinity_config self.allowed_fails_policy: AllowedFailsPolicy | None = None if allowed_fails_policy is not None: @@ -789,21 +793,8 @@ class Router: # If model_group_affinity_config is set but no global affinity checks were # enabled, we still need the DeploymentAffinityCheck callback (with global # flags all False) so per-group config can activate affinity per model group. - if self.model_group_affinity_config and not any( - isinstance(cb, DeploymentAffinityCheck) for cb in (self.optional_callbacks or []) - ): - if self.optional_callbacks is None: - self.optional_callbacks = [] - affinity_callback: Final = DeploymentAffinityCheck( - cache=self.cache, - ttl_seconds=self.deployment_affinity_ttl_seconds, - enable_user_key_affinity=False, - enable_responses_api_affinity=False, - enable_session_id_affinity=False, - model_group_affinity_config=self.model_group_affinity_config, - ) - self.optional_callbacks.append(affinity_callback) - litellm.logging_callback_manager.add_litellm_callback(affinity_callback) + if self.model_group_affinity_config: + self._ensure_deployment_affinity_callback() if self.alerting_config is not None: self._initialize_alerting() @@ -1662,6 +1653,28 @@ class Router: _move_before_deployment_affinity(self.optional_callbacks, ec_callback) _move_before_deployment_affinity(litellm.callbacks, ec_callback) + def _ensure_deployment_affinity_callback(self) -> None: + """Register the DeploymentAffinityCheck callback (global flags all False) if absent. + + Needed when nothing enabled a global affinity flag but affinity can still + activate per request: per-group `model_group_affinity_config` entries, or the + session-affinity marker a complexity router stamps at pre-routing time. + """ + if any(isinstance(cb, DeploymentAffinityCheck) for cb in (self.optional_callbacks or [])): + return + if self.optional_callbacks is None: + self.optional_callbacks = [] + affinity_callback: Final = DeploymentAffinityCheck( + cache=self.cache, + ttl_seconds=self.deployment_affinity_ttl_seconds, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + enable_session_id_affinity=False, + model_group_affinity_config=self.model_group_affinity_config, + ) + self.optional_callbacks.append(affinity_callback) + litellm.logging_callback_manager.add_litellm_callback(affinity_callback) + def add_optional_pre_call_checks(self, optional_pre_call_checks: OptionalPreCallChecks | None): if optional_pre_call_checks is None: return @@ -7683,6 +7696,8 @@ class Router: strategy=complexity_router, strategy_label="Complexity-router", ) + if complexity_router._uses_deployment_pin: + self._ensure_deployment_affinity_callback() def _is_adaptive_router_deployment(self, litellm_params: LiteLLM_Params) -> bool: """True when this deployment opts in via the `auto_router/adaptive_router` model prefix.""" @@ -11190,6 +11205,9 @@ class Router: router_strategy: Final = self._select_pre_routing_strategy(model=model, request_kwargs=request_kwargs) if router_strategy is None: self._record_routing_decision(request_kwargs=request_kwargs, routing_decision=None) + self._stamp_or_clear_metadata_key( + request_kwargs=request_kwargs, key=SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, value=None + ) return None pre_routing_hook_response: Final = await router_strategy.async_pre_routing_hook( @@ -11203,6 +11221,11 @@ class Router: request_kwargs=request_kwargs, routing_decision=(pre_routing_hook_response.routing_decision if pre_routing_hook_response else None), ) + self._stamp_or_clear_metadata_key( + request_kwargs=request_kwargs, + key=SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY, + value=(pre_routing_hook_response.session_affinity_ttl_seconds if pre_routing_hook_response else None), + ) # `model` (the alias, e.g. "smart-router") is never the deployment actually # called - apply the alias's own litellm_params (besides `model` itself, @@ -11234,21 +11257,40 @@ class Router: to the deployment that actually served the request. Every attempt therefore writes or clears, never just writes. """ - if routing_decision is None: + Router._stamp_or_clear_metadata_key( + request_kwargs=request_kwargs, + key="routing_decision", + value=( + None + if routing_decision is None + else Router._redact_prompt_text_if_needed( + request_kwargs=request_kwargs, routing_decision=routing_decision + ) + ), + ) + + @staticmethod + def _stamp_or_clear_metadata_key(request_kwargs: dict, key: str, value: object | None) -> None: + """Write a proxy-internal metadata key for THIS routing attempt, or clear it. + + Fallbacks and retries re-enter the pre-routing hook with the same + `request_kwargs`, so every attempt must write or clear, never just write; + a value left behind by an earlier attempt would be attributed to this one. + `get_or_create_metadata_bucket` is the single owner of "which dict holds + proxy-internal metadata": it picks `litellm_metadata` when present (so the + value never lands in the `metadata` dict that routes like /v1/messages + forward to the provider) and replaces a non-dict value rather than silently + skipping the write. Clearing pops from BOTH buckets so a request whose + bucket resolution changed between attempts cannot resurrect a stale value. + """ + if value is None: for bucket in (request_kwargs.get("metadata"), request_kwargs.get("litellm_metadata")): if isinstance(bucket, dict): - bucket.pop("routing_decision", None) + bucket.pop(key, None) return - # `get_or_create_metadata_bucket` is the single owner of "which dict holds - # proxy-internal metadata": it picks `litellm_metadata` when present (so the - # decision never lands in the `metadata` dict that routes like /v1/messages - # forward to the provider) and replaces a non-dict value rather than silently - # skipping the write. _, metadata_bucket = get_or_create_metadata_bucket(request_kwargs) - metadata_bucket["routing_decision"] = Router._redact_prompt_text_if_needed( - request_kwargs=request_kwargs, routing_decision=routing_decision - ) + metadata_bucket[key] = value @staticmethod def _redact_prompt_text_if_needed( diff --git a/litellm/router_strategy/complexity_router/complexity_router.py b/litellm/router_strategy/complexity_router/complexity_router.py index f6ced0bb9d2..32d252f3f68 100644 --- a/litellm/router_strategy/complexity_router/complexity_router.py +++ b/litellm/router_strategy/complexity_router/complexity_router.py @@ -1651,6 +1651,28 @@ class ComplexityRouter(CustomLogger): caller_scope: Final = self._get_user_api_key_hash_from_request_kwargs(request_kwargs) or "unscoped" return f"complexity_router_session_affinity:v1:{self.model_name}:{caller_scope}:{session_id}" + @property + def _uses_tier_pin(self) -> bool: + return bool(self.config.session_affinity and not self.config.plugins) + + @property + def _uses_deployment_pin(self) -> bool: + """session_affinity implies the deployment pin: a session frozen onto one model + group but load-balanced across its deployments would still go cache-cold, which + is the exact failure both flags exist to prevent.""" + return bool((self.config.deployment_affinity or self.config.session_affinity) and not self.config.plugins) + + def _with_session_deployment_affinity( + self, response: PreRoutingHookResponse | None + ) -> PreRoutingHookResponse | None: + if response is None or not self._uses_deployment_pin: + return response + return response.model_copy( + update={ # mutable-ok: model_copy types update as a plain dict + "session_affinity_ttl_seconds": self.config.session_affinity_ttl_seconds + } + ) + async def async_pre_routing_hook( self, model: str, @@ -1685,7 +1707,7 @@ class ComplexityRouter(CustomLogger): resolved_messages: Final = self._resolve_messages(messages, request_kwargs) conversation_continuing: Final = _conversation_is_continuing(resolved_messages) - use_session_affinity: Final = self.config.session_affinity and not self.config.plugins + use_session_affinity: Final = self._uses_tier_pin session_id: Final = self._get_session_id_from_request_kwargs(request_kwargs) if use_session_affinity else None cache_key = self._get_session_affinity_cache_key(session_id, request_kwargs) if session_id is not None else None @@ -1724,17 +1746,19 @@ class ComplexityRouter(CustomLogger): "ComplexityRouter: routing decision cause=%s, routed_model=%s", cause, routed_model ) has_original_messages: Final = messages is not None and len(messages) > 0 - return PreRoutingHookResponse( - model=routed_model, - messages=messages if has_original_messages else None, - routing_decision=self._build_routing_decision( - routed_model=routed_model, - cause=cause, - tier=self._tier_for_model(routed_model), - escalation_keyword=pin_escalation_keyword, - escalated=escalated, - conversation_continuing=conversation_continuing, - ), + return self._with_session_deployment_affinity( + PreRoutingHookResponse( + model=routed_model, + messages=messages if has_original_messages else None, + routing_decision=self._build_routing_decision( + routed_model=routed_model, + cause=cause, + tier=self._tier_for_model(routed_model), + escalation_keyword=pin_escalation_keyword, + escalated=escalated, + conversation_continuing=conversation_continuing, + ), + ) ) response: Final = await self._classify_and_route( @@ -1752,7 +1776,7 @@ class ComplexityRouter(CustomLogger): value=response.model, ttl=self.config.session_affinity_ttl_seconds, ) - return response + return self._with_session_deployment_affinity(response) async def _classify_and_route( self, diff --git a/litellm/router_strategy/complexity_router/config.py b/litellm/router_strategy/complexity_router/config.py index 69609a973b0..0999af66fd8 100644 --- a/litellm/router_strategy/complexity_router/config.py +++ b/litellm/router_strategy/complexity_router/config.py @@ -508,13 +508,39 @@ class ComplexityRouterConfig(BaseModel): "session's first turn and reuse it for every later turn, skipping re-classification. " "Off by default so every turn is classified on its own merits and routed to the cheapest " "adequate tier. Set True to keep a multi-turn session on one model, which preserves " - "provider prompt caches and avoids cross-model conversation-history errors." + "provider prompt caches and avoids cross-model conversation-history errors. Always " + "implies the deployment pin regardless of deployment_affinity: the session sticks to " + "one deployment of the pinned model, since freezing the model while re-shuffling its " + "deployments would still go cache-cold." + ), + ) + deployment_affinity: bool = Field( + default=True, + description=( + "When True and a session_id is resolvable on the request, pin the deployment chosen " + "inside each routed model group and reuse it whenever the session returns to that " + "group, without pinning which group the session routes to. Independent of " + "session_affinity, which pins the model group instead (and always carries this " + "deployment pin with it): with session_affinity off, " + "every turn is still classified on its own merits while a session that escalates to a " + "stronger tier and comes back still lands on the deployment it used before, which is " + "what keeps a provider prompt cache warm. Pins are held per model group, so switching " + "tiers does not disturb the pin left behind in the previous group. On by default " + "because re-shuffling a conversation across deployments of the same model discards " + "that cache for no benefit; set False to keep every turn load-balanced across the " + "group, which is what a deployment set with tight per-deployment rate limits wants. " + "Inert when no session_id is resolvable, since there is nothing to key a pin on, and " + "suppressed when plugins are configured, for the same reason session_affinity is." ), ) session_affinity_ttl_seconds: int = Field( default=3600, gt=0, - description="TTL for the session affinity pin; refreshed on every cache hit", + description=( + "TTL for the session affinity pin; refreshed on every cache hit. Bounds both the " + "session_affinity model pin and the deployment_affinity deployment pin, so it measures " + "idle time for the session's routing decisions rather than total session length" + ), ) plugins: list[RoutingPlugin] | None = Field( diff --git a/litellm/router_utils/pre_call_checks/deployment_affinity_check.py b/litellm/router_utils/pre_call_checks/deployment_affinity_check.py index b4408d17ffb..7fb90ab89de 100644 --- a/litellm/router_utils/pre_call_checks/deployment_affinity_check.py +++ b/litellm/router_utils/pre_call_checks/deployment_affinity_check.py @@ -13,12 +13,15 @@ where routing to a consistent deployment is still beneficial. """ import hashlib +import json +from collections.abc import Mapping, Sequence from typing import Any, Final, cast from typing_extensions import TypedDict from litellm._logging import verbose_router_logger from litellm.caching.dual_cache import DualCache +from litellm.constants import SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY from litellm.integrations.custom_logger import CustomLogger, Span from litellm.responses.utils import ResponsesAPIRequestUtils from litellm.types.llms.openai import AllMessageValues @@ -29,6 +32,47 @@ class DeploymentAffinityCacheValue(TypedDict): model_id: str +VALID_MODEL_GROUP_AFFINITY_FLAGS: Final = frozenset( + { + "deployment_affinity", + "responses_api_deployment_check", + "session_affinity", + "encrypted_content_affinity", + } +) + + +def warn_on_unknown_model_group_affinity_flags(model_group_affinity_config: Mapping[str, Sequence[str]] | None) -> None: + """`model_group_affinity_config` is one Router-level config consumed by two callbacks: + DeploymentAffinityCheck acts on three of the flags and EncryptedContentAffinityCheck + on the fourth, so typo detection lives here at the schema, not inside either consumer. + """ + if model_group_affinity_config is None: + return + for group, flags in model_group_affinity_config.items(): + unknown = set(flags) - VALID_MODEL_GROUP_AFFINITY_FLAGS + if unknown: + verbose_router_logger.warning( + "model_group_affinity_config: unknown flag(s) %s for model group '%s'; will be ignored. Valid flags: %s", + unknown, + group, + VALID_MODEL_GROUP_AFFINITY_FLAGS, + ) + + +_CLAIM_PIN_SCRIPT: Final = """ +local current = redis.call('GET', KEYS[1]) +if current == false then + redis.call('SET', KEYS[1], ARGV[1], 'EX', ARGV[2]) + return ARGV[1] +end +if current == ARGV[1] then + redis.call('EXPIRE', KEYS[1], ARGV[2]) +end +return current +""" + + class DeploymentAffinityCheck(CustomLogger): """ Router deployment affinity callback. @@ -38,14 +82,6 @@ class DeploymentAffinityCheck(CustomLogger): """ CACHE_KEY_PREFIX = "deployment_affinity:v1" - VALID_FLAGS = frozenset( - { - "deployment_affinity", - "responses_api_deployment_check", - "session_affinity", - "encrypted_content_affinity", - } - ) def __init__( self, @@ -63,15 +99,6 @@ class DeploymentAffinityCheck(CustomLogger): self.enable_responses_api_affinity = enable_responses_api_affinity self.enable_session_id_affinity = enable_session_id_affinity self.model_group_affinity_config: dict[str, list[str]] = model_group_affinity_config or {} - for group, flags in self.model_group_affinity_config.items(): - unknown = set(flags) - self.VALID_FLAGS - if unknown: - verbose_router_logger.warning( - "DeploymentAffinityCheck: unknown flag(s) %s for model group '%s'; will be ignored. Valid flags: %s", - unknown, - group, - self.VALID_FLAGS, - ) def _get_effective_flags(self, model_group: str) -> tuple[bool, bool, bool]: """ @@ -218,8 +245,13 @@ class DeploymentAffinityCheck(CustomLogger): return f"{cls.CACHE_KEY_PREFIX}:{model_group}:{hashed_user_key}" @classmethod - def get_session_affinity_cache_key(cls, model_group: str, session_id: str) -> str: - return f"{cls.CACHE_KEY_PREFIX}:session:{model_group}:{session_id}" + def get_session_affinity_cache_key(cls, model_group: str, session_id: str, user_key: str | None) -> str: + """Session pins are scoped by the caller's hashed API key so two callers reusing + the same client-supplied session_id cannot read or steer each other's pin. + `"unscoped"` covers direct Router usage with no authenticated caller, matching + the complexity router's own session pin key.""" + hashed_user_key: Final = cls._hash_user_key(user_key) if user_key is not None else "unscoped" + return f"{cls.CACHE_KEY_PREFIX}:session:{model_group}:{hashed_user_key}:{session_id}" @staticmethod def _get_user_key_from_metadata_dict(metadata: dict) -> str | None: @@ -278,6 +310,97 @@ class DeploymentAffinityCheck(CustomLogger): return session_id return None + @staticmethod + def _get_marker_session_affinity_ttl(request_kwargs: dict) -> int | None: + """TTL from the session-affinity marker the Router stamps at pre-routing time + when an auto-router routed this request with session_affinity enabled. + Marker presence enables session pinning for this request only; anything that + is not a positive int is treated as absent.""" + for metadata in DeploymentAffinityCheck._iter_metadata_dicts(request_kwargs): + ttl = metadata.get(SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY) + if isinstance(ttl, int) and not isinstance(ttl, bool) and ttl > 0: + return ttl + return None + + @staticmethod + def _pinned_model_id(stored: object) -> str | None: + """Deployment id held by a stored pin, for both the dict shape this writes and the + bare string older writers left behind. None when the value is neither.""" + if isinstance(stored, dict): + model_id: Final = stored.get("model_id") + return str(model_id) if model_id is not None else None + if isinstance(stored, str): + return stored + return None + + def _set_local_pin(self, cache_key: str, value: object, ttl_seconds: int) -> None: + """The one owner of authoritative local pin writes: a plain set keeps a live + key's original expiry (`allow_ttl_override`), so the entry is replaced to make + the TTL real. Every local pin write goes through here so the redis-winner sync + and the pod-local claim can never disagree about expiry again.""" + self.cache.in_memory_cache.delete_cache(cache_key) + self.cache.in_memory_cache.set_cache(cache_key, value, ttl=ttl_seconds) + + async def _claim_pin(self, cache_key: str, pin_value: DeploymentAffinityCacheValue, ttl_seconds: int) -> str | None: + """First-writer-wins pin write: store `pin_value` only when the key is absent and + return the deployment id the key holds afterwards, so a caller learns whether it won + by comparing against its own id, and None when the stored value is one no reader can + interpret. Concurrent claimers converge on the + first write instead of the last. Re-claiming with the stored value refreshes its + TTL, the same keepalive the complexity router's model pin documents: an active + session must not lose its pin mid-conversation just because it outlives the + original write, so `session_affinity_ttl_seconds` bounds idle time, not total + session length. On Redis one Lua script does the get-or-set-or-refresh + atomically (same registration seam the rate limiters use) and the in-memory + tier is synchronized to the winner; without Redis, and whenever Redis is + unreachable, the pod-local check-and-set below stands in and is atomic because it + runs synchronously on the event loop. Degrading to a pod-local claim rather than + propagating the fault is what keeps same-pod stickiness through a Redis blip: the + caller only logs this result, so an escaping error would leave the session with no + pin at all and reshuffle every turn for the outage, which is worse than losing + cross-pod agreement. The redis tier is + resolved per call because the proxy attaches it after Router construction + (`Router._update_redis_cache`); the compiled script is cached per event loop + underneath the registration seam. + """ + redis_cache: Final = self.cache.redis_cache + if redis_cache is not None: + try: + claim_script: Final = redis_cache.async_register_script(_CLAIM_PIN_SCRIPT) + raw: Final = await claim_script(keys=(cache_key,), args=(json.dumps(pin_value), int(ttl_seconds))) + decoded: Final = raw.decode("utf-8") if isinstance(raw, bytes) else raw + if not isinstance(decoded, str): + return pin_value["model_id"] + try: + winner: object = json.loads(decoded) + except json.JSONDecodeError: + winner = decoded + self._set_local_pin(cache_key=cache_key, value=winner, ttl_seconds=ttl_seconds) + return self._pinned_model_id(winner) + except Exception as e: # noqa: BLE001 # any Redis/Lua failure degrades to the pod-local claim, never unpins + verbose_router_logger.debug( + "DeploymentAffinityCheck: redis pin claim failed, falling back to pod-local claim. error=%s", e + ) + + return self._claim_pin_in_memory(cache_key=cache_key, pin_value=pin_value, ttl_seconds=ttl_seconds) + + def _claim_pin_in_memory( + self, cache_key: str, pin_value: DeploymentAffinityCacheValue, ttl_seconds: int + ) -> str | None: + """Pod-local half of the claim, used when no Redis tier is attached and as the + fallback when the Redis claim fails. Mirrors the Lua script exactly, including + the keepalive: re-claiming with the stored value slides the idle window through + `_set_local_pin`. Both branches stay synchronous, hence atomic on the event + loop.""" + existing: Final = self.cache.in_memory_cache.get_cache(cache_key) + if existing is not None: + existing_model_id: Final = self._pinned_model_id(existing) + if existing_model_id == pin_value["model_id"]: + self._set_local_pin(cache_key=cache_key, value=pin_value, ttl_seconds=ttl_seconds) + return existing_model_id + self._set_local_pin(cache_key=cache_key, value=pin_value, ttl_seconds=ttl_seconds) + return pin_value["model_id"] + @staticmethod def _find_deployment_by_model_id(healthy_deployments: list[dict], model_id: str) -> dict | None: for deployment in healthy_deployments: @@ -334,12 +457,21 @@ class DeploymentAffinityCheck(CustomLogger): if stable_model_map_key is None: return typed_healthy_deployments + session_affinity_active: Final = ( + enable_session_id or self._get_marker_session_affinity_ttl(request_kwargs=request_kwargs) is not None + ) + user_key: Final = ( + self._get_user_key_from_request_kwargs(request_kwargs=request_kwargs) + if (session_affinity_active or enable_user_key) + else None + ) + # 2) Session-id -> deployment affinity - if enable_session_id: + if session_affinity_active: session_id: Final = self._get_session_id_from_request_kwargs(request_kwargs=request_kwargs) if session_id is not None: session_cache_key: Final = self.get_session_affinity_cache_key( - model_group=stable_model_map_key, session_id=session_id + model_group=stable_model_map_key, session_id=session_id, user_key=user_key ) session_cache_result: Final = await self.cache.async_get_cache(key=session_cache_key) @@ -371,7 +503,6 @@ class DeploymentAffinityCheck(CustomLogger): if not enable_user_key: return typed_healthy_deployments - user_key: Final = self._get_user_key_from_request_kwargs(request_kwargs=request_kwargs) if user_key is None: return typed_healthy_deployments @@ -438,18 +569,22 @@ class DeploymentAffinityCheck(CustomLogger): enable_session_id, ) = self._get_effective_flags(deployment_model_name) - if not enable_user_key and not enable_session_id: + marker_session_ttl: Final = self._get_marker_session_affinity_ttl(request_kwargs=kwargs) + session_affinity_active: Final = enable_session_id or marker_session_ttl is not None + + if not enable_user_key and not session_affinity_active: return None - user_key = None - if enable_user_key: - user_key = self._get_user_key_from_request_kwargs(request_kwargs=kwargs) + user_key: Final = ( + self._get_user_key_from_request_kwargs(request_kwargs=kwargs) + if (enable_user_key or session_affinity_active) + else None + ) + session_id: Final = ( + self._get_session_id_from_request_kwargs(request_kwargs=kwargs) if session_affinity_active else None + ) - session_id = None - if enable_session_id: - session_id = self._get_session_id_from_request_kwargs(request_kwargs=kwargs) - - if user_key is None and session_id is None: + if not ((enable_user_key and user_key is not None) or session_id is not None): return None model_info = kwargs.get("model_info") @@ -473,22 +608,31 @@ class DeploymentAffinityCheck(CustomLogger): verbose_router_logger.warning("DeploymentAffinityCheck: model_id missing; skipping affinity cache update.") return None - if user_key is not None: + pin_value: Final = DeploymentAffinityCacheValue(model_id=str(model_id)) + + if enable_user_key and user_key is not None: try: cache_key: Final = self.get_affinity_cache_key(model_group=deployment_model_name, user_key=user_key) - await self.cache.async_set_cache( - cache_key, - DeploymentAffinityCacheValue(model_id=str(model_id)), - ttl=self.ttl_seconds, - ) - - verbose_router_logger.debug( - "DeploymentAffinityCheck: set affinity mapping model_map_key=%s deployment=%s ttl=%s user_key=%s", - deployment_model_name, - model_id, - self.ttl_seconds, - self._shorten_for_logs(user_key), + claimed_user_pin: Final = await self._claim_pin( + cache_key=cache_key, + pin_value=pin_value, + ttl_seconds=self.ttl_seconds, ) + if claimed_user_pin == pin_value["model_id"]: + verbose_router_logger.debug( + "DeploymentAffinityCheck: set affinity mapping model_map_key=%s deployment=%s ttl=%s user_key=%s", + deployment_model_name, + model_id, + self.ttl_seconds, + self._shorten_for_logs(user_key), + ) + else: + verbose_router_logger.debug( + "DeploymentAffinityCheck: affinity pin already claimed model_map_key=%s existing=%s ours=%s", + deployment_model_name, + claimed_user_pin, + model_id, + ) except Exception as e: # Non-blocking: affinity is a best-effort optimization. verbose_router_logger.debug( @@ -500,21 +644,31 @@ class DeploymentAffinityCheck(CustomLogger): # Also persist Session-ID affinity if enabled and session-id is provided if session_id is not None: try: + session_affinity_ttl: Final = marker_session_ttl if marker_session_ttl is not None else self.ttl_seconds session_cache_key: Final = self.get_session_affinity_cache_key( - model_group=deployment_model_name, session_id=session_id + model_group=deployment_model_name, session_id=session_id, user_key=user_key ) - await self.cache.async_set_cache( - session_cache_key, - DeploymentAffinityCacheValue(model_id=str(model_id)), - ttl=self.ttl_seconds, - ) - verbose_router_logger.debug( - "DeploymentAffinityCheck: set session affinity mapping model_map_key=%s deployment=%s ttl=%s session_id=%s", - deployment_model_name, - model_id, - self.ttl_seconds, - session_id, + claimed_session_pin: Final = await self._claim_pin( + cache_key=session_cache_key, + pin_value=pin_value, + ttl_seconds=session_affinity_ttl, ) + if claimed_session_pin == pin_value["model_id"]: + verbose_router_logger.debug( + "DeploymentAffinityCheck: set session affinity mapping model_map_key=%s deployment=%s ttl=%s session_id=%s", + deployment_model_name, + model_id, + session_affinity_ttl, + session_id, + ) + else: + verbose_router_logger.debug( + "DeploymentAffinityCheck: session pin already claimed model_map_key=%s existing=%s ours=%s session_id=%s", + deployment_model_name, + claimed_session_pin, + model_id, + session_id, + ) except Exception as e: verbose_router_logger.debug( "DeploymentAffinityCheck: failed to set session affinity cache. model_map_key=%s error=%s", diff --git a/litellm/types/router.py b/litellm/types/router.py index 4280da08cbb..e166d844735 100644 --- a/litellm/types/router.py +++ b/litellm/types/router.py @@ -816,6 +816,7 @@ class PreRoutingHookResponse(BaseModel): model: str messages: list[dict[str, Any]] | None routing_decision: StandardLoggingRoutingDecision | None = None + session_affinity_ttl_seconds: int | None = None _PreRoutingStrategyT_co = TypeVar("_PreRoutingStrategyT_co", covariant=True) 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 6d6fd2e5507..22f9e6bb67a 100644 --- a/tests/test_litellm/proxy/test_litellm_pre_call_utils.py +++ b/tests/test_litellm/proxy/test_litellm_pre_call_utils.py @@ -676,6 +676,7 @@ async def test_add_litellm_data_to_request_strips_user_control_fields(): "applied_policies": ["spoofed-policy"], "policy_sources": {"spoofed-policy": "request"}, "routing_decision": {"cause": "forged", "routed_model": "spoofed"}, + "_session_deployment_affinity_ttl": 999999, "internal_call_origin": "autorouter_classifier", "_guardrail_pipelines": [{"name": "spoofed"}], "_pipeline_managed_guardrails": ["evaded"], @@ -719,6 +720,7 @@ async def test_add_litellm_data_to_request_strips_user_control_fields(): "applied_policies", "policy_sources", "routing_decision", + "_session_deployment_affinity_ttl", "internal_call_origin", "_guardrail_pipelines", "_pipeline_managed_guardrails", diff --git a/tests/test_litellm/router_strategy/test_complexity_router.py b/tests/test_litellm/router_strategy/test_complexity_router.py index 356556f3563..94b6b68855b 100644 --- a/tests/test_litellm/router_strategy/test_complexity_router.py +++ b/tests/test_litellm/router_strategy/test_complexity_router.py @@ -3414,6 +3414,103 @@ class TestSessionAffinity: def _request_kwargs(session_id: str) -> Dict: return {"metadata": {"session_id": session_id}} + @pytest.mark.asyncio + async def test_hook_response_carries_session_affinity_ttl_on_classify_and_pin_paths( + self, mock_router_instance, session_affinity_config + ): + """The hook response's session_affinity_ttl_seconds is what the Router stamps as + the deployment-affinity marker, so both the classify path (turn 1) and the + session-pin path (turn 2) must carry the configured TTL.""" + mock_router_instance.cache = DualCache() + router = ComplexityRouter( + model_name="test-router", + litellm_router_instance=mock_router_instance, + complexity_router_config={**session_affinity_config, "session_affinity_ttl_seconds": 321}, + ) + request_kwargs = self._request_kwargs("marker-session") + first = await router.async_pre_routing_hook( + model="test-model", request_kwargs=request_kwargs, messages=self.SIMPLE_MESSAGE + ) + second = await router.async_pre_routing_hook( + model="test-model", request_kwargs=request_kwargs, messages=self.SIMPLE_MESSAGE + ) + assert first.session_affinity_ttl_seconds == 321 + assert second.session_affinity_ttl_seconds == 321 + + @pytest.mark.parametrize( + "session_affinity,deployment_affinity,plugins,tier_pinned,deployment_pinned", + [ + (False, False, False, False, False), + (False, True, False, False, True), + (True, False, False, True, True), + (True, True, False, True, True), + (False, True, True, False, False), + (True, True, True, False, False), + ], + ) + @pytest.mark.asyncio + async def test_tier_pin_and_deployment_pin_are_independently_gated( + self, + mock_router_instance, + basic_config, + session_affinity, + deployment_affinity, + plugins, + tier_pinned, + deployment_pinned, + ): + """deployment_affinity pins the deployment inside each routed group without pinning which + group the session routes to, so with session_affinity off the tier must still reclassify + on every turn while the marker the Router stamps is still emitted. Turn 1 classifies + REASONING and turn 2 SIMPLE, so a reclassified turn 2 moves model while a tier-pinned one + does not. plugins suppress both pins, since a stale pin would bypass the plugin pipeline.""" + mock_router_instance.cache = DualCache() + router = ComplexityRouter( + model_name="test-router", + litellm_router_instance=mock_router_instance, + complexity_router_config={ + **basic_config, + "session_affinity": session_affinity, + "deployment_affinity": deployment_affinity, + **({"plugins": [_DummyPlugin()]} if plugins else {}), + }, + ) + request_kwargs = self._request_kwargs("matrix-session") + first = await router.async_pre_routing_hook( + model="test-model", request_kwargs=request_kwargs, messages=self.REASONING_MESSAGE + ) + second = await router.async_pre_routing_hook( + model="test-model", request_kwargs=request_kwargs, messages=self.SIMPLE_MESSAGE + ) + assert first.model == "o1-preview" + assert second.model == ("o1-preview" if tier_pinned else "gpt-4o-mini") + assert (first.session_affinity_ttl_seconds is not None) is deployment_pinned + assert (second.session_affinity_ttl_seconds is not None) is deployment_pinned + + @pytest.mark.asyncio + async def test_hook_response_has_no_session_affinity_ttl_when_disabled_or_plugins( + self, mock_router_instance, basic_config, session_affinity_config + ): + mock_router_instance.cache = DualCache() + disabled_router = ComplexityRouter( + model_name="test-router", + litellm_router_instance=mock_router_instance, + complexity_router_config={**basic_config, "deployment_affinity": False}, + ) + plugin_router = ComplexityRouter( + model_name="test-router-plugins", + litellm_router_instance=mock_router_instance, + complexity_router_config={**session_affinity_config, "plugins": [_DummyPlugin()]}, + ) + disabled = await disabled_router.async_pre_routing_hook( + model="test-model", request_kwargs=self._request_kwargs("s-off"), messages=self.SIMPLE_MESSAGE + ) + with_plugins = await plugin_router.async_pre_routing_hook( + model="test-model", request_kwargs=self._request_kwargs("s-plugins"), messages=self.SIMPLE_MESSAGE + ) + assert disabled.session_affinity_ttl_seconds is None + assert with_plugins.session_affinity_ttl_seconds is None + @pytest.mark.asyncio async def test_disabled_by_default_reclassifies_every_turn(self, mock_router_instance, basic_config): """Regression: session_affinity defaults to False, so a shared session_id must NOT diff --git a/tests/test_litellm/router_utils/pre_call_checks/test_deployment_affinity_check.py b/tests/test_litellm/router_utils/pre_call_checks/test_deployment_affinity_check.py index e29adda3328..428eb0ceafd 100644 --- a/tests/test_litellm/router_utils/pre_call_checks/test_deployment_affinity_check.py +++ b/tests/test_litellm/router_utils/pre_call_checks/test_deployment_affinity_check.py @@ -465,8 +465,7 @@ async def test_async_pre_call_hook_uses_model_map_key_scope(): Deployment affinity caching uses (user_api_key_hash, model_map_key) -> model_id. """ - cache = AsyncMock() - cache.async_set_cache = AsyncMock() + cache = DualCache() callback = DeploymentAffinityCheck( cache=cache, @@ -489,11 +488,7 @@ async def test_async_pre_call_hook_uses_model_map_key_scope(): model_group="claude-sonnet-4-5@20250929", user_key="user-key-abc", ) - cache.async_set_cache.assert_called_once_with( - expected_cache_key, - {"model_id": "model-id-123"}, - ttl=123, - ) + assert await cache.async_get_cache(key=expected_cache_key) == {"model_id": "model-id-123"} @pytest.mark.asyncio diff --git a/tests/test_litellm/router_utils/pre_call_checks/test_session_id_affinity.py b/tests/test_litellm/router_utils/pre_call_checks/test_session_id_affinity.py index 0bcb0247aad..4053e6d118b 100644 --- a/tests/test_litellm/router_utils/pre_call_checks/test_session_id_affinity.py +++ b/tests/test_litellm/router_utils/pre_call_checks/test_session_id_affinity.py @@ -1,6 +1,6 @@ import os import sys -from unittest.mock import AsyncMock, patch +from unittest.mock import AsyncMock, MagicMock, patch import pytest @@ -10,6 +10,7 @@ import json import litellm from litellm.caching.dual_cache import DualCache +from litellm.constants import SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY from litellm.router_utils.pre_call_checks.deployment_affinity_check import ( DeploymentAffinityCheck, ) @@ -163,7 +164,7 @@ async def test_async_session_id_affinity_priority_over_user_key(): await callback.cache.async_set_cache( DeploymentAffinityCheck.get_session_affinity_cache_key( - "model_group", "session1" + "model_group", "session1", user_key="user1" ), {"model_id": "deployment-2"}, ) @@ -180,3 +181,439 @@ async def test_async_session_id_affinity_priority_over_user_key(): assert len(filtered) == 1 assert filtered[0]["model_info"]["id"] == "deployment-2" + + +MOCK_RESPONSES_API_RESPONSE = { + "id": "resp_mock-resp-456", + "object": "response", + "created_at": 1741476542, + "status": "completed", + "model": "azure/computer-use-preview", + "output": [], + "usage": { + "input_tokens": 5, + "output_tokens": 10, + "total_tokens": 15, + "output_tokens_details": {"reasoning_tokens": 0}, + }, +} + + +def _smart_router(session_affinity=True, ttl_seconds=777, deployment_affinity=True): + return litellm.Router( + model_list=[ + { + "model_name": "smart-router", + "litellm_params": { + "model": "auto_router/complexity_router", + "complexity_router_default_model": "target-group", + "complexity_router_config": { + "session_affinity": session_affinity, + "deployment_affinity": deployment_affinity, + "session_affinity_ttl_seconds": ttl_seconds, + "tiers": { + "SIMPLE": "target-group", + "MEDIUM": "target-group", + "COMPLEX": "target-group", + "REASONING": "target-group", + }, + }, + }, + }, + { + "model_name": "target-group", + "litellm_params": { + "model": "azure/computer-use-preview-1", + "api_key": "mock-api-key-1", + "api_version": "mock-api-version", + "api_base": "https://mock-endpoint-1.openai.azure.com", + }, + "model_info": {"id": "deployment-1", "base_model": "computer-use-preview"}, + }, + { + "model_name": "target-group", + "litellm_params": { + "model": "azure/computer-use-preview-2", + "api_key": "mock-api-key-2", + "api_version": "mock-api-version-2", + "api_base": "https://mock-endpoint-2.openai.azure.com", + }, + "model_info": {"id": "deployment-2", "base_model": "computer-use-preview"}, + }, + ], + ) + + +def _session_pin_key(session_id, user_key): + return DeploymentAffinityCheck.get_session_affinity_cache_key( + model_group="target-group", session_id=session_id, user_key=user_key + ) + + +def _cleanup_router_callbacks(router): + for callback in router.optional_callbacks or []: + litellm.logging_callback_manager.remove_callback_from_all_lists(callback) + + +async def _one_turn(router, model, session_id, key_hash): + """One request with the shuffle forced to deployment-1, so any other landing + deployment can only come from a pin read.""" + with ( + patch( + "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.post", + new_callable=AsyncMock, + ) as mock_post, + patch( + "litellm.router_strategy.simple_shuffle.random.choice", + side_effect=lambda seq: seq[0], + ), + ): + mock_post.return_value = MockResponse(MOCK_RESPONSES_API_RESPONSE, 200) + response = await router.aresponses( + model=model, + input=f"turn for {session_id} {key_hash}", + litellm_metadata={"session_id": session_id, "user_api_key_hash": key_hash}, + ) + return response._hidden_params["model_id"] + + +@pytest.mark.asyncio +async def test_auto_router_session_affinity_writes_scoped_pin_and_follows_it(): + """Turn 1 persists a key-scoped deployment pin; a pin seeded to the deployment + the shuffle would never pick is then followed, proving the read path.""" + router = _smart_router() + try: + served = await _one_turn(router, "smart-router", "write-session", "key-1") + assert await router.cache.async_get_cache(key=_session_pin_key("write-session", "key-1")) == { + "model_id": served + } + assert await router.cache.async_get_cache(key=_session_pin_key("write-session", None)) is None + + await router.cache.async_set_cache( + key=_session_pin_key("read-session", "key-1"), value={"model_id": "deployment-2"} + ) + assert await _one_turn(router, "smart-router", "read-session", "key-1") == "deployment-2" + finally: + _cleanup_router_callbacks(router) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "model,key_hash", + [ + ("target-group", "key-1"), + ("smart-router", "key-2"), + ], + ids=["direct-group-call", "different-api-key"], +) +async def test_seeded_session_pin_is_invisible_outside_its_scope(model, key_hash): + """The pin binds (auto-routed request, api key, session): a direct call to the + group and a different key reusing the session id must both ignore it.""" + router = _smart_router() + try: + await router.cache.async_set_cache( + key=_session_pin_key("scoped-session", "key-1"), value={"model_id": "deployment-2"} + ) + assert await _one_turn(router, model, "scoped-session", key_hash) == "deployment-1" + finally: + _cleanup_router_callbacks(router) + + +@pytest.mark.asyncio +async def test_marker_write_uses_marker_ttl_and_writes_only_the_session_pin(): + """The write hook honors the marker's TTL over the callback default and writes + no user-key entry when only session affinity is active.""" + import time as time_module + + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + + await callback.async_pre_call_deployment_hook( + kwargs={ + "model_info": {"id": "deployment-1"}, + "metadata": { + "deployment_model_name": "target-group", + "session_id": "ttl-session", + "user_api_key_hash": "key-1", + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: 777, + }, + }, + call_type=None, + ) + + session_key = _session_pin_key("ttl-session", "key-1") + assert cache.in_memory_cache.cache_dict == {session_key: {"model_id": "deployment-1"}} + assert cache.in_memory_cache.ttl_dict[session_key] == pytest.approx(time_module.time() + 777, abs=5) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("bad_marker", ["777", True, -5, 0, None]) +async def test_malformed_marker_values_do_not_enable_session_affinity(bad_marker): + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + + await callback.async_pre_call_deployment_hook( + kwargs={ + "model_info": {"id": "deployment-1"}, + "metadata": { + "deployment_model_name": "target-group", + "session_id": "bad-marker-session", + "user_api_key_hash": "key-1", + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: bad_marker, + }, + }, + call_type=None, + ) + + assert cache.in_memory_cache.cache_dict == {} + + +@pytest.mark.asyncio +@pytest.mark.parametrize("enable_user_key", [False, True], ids=["session-pin", "user-key-pin"]) +async def test_concurrent_first_requests_never_flip_a_claimed_pin(enable_user_key): + """Two overlapping first requests select different deployments before either + write lands. Pins are first-writer-wins claims, so the second write must leave + the stored pin unchanged instead of flipping it.""" + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=enable_user_key, + enable_responses_api_affinity=False, + ) + + def racing_kwargs(deployment_id): + metadata = {"deployment_model_name": "target-group", "user_api_key_hash": "key-1"} + if not enable_user_key: + metadata["session_id"] = "racing-session" + metadata[SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY] = 777 + return {"model_info": {"id": deployment_id}, "metadata": metadata} + + await callback.async_pre_call_deployment_hook(kwargs=racing_kwargs("deployment-1"), call_type=None) + await callback.async_pre_call_deployment_hook(kwargs=racing_kwargs("deployment-2"), call_type=None) + + pinned_key = ( + DeploymentAffinityCheck.get_affinity_cache_key(model_group="target-group", user_key="key-1") + if enable_user_key + else _session_pin_key("racing-session", "key-1") + ) + assert await cache.async_get_cache(key=pinned_key) == {"model_id": "deployment-1"} + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "stored_pin", + [{"model_id": "deployment-1"}, "deployment-1"], + ids=["dict-pin", "legacy-string-pin"], +) +async def test_in_memory_reclaim_slides_idle_window_only_for_the_stored_deployment(stored_pin): + """The pod-local claim mirrors the Lua keepalive: the winning deployment's + re-claim extends the pin's expiry, a losing deployment's claim touches neither + the value nor the expiry, so no-Redis setups keep stickiness across an active + session and ttl bounds idle time there too. Sameness is judged on the pinned + model id, so a legacy string pin written by the Redis branch slides the same.""" + import time as time_module + + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + pin_key = _session_pin_key("slide-session", "key-1") + cache.in_memory_cache.set_cache(pin_key, stored_pin, ttl=10) + first_expiry = cache.in_memory_cache.ttl_dict[pin_key] + + reclaimed = await callback._claim_pin(cache_key=pin_key, pin_value={"model_id": "deployment-1"}, ttl_seconds=777) + assert reclaimed == "deployment-1" + assert cache.in_memory_cache.ttl_dict[pin_key] == pytest.approx(time_module.time() + 777, abs=5) + assert cache.in_memory_cache.ttl_dict[pin_key] > first_expiry + + lost = await callback._claim_pin(cache_key=pin_key, pin_value={"model_id": "deployment-2"}, ttl_seconds=10) + assert lost == "deployment-1" + assert cache.in_memory_cache.ttl_dict[pin_key] == pytest.approx(time_module.time() + 777, abs=5) + + +@pytest.mark.asyncio +async def test_claim_pin_uses_redis_attached_after_construction(): + """The proxy attaches Redis via Router._update_redis_cache after the Router (and + this callback) are built. The claim must resolve the redis tier per call, or pins + silently stay pod-local and cross-pod first-writer-wins is lost.""" + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + + captured = {} + + async def fake_runner(keys, args, client=None): + captured["keys"] = keys + captured["args"] = args + return b'{"model_id": "other-pod-winner"}' + + late_redis = MagicMock() + late_redis.async_register_script = MagicMock(return_value=fake_runner) + cache.redis_cache = late_redis + + import time as time_module + + pin_key = _session_pin_key("late-redis-session", "key-1") + cache.in_memory_cache.set_cache(pin_key, {"model_id": "other-pod-winner"}, ttl=10) + + claimed = await callback._claim_pin( + cache_key=pin_key, + pin_value={"model_id": "our-deployment"}, + ttl_seconds=777, + ) + + assert claimed == "other-pod-winner" + assert cache.in_memory_cache.ttl_dict[pin_key] == pytest.approx(time_module.time() + 777, abs=5) + assert captured["keys"] == (pin_key,) + assert captured["args"] == ('{"model_id": "our-deployment"}', 777) + assert cache.in_memory_cache.get_cache(_session_pin_key("late-redis-session", "key-1")) == { + "model_id": "other-pod-winner" + } + + +@pytest.mark.asyncio +async def test_claim_pin_falls_back_to_pod_local_when_redis_is_down(): + """A Redis outage must cost cross-pod agreement, never same-pod stickiness. The write + hook only logs this result, so an escaping error would leave the session unpinned and + reshuffle every turn for the whole outage. DualCache's write path, which this claim + replaced, wrote the in-memory tier before ever touching Redis.""" + cache = DualCache() + callback = DeploymentAffinityCheck( + cache=cache, + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + + async def exploding_runner(keys, args, client=None): + raise ConnectionError("redis is down") + + down_redis = MagicMock() + down_redis.async_register_script = MagicMock(return_value=exploding_runner) + cache.redis_cache = down_redis + + key = _session_pin_key("outage-session", "key-1") + claimed = await callback._claim_pin(cache_key=key, pin_value={"model_id": "our-deployment"}, ttl_seconds=777) + + assert claimed == "our-deployment" + assert cache.in_memory_cache.get_cache(key) == {"model_id": "our-deployment"} + + second = await callback._claim_pin(cache_key=key, pin_value={"model_id": "another-deployment"}, ttl_seconds=777) + assert second == "our-deployment" + + +@pytest.mark.asyncio +async def test_marker_session_affinity_read_and_write_agree_for_wildcard_groups(): + """Wildcard deployments keep the literal pattern as model_name on both the read + path and the write path, so the marker-gated pin round-trips through one key.""" + callback = DeploymentAffinityCheck( + cache=DualCache(), + ttl_seconds=3600, + enable_user_key_affinity=False, + enable_responses_api_affinity=False, + ) + request_kwargs = { + "model_info": {"id": "wild-deployment-2"}, + "metadata": { + "deployment_model_name": "openai/*", + "session_id": "wild-session", + "user_api_key_hash": "key-1", + SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: 777, + }, + } + + await callback.async_pre_call_deployment_hook(kwargs=request_kwargs, call_type=None) + filtered = await callback.async_filter_deployments( + model="openai/gpt-4o", + healthy_deployments=[ + { + "model_name": "openai/*", + "litellm_params": {"model": "openai/gpt-4o"}, + "model_info": {"id": f"wild-deployment-{i}"}, + } + for i in (1, 2) + ], + messages=[], + request_kwargs=request_kwargs, + ) + + assert [d["model_info"]["id"] for d in filtered] == ["wild-deployment-2"] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "model,session_affinity,deployment_affinity,expect_marker", + [ + ("smart-router", False, True, True), + ("smart-router", True, False, True), + ("smart-router", False, False, False), + ("target-group", False, True, False), + ], + ids=[ + "deployment-affinity-stamps", + "session-affinity-implies-deployment-pin", + "both-off-no-stamp", + "non-auto-routed-clears", + ], +) +async def test_pre_routing_hook_stamps_or_clears_the_marker_per_attempt( + model, session_affinity, deployment_affinity, expect_marker +): + """Every routing attempt writes or clears the marker, so a fallback from an + auto-routed group to a plain group cannot carry a stale marker. session_affinity + implies the deployment pin: a session frozen onto one group must not re-shuffle + across that group's deployments.""" + router = _smart_router(session_affinity=session_affinity, deployment_affinity=deployment_affinity) + try: + request_kwargs = { + "metadata": {SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: 111}, + "litellm_metadata": {SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY: 111}, + } + await router.async_pre_routing_hook( + model=model, + request_kwargs=request_kwargs, + messages=[{"role": "user", "content": "Hello"}], + ) + if expect_marker: + assert request_kwargs["litellm_metadata"][SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY] == 777 + else: + assert SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY not in request_kwargs["metadata"] + assert SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY not in request_kwargs["litellm_metadata"] + finally: + _cleanup_router_callbacks(router) + + +def test_complexity_router_with_deployment_affinity_registers_affinity_callback(): + enabled = _smart_router() + session_only = _smart_router(session_affinity=True, deployment_affinity=False) + disabled = _smart_router(session_affinity=False, deployment_affinity=False) + try: + assert [ + (cb.enable_user_key_affinity, cb.enable_responses_api_affinity, cb.enable_session_id_affinity) + for cb in enabled.optional_callbacks or [] + if isinstance(cb, DeploymentAffinityCheck) + ] == [(False, False, False)] + assert any(isinstance(cb, DeploymentAffinityCheck) for cb in session_only.optional_callbacks or []) + assert not any(isinstance(cb, DeploymentAffinityCheck) for cb in disabled.optional_callbacks or []) + finally: + _cleanup_router_callbacks(enabled) + _cleanup_router_callbacks(session_only) + _cleanup_router_callbacks(disabled) diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index da2d78edb73..67fa827a8e4 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -7550,3 +7550,68 @@ async def test_fallback_failure_detail_from_upstream_is_bounded(): assert capture.messages, "the fallback failure path did not log at ERROR" assert huge_message not in "".join(capture.messages) assert max(len(message) for message in capture.messages) < 5_000 +def test_stamp_or_clear_metadata_key_writes_and_clears_both_buckets(): + request_kwargs = {"metadata": {}} + litellm.Router._stamp_or_clear_metadata_key(request_kwargs=request_kwargs, key="probe", value=7) + assert request_kwargs["metadata"]["probe"] == 7 + + stale_kwargs = {"metadata": {"probe": 7}, "litellm_metadata": {"probe": 7}} + litellm.Router._stamp_or_clear_metadata_key(request_kwargs=stale_kwargs, key="probe", value=None) + assert "probe" not in stale_kwargs["metadata"] + assert "probe" not in stale_kwargs["litellm_metadata"] + + +@pytest.mark.parametrize( + "complexity_router_config,expect_callback", + [ + ({"tiers": {"SIMPLE": "gpt-4o"}}, True), + ({"tiers": {"SIMPLE": "gpt-4o"}, "deployment_affinity": False}, False), + ({"tiers": {"SIMPLE": "gpt-4o"}, "deployment_affinity": False, "session_affinity": True}, True), + ], +) +def test_complexity_router_registers_affinity_callback_for_deployment_pin(complexity_router_config, expect_callback): + """The marker the complexity router stamps is inert unless a DeploymentAffinityCheck is + registered to read it, so deployment_affinity has to pull the callback in, and its default-on + means a bare config registers one. Opting out must skip the callback entirely rather than + register a filter that can never fire, including when session_affinity is on, since the two + pins are independent.""" + from litellm.router_utils.pre_call_checks.deployment_affinity_check import ( + DeploymentAffinityCheck, + ) + + router = litellm.Router( + model_list=[ + {"model_name": "gpt-4o", "litellm_params": {"model": "gpt-4o"}}, + { + "model_name": "my-complexity-router", + "litellm_params": { + "model": "auto_router/complexity_router", + "complexity_router_config": complexity_router_config, + }, + }, + ] + ) + try: + registered = any(isinstance(cb, DeploymentAffinityCheck) for cb in router.optional_callbacks or []) + assert registered is expect_callback + finally: + for cb in router.optional_callbacks or []: + litellm.logging_callback_manager.remove_callback_from_all_lists(cb) + + +def test_ensure_deployment_affinity_callback_is_idempotent(): + from litellm.router_utils.pre_call_checks.deployment_affinity_check import ( + DeploymentAffinityCheck, + ) + + router = litellm.Router(model_list=[]) + try: + router._ensure_deployment_affinity_callback() + router._ensure_deployment_affinity_callback() + affinity_callbacks = [ + cb for cb in router.optional_callbacks or [] if isinstance(cb, DeploymentAffinityCheck) + ] + assert len(affinity_callbacks) == 1 + finally: + for cb in router.optional_callbacks or []: + litellm.logging_callback_manager.remove_callback_from_all_lists(cb) diff --git a/type-discipline-budget.json b/type-discipline-budget.json index 3a670bc7345..d621e85f09b 100644 --- a/type-discipline-budget.json +++ b/type-discipline-budget.json @@ -27,7 +27,7 @@ "limit": 0 }, "LIT010": { - "limit": 16760 + "limit": 16758 }, "LIT011": { "limit": 5598 diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index a75c23da1cf..b361a16a0e6 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -31695,6 +31695,12 @@ export interface components { * @description Default model to use if tier cannot be determined */ default_model?: string | null; + /** + * Deployment Affinity + * @description When True and a session_id is resolvable on the request, pin the deployment chosen inside each routed model group and reuse it whenever the session returns to that group, without pinning which group the session routes to. Independent of session_affinity, which pins the model group instead (and always carries this deployment pin with it): with session_affinity off, every turn is still classified on its own merits while a session that escalates to a stronger tier and comes back still lands on the deployment it used before, which is what keeps a provider prompt cache warm. Pins are held per model group, so switching tiers does not disturb the pin left behind in the previous group. On by default because re-shuffling a conversation across deployments of the same model discards that cache for no benefit; set False to keep every turn load-balanced across the group, which is what a deployment set with tight per-deployment rate limits wants. Inert when no session_id is resolvable, since there is nothing to key a pin on, and suppressed when plugins are configured, for the same reason session_affinity is. + * @default true + */ + deployment_affinity: boolean; /** * Dimension Weights * @description Weights for each scoring dimension @@ -31752,13 +31758,13 @@ export interface components { semantic_keyword_matching: boolean; /** * Session Affinity - * @description When True and a session_id is resolvable on the request, pin the model chosen on the session's first turn and reuse it for every later turn, skipping re-classification. Off by default so every turn is classified on its own merits and routed to the cheapest adequate tier. Set True to keep a multi-turn session on one model, which preserves provider prompt caches and avoids cross-model conversation-history errors. + * @description When True and a session_id is resolvable on the request, pin the model chosen on the session's first turn and reuse it for every later turn, skipping re-classification. Off by default so every turn is classified on its own merits and routed to the cheapest adequate tier. Set True to keep a multi-turn session on one model, which preserves provider prompt caches and avoids cross-model conversation-history errors. Always implies the deployment pin regardless of deployment_affinity: the session sticks to one deployment of the pinned model, since freezing the model while re-shuffling its deployments would still go cache-cold. * @default false */ session_affinity: boolean; /** * Session Affinity Ttl Seconds - * @description TTL for the session affinity pin; refreshed on every cache hit + * @description TTL for the session affinity pin; refreshed on every cache hit. Bounds both the session_affinity model pin and the deployment_affinity deployment pin, so it measures idle time for the session's routing decisions rather than total session length * @default 3600 */ session_affinity_ttl_seconds: number; From 84d63cbdcff2b3cbf7b2434c43f7405d3b123358 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Sat, 8 Aug 2026 13:14:45 -0700 Subject: [PATCH 049/279] chore: update Next.js build artifacts (2026-08-08 20:14 UTC, node v24.19.0) --- 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 | 60 +-- .../proxy/_experimental/out/__next._head.txt | 8 +- .../proxy/_experimental/out/__next._index.txt | 15 +- .../proxy/_experimental/out/__next._tree.txt | 4 +- .../_buildManifest.js | 0 .../_clientMiddlewareManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/00lwtxl1k_z8t.js | 1 - .../out/_next/static/chunks/017kxo-8o84bv.js | 1 - .../out/_next/static/chunks/01q1b-t4kl710.js | 41 ++ .../out/_next/static/chunks/033zbmm2193x9.js | 1 + .../out/_next/static/chunks/03kaz3d0v3z45.js | 10 - .../out/_next/static/chunks/06sx0oh8weeph.js | 8 - .../out/_next/static/chunks/077dp65t7iug7.js | 1 - .../out/_next/static/chunks/07sexl9lqn8w6.js | 1 + .../out/_next/static/chunks/08eaumdx0krrt.js | 1 - .../out/_next/static/chunks/08ldu6o5kiz9c.js | 8 + .../out/_next/static/chunks/08uoywqkfbbbt.js | 1 + .../out/_next/static/chunks/0_8sguvytg2x1.js | 1 - .../out/_next/static/chunks/0ak2vacq91c7k.js | 89 ---- .../out/_next/static/chunks/0aoel7yrv88fp.js | 1 + .../out/_next/static/chunks/0catil7su1yp5.js | 3 + .../{26o1fp5v-765p.js => 0dhxm4s1uxvr1.js} | 2 +- .../out/_next/static/chunks/0e3vwdd43gm8b.js | 1 - .../out/_next/static/chunks/0e5-pjnljk_pz.js | 1 + .../{2lmbrl05dz2hg.js => 0eblixumbp_86.js} | 2 +- .../out/_next/static/chunks/0eh5r_mh1kh_t.js | 1 + .../{0g8wwba6umbim.js => 0ex44ljfg9dp9.js} | 2 +- .../out/_next/static/chunks/0fldyxjw1x7b3.js | 89 ++++ .../out/_next/static/chunks/0ga80_i1un77z.js | 1 - .../out/_next/static/chunks/0gylheyn-59ow.js | 8 - .../out/_next/static/chunks/0hpbtid045pqt.js | 10 - .../out/_next/static/chunks/0iabn229p_bg9.js | 1 + .../out/_next/static/chunks/0ikhgrs0xvkyu.js | 1 + .../out/_next/static/chunks/0imbshqv9tl6y.js | 19 + .../out/_next/static/chunks/0j0zka6472o9x.js | 1 - .../out/_next/static/chunks/0j43vc4hvn3oe.js | 1 - .../out/_next/static/chunks/0jf45vdwkbyvs.js | 66 +++ .../out/_next/static/chunks/0jjbikxye1xv_.js | 1 - .../out/_next/static/chunks/0kzod24rqslaj.js | 23 + .../out/_next/static/chunks/0l9ditwxvhpn1.js | 1 - .../out/_next/static/chunks/0lrifevwaw-qj.js | 1 + .../out/_next/static/chunks/0nobv49ll5nyv.js | 1 - .../out/_next/static/chunks/0o4-g_7x79zs_.js | 1 + .../out/_next/static/chunks/0poz1ux09ae29.js | 1 + .../out/_next/static/chunks/0q8_xov7_vyo6.js | 1 + .../out/_next/static/chunks/0qf84m09hg_q8.js | 1 - .../out/_next/static/chunks/0qkqkii3nce2s.js | 427 ------------------ .../out/_next/static/chunks/0qmwyxhqsmi-v.js | 1 + .../out/_next/static/chunks/0r0okx31djc7i.js | 8 - .../{0xu-p94boe99i.js => 0s31ton5ia2fh.js} | 2 +- .../out/_next/static/chunks/0sm3ln66e4502.js | 3 - .../out/_next/static/chunks/0t3wvditulk42.js | 1 - .../out/_next/static/chunks/0u0-hzwjwlynn.js | 1 + .../out/_next/static/chunks/0uqgz7kckt4h1.js | 1 + .../out/_next/static/chunks/0vggytdohwe7o.js | 1 - .../out/_next/static/chunks/0vzx0jspfnkgb.js | 1 + .../out/_next/static/chunks/0wg3l8hjyxbxn.js | 56 --- .../out/_next/static/chunks/0wo6dp1zxhzve.js | 10 - .../out/_next/static/chunks/0wo7g25bvtjy-.js | 8 + .../out/_next/static/chunks/0xcneptpo0s76.js | 1 + .../{14rmfrwspq6qw.js => 0xo7qvoxfppvz.js} | 2 +- .../out/_next/static/chunks/0xs1uz0umxpo_.js | 10 + .../{0kx52ovlpa34x.js => 0zy8o1br4cxj_.js} | 2 +- .../out/_next/static/chunks/11_8skd8xyc2y.js | 1 - .../out/_next/static/chunks/11_h-ycwasbfv.js | 7 - .../out/_next/static/chunks/11f7pk3f8kvvz.js | 1 - .../out/_next/static/chunks/11tayjjqv4w7m.js | 3 + .../out/_next/static/chunks/11td9c6ktfxjm.js | 1 + .../out/_next/static/chunks/12-bl9aesgwlz.js | 7 - .../{3gj-m4kjq0tei.js => 1269ecu-v6ly2.js} | 4 +- .../out/_next/static/chunks/12drti6el0iyq.js | 1 + .../out/_next/static/chunks/12gco0szy9t4d.js | 1 - .../{2-aswp_-wcabc.js => 12wnb8w5rzc0p.js} | 2 +- .../out/_next/static/chunks/13-6v0bl0z1kw.js | 1 + .../out/_next/static/chunks/13-de4f5zysj_.js | 1 + .../out/_next/static/chunks/132zrhwuxd-9j.js | 1 + .../{31j2km6tmcwz2.js => 14q7qkap-vg_k.js} | 2 +- .../out/_next/static/chunks/14udkurgshvhr.js | 1 + .../out/_next/static/chunks/15tw4l45yqt1o.js | 7 - .../out/_next/static/chunks/169bqf_mz3j8m.css | 1 - .../out/_next/static/chunks/171cx658-q4gh.js | 420 +++++++++++++++++ .../{3msynadpz-qlj.js => 17_n7d7sao37s.js} | 4 +- .../out/_next/static/chunks/17gy9d71tfqhd.js | 1 - .../{0b4c0ak_j76h0.js => 17y1q5sh_9s-g.js} | 2 +- .../out/_next/static/chunks/18wkke_o3faz6.js | 1 - .../out/_next/static/chunks/19frz_r2jewoi.js | 1 + .../out/_next/static/chunks/19o72uq6r0yc6.js | 10 - .../out/_next/static/chunks/19wuvjaaw7hlh.js | 1 + .../out/_next/static/chunks/1_brfnmnjcjzu.js | 1 + .../out/_next/static/chunks/1_ci65lqx_7fg.js | 1 + .../out/_next/static/chunks/1_lnyzb5t0ym1.js | 1 + .../out/_next/static/chunks/1aafdh2uz-2dg.js | 23 - .../{2wt_98_ncupdk.js => 1aluun0xaam5g.js} | 6 +- .../out/_next/static/chunks/1axupaiywv5s2.js | 1 + .../{3686mcknnkzkg.js => 1b6ejigcj870-.js} | 2 +- .../out/_next/static/chunks/1bwzei67lb34f.js | 1 - .../out/_next/static/chunks/1dz5lav3kl0ev.js | 1 - .../out/_next/static/chunks/1fsvlo5kqu-2m.js | 1 - .../{2snefsd_3bsd3.js => 1g7szci1phjh_.js} | 2 +- .../out/_next/static/chunks/1gbocndha6wy_.js | 1 + .../out/_next/static/chunks/1i3uh_0v3x0m3.js | 1 - .../out/_next/static/chunks/1jk31lastms2d.js | 17 - .../out/_next/static/chunks/1jxl7tej0hrz8.js | 1 - .../out/_next/static/chunks/1k8pioeg1repk.js | 1 + .../out/_next/static/chunks/1kc93z58r09lh.js | 10 + .../{3d5jzuznlr5b_.js => 1lmejayisnmqu.js} | 2 +- .../out/_next/static/chunks/1mmprbrq4-2gr.js | 1 - .../out/_next/static/chunks/1o-felcyu_bhd.js | 1 + .../{08yk0x-hh3ydk.js => 1o0_71qcxajfu.js} | 2 +- .../{2j0naxq1yw5vq.js => 1o1x0lh4berqb.js} | 62 +-- .../{2z165x3dvxa-h.js => 1oda9kdz4-_d7.js} | 4 +- .../out/_next/static/chunks/1pgh82nmoqy5j.js | 3 + .../out/_next/static/chunks/1q2sgg5x2pxls.js | 10 + .../out/_next/static/chunks/1qlouqdmceub4.js | 420 ----------------- .../{43ka9o8yln4me.js => 1rkqkr8vxt30c.js} | 2 +- .../out/_next/static/chunks/1s32a2vvs3l7w.js | 1 + .../{3jstcofmhxj55.js => 1s5z4tgndbmv6.js} | 2 +- .../out/_next/static/chunks/1s62g55t5755v.js | 1 + .../out/_next/static/chunks/1u-z_da077rnf.js | 1 - .../out/_next/static/chunks/1u9cxkx771jnb.css | 1 + .../out/_next/static/chunks/1v1oh8fp_g-r_.js | 1 - .../out/_next/static/chunks/1vrxjn9atxugh.js | 19 + .../{0lf6n96uy4q27.js => 1xa9yu09pffiu.js} | 2 +- .../out/_next/static/chunks/1xmq4ewn31b14.js | 1 + .../{0ma4y3uxzghhw.js => 1xv1ppzejm8y2.js} | 2 +- .../out/_next/static/chunks/1y8yqz9ii_cl0.js | 1 - .../out/_next/static/chunks/1ye-hq0gakt-m.js | 10 - .../out/_next/static/chunks/1yllcy_eafc2u.js | 1 + .../out/_next/static/chunks/1z6hg2cw2188l.js | 1 - .../out/_next/static/chunks/1zznuqlfxm47w.js | 8 - .../out/_next/static/chunks/2-4qe-yyfavei.js | 1 - .../{3y674jhwchpcq.js => 2023q5h806oc4.js} | 2 +- .../out/_next/static/chunks/20mvgyvrlrdla.js | 2 + .../{26thr492-c8xr.js => 211gf6j__5t29.js} | 2 +- .../out/_next/static/chunks/21vtdd_swvbzs.js | 1 - .../out/_next/static/chunks/2261mcsdnyreu.js | 1 + .../out/_next/static/chunks/22dktt8qrt6rf.js | 1 - .../out/_next/static/chunks/22m4bb1j3r7zp.js | 1 - .../out/_next/static/chunks/23cd1r5zlp2el.js | 1 + .../out/_next/static/chunks/243id3jugqr94.js | 1 - .../{06hxe45fjy7x7.js => 25r4u4futzzt2.js} | 2 +- .../{030xj-a9q0ur8.js => 27_2u60qyxy6_.js} | 2 +- .../{3ckrfvcj0b3i7.js => 27zjzw8s0fbnw.js} | 2 +- .../out/_next/static/chunks/28aka7p0tvdrg.js | 10 + .../out/_next/static/chunks/28md7sjkucknx.js | 3 - .../out/_next/static/chunks/28o81b2onxgmf.js | 1 + .../out/_next/static/chunks/295q2m2m31tsh.js | 50 -- .../out/_next/static/chunks/29l3pao1xfkc3.js | 1 + .../out/_next/static/chunks/29mvy3j2m7sge.js | 1 + .../{2_6f9v3gbf0sq.js => 2_2co5c4b9e6e.js} | 2 +- .../out/_next/static/chunks/2a8ww5ni5-8w0.js | 1 - .../out/_next/static/chunks/2aipnlru7apeo.js | 1 - .../out/_next/static/chunks/2bej9fc7jzdr4.js | 1 - .../{3ib18qm2ox61z.js => 2bwy4wke9jrlh.js} | 2 +- .../out/_next/static/chunks/2co6u9hlpqnbf.js | 17 - .../out/_next/static/chunks/2cps1n4fsjn3x.js | 1 - .../{2vnpyhxoamx0f.js => 2cz4e0-p1l3hf.js} | 2 +- .../out/_next/static/chunks/2dnxzrmbll_f_.js | 1 - .../out/_next/static/chunks/2e75ru1nma589.js | 47 ++ .../out/_next/static/chunks/2eehehco24kgo.js | 1 + .../out/_next/static/chunks/2eova-n8-0gr2.js | 1 - .../out/_next/static/chunks/2fw2t_0v-71vq.js | 1 + .../out/_next/static/chunks/2h05j6f6btioc.js | 1 - .../out/_next/static/chunks/2iio9hgb_u4jj.js | 1 - .../out/_next/static/chunks/2ik5hi7wloa-i.js | 8 - .../out/_next/static/chunks/2k91759uzip4m.js | 1 + .../out/_next/static/chunks/2kltpq3q8up7g.js | 7 + .../out/_next/static/chunks/2kt_m68ln2fyr.js | 1 - .../out/_next/static/chunks/2kztbq94gb-da.js | 1 - .../out/_next/static/chunks/2l12-7bw-d7fj.js | 8 - .../out/_next/static/chunks/2m04pnthaoc-y.js | 10 - .../out/_next/static/chunks/2m11cycf6gnyx.js | 10 + .../{41eydn-q2wrd_.js => 2m6yr-vp1lu1f.js} | 2 +- .../{3dxpyn2i1l2v1.js => 2miv61sfmgvg2.js} | 2 +- .../{3oiooy4p0ux4h.js => 2oi60u0cemkr3.js} | 2 +- .../out/_next/static/chunks/2oi9nmuauh0je.js | 7 + .../out/_next/static/chunks/2ozr0u0juxzig.js | 1 + .../{12xzclxtit2xd.js => 2pqj8g4g046qf.js} | 2 +- .../out/_next/static/chunks/2r-b03uceiyd9.js | 8 + .../out/_next/static/chunks/2r285pkv5nnfe.js | 10 + .../out/_next/static/chunks/2reygs7a48uqw.js | 8 - .../out/_next/static/chunks/2rq8yc88w8h8j.js | 1 - .../out/_next/static/chunks/2rr1v94v_-ef6.js | 1 - .../out/_next/static/chunks/2rwo22jlmrgva.js | 1 + .../out/_next/static/chunks/2s9dnn4earby2.js | 1 + .../out/_next/static/chunks/2sdvzej6o7544.js | 1 + .../out/_next/static/chunks/2sm_zfd_jrgxe.js | 1 - .../out/_next/static/chunks/2t2-f7xxigo1d.js | 1 - .../{2au_w_kyew5j7.js => 2t3t4opdafh6n.js} | 2 +- .../{2jv6lfgxgwyk1.js => 2tarn630-qz1x.js} | 2 +- .../out/_next/static/chunks/2tkpj7d49kuht.js | 1 + .../out/_next/static/chunks/2up3bks93iqds.js | 1 - .../out/_next/static/chunks/2v54hze4wuham.js | 1 + .../out/_next/static/chunks/2vtkmrasnohgw.js | 1 - .../out/_next/static/chunks/2x96scis66zmk.js | 1 - .../out/_next/static/chunks/2yvxihkuurxbf.js | 50 ++ .../out/_next/static/chunks/2zxiwsnk5d3y-.js | 1 + .../out/_next/static/chunks/3-oftth1cxnyl.js | 1 + .../out/_next/static/chunks/31azy9hywrzm7.js | 8 + .../out/_next/static/chunks/31cwj7vkk3gfz.js | 8 - .../out/_next/static/chunks/31khbgv55q1sp.js | 16 + .../out/_next/static/chunks/329tel7h1_v2c.js | 1 - .../out/_next/static/chunks/32kdgna82h224.js | 8 + .../out/_next/static/chunks/32tzootxu8-6e.js | 1 - .../out/_next/static/chunks/32y9b8oxeopec.js | 1 + .../out/_next/static/chunks/32yy_6wbqwxpc.js | 1 - .../out/_next/static/chunks/3320sm6j1jotz.js | 3 - .../out/_next/static/chunks/33xxmesl24-02.js | 1 + .../{1azbeyb626rh5.js => 34canl9e2fj8w.js} | 2 +- .../out/_next/static/chunks/37d71b7kk_uto.js | 1 + .../out/_next/static/chunks/39-vixwnx4i6z.js | 8 + .../out/_next/static/chunks/392aq001_xk5x.js | 1 - .../out/_next/static/chunks/395p6a6cbvfah.js | 1 - .../{011as3ct2u0nu.js => 39z4saua4wrzp.js} | 4 +- .../{0cj588tfl8vcq.js => 3_1txk_kvc_lh.js} | 2 +- .../out/_next/static/chunks/3_8m84_gkku_s.js | 7 - .../out/_next/static/chunks/3_et8a47dwosl.js | 7 + .../out/_next/static/chunks/3ap0aimtf8chq.js | 1 - .../out/_next/static/chunks/3b744cbxwmwnv.js | 1 + .../out/_next/static/chunks/3b9e6ztqd7gsk.js | 1 - .../out/_next/static/chunks/3bffd_h1wwdvy.js | 7 + .../out/_next/static/chunks/3bhv2o_oast51.js | 1 - .../{05ttqlxo9w0ow.js => 3cw0guuo_glfi.js} | 2 +- .../out/_next/static/chunks/3d3jond2vr0e1.js | 8 + .../{2x2f60ss87d3x.js => 3d9on3jcl20g4.js} | 2 +- .../out/_next/static/chunks/3drq2_k-jeio2.js | 1 - .../out/_next/static/chunks/3fu9as6otanx5.js | 1 + .../{32_ulchi2_aad.js => 3fzya67r1y1fl.js} | 24 +- .../out/_next/static/chunks/3gd2x5p0_azf2.js | 1 - .../out/_next/static/chunks/3gxis3ycrvgy9.js | 1 + .../out/_next/static/chunks/3i-q3u8a9gglk.js | 1 - .../out/_next/static/chunks/3i55449at-oj8.js | 1 - .../out/_next/static/chunks/3ik9o_1siirtw.js | 7 - .../out/_next/static/chunks/3j3eozgtz9ocf.js | 1 - .../out/_next/static/chunks/3kmoa-63y6leb.js | 10 - .../{38tna1p1mxo04.js => 3kqubqhevz875.js} | 4 +- .../out/_next/static/chunks/3l_lol8afnoh0.js | 1 + .../{1alrb0xib8wmc.js => 3less_-8_3yu2.js} | 2 +- .../out/_next/static/chunks/3ljwjf5o6ocd8.js | 1 - .../out/_next/static/chunks/3lsw900yb5qyy.js | 1 + .../{2783exotql09c.js => 3m5bmlwc2msfd.js} | 2 +- .../out/_next/static/chunks/3mjaw6luhro0j.js | 1 + .../out/_next/static/chunks/3mrwpwkrhn-e5.js | 1 - .../{1abwfud5uqxxq.js => 3mz07lvvrbciz.js} | 2 +- .../out/_next/static/chunks/3nr80xs9yy1co.js | 1 + .../out/_next/static/chunks/3o8olif8ekmc9.js | 1 - .../out/_next/static/chunks/3oto3uw67tztq.js | 1 - .../out/_next/static/chunks/3pgwv_yx5dbep.js | 1 + .../out/_next/static/chunks/3q4gsp09ztete.js | 1 + .../out/_next/static/chunks/3qivzpqq87ul9.js | 1 - .../out/_next/static/chunks/3qquqa6xl0ci8.js | 420 ----------------- .../out/_next/static/chunks/3s7zvty459znj.js | 1 - .../out/_next/static/chunks/3subppi3hqa14.js | 47 -- .../out/_next/static/chunks/3swbpwepmclaq.js | 1 + .../out/_next/static/chunks/3thshb577abuo.js | 1 - .../out/_next/static/chunks/3tt08rqvhxzib.js | 8 + .../out/_next/static/chunks/3u0zs7m2u4t03.js | 7 - .../out/_next/static/chunks/3vkfl6jnlw0zp.js | 1 + .../out/_next/static/chunks/3vu26x-a1_slz.js | 1 + .../out/_next/static/chunks/3wmcd3z9nmf1k.js | 10 - .../out/_next/static/chunks/3xi9dzq2-qg67.js | 66 --- .../out/_next/static/chunks/3zv_sthsyw5_i.js | 1 + .../out/_next/static/chunks/402g_pknu22b0.js | 1 + .../out/_next/static/chunks/40lf1xqjhxpq3.js | 1 + .../{34q6izq3hrlzj.js => 40viky8xip4ea.js} | 2 +- .../out/_next/static/chunks/41bzuzbn23qmv.js | 420 +++++++++++++++++ .../out/_next/static/chunks/41nqaa4z_z8u2.js | 1 + .../out/_next/static/chunks/42gio3rky08u5.js | 56 +++ .../out/_next/static/chunks/42o7xvspvvbk_.js | 2 - .../out/_next/static/chunks/42ptas50be2r5.js | 1 - .../out/_next/static/chunks/43nx3aaw4k2gv.js | 1 + .../out/_next/static/chunks/43qy9q02dp_cd.js | 1 + .../out/_next/static/chunks/44h2-69747xo0.js | 420 +++++++++++++++++ .../{3u-6f35z0tzpn.js => 44h3edx90yk8k.js} | 2 +- .../{0dy9qdalpgmgy.js => 44kde9nggcr0h.js} | 2 +- .../out/_next/static/chunks/44mjfwtslpvak.js | 1 + .../{1m28zz-ftm1fp.js => 45740ebv6x-ub.js} | 2 +- .../out/_not-found/__next._full.txt | 37 +- .../out/_not-found/__next._head.txt | 8 +- .../out/_not-found/__next._index.txt | 15 +- .../_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 | 37 +- ...KGRhc2hib2FyZCk.access-groups.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.access-groups.txt | 6 +- .../access-groups/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/access-groups/__next._full.txt | 66 +-- .../out/access-groups/__next._head.txt | 8 +- .../out/access-groups/__next._index.txt | 15 +- .../out/access-groups/__next._tree.txt | 4 +- .../out/access-groups/index.html | 2 +- .../_experimental/out/access-groups/index.txt | 66 +-- ....!KGRhc2hib2FyZCk.admin-panel.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.admin-panel.txt | 6 +- .../admin-panel/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/admin-panel/__next._full.txt | 66 +-- .../out/admin-panel/__next._head.txt | 8 +- .../out/admin-panel/__next._index.txt | 15 +- .../out/admin-panel/__next._tree.txt | 4 +- .../_experimental/out/admin-panel/index.html | 2 +- .../_experimental/out/admin-panel/index.txt | 66 +-- ..._next.!KGRhc2hib2FyZCk.agents.__PAGE__.txt | 8 +- .../agents/__next.!KGRhc2hib2FyZCk.agents.txt | 6 +- .../out/agents/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/agents/__next._full.txt | 66 +-- .../_experimental/out/agents/__next._head.txt | 8 +- .../out/agents/__next._index.txt | 15 +- .../_experimental/out/agents/__next._tree.txt | 4 +- .../proxy/_experimental/out/agents/index.html | 2 +- .../proxy/_experimental/out/agents/index.txt | 66 +-- ...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 | 66 +-- .../out/api-keys/__next._head.txt | 8 +- .../out/api-keys/__next._index.txt | 15 +- .../out/api-keys/__next._tree.txt | 4 +- .../_experimental/out/api-keys/index.html | 2 +- .../_experimental/out/api-keys/index.txt | 66 +-- ...KGRhc2hib2FyZCk.api-reference.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.api-reference.txt | 6 +- .../api-reference/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/api-reference/__next._full.txt | 66 +-- .../out/api-reference/__next._head.txt | 8 +- .../out/api-reference/__next._index.txt | 15 +- .../out/api-reference/__next._tree.txt | 4 +- .../out/api-reference/index.html | 2 +- .../_experimental/out/api-reference/index.txt | 66 +-- ...next.!KGRhc2hib2FyZCk.budgets.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.budgets.txt | 6 +- .../out/budgets/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/budgets/__next._full.txt | 66 +-- .../out/budgets/__next._head.txt | 8 +- .../out/budgets/__next._index.txt | 15 +- .../out/budgets/__next._tree.txt | 4 +- .../_experimental/out/budgets/index.html | 2 +- .../proxy/_experimental/out/budgets/index.txt | 66 +-- ...next.!KGRhc2hib2FyZCk.caching.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.caching.txt | 6 +- .../out/caching/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/caching/__next._full.txt | 66 +-- .../out/caching/__next._head.txt | 8 +- .../out/caching/__next._index.txt | 15 +- .../out/caching/__next._tree.txt | 4 +- .../_experimental/out/caching/index.html | 2 +- .../proxy/_experimental/out/caching/index.txt | 66 +-- .../_experimental/out/chat/__next._full.txt | 60 ++- .../_experimental/out/chat/__next._head.txt | 8 +- .../_experimental/out/chat/__next._index.txt | 15 +- .../_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 | 61 +-- .../out/chat/api-keys/__next._head.txt | 8 +- .../out/chat/api-keys/__next._index.txt | 15 +- .../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 | 61 +-- .../out/chat/credentials/__next._full.txt | 61 +-- .../out/chat/credentials/__next._head.txt | 8 +- .../out/chat/credentials/__next._index.txt | 15 +- .../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 | 61 +-- .../proxy/_experimental/out/chat/index.html | 2 +- .../proxy/_experimental/out/chat/index.txt | 60 ++- .../out/chat/integrations/__next._full.txt | 61 +-- .../out/chat/integrations/__next._head.txt | 8 +- .../out/chat/integrations/__next._index.txt | 15 +- .../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 | 61 +-- .../out/chat/logs/__next._full.txt | 61 +-- .../out/chat/logs/__next._head.txt | 8 +- .../out/chat/logs/__next._index.txt | 15 +- .../out/chat/logs/__next._tree.txt | 4 +- .../chat/logs/__next.chat.logs.__PAGE__.txt | 8 +- .../out/chat/logs/__next.chat.logs.txt | 6 +- .../out/chat/logs/__next.chat.txt | 10 +- .../_experimental/out/chat/logs/index.html | 2 +- .../_experimental/out/chat/logs/index.txt | 61 +-- .../out/chat/usage/__next._full.txt | 61 +-- .../out/chat/usage/__next._head.txt | 8 +- .../out/chat/usage/__next._index.txt | 15 +- .../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 | 61 +-- .../out/connect/__next._full.txt | 50 +- .../out/connect/__next._head.txt | 8 +- .../out/connect/__next._index.txt | 15 +- .../out/connect/__next._tree.txt | 4 +- .../out/connect/__next.connect.__PAGE__.txt | 8 +- .../out/connect/__next.connect.txt | 10 +- .../_experimental/out/connect/index.html | 2 +- .../proxy/_experimental/out/connect/index.txt | 50 +- ...c2hib2FyZCk.cost-optimization.__PAGE__.txt | 8 +- ...ext.!KGRhc2hib2FyZCk.cost-optimization.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/cost-optimization/__next._full.txt | 66 +-- .../out/cost-optimization/__next._head.txt | 8 +- .../out/cost-optimization/__next._index.txt | 15 +- .../out/cost-optimization/__next._tree.txt | 4 +- .../out/cost-optimization/index.html | 2 +- .../out/cost-optimization/index.txt | 66 +-- ...KGRhc2hib2FyZCk.cost-tracking.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.cost-tracking.txt | 6 +- .../cost-tracking/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/cost-tracking/__next._full.txt | 66 +-- .../out/cost-tracking/__next._head.txt | 8 +- .../out/cost-tracking/__next._index.txt | 15 +- .../out/cost-tracking/__next._tree.txt | 4 +- .../out/cost-tracking/index.html | 2 +- .../_experimental/out/cost-tracking/index.txt | 66 +-- ...2hib2FyZCk.guardrails-monitor.__PAGE__.txt | 8 +- ...xt.!KGRhc2hib2FyZCk.guardrails-monitor.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/guardrails-monitor/__next._full.txt | 66 +-- .../out/guardrails-monitor/__next._head.txt | 8 +- .../out/guardrails-monitor/__next._index.txt | 15 +- .../out/guardrails-monitor/__next._tree.txt | 4 +- .../out/guardrails-monitor/index.html | 2 +- .../out/guardrails-monitor/index.txt | 66 +-- ...t.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.guardrails.txt | 6 +- .../guardrails/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/guardrails/__next._full.txt | 66 +-- .../out/guardrails/__next._head.txt | 8 +- .../out/guardrails/__next._index.txt | 15 +- .../out/guardrails/__next._tree.txt | 4 +- .../_experimental/out/guardrails/index.html | 2 +- .../_experimental/out/guardrails/index.txt | 66 +-- litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 60 +-- ...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 | 66 +-- .../out/logging-and-alerts/__next._head.txt | 8 +- .../out/logging-and-alerts/__next._index.txt | 15 +- .../out/logging-and-alerts/__next._tree.txt | 4 +- .../out/logging-and-alerts/index.html | 2 +- .../out/logging-and-alerts/index.txt | 66 +-- .../_experimental/out/login/__next._full.txt | 45 +- .../_experimental/out/login/__next._head.txt | 8 +- .../_experimental/out/login/__next._index.txt | 15 +- .../_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 | 45 +- .../__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 | 66 +-- .../_experimental/out/logs/__next._head.txt | 8 +- .../_experimental/out/logs/__next._index.txt | 15 +- .../_experimental/out/logs/__next._tree.txt | 4 +- .../proxy/_experimental/out/logs/index.html | 2 +- .../proxy/_experimental/out/logs/index.txt | 66 +-- ....!KGRhc2hib2FyZCk.mcp-servers.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.mcp-servers.txt | 6 +- .../mcp-servers/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/mcp-servers/__next._full.txt | 66 +-- .../out/mcp-servers/__next._head.txt | 8 +- .../out/mcp-servers/__next._index.txt | 15 +- .../out/mcp-servers/__next._tree.txt | 4 +- .../_experimental/out/mcp-servers/index.html | 2 +- .../_experimental/out/mcp-servers/index.txt | 66 +-- .../out/mcp/oauth/callback/__next._full.txt | 45 +- .../out/mcp/oauth/callback/__next._head.txt | 8 +- .../out/mcp/oauth/callback/__next._index.txt | 15 +- .../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 | 45 +- ..._next.!KGRhc2hib2FyZCk.memory.__PAGE__.txt | 8 +- .../memory/__next.!KGRhc2hib2FyZCk.memory.txt | 6 +- .../out/memory/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/memory/__next._full.txt | 66 +-- .../_experimental/out/memory/__next._head.txt | 8 +- .../out/memory/__next._index.txt | 15 +- .../_experimental/out/memory/__next._tree.txt | 4 +- .../proxy/_experimental/out/memory/index.html | 2 +- .../proxy/_experimental/out/memory/index.txt | 66 +-- ...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 | 66 +-- .../out/model-hub-table/__next._head.txt | 8 +- .../out/model-hub-table/__next._index.txt | 15 +- .../out/model-hub-table/__next._tree.txt | 4 +- .../out/model-hub-table/index.html | 2 +- .../out/model-hub-table/index.txt | 66 +-- .../out/model_hub/__next._full.txt | 72 +-- .../out/model_hub/__next._head.txt | 8 +- .../out/model_hub/__next._index.txt | 15 +- .../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 | 72 +-- .../out/model_hub_table/__next._full.txt | 82 ++-- .../out/model_hub_table/__next._head.txt | 8 +- .../out/model_hub_table/__next._index.txt | 15 +- .../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 | 82 ++-- ...ib2FyZCk.models-and-endpoints.__PAGE__.txt | 8 +- ....!KGRhc2hib2FyZCk.models-and-endpoints.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/models-and-endpoints/__next._full.txt | 66 +-- .../out/models-and-endpoints/__next._head.txt | 8 +- .../models-and-endpoints/__next._index.txt | 15 +- .../out/models-and-endpoints/__next._tree.txt | 4 +- .../out/models-and-endpoints/index.html | 2 +- .../out/models-and-endpoints/index.txt | 66 +-- ...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 | 66 +-- .../out/old-usage/__next._head.txt | 8 +- .../out/old-usage/__next._index.txt | 15 +- .../out/old-usage/__next._tree.txt | 4 +- .../_experimental/out/old-usage/index.html | 2 +- .../_experimental/out/old-usage/index.txt | 66 +-- .../out/onboarding/__next._full.txt | 45 +- .../out/onboarding/__next._head.txt | 8 +- .../out/onboarding/__next._index.txt | 15 +- .../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 | 45 +- ...KGRhc2hib2FyZCk.organizations.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.organizations.txt | 6 +- .../organizations/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/organizations/__next._full.txt | 66 +-- .../out/organizations/__next._head.txt | 8 +- .../out/organizations/__next._index.txt | 15 +- .../out/organizations/__next._tree.txt | 4 +- .../out/organizations/index.html | 2 +- .../_experimental/out/organizations/index.txt | 66 +-- ...t.!KGRhc2hib2FyZCk.playground.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.playground.txt | 6 +- .../playground/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/playground/__next._full.txt | 66 +-- .../out/playground/__next._head.txt | 8 +- .../out/playground/__next._index.txt | 15 +- .../out/playground/__next._tree.txt | 4 +- .../_experimental/out/playground/index.html | 2 +- .../_experimental/out/playground/index.txt | 66 +-- ...ext.!KGRhc2hib2FyZCk.policies.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.policies.txt | 6 +- .../out/policies/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/policies/__next._full.txt | 66 +-- .../out/policies/__next._head.txt | 8 +- .../out/policies/__next._index.txt | 15 +- .../out/policies/__next._tree.txt | 4 +- .../_experimental/out/policies/index.html | 2 +- .../_experimental/out/policies/index.txt | 66 +-- ...ext.!KGRhc2hib2FyZCk.projects.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.projects.txt | 6 +- .../out/projects/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/projects/__next._full.txt | 66 +-- .../out/projects/__next._head.txt | 8 +- .../out/projects/__next._index.txt | 15 +- .../out/projects/__next._tree.txt | 4 +- .../_experimental/out/projects/index.html | 2 +- .../_experimental/out/projects/index.txt | 66 +-- ...next.!KGRhc2hib2FyZCk.prompts.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.prompts.txt | 6 +- .../out/prompts/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/prompts/__next._full.txt | 66 +-- .../out/prompts/__next._head.txt | 8 +- .../out/prompts/__next._index.txt | 15 +- .../out/prompts/__next._tree.txt | 4 +- .../_experimental/out/prompts/index.html | 2 +- .../proxy/_experimental/out/prompts/index.txt | 66 +-- ...Rhc2hib2FyZCk.router-settings.__PAGE__.txt | 8 +- ..._next.!KGRhc2hib2FyZCk.router-settings.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/router-settings/__next._full.txt | 66 +-- .../out/router-settings/__next._head.txt | 8 +- .../out/router-settings/__next._index.txt | 15 +- .../out/router-settings/__next._tree.txt | 4 +- .../out/router-settings/index.html | 2 +- .../out/router-settings/index.txt | 66 +-- ...!KGRhc2hib2FyZCk.search-tools.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.search-tools.txt | 6 +- .../search-tools/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/search-tools/__next._full.txt | 66 +-- .../out/search-tools/__next._head.txt | 8 +- .../out/search-tools/__next._index.txt | 15 +- .../out/search-tools/__next._tree.txt | 4 +- .../_experimental/out/search-tools/index.html | 2 +- .../_experimental/out/search-tools/index.txt | 66 +-- ..._next.!KGRhc2hib2FyZCk.skills.__PAGE__.txt | 8 +- .../skills/__next.!KGRhc2hib2FyZCk.skills.txt | 6 +- .../out/skills/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/skills/__next._full.txt | 66 +-- .../_experimental/out/skills/__next._head.txt | 8 +- .../out/skills/__next._index.txt | 15 +- .../_experimental/out/skills/__next._tree.txt | 4 +- .../proxy/_experimental/out/skills/index.html | 2 +- .../proxy/_experimental/out/skills/index.txt | 66 +-- ...GRhc2hib2FyZCk.tag-management.__PAGE__.txt | 8 +- ...__next.!KGRhc2hib2FyZCk.tag-management.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/tag-management/__next._full.txt | 66 +-- .../out/tag-management/__next._head.txt | 8 +- .../out/tag-management/__next._index.txt | 15 +- .../out/tag-management/__next._tree.txt | 4 +- .../out/tag-management/index.html | 2 +- .../out/tag-management/index.txt | 66 +-- ...__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt | 8 +- .../teams/__next.!KGRhc2hib2FyZCk.teams.txt | 6 +- .../out/teams/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../_experimental/out/teams/__next._full.txt | 66 +-- .../_experimental/out/teams/__next._head.txt | 8 +- .../_experimental/out/teams/__next._index.txt | 15 +- .../_experimental/out/teams/__next._tree.txt | 4 +- .../proxy/_experimental/out/teams/index.html | 2 +- .../proxy/_experimental/out/teams/index.txt | 66 +-- ...KGRhc2hib2FyZCk.tool-policies.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.tool-policies.txt | 6 +- .../tool-policies/__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/tool-policies/__next._full.txt | 66 +-- .../out/tool-policies/__next._head.txt | 8 +- .../out/tool-policies/__next._index.txt | 15 +- .../out/tool-policies/__next._tree.txt | 4 +- .../out/tool-policies/index.html | 2 +- .../_experimental/out/tool-policies/index.txt | 66 +-- ...c2hib2FyZCk.transform-request.__PAGE__.txt | 8 +- ...ext.!KGRhc2hib2FyZCk.transform-request.txt | 6 +- .../__next.!KGRhc2hib2FyZCk.txt | 10 +- .../out/transform-request/__next._full.txt | 66 +-- .../out/transform-request/__next._head.txt | 8 +- .../out/transform-request/__next._index.txt | 15 +- .../out/transform-request/__next._tree.txt | 4 +- .../out/transform-request/index.html | 2 +- .../out/transform-request/index.txt | 66 +-- .../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 | 66 +-- .../out/ui-theme/__next._head.txt | 8 +- .../out/ui-theme/__next._index.txt | 15 +- .../out/ui-theme/__next._tree.txt | 4 +- .../_experimental/out/ui-theme/index.html | 2 +- .../_experimental/out/ui-theme/index.txt | 66 +-- .../out/usage/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt | 8 +- .../usage/__next.!KGRhc2hib2FyZCk.usage.txt | 6 +- .../_experimental/out/usage/__next._full.txt | 66 +-- .../_experimental/out/usage/__next._head.txt | 8 +- .../_experimental/out/usage/__next._index.txt | 15 +- .../_experimental/out/usage/__next._tree.txt | 4 +- .../proxy/_experimental/out/usage/index.html | 2 +- .../proxy/_experimental/out/usage/index.txt | 66 +-- .../out/users/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt | 8 +- .../users/__next.!KGRhc2hib2FyZCk.users.txt | 6 +- .../_experimental/out/users/__next._full.txt | 66 +-- .../_experimental/out/users/__next._head.txt | 8 +- .../_experimental/out/users/__next._index.txt | 15 +- .../_experimental/out/users/__next._tree.txt | 4 +- .../proxy/_experimental/out/users/index.html | 2 +- .../proxy/_experimental/out/users/index.txt | 66 +-- .../vector-stores/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...KGRhc2hib2FyZCk.vector-stores.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.vector-stores.txt | 6 +- .../out/vector-stores/__next._full.txt | 66 +-- .../out/vector-stores/__next._head.txt | 8 +- .../out/vector-stores/__next._index.txt | 15 +- .../out/vector-stores/__next._tree.txt | 4 +- .../out/vector-stores/index.html | 2 +- .../_experimental/out/vector-stores/index.txt | 66 +-- .../out/workflows/__next.!KGRhc2hib2FyZCk.txt | 10 +- ...xt.!KGRhc2hib2FyZCk.workflows.__PAGE__.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.workflows.txt | 6 +- .../out/workflows/__next._full.txt | 66 +-- .../out/workflows/__next._head.txt | 8 +- .../out/workflows/__next._index.txt | 15 +- .../out/workflows/__next._tree.txt | 4 +- .../_experimental/out/workflows/index.html | 2 +- .../_experimental/out/workflows/index.txt | 66 +-- 710 files changed, 6506 insertions(+), 6270 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{VCvPhLLOUp92Yx-E-CVlV => HynDchE8aLeEewsZVNDO8}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{VCvPhLLOUp92Yx-E-CVlV => HynDchE8aLeEewsZVNDO8}/_clientMiddlewareManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{VCvPhLLOUp92Yx-E-CVlV => HynDchE8aLeEewsZVNDO8}/_ssgManifest.js (100%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00lwtxl1k_z8t.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/017kxo-8o84bv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/01q1b-t4kl710.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/033zbmm2193x9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/03kaz3d0v3z45.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06sx0oh8weeph.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/077dp65t7iug7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07sexl9lqn8w6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08eaumdx0krrt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08ldu6o5kiz9c.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/08uoywqkfbbbt.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0_8sguvytg2x1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ak2vacq91c7k.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0aoel7yrv88fp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0catil7su1yp5.js rename litellm/proxy/_experimental/out/_next/static/chunks/{26o1fp5v-765p.js => 0dhxm4s1uxvr1.js} (71%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0e3vwdd43gm8b.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0e5-pjnljk_pz.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2lmbrl05dz2hg.js => 0eblixumbp_86.js} (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0eh5r_mh1kh_t.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0g8wwba6umbim.js => 0ex44ljfg9dp9.js} (98%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0fldyxjw1x7b3.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ga80_i1un77z.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0gylheyn-59ow.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0hpbtid045pqt.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0iabn229p_bg9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ikhgrs0xvkyu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0imbshqv9tl6y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0j0zka6472o9x.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0j43vc4hvn3oe.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jf45vdwkbyvs.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0jjbikxye1xv_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0kzod24rqslaj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0l9ditwxvhpn1.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0lrifevwaw-qj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0nobv49ll5nyv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0o4-g_7x79zs_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0poz1ux09ae29.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0q8_xov7_vyo6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0qf84m09hg_q8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0qkqkii3nce2s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0qmwyxhqsmi-v.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0r0okx31djc7i.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0xu-p94boe99i.js => 0s31ton5ia2fh.js} (86%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0sm3ln66e4502.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0t3wvditulk42.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0u0-hzwjwlynn.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0uqgz7kckt4h1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vggytdohwe7o.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0vzx0jspfnkgb.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wg3l8hjyxbxn.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wo6dp1zxhzve.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0wo7g25bvtjy-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xcneptpo0s76.js rename litellm/proxy/_experimental/out/_next/static/chunks/{14rmfrwspq6qw.js => 0xo7qvoxfppvz.js} (87%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0xs1uz0umxpo_.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0kx52ovlpa34x.js => 0zy8o1br4cxj_.js} (80%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11_8skd8xyc2y.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11_h-ycwasbfv.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11f7pk3f8kvvz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11tayjjqv4w7m.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/11td9c6ktfxjm.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12-bl9aesgwlz.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3gj-m4kjq0tei.js => 1269ecu-v6ly2.js} (70%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12drti6el0iyq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/12gco0szy9t4d.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2-aswp_-wcabc.js => 12wnb8w5rzc0p.js} (83%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13-6v0bl0z1kw.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/13-de4f5zysj_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/132zrhwuxd-9j.js rename litellm/proxy/_experimental/out/_next/static/chunks/{31j2km6tmcwz2.js => 14q7qkap-vg_k.js} (76%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/14udkurgshvhr.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/15tw4l45yqt1o.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/169bqf_mz3j8m.css create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/171cx658-q4gh.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3msynadpz-qlj.js => 17_n7d7sao37s.js} (68%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/17gy9d71tfqhd.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0b4c0ak_j76h0.js => 17y1q5sh_9s-g.js} (82%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/18wkke_o3faz6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/19frz_r2jewoi.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/19o72uq6r0yc6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/19wuvjaaw7hlh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1_brfnmnjcjzu.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1_ci65lqx_7fg.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1_lnyzb5t0ym1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1aafdh2uz-2dg.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2wt_98_ncupdk.js => 1aluun0xaam5g.js} (79%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1axupaiywv5s2.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3686mcknnkzkg.js => 1b6ejigcj870-.js} (73%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1bwzei67lb34f.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1dz5lav3kl0ev.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1fsvlo5kqu-2m.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2snefsd_3bsd3.js => 1g7szci1phjh_.js} (95%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1gbocndha6wy_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1i3uh_0v3x0m3.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1jk31lastms2d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1jxl7tej0hrz8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1k8pioeg1repk.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1kc93z58r09lh.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3d5jzuznlr5b_.js => 1lmejayisnmqu.js} (94%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1mmprbrq4-2gr.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1o-felcyu_bhd.js rename litellm/proxy/_experimental/out/_next/static/chunks/{08yk0x-hh3ydk.js => 1o0_71qcxajfu.js} (98%) rename litellm/proxy/_experimental/out/_next/static/chunks/{2j0naxq1yw5vq.js => 1o1x0lh4berqb.js} (87%) rename litellm/proxy/_experimental/out/_next/static/chunks/{2z165x3dvxa-h.js => 1oda9kdz4-_d7.js} (95%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1pgh82nmoqy5j.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1q2sgg5x2pxls.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1qlouqdmceub4.js rename litellm/proxy/_experimental/out/_next/static/chunks/{43ka9o8yln4me.js => 1rkqkr8vxt30c.js} (61%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1s32a2vvs3l7w.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3jstcofmhxj55.js => 1s5z4tgndbmv6.js} (50%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1s62g55t5755v.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1u-z_da077rnf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1u9cxkx771jnb.css delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1v1oh8fp_g-r_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1vrxjn9atxugh.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0lf6n96uy4q27.js => 1xa9yu09pffiu.js} (62%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1xmq4ewn31b14.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0ma4y3uxzghhw.js => 1xv1ppzejm8y2.js} (85%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1y8yqz9ii_cl0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1ye-hq0gakt-m.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1yllcy_eafc2u.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1z6hg2cw2188l.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1zznuqlfxm47w.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2-4qe-yyfavei.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3y674jhwchpcq.js => 2023q5h806oc4.js} (68%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/20mvgyvrlrdla.js rename litellm/proxy/_experimental/out/_next/static/chunks/{26thr492-c8xr.js => 211gf6j__5t29.js} (97%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/21vtdd_swvbzs.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2261mcsdnyreu.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/22dktt8qrt6rf.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/22m4bb1j3r7zp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/23cd1r5zlp2el.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/243id3jugqr94.js rename litellm/proxy/_experimental/out/_next/static/chunks/{06hxe45fjy7x7.js => 25r4u4futzzt2.js} (94%) rename litellm/proxy/_experimental/out/_next/static/chunks/{030xj-a9q0ur8.js => 27_2u60qyxy6_.js} (98%) rename litellm/proxy/_experimental/out/_next/static/chunks/{3ckrfvcj0b3i7.js => 27zjzw8s0fbnw.js} (69%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/28aka7p0tvdrg.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/28md7sjkucknx.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/28o81b2onxgmf.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/295q2m2m31tsh.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/29l3pao1xfkc3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/29mvy3j2m7sge.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2_6f9v3gbf0sq.js => 2_2co5c4b9e6e.js} (77%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2a8ww5ni5-8w0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2aipnlru7apeo.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2bej9fc7jzdr4.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3ib18qm2ox61z.js => 2bwy4wke9jrlh.js} (73%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2co6u9hlpqnbf.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2cps1n4fsjn3x.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2vnpyhxoamx0f.js => 2cz4e0-p1l3hf.js} (51%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2dnxzrmbll_f_.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2e75ru1nma589.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2eehehco24kgo.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2eova-n8-0gr2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2fw2t_0v-71vq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2h05j6f6btioc.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2iio9hgb_u4jj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2ik5hi7wloa-i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2k91759uzip4m.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2kltpq3q8up7g.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2kt_m68ln2fyr.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2kztbq94gb-da.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2l12-7bw-d7fj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2m04pnthaoc-y.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2m11cycf6gnyx.js rename litellm/proxy/_experimental/out/_next/static/chunks/{41eydn-q2wrd_.js => 2m6yr-vp1lu1f.js} (96%) rename litellm/proxy/_experimental/out/_next/static/chunks/{3dxpyn2i1l2v1.js => 2miv61sfmgvg2.js} (71%) rename litellm/proxy/_experimental/out/_next/static/chunks/{3oiooy4p0ux4h.js => 2oi60u0cemkr3.js} (90%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2oi9nmuauh0je.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2ozr0u0juxzig.js rename litellm/proxy/_experimental/out/_next/static/chunks/{12xzclxtit2xd.js => 2pqj8g4g046qf.js} (98%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2r-b03uceiyd9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2r285pkv5nnfe.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2reygs7a48uqw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2rq8yc88w8h8j.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2rr1v94v_-ef6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2rwo22jlmrgva.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2s9dnn4earby2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2sdvzej6o7544.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2sm_zfd_jrgxe.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2t2-f7xxigo1d.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2au_w_kyew5j7.js => 2t3t4opdafh6n.js} (57%) rename litellm/proxy/_experimental/out/_next/static/chunks/{2jv6lfgxgwyk1.js => 2tarn630-qz1x.js} (56%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2tkpj7d49kuht.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2up3bks93iqds.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2v54hze4wuham.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2vtkmrasnohgw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2x96scis66zmk.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2yvxihkuurxbf.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2zxiwsnk5d3y-.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3-oftth1cxnyl.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/31azy9hywrzm7.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/31cwj7vkk3gfz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/31khbgv55q1sp.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/329tel7h1_v2c.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/32kdgna82h224.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/32tzootxu8-6e.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/32y9b8oxeopec.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/32yy_6wbqwxpc.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3320sm6j1jotz.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/33xxmesl24-02.js rename litellm/proxy/_experimental/out/_next/static/chunks/{1azbeyb626rh5.js => 34canl9e2fj8w.js} (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/37d71b7kk_uto.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/39-vixwnx4i6z.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/392aq001_xk5x.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/395p6a6cbvfah.js rename litellm/proxy/_experimental/out/_next/static/chunks/{011as3ct2u0nu.js => 39z4saua4wrzp.js} (67%) rename litellm/proxy/_experimental/out/_next/static/chunks/{0cj588tfl8vcq.js => 3_1txk_kvc_lh.js} (82%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3_8m84_gkku_s.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3_et8a47dwosl.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3ap0aimtf8chq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3b744cbxwmwnv.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3b9e6ztqd7gsk.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3bffd_h1wwdvy.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3bhv2o_oast51.js rename litellm/proxy/_experimental/out/_next/static/chunks/{05ttqlxo9w0ow.js => 3cw0guuo_glfi.js} (86%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3d3jond2vr0e1.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2x2f60ss87d3x.js => 3d9on3jcl20g4.js} (69%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3drq2_k-jeio2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3fu9as6otanx5.js rename litellm/proxy/_experimental/out/_next/static/chunks/{32_ulchi2_aad.js => 3fzya67r1y1fl.js} (68%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3gd2x5p0_azf2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3gxis3ycrvgy9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3i-q3u8a9gglk.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3i55449at-oj8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3ik9o_1siirtw.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3j3eozgtz9ocf.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3kmoa-63y6leb.js rename litellm/proxy/_experimental/out/_next/static/chunks/{38tna1p1mxo04.js => 3kqubqhevz875.js} (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3l_lol8afnoh0.js rename litellm/proxy/_experimental/out/_next/static/chunks/{1alrb0xib8wmc.js => 3less_-8_3yu2.js} (71%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3ljwjf5o6ocd8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3lsw900yb5qyy.js rename litellm/proxy/_experimental/out/_next/static/chunks/{2783exotql09c.js => 3m5bmlwc2msfd.js} (52%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3mjaw6luhro0j.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3mrwpwkrhn-e5.js rename litellm/proxy/_experimental/out/_next/static/chunks/{1abwfud5uqxxq.js => 3mz07lvvrbciz.js} (56%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3nr80xs9yy1co.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3o8olif8ekmc9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3oto3uw67tztq.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3pgwv_yx5dbep.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3q4gsp09ztete.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3qivzpqq87ul9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3qquqa6xl0ci8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3s7zvty459znj.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3subppi3hqa14.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3swbpwepmclaq.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3thshb577abuo.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3tt08rqvhxzib.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3u0zs7m2u4t03.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3vkfl6jnlw0zp.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3vu26x-a1_slz.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3wmcd3z9nmf1k.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3xi9dzq2-qg67.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3zv_sthsyw5_i.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/402g_pknu22b0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/40lf1xqjhxpq3.js rename litellm/proxy/_experimental/out/_next/static/chunks/{34q6izq3hrlzj.js => 40viky8xip4ea.js} (81%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/41bzuzbn23qmv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/41nqaa4z_z8u2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/42gio3rky08u5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/42o7xvspvvbk_.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/42ptas50be2r5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/43nx3aaw4k2gv.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/43qy9q02dp_cd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/44h2-69747xo0.js rename litellm/proxy/_experimental/out/_next/static/chunks/{3u-6f35z0tzpn.js => 44h3edx90yk8k.js} (91%) rename litellm/proxy/_experimental/out/_next/static/chunks/{0dy9qdalpgmgy.js => 44kde9nggcr0h.js} (84%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/44mjfwtslpvak.js rename litellm/proxy/_experimental/out/_next/static/chunks/{1m28zz-ftm1fp.js => 45740ebv6x-ub.js} (80%) diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index d27d44fd770..b4775167856 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 d27d44fd770..b4775167856 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 92b64678c4a..d1146ca2b00 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/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ClientPageRoot"] -3:I[871135,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/28md7sjkucknx.js","/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/0kx52ovlpa34x.js","/litellm-asset-prefix/_next/static/chunks/3drq2_k-jeio2.js","/litellm-asset-prefix/_next/static/chunks/2vnpyhxoamx0f.js","/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","/litellm-asset-prefix/_next/static/chunks/3ib18qm2ox61z.js","/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","/litellm-asset-prefix/_next/static/chunks/1abwfud5uqxxq.js","/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","/litellm-asset-prefix/_next/static/chunks/3bhv2o_oast51.js","/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","/litellm-asset-prefix/_next/static/chunks/31cwj7vkk3gfz.js","/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","/litellm-asset-prefix/_next/static/chunks/2kt_m68ln2fyr.js","/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","/litellm-asset-prefix/_next/static/chunks/08eaumdx0krrt.js"],"default"] -6:I[897367,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"OutletBoundary"] +2:I[347257,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ClientPageRoot"] +3:I[871135,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js","/litellm-asset-prefix/_next/static/chunks/0catil7su1yp5.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.js","/litellm-asset-prefix/_next/static/chunks/2v54hze4wuham.js","/litellm-asset-prefix/_next/static/chunks/1axupaiywv5s2.js","/litellm-asset-prefix/_next/static/chunks/0zy8o1br4cxj_.js","/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","/litellm-asset-prefix/_next/static/chunks/2bwy4wke9jrlh.js","/litellm-asset-prefix/_next/static/chunks/2cz4e0-p1l3hf.js","/litellm-asset-prefix/_next/static/chunks/2tkpj7d49kuht.js","/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","/litellm-asset-prefix/_next/static/chunks/29l3pao1xfkc3.js","/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","/litellm-asset-prefix/_next/static/chunks/31azy9hywrzm7.js","/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","/litellm-asset-prefix/_next/static/chunks/3mz07lvvrbciz.js","/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","/litellm-asset-prefix/_next/static/chunks/0ikhgrs0xvkyu.js","/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js"],"default"] +6:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.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/0kx52ovlpa34x.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/3drq2_k-jeio2.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2vnpyhxoamx0f.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3ib18qm2ox61z.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/1abwfud5uqxxq.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/3bhv2o_oast51.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/31cwj7vkk3gfz.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","async":true}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","async":true}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","async":true}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/2kt_m68ln2fyr.js","async":true}],["$","script","script-21",{"src":"/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","async":true}],["$","script","script-22",{"src":"/litellm-asset-prefix/_next/static/chunks/08eaumdx0krrt.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"VCvPhLLOUp92Yx-E-CVlV"} +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/2v54hze4wuham.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/1axupaiywv5s2.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0zy8o1br4cxj_.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/2bwy4wke9jrlh.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/2cz4e0-p1l3hf.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/2tkpj7d49kuht.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/29l3pao1xfkc3.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/31azy9hywrzm7.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","async":true}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3mz07lvvrbciz.js","async":true}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","async":true}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","async":true}],["$","script","script-21",{"src":"/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","async":true}],["$","script","script-22",{"src":"/litellm-asset-prefix/_next/static/chunks/0ikhgrs0xvkyu.js","async":true}],["$","script","script-23",{"src":"/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"HynDchE8aLeEewsZVNDO8"} 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 8d3d6c6fa72..29b35e0ff53 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/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ClientSegmentRoot"] -3:I[216370,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/28md7sjkucknx.js","/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js"],"default"] -4:I[339756,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -5:I[837457,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -0:{"rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/28md7sjkucknx.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.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":"VCvPhLLOUp92Yx-E-CVlV"} +2:I[92825,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ClientSegmentRoot"] +3:I[216370,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js","/litellm-asset-prefix/_next/static/chunks/0catil7su1yp5.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.js"],"default"] +4:I[339756,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +5:I[837457,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +0:{"rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0catil7su1yp5.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","async":true}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","async":true}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","async":true}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","async":true}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","async":true}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","async":true}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","async":true}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","async":true}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","async":true}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","async":true}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","async":true}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","async":true}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","async":true}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","async":true}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.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":"HynDchE8aLeEewsZVNDO8"} 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 39d1d35051d..88d0a6b0761 100644 --- a/litellm/proxy/_experimental/out/__next._full.txt +++ b/litellm/proxy/_experimental/out/__next._full.txt @@ -1,32 +1,34 @@ 1:"$Sreact.fragment" -2:I[867271,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -3:I[71195,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -4:I[557951,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"AuthProvider"] -5:I[339756,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -6:I[837457,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -7:I[92825,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ClientSegmentRoot"] -8:I[216370,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/28md7sjkucknx.js","/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js"],"default"] -e:I[168027,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default",1] +2:I[12985,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"NuqsAdapter"] +3:I[867271,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +4:I[71195,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +5:I[557951,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"AuthProvider"] +6:I[339756,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +7:I[837457,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +d:I[168027,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default",1] :HL["/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","style"] :HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.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/1kid9zr1--h6y.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.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/28md7sjkucknx.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","async":true,"nonce":"$undefined"}]],["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":"$L9","templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$La","forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@b"]}}]]}],{"children":["$Lc",{},null,false,null]},null,false,null]},null,false,null],"$Ld",false]],"m":"$undefined","G":["$e",["$Lf","$L10"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"VCvPhLLOUp92Yx-E-CVlV"} -11:I[347257,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ClientPageRoot"] -12:I[871135,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/28md7sjkucknx.js","/litellm-asset-prefix/_next/static/chunks/2x96scis66zmk.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/1azbeyb626rh5.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/0g8wwba6umbim.js","/litellm-asset-prefix/_next/static/chunks/2up3bks93iqds.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/17gy9d71tfqhd.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/0kx52ovlpa34x.js","/litellm-asset-prefix/_next/static/chunks/3drq2_k-jeio2.js","/litellm-asset-prefix/_next/static/chunks/2vnpyhxoamx0f.js","/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","/litellm-asset-prefix/_next/static/chunks/3ib18qm2ox61z.js","/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","/litellm-asset-prefix/_next/static/chunks/1abwfud5uqxxq.js","/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","/litellm-asset-prefix/_next/static/chunks/3bhv2o_oast51.js","/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","/litellm-asset-prefix/_next/static/chunks/31cwj7vkk3gfz.js","/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","/litellm-asset-prefix/_next/static/chunks/2kt_m68ln2fyr.js","/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","/litellm-asset-prefix/_next/static/chunks/08eaumdx0krrt.js"],"default"] -15:I[897367,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"OutletBoundary"] -16:"$Sreact.suspense" -18:I[897367,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ViewportBoundary"] -1a:I[897367,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"MetadataBoundary"] -9:["$","$L6",null,{}] -a:[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]] -c:["$","$1","c",{"children":[["$","$L11",null,{"Component":"$12","serverProvidedParams":{"searchParams":{},"params":"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params","promises":["$@13","$@14"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0kx52ovlpa34x.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/3drq2_k-jeio2.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/2vnpyhxoamx0f.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3ib18qm2ox61z.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/1abwfud5uqxxq.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/3bhv2o_oast51.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/31cwj7vkk3gfz.js","async":true,"nonce":"$undefined"}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","async":true,"nonce":"$undefined"}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","async":true,"nonce":"$undefined"}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","async":true,"nonce":"$undefined"}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/2kt_m68ln2fyr.js","async":true,"nonce":"$undefined"}],["$","script","script-21",{"src":"/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","async":true,"nonce":"$undefined"}],["$","script","script-22",{"src":"/litellm-asset-prefix/_next/static/chunks/08eaumdx0krrt.js","async":true,"nonce":"$undefined"}]],["$","$L15",null,{"children":["$","$16",null,{"name":"Next.MetadataOutlet","children":"$@17"}]}]]}] -d:["$","$1","h",{"children":[null,["$","$L18",null,{"children":"$L19"}],["$","div",null,{"hidden":true,"children":["$","$L1a",null,{"children":["$","$16",null,{"name":"Next.Metadata","children":"$L1b"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] -f:["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] -10:["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] -b:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" -13:{} -14:"$0:f:0:1:1:children:0:props:children:1:props:serverProvidedParams:params" -19:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] -1c:I[27201,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"IconMark"] -17:null -1b:[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.3arlap5n8tyzg.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L1c","4",{}]] +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/1kid9zr1--h6y.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.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,{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",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/0catil7su1yp5.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","async":true,"nonce":"$undefined"}],"$L8","$L9"],"$La"]}],{"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":"HynDchE8aLeEewsZVNDO8"} +10:I[92825,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ClientSegmentRoot"] +11:I[216370,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js","/litellm-asset-prefix/_next/static/chunks/0catil7su1yp5.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.js"],"default"] +13:I[347257,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ClientPageRoot"] +14:I[871135,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js","/litellm-asset-prefix/_next/static/chunks/0catil7su1yp5.js","/litellm-asset-prefix/_next/static/chunks/2cngn5bal3278.js","/litellm-asset-prefix/_next/static/chunks/34canl9e2fj8w.js","/litellm-asset-prefix/_next/static/chunks/0vvnul8uez9kj.js","/litellm-asset-prefix/_next/static/chunks/3vu26x-a1_slz.js","/litellm-asset-prefix/_next/static/chunks/1vquuz09jxl5_.js","/litellm-asset-prefix/_next/static/chunks/3_3dj4vdy-3xy.js","/litellm-asset-prefix/_next/static/chunks/0ex44ljfg9dp9.js","/litellm-asset-prefix/_next/static/chunks/0xcneptpo0s76.js","/litellm-asset-prefix/_next/static/chunks/08uoywqkfbbbt.js","/litellm-asset-prefix/_next/static/chunks/0g_w4tf2inv3i.js","/litellm-asset-prefix/_next/static/chunks/1iakmimqrlpn0.js","/litellm-asset-prefix/_next/static/chunks/17-6zku8f68gf.js","/litellm-asset-prefix/_next/static/chunks/0f5fel02jwglw.js","/litellm-asset-prefix/_next/static/chunks/0fk0i3e2aixp7.js","/litellm-asset-prefix/_next/static/chunks/3ytz29phknzsy.js","/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.js","/litellm-asset-prefix/_next/static/chunks/2v54hze4wuham.js","/litellm-asset-prefix/_next/static/chunks/1axupaiywv5s2.js","/litellm-asset-prefix/_next/static/chunks/0zy8o1br4cxj_.js","/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","/litellm-asset-prefix/_next/static/chunks/2bwy4wke9jrlh.js","/litellm-asset-prefix/_next/static/chunks/2cz4e0-p1l3hf.js","/litellm-asset-prefix/_next/static/chunks/2tkpj7d49kuht.js","/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","/litellm-asset-prefix/_next/static/chunks/29l3pao1xfkc3.js","/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","/litellm-asset-prefix/_next/static/chunks/31azy9hywrzm7.js","/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","/litellm-asset-prefix/_next/static/chunks/3mz07lvvrbciz.js","/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","/litellm-asset-prefix/_next/static/chunks/0ikhgrs0xvkyu.js","/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js"],"default"] +17:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"OutletBoundary"] +18:"$Sreact.suspense" +1a:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ViewportBoundary"] +1c:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"MetadataBoundary"] +8:["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/0dbvgsc7ha049.js","async":true,"nonce":"$undefined"}] +9:["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/0aoel7yrv88fp.js","async":true,"nonce":"$undefined"}] +a:["$","$L10",null,{"Component":"$11","slots":{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:props:children:props: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: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: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:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"serverProvidedParams":{"params":{},"promises":["$@12"]}}] +b:["$","$1","c",{"children":[["$","$L13",null,{"Component":"$14","serverProvidedParams":{"searchParams":{},"params":"$a:props:serverProvidedParams:params","promises":["$@15","$@16"]}}],[["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/2v54hze4wuham.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/1axupaiywv5s2.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/0zy8o1br4cxj_.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/1uz3jt-tj9lkf.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/litellm-asset-prefix/_next/static/chunks/2bwy4wke9jrlh.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/litellm-asset-prefix/_next/static/chunks/2cz4e0-p1l3hf.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/litellm-asset-prefix/_next/static/chunks/2tkpj7d49kuht.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/litellm-asset-prefix/_next/static/chunks/323l6h8s7ahat.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/litellm-asset-prefix/_next/static/chunks/1cea03gg5a_c7.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/litellm-asset-prefix/_next/static/chunks/2hu1vyy-5pv13.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/litellm-asset-prefix/_next/static/chunks/199uwr871eene.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/litellm-asset-prefix/_next/static/chunks/105643dvf00hu.js","async":true,"nonce":"$undefined"}],["$","script","script-12",{"src":"/litellm-asset-prefix/_next/static/chunks/29l3pao1xfkc3.js","async":true,"nonce":"$undefined"}],["$","script","script-13",{"src":"/litellm-asset-prefix/_next/static/chunks/111jj26rg98nb.js","async":true,"nonce":"$undefined"}],["$","script","script-14",{"src":"/litellm-asset-prefix/_next/static/chunks/12wsfsljxg4xv.js","async":true,"nonce":"$undefined"}],["$","script","script-15",{"src":"/litellm-asset-prefix/_next/static/chunks/112n0hv3cc2rg.js","async":true,"nonce":"$undefined"}],["$","script","script-16",{"src":"/litellm-asset-prefix/_next/static/chunks/31azy9hywrzm7.js","async":true,"nonce":"$undefined"}],["$","script","script-17",{"src":"/litellm-asset-prefix/_next/static/chunks/3pu9plov1btip.js","async":true,"nonce":"$undefined"}],["$","script","script-18",{"src":"/litellm-asset-prefix/_next/static/chunks/3mz07lvvrbciz.js","async":true,"nonce":"$undefined"}],["$","script","script-19",{"src":"/litellm-asset-prefix/_next/static/chunks/1lndy6n7cwvrq.js","async":true,"nonce":"$undefined"}],["$","script","script-20",{"src":"/litellm-asset-prefix/_next/static/chunks/09l_m9l1emin2.js","async":true,"nonce":"$undefined"}],["$","script","script-21",{"src":"/litellm-asset-prefix/_next/static/chunks/2c90xukbd3il6.js","async":true,"nonce":"$undefined"}],["$","script","script-22",{"src":"/litellm-asset-prefix/_next/static/chunks/0ikhgrs0xvkyu.js","async":true,"nonce":"$undefined"}],["$","script","script-23",{"src":"/litellm-asset-prefix/_next/static/chunks/23-g73xaw3kap.js","async":true,"nonce":"$undefined"}]],["$","$L17",null,{"children":["$","$18",null,{"name":"Next.MetadataOutlet","children":"$@19"}]}]]}] +c:["$","$1","h",{"children":[null,["$","$L1a",null,{"children":"$L1b"}],["$","div",null,{"hidden":true,"children":["$","$L1c",null,{"children":["$","$18",null,{"name":"Next.Metadata","children":"$L1d"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] +e:["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] +f:["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] +12:"$a:props:serverProvidedParams:params" +15:{} +16:"$a:props:serverProvidedParams:params" +1b:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] +1e:I[27201,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"IconMark"] +19:null +1d:[["$","title","0",{"children":"LiteLLM Dashboard"}],["$","meta","1",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.3arlap5n8tyzg.ico","sizes":"48x48","type":"image/x-icon"}],["$","link","3",{"rel":"icon","href":"/get_favicon"}],["$","$L1e","4",{}]] diff --git a/litellm/proxy/_experimental/out/__next._head.txt b/litellm/proxy/_experimental/out/__next._head.txt index 7f9cce30bd3..7b202f0b9b4 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/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"ViewportBoundary"] -3:I[897367,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"MetadataBoundary"] +2:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"ViewportBoundary"] +3:I[897367,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"MetadataBoundary"] 4:"$Sreact.suspense" -5:I[27201,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.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.3arlap5n8tyzg.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":"VCvPhLLOUp92Yx-E-CVlV"} +5:I[27201,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.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.3arlap5n8tyzg.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":"HynDchE8aLeEewsZVNDO8"} diff --git a/litellm/proxy/_experimental/out/__next._index.txt b/litellm/proxy/_experimental/out/__next._index.txt index 4bad133adea..b5a812a07b9 100644 --- a/litellm/proxy/_experimental/out/__next._index.txt +++ b/litellm/proxy/_experimental/out/__next._index.txt @@ -1,9 +1,10 @@ 1:"$Sreact.fragment" -2:I[867271,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -3:I[71195,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -4:I[557951,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"AuthProvider"] -5:I[339756,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] -6:I[837457,["/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js"],"default"] +2:I[12985,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"NuqsAdapter"] +3:I[867271,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +4:I[71195,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +5:I[557951,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"AuthProvider"] +6:I[339756,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] +7:I[837457,["/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.js"],"default"] :HL["/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/0vggytdohwe7o.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/32_ulchi2_aad.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.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":"VCvPhLLOUp92Yx-E-CVlV"} +:HL["/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","style"] +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1kid9zr1--h6y.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","precedence":"next"}],["$","script","script-0",{"src":"/litellm-asset-prefix/_next/static/chunks/19frz_r2jewoi.js","async":true}],["$","script","script-1",{"src":"/litellm-asset-prefix/_next/static/chunks/20mvgyvrlrdla.js","async":true}],["$","script","script-2",{"src":"/litellm-asset-prefix/_next/static/chunks/1jfookxfajkeo.js","async":true}],["$","script","script-3",{"src":"/litellm-asset-prefix/_next/static/chunks/3fzya67r1y1fl.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,{"children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",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":"HynDchE8aLeEewsZVNDO8"} diff --git a/litellm/proxy/_experimental/out/__next._tree.txt b/litellm/proxy/_experimental/out/__next._tree.txt index fd6ef8942bf..523136ad880 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/1kid9zr1--h6y.css","style"] -:HL["/litellm-asset-prefix/_next/static/chunks/169bqf_mz3j8m.css","style"] +:HL["/litellm-asset-prefix/_next/static/chunks/1u9cxkx771jnb.css","style"] :HL["/litellm-asset-prefix/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.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":"VCvPhLLOUp92Yx-E-CVlV"} +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":"HynDchE8aLeEewsZVNDO8"} diff --git a/litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_clientMiddlewareManifest.js b/litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_clientMiddlewareManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_clientMiddlewareManifest.js rename to litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_clientMiddlewareManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/VCvPhLLOUp92Yx-E-CVlV/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/HynDchE8aLeEewsZVNDO8/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/00lwtxl1k_z8t.js b/litellm/proxy/_experimental/out/_next/static/chunks/00lwtxl1k_z8t.js deleted file mode 100644 index 12cc40b8fd0..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/00lwtxl1k_z8t.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,540626,e=>{"use strict";let t;var n,i=e.i(271645);let s=(0,i.createContext)(null);function o(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=l(e);if(n.length!==l(t).length)return!1;for(let i=0;ie,n){let s=n?.compare??r,o=(0,i.useCallback)(t=>{let{unsubscribe:n}=e.subscribe(t);return n},[e]),l=(0,i.useCallback)(()=>e.get(),[e]);return(0,a.useSyncExternalStoreWithSelector)(o,l,l,t,s)}function d(e,...t){return"function"==typeof e?e(...t):e}var u=class{#e=!0;#t;#n;#i;#s;#o;#l;#a;#r=0;#c=5;#d=!1;#u=!1;#g=null;#h=()=>{this.debugLog("Connected to event bus"),this.#o=!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.#h)};#v=()=>{if(this.#r{this.#d||(this.#d=!0,this.#n().addEventListener("tanstack-connect-success",this.#h),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.#o=!1,this.#u=!1,this.#l=null,this.#a=i}startConnectLoop(){null!==this.#l||this.#o||(this.debugLog(`Starting connect loop (every ${this.#a}ms)`),this.#l=setInterval(this.#v,this.#a))}stopConnectLoop(){this.#d=!1,null!==this.#l&&(clearInterval(this.#l),this.#l=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.#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.#o){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.#p(),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.#g||(this.#g=new EventTarget),this.#g.addEventListener(s,e=>{t(e.detail)})),!this.#e)return this.debugLog("Event bus client is disabled, not registering event",s),()=>{};let o=e=>{this.debugLog("Received event from bus",e.detail),t(e.detail)};return this.#n().addEventListener(s,o),this.debugLog("Registered event to bus",s),()=>{i&&this.#g?.removeEventListener(s,o),this.#n().removeEventListener(s,o)}}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 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})}},p=((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 f(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 m=[],b=0,{link:E,unlink:T,propagate:y,checkDirty:S,shallowPropagate:x}=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 o=e.subsTail;if(void 0!==o&&o.version===n&&o.sub===t)return;let l=t.depsTail=e.subsTail={version:n,dep:e,sub:t,prevDep:i,nextDep:s,prevSub:o,nextSub:void 0};void 0!==s&&(s.prevDep=l),void 0!==i?i.nextDep=l:t.deps=l,void 0!==o?o.nextSub=l:e.subs=l},unlink:function(e,t=e.sub){let i=e.dep,s=e.prevDep,o=e.nextDep,l=e.nextSub,a=e.prevSub;return void 0!==o?o.prevDep=s:t.depsTail=s,void 0!==s?s.nextDep=o:t.deps=o,void 0!==l?l.prevSub=a:i.subsTail=a,void 0!==a?a.nextSub=l:void 0===(i.subs=l)&&n(i),o},propagate:function(e){let n,i=e.nextSub;e:for(;;){let s=e.sub,o=s.flags;if(o&(p.RecursedCheck|p.Recursed|p.Dirty|p.Pending)?o&(p.RecursedCheck|p.Recursed)?o&p.RecursedCheck?!(o&(p.Dirty|p.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=o|(p.Recursed|p.Pending),o&=p.Mutable):o=p.None:s.flags=o&~p.Recursed|p.Pending:o=p.None:s.flags=o|p.Pending,o&p.Watching&&t(s),o&p.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,o=0,l=!1;e:for(;;){let a=t.dep,r=a.flags;if(n.flags&p.Dirty)l=!0;else if((r&(p.Mutable|p.Dirty))==(p.Mutable|p.Dirty)){if(e(a)){let e=a.subs;void 0!==e.nextSub&&i(e),l=!0}}else if((r&(p.Mutable|p.Pending))==(p.Mutable|p.Pending)){(void 0!==t.nextSub||void 0!==t.prevSub)&&(s={value:t,prev:s}),t=a.deps,n=a,++o;continue}if(!l){let e=t.nextDep;if(void 0!==e){t=e;continue}}for(;o--;){let o=n.subs,a=void 0!==o.nextSub;if(a?(t=s.value,s=s.prev):t=o,l){if(e(n)){a&&i(o),n=t.sub;continue}l=!1}else n.flags&=~p.Pending;n=t.sub;let r=t.nextDep;if(void 0!==r){t=r;continue e}}return l}},shallowPropagate:i};function i(e){do{let n=e.sub,i=n.flags;(i&(p.Pending|p.Dirty))===p.Pending&&(n.flags=i|p.Dirty,(i&(p.Watching|p.RecursedCheck))===p.Watching&&t(n))}while(void 0!==(e=e.nextSub))}}({update:e=>e._update(),notify(e){m[L++]=e,e.flags&=~p.Watching},unwatched(e){void 0!==e.depsTail&&(e.depsTail=void 0,e.flags=p.Mutable|p.Dirty,I(e))}}),C=0,L=0;function I(e){let t=e.depsTail,n=void 0!==t?t.nextDep:e.deps;for(;void 0!==n;)n=T(n,e)}var w=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?p.None:p.Mutable,get:()=>(void 0!==t&&E(i,t,b),i._snapshot),subscribe(e){var n;let s,o,l=f(e),a={current:!1},r=(n=()=>{i.get(),a.current?l.next?.(i._snapshot):a.current=!0},s=()=>{let e=t;t=o,++b,o.depsTail=void 0,o.flags=p.Watching|p.RecursedCheck;try{return n()}finally{t=e,o.flags&=~p.RecursedCheck,I(o)}},o={deps:void 0,depsTail:void 0,subs:void 0,subsTail:void 0,flags:p.Watching|p.RecursedCheck,notify(){let e=this.flags;e&p.Dirty||e&p.Pending&&S(this.deps,this)?s():this.flags=p.Watching},stop(){this.flags=p.None,this.depsTail=void 0,I(this)}},s(),o);return{unsubscribe:()=>{r.stop()}}},_update(s){let o=t,l=(void 0)??Object.is;if(n)t=i,++b,i.depsTail=void 0;else if(void 0===s)return!1;n&&(i.flags=p.Mutable|p.RecursedCheck);try{let t=i._snapshot,o="function"==typeof s?s(t):void 0===s&&n?e(t):s;if(void 0===t||!l(t,o))return i._snapshot=o,!0;return!1}finally{t=o,n&&(i.flags&=~p.RecursedCheck),I(i)}}};return n?(i.flags=p.Mutable|p.Dirty,i.get=function(){let e=i.flags;if(e&p.Dirty||e&p.Pending&&S(i.deps,i)){if(i._update()){let e=i.subs;void 0!==e&&x(e)}}else e&p.Pending&&(i.flags=e&~p.Pending);return void 0!==t&&E(i,t,b),i._snapshot}):i.set=function(e){if(i._update(e)){let e=i.subs;if(void 0!==e&&(y(e),x(e),1)){for(;C{this.options={...this.options,...e},this.#m()||this.cancel()},this.#b=e=>{this.store.setState(t=>{let n={...t,...e},{isPending:i}=n;return{...n,status:this.#m()?i?"pending":"idle":"disabled"}}),((e,t)=>{let n=t.key;if(n){var i,s;g.set(n,t),v.emit(e,{key:(i={...t,key:n}).key,store:{state:h("function"==typeof(s=i.store).get?s.get():s.state)},options:h(i.options)})}})("Debouncer",this)},this.#m=()=>!!d(this.options.enabled,this),this.#E=()=>d(this.options.wait,this),this.maybeExecute=(...e)=>{if(!this.#m())return;this.#b({maybeExecuteCount:this.store.state.maybeExecuteCount+1});let t=!1;this.options.leading&&this.store.state.canLeadingExecute&&(this.#b({canLeadingExecute:!1}),t=!0,this.#T(...e)),this.options.trailing&&this.#b({isPending:!0,lastArgs:e}),this.#f&&clearTimeout(this.#f),this.#f=setTimeout(()=>{this.#b({canLeadingExecute:!0}),this.options.trailing&&!t&&this.#T(...e)},this.#E())},this.#T=(...e)=>{this.#m()&&(this.fn(...e),this.#b({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.#y(),this.#T(...this.store.state.lastArgs))},this.#y=()=>{this.#f&&(clearTimeout(this.#f),this.#f=void 0)},this.cancel=()=>{this.#y(),this.#b({canLeadingExecute:!0,isPending:!1})},this.reset=()=>{this.#b(M())},this.key=t.key,this.options={...k,...t},this.#b(this.options.initialState??{}),this.key&&v.on("d-Debouncer",e=>{e.payload.key===this.key&&(this.#b(e.payload.store.state),this.setOptions(e.payload.options))})}#b;#m;#E;#T;#y};e.s(["useDebouncer",0,function(e,t,n=()=>({})){let l={...((0,i.useContext)(s)?.defaultOptions??{}).debouncer,...t},[a]=(0,i.useState)(()=>{let t=new D(e,l);return t.Subscribe=function(e){let n=c(t.store,e.selector,{compare:o});return"function"==typeof e.children?e.children(n):e.children},t});a.fn=e,a.setOptions(l),(0,i.useEffect)(()=>()=>{l.onUnmount?l.onUnmount(a):a.cancel()},[]);let r=c(a.store,n,{compare:o});return(0,i.useMemo)(()=>({...a,state:r}),[a,r])}],540626)},741466,e=>{"use strict";e.s(["DEBOUNCE_WAIT_MS",0,300])},399029,e=>{"use strict";var t=e.i(540626),n=e.i(271645);e.s(["useDebouncedState",0,function(e,i,s){let[o,l]=(0,n.useState)(e),a=(0,t.useDebouncer)(l,i,s);return[o,a.maybeExecute,a]}])},663435,e=>{"use strict";var t=e.i(843476),n=e.i(271645),i=e.i(199133),s=e.i(898586),o=e.i(56456),l=e.i(399029),a=e.i(785242),r=e.i(741466);let{Text:c}=s.Typography;e.s(["default",0,({value:e,onChange:s,onTeamSelect:d,disabled:u,organizationId:g,pageSize:h=20})=>{let[v,p]=(0,n.useState)(""),[f,m]=(0,l.useDebouncedState)("",{wait:r.DEBOUNCE_WAIT_MS}),{data:b,fetchNextPage:E,hasNextPage:T,isFetchingNextPage:y,isLoading:S}=(0,a.useInfiniteTeams)(h,f||void 0,g),x=(0,n.useMemo)(()=>{if(!b?.pages)return[];let e=new Set,t=[];for(let n of b.pages)for(let i of n.teams)e.has(i.team_id)||(e.add(i.team_id),t.push(i));return t},[b]);return(0,t.jsx)(i.Select,{showSearch:!0,placeholder:"Search or select a team",value:e||void 0,onChange:e=>{s?.(e??""),d&&d(e?x.find(t=>t.team_id===e)??null:null)},disabled:u,allowClear:!0,filterOption:!1,onSearch:e=>{p(e),m(e)},searchValue:v,onPopupScroll:e=>{let t=e.currentTarget;(t.scrollTop+t.clientHeight)/t.scrollHeight>=.8&&T&&!y&&E()},loading:S,notFoundContent:S?(0,t.jsx)(o.LoadingOutlined,{spin:!0}):"No teams found","data-testid":"team-dropdown",popupRender:e=>(0,t.jsxs)(t.Fragment,{children:[e,y&&(0,t.jsx)("div",{style:{textAlign:"center",padding:8},children:(0,t.jsx)(o.LoadingOutlined,{spin:!0})})]}),children:x.map(e=>(0,t.jsxs)(i.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))})}])},350967,46757,e=>{"use strict";var t=e.i(290571),n=e.i(444755),i=e.i(673706),s=e.i(271645);let o={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"},l={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"},a={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"},r={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,o,"gridColsLg",0,r,"gridColsMd",0,a,"gridColsSm",0,l],46757);let c=(0,i.makeClassName)("Grid"),d=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"",u=s.default.forwardRef((e,i)=>{let{numItems:u=1,numItemsSm:g,numItemsMd:h,numItemsLg:v,children:p,className:f}=e,m=(0,t.__rest)(e,["numItems","numItemsSm","numItemsMd","numItemsLg","children","className"]),b=d(u,o),E=d(g,l),T=d(h,a),y=d(v,r),S=(0,n.tremorTwMerge)(b,E,T,y);return s.default.createElement("div",Object.assign({ref:i,className:(0,n.tremorTwMerge)(c("root"),"grid",S,f)},m),p)});u.displayName="Grid",e.s(["Grid",0,u],350967)},519756,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:"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 s=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(s.default,(0,t.default)({},e,{ref:o,icon:i}))});e.s(["UploadOutlined",0,o],519756)},184163,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:"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 s=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(s.default,(0,t.default)({},e,{ref:o,icon:i}))});e.s(["default",0,o],184163)},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 s=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(s.default,(0,t.default)({},e,{ref:o,icon:i}))});e.s(["default",0,o],597440)},955135,e=>{"use strict";var t=e.i(597440);e.s(["DeleteOutlined",()=>t.default])},993914,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:"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 s=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(s.default,(0,t.default)({},e,{ref:o,icon:i}))});e.s(["FileTextOutlined",0,o],993914)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/017kxo-8o84bv.js b/litellm/proxy/_experimental/out/_next/static/chunks/017kxo-8o84bv.js deleted file mode 100644 index edb12734d22..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/017kxo-8o84bv.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,560025,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),a=e.i(931067),l=e.i(392221),o=e.i(703923),i=e.i(211577),r=e.i(209428),s=e.i(410160),c=e.i(914949),u=e.i(529681),d=e.i(611935),f=e.i(361275),m=e.i(174428),v=function(e,t){if(!e)return null;var n={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:n.top,bottom:n.bottom,height:n.height}:{left:n.left,right:n.right,width:n.width,top:0,bottom:0,height:0}},p=function(e){return void 0!==e?"".concat(e,"px"):void 0};function g(e){var a=e.prefixCls,o=e.containerRef,i=e.value,s=e.getValueIndex,c=e.motionName,u=e.onMotionStart,g=e.onMotionEnd,h=e.direction,b=e.vertical,y=void 0!==b&&b,w=t.useRef(null),x=t.useState(i),$=(0,l.default)(x,2),C=$[0],O=$[1],S=function(e){var t,n=s(e),l=null==(t=o.current)?void 0:t.querySelectorAll(".".concat(a,"-item"))[n];return(null==l?void 0:l.offsetParent)&&l},k=t.useState(null),E=(0,l.default)(k,2),N=E[0],j=E[1],R=t.useState(null),M=(0,l.default)(R,2),z=M[0],D=M[1];(0,m.default)(function(){if(C!==i){var e=S(C),t=S(i),n=v(e,y),a=v(t,y);O(i),j(n),D(a),e&&t?u():g()}},[i]);var I=t.useMemo(function(){if(y){var e;return p(null!=(e=null==N?void 0:N.top)?e:0)}return"rtl"===h?p(-(null==N?void 0:N.right)):p(null==N?void 0:N.left)},[y,h,N]),H=t.useMemo(function(){if(y){var e;return p(null!=(e=null==z?void 0:z.top)?e:0)}return"rtl"===h?p(-(null==z?void 0:z.right)):p(null==z?void 0:z.left)},[y,h,z]);return N&&z?t.createElement(f.default,{visible:!0,motionName:c,motionAppear:!0,onAppearStart:function(){return y?{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 y?{transform:"translateY(var(--thumb-active-top))",height:"var(--thumb-active-height)"}:{transform:"translateX(var(--thumb-active-left))",width:"var(--thumb-active-width)"}},onVisibleChanged:function(){j(null),D(null),g()}},function(e,l){var o=e.className,i=e.style,s=(0,r.default)((0,r.default)({},i),{},{"--thumb-start-left":I,"--thumb-start-width":p(null==N?void 0:N.width),"--thumb-active-left":H,"--thumb-active-width":p(null==z?void 0:z.width),"--thumb-start-top":I,"--thumb-start-height":p(null==N?void 0:N.height),"--thumb-active-top":H,"--thumb-active-height":p(null==z?void 0:z.height)}),c={ref:(0,d.composeRef)(w,l),style:s,className:(0,n.default)("".concat(a,"-thumb"),o)};return t.createElement("div",c)}):null}var h=["prefixCls","direction","vertical","options","disabled","defaultValue","value","name","onChange","className","motionName"],b=function(e){var a=e.prefixCls,l=e.className,o=e.disabled,r=e.checked,s=e.label,c=e.title,u=e.value,d=e.name,f=e.onChange,m=e.onFocus,v=e.onBlur,p=e.onKeyDown,g=e.onKeyUp,h=e.onMouseDown;return t.createElement("label",{className:(0,n.default)(l,(0,i.default)({},"".concat(a,"-item-disabled"),o)),onMouseDown:h},t.createElement("input",{name:d,className:"".concat(a,"-item-input"),type:"radio",disabled:o,checked:r,onChange:function(e){o||f(e,u)},onFocus:m,onBlur:v,onKeyDown:p,onKeyUp:g}),t.createElement("div",{className:"".concat(a,"-item-label"),title:c},s))},y=t.forwardRef(function(e,f){var m,v=e.prefixCls,p=void 0===v?"rc-segmented":v,y=e.direction,w=e.vertical,x=e.options,$=void 0===x?[]:x,C=e.disabled,O=e.defaultValue,S=e.value,k=e.name,E=e.onChange,N=e.className,j=e.motionName,R=(0,o.default)(e,h),M=t.useRef(null),z=t.useMemo(function(){return(0,d.composeRef)(M,f)},[M,f]),D=t.useMemo(function(){return $.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}})},[$]),I=(0,c.default)(null==(m=D[0])?void 0:m.value,{value:S,defaultValue:O}),H=(0,l.default)(I,2),L=H[0],P=H[1],B=t.useState(!1),A=(0,l.default)(B,2),K=A[0],T=A[1],V=function(e,t){P(t),null==E||E(t)},U=(0,u.default)(R,["children"]),F=t.useState(!1),W=(0,l.default)(F,2),X=W[0],q=W[1],Y=t.useState(!1),_=(0,l.default)(Y,2),G=_[0],Z=_[1],J=function(){Z(!0)},Q=function(){Z(!1)},ee=function(){q(!1)},et=function(e){"Tab"===e.key&&q(!0)},en=function(e){var t=D.findIndex(function(e){return e.value===L}),n=D.length,a=D[(t+e+n)%n];a&&(P(a.value),null==E||E(a.value))},ea=function(e){switch(e.key){case"ArrowLeft":case"ArrowUp":en(-1);break;case"ArrowRight":case"ArrowDown":en(1)}};return t.createElement("div",(0,a.default)({role:"radiogroup","aria-label":"segmented control",tabIndex:C?void 0:0,"aria-orientation":w?"vertical":"horizontal"},U,{className:(0,n.default)(p,(0,i.default)((0,i.default)((0,i.default)({},"".concat(p,"-rtl"),"rtl"===y),"".concat(p,"-disabled"),C),"".concat(p,"-vertical"),w),void 0===N?"":N),ref:z}),t.createElement("div",{className:"".concat(p,"-group")},t.createElement(g,{vertical:w,prefixCls:p,value:L,containerRef:M,motionName:"".concat(p,"-").concat(void 0===j?"thumb-motion":j),direction:y,getValueIndex:function(e){return D.findIndex(function(t){return t.value===e})},onMotionStart:function(){T(!0)},onMotionEnd:function(){T(!1)}}),D.map(function(e){return t.createElement(b,(0,a.default)({},e,{name:k,key:e.value,prefixCls:p,className:(0,n.default)(e.className,"".concat(p,"-item"),(0,i.default)((0,i.default)({},"".concat(p,"-item-selected"),e.value===L&&!K),"".concat(p,"-item-focused"),G&&X&&e.value===L)),checked:e.value===L,onChange:V,onFocus:J,onBlur:Q,onKeyDown:ea,onKeyUp:et,onMouseDown:ee,disabled:!!C||!!e.disabled}))})))}),w=e.i(981444),x=e.i(242064),$=e.i(517455);e.i(296059);var C=e.i(915654),O=e.i(183293),S=e.i(246422),k=e.i(838378);function E(e,t){return{[`${e}, ${e}:hover, ${e}:focus`]:{color:t.colorTextDisabled,cursor:"not-allowed"}}}function N(e){return{background:e.itemSelectedBg,boxShadow:e.boxShadowTertiary}}let j=Object.assign({overflow:"hidden"},O.textEllipsis),R=(0,S.genStyleHooks)("Segmented",e=>{let{lineWidth:t,calc:n}=e;return(e=>{let{componentCls:t}=e,n=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,O.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,O.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,C.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({},N(e)),{color:e.itemSelectedColor}),"&-focused":(0,O.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:n,lineHeight:(0,C.unit)(n),padding:`0 ${(0,C.unit)(e.segmentedPaddingHorizontal)}`},j),"&-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({},N(e)),{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:"100%",padding:`${(0,C.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,C.unit)(a),padding:`0 ${(0,C.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,C.unit)(l),padding:`0 ${(0,C.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),E(`&-disabled ${t}-item`,e)),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,k.mergeToken)(e,{segmentedPaddingHorizontal:n(e.controlPaddingHorizontal).sub(t).equal(),segmentedPaddingHorizontalSM:n(e.controlPaddingHorizontalSM).sub(t).equal()}))},e=>{let{colorTextLabel:t,colorText:n,colorFillSecondary:a,colorBgElevated:l,colorFill:o,lineWidthBold:i,colorBgLayout:r}=e;return{trackPadding:i,trackBg:r,itemColor:t,itemHoverColor:n,itemHoverBg:a,itemSelectedBg:l,itemActiveBg:o,itemSelectedColor:n}});var M=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(n[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])&&(n[a[l]]=e[a[l]]);return n};let z=t.forwardRef((e,a)=>{let l=(0,w.default)(),{prefixCls:o,className:i,rootClassName:r,block:s,options:c=[],size:u="middle",style:d,vertical:f,shape:m="default",name:v=l}=e,p=M(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:g,direction:h,className:b,style:C}=(0,x.useComponentConfig)("segmented"),O=g("segmented",o),[S,k,E]=R(O),N=(0,$.default)(u),j=t.useMemo(()=>c.map(e=>{if("object"==typeof e&&(null==e?void 0:e.icon)){let{icon:n,label:a}=e;return Object.assign(Object.assign({},M(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${O}-item-icon`},n),a&&t.createElement("span",null,a))})}return e}),[c,O]),z=(0,n.default)(i,r,b,{[`${O}-block`]:s,[`${O}-sm`]:"small"===N,[`${O}-lg`]:"large"===N,[`${O}-vertical`]:f,[`${O}-shape-${m}`]:"round"===m},k,E),D=Object.assign(Object.assign({},C),d);return S(t.createElement(y,Object.assign({},p,{name:v,className:z,style:D,options:j,ref:a,prefixCls:O,direction:h,vertical:f})))});e.s(["Segmented",0,z],560025)},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])},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},518617,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["CloseCircleOutlined",0,o],518617)},19732,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["ExperimentOutlined",0,o],19732)},366308,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["ToolOutlined",0,o],366308)},782273,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["SoundOutlined",0,o],782273)},313603,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["SettingOutlined",0,o],313603)},793916,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let a={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 l=e.i(9583),o=n.forwardRef(function(e,o){return n.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["AudioOutlined",0,o],793916)},608856,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),a=e.i(209428),l=e.i(392221),o=e.i(951160),i=e.i(174428),r=t.createContext(null),s=t.createContext({}),c=e.i(211577),u=e.i(931067),d=e.i(361275),f=e.i(404948),m=e.i(244009),v=e.i(703923),p=e.i(611935),g=["prefixCls","className","containerRef"];let h=function(e){var a=e.prefixCls,l=e.className,o=e.containerRef,i=(0,v.default)(e,g),r=t.useContext(s).panel,c=(0,p.useComposeRef)(r,o);return t.createElement("div",(0,u.default)({className:(0,n.default)("".concat(a,"-content"),l),role:"dialog",ref:c},(0,m.default)(e,{aria:!0}),{"aria-modal":"true"},i))};var b=e.i(883110);function y(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 w={width:0,height:0,overflow:"hidden",outline:"none",position:"absolute"},x=t.forwardRef(function(e,o){var i,s,v,p=e.prefixCls,g=e.open,b=e.placement,x=e.inline,$=e.push,C=e.forceRender,O=e.autoFocus,S=e.keyboard,k=e.classNames,E=e.rootClassName,N=e.rootStyle,j=e.zIndex,R=e.className,M=e.id,z=e.style,D=e.motion,I=e.width,H=e.height,L=e.children,P=e.mask,B=e.maskClosable,A=e.maskMotion,K=e.maskClassName,T=e.maskStyle,V=e.afterOpenChange,U=e.onClose,F=e.onMouseEnter,W=e.onMouseOver,X=e.onMouseLeave,q=e.onClick,Y=e.onKeyDown,_=e.onKeyUp,G=e.styles,Z=e.drawerRender,J=t.useRef(),Q=t.useRef(),ee=t.useRef();t.useImperativeHandle(o,function(){return J.current}),t.useEffect(function(){if(g&&O){var e;null==(e=J.current)||e.focus({preventScroll:!0})}},[g]);var et=t.useState(!1),en=(0,l.default)(et,2),ea=en[0],el=en[1],eo=t.useContext(r),ei=null!=(i=null!=(s=null==(v="boolean"==typeof $?$?{}:{distance:0}:$||{})?void 0:v.distance)?s:null==eo?void 0:eo.pushDistance)?i:180,er=t.useMemo(function(){return{pushDistance:ei,push:function(){el(!0)},pull:function(){el(!1)}}},[ei]);t.useEffect(function(){var e,t;g?null==eo||null==(e=eo.push)||e.call(eo):null==eo||null==(t=eo.pull)||t.call(eo)},[g]),t.useEffect(function(){return function(){var e;null==eo||null==(e=eo.pull)||e.call(eo)}},[]);var es=t.createElement(d.default,(0,u.default)({key:"mask"},A,{visible:P&&g}),function(e,l){var o=e.className,i=e.style;return t.createElement("div",{className:(0,n.default)("".concat(p,"-mask"),o,null==k?void 0:k.mask,K),style:(0,a.default)((0,a.default)((0,a.default)({},i),T),null==G?void 0:G.mask),onClick:B&&g?U:void 0,ref:l})}),ec="function"==typeof D?D(b):D,eu={};if(ea&&ei)switch(b){case"top":eu.transform="translateY(".concat(ei,"px)");break;case"bottom":eu.transform="translateY(".concat(-ei,"px)");break;case"left":eu.transform="translateX(".concat(ei,"px)");break;default:eu.transform="translateX(".concat(-ei,"px)")}"left"===b||"right"===b?eu.width=y(I):eu.height=y(H);var ed={onMouseEnter:F,onMouseOver:W,onMouseLeave:X,onClick:q,onKeyDown:Y,onKeyUp:_},ef=t.createElement(d.default,(0,u.default)({key:"panel"},ec,{visible:g,forceRender:C,onVisibleChanged:function(e){null==V||V(e)},removeOnLeave:!1,leavedClassName:"".concat(p,"-content-wrapper-hidden")}),function(l,o){var i=l.className,r=l.style,s=t.createElement(h,(0,u.default)({id:M,containerRef:o,prefixCls:p,className:(0,n.default)(R,null==k?void 0:k.content),style:(0,a.default)((0,a.default)({},z),null==G?void 0:G.content)},(0,m.default)(e,{aria:!0}),ed),L);return t.createElement("div",(0,u.default)({className:(0,n.default)("".concat(p,"-content-wrapper"),null==k?void 0:k.wrapper,i),style:(0,a.default)((0,a.default)((0,a.default)({},eu),r),null==G?void 0:G.wrapper)},(0,m.default)(e,{data:!0})),Z?Z(s):s)}),em=(0,a.default)({},N);return j&&(em.zIndex=j),t.createElement(r.Provider,{value:er},t.createElement("div",{className:(0,n.default)(p,"".concat(p,"-").concat(b),E,(0,c.default)((0,c.default)({},"".concat(p,"-open"),g),"".concat(p,"-inline"),x)),style:em,tabIndex:-1,ref:J,onKeyDown:function(e){var t,n,a=e.keyCode,l=e.shiftKey;switch(a){case f.default.TAB:a===f.default.TAB&&(l||document.activeElement!==ee.current?l&&document.activeElement===Q.current&&(null==(n=ee.current)||n.focus({preventScroll:!0})):null==(t=Q.current)||t.focus({preventScroll:!0}));break;case f.default.ESC:U&&S&&(e.stopPropagation(),U(e))}}},es,t.createElement("div",{tabIndex:0,ref:Q,style:w,"aria-hidden":"true","data-sentinel":"start"}),ef,t.createElement("div",{tabIndex:0,ref:ee,style:w,"aria-hidden":"true","data-sentinel":"end"})))});let $=function(e){var n=e.open,r=e.prefixCls,c=e.placement,u=e.autoFocus,d=e.keyboard,f=e.width,m=e.mask,v=void 0===m||m,p=e.maskClosable,g=e.getContainer,h=e.forceRender,b=e.afterOpenChange,y=e.destroyOnClose,w=e.onMouseEnter,$=e.onMouseOver,C=e.onMouseLeave,O=e.onClick,S=e.onKeyDown,k=e.onKeyUp,E=e.panelRef,N=t.useState(!1),j=(0,l.default)(N,2),R=j[0],M=j[1],z=t.useState(!1),D=(0,l.default)(z,2),I=D[0],H=D[1];(0,i.default)(function(){H(!0)},[]);var L=!!I&&void 0!==n&&n,P=t.useRef(),B=t.useRef();(0,i.default)(function(){L&&(B.current=document.activeElement)},[L]);var A=t.useMemo(function(){return{panel:E}},[E]);if(!h&&!R&&!L&&y)return null;var K=(0,a.default)((0,a.default)({},e),{},{open:L,prefixCls:void 0===r?"rc-drawer":r,placement:void 0===c?"right":c,autoFocus:void 0===u||u,keyboard:void 0===d||d,width:void 0===f?378:f,mask:v,maskClosable:void 0===p||p,inline:!1===g,afterOpenChange:function(e){var t,n;M(e),null==b||b(e),e||!B.current||null!=(t=P.current)&&t.contains(B.current)||null==(n=B.current)||n.focus({preventScroll:!0})},ref:P},{onMouseEnter:w,onMouseOver:$,onMouseLeave:C,onClick:O,onKeyDown:S,onKeyUp:k});return t.createElement(s.Provider,{value:A},t.createElement(o.default,{open:L||h||R,autoDestroy:!1,getContainer:g,autoLock:v&&(L||R)},t.createElement(x,K)))};var C=e.i(981444),O=e.i(617206),S=e.i(122767),k=e.i(613541),E=e.i(340010),N=e.i(242064),j=e.i(922611),R=e.i(563113),M=e.i(185793);let z=e=>{var a,l,o,i;let r,{prefixCls:s,ariaId:c,title:u,footer:d,extra:f,closable:m,loading:v,onClose:p,headerStyle:g,bodyStyle:h,footerStyle:b,children:y,classNames:w,styles:x}=e,$=(0,N.useComponentConfig)("drawer");r=!1===m?void 0:void 0===m||!0===m?"start":(null==m?void 0:m.placement)==="end"?"end":"start";let C=t.useCallback(e=>t.createElement("button",{type:"button",onClick:p,className:(0,n.default)(`${s}-close`,{[`${s}-close-${r}`]:"end"===r})},e),[p,s,r]),[O,S]=(0,R.useClosable)((0,R.pickClosable)(e),(0,R.pickClosable)($),{closable:!0,closeIconRender:C});return t.createElement(t.Fragment,null,u||O?t.createElement("div",{style:Object.assign(Object.assign(Object.assign({},null==(o=$.styles)?void 0:o.header),g),null==x?void 0:x.header),className:(0,n.default)(`${s}-header`,{[`${s}-header-close-only`]:O&&!u&&!f},null==(i=$.classNames)?void 0:i.header,null==w?void 0:w.header)},t.createElement("div",{className:`${s}-header-title`},"start"===r&&S,u&&t.createElement("div",{className:`${s}-title`,id:c},u)),f&&t.createElement("div",{className:`${s}-extra`},f),"end"===r&&S):null,t.createElement("div",{className:(0,n.default)(`${s}-body`,null==w?void 0:w.body,null==(a=$.classNames)?void 0:a.body),style:Object.assign(Object.assign(Object.assign({},null==(l=$.styles)?void 0:l.body),h),null==x?void 0:x.body)},v?t.createElement(M.default,{active:!0,title:!1,paragraph:{rows:5},className:`${s}-body-skeleton`}):y),(()=>{var e,a;if(!d)return null;let l=`${s}-footer`;return t.createElement("div",{className:(0,n.default)(l,null==(e=$.classNames)?void 0:e.footer,null==w?void 0:w.footer),style:Object.assign(Object.assign(Object.assign({},null==(a=$.styles)?void 0:a.footer),b),null==x?void 0:x.footer)},d)})())};e.i(296059);var D=e.i(915654),I=e.i(183293),H=e.i(246422),L=e.i(838378);let P=(e,t)=>({"&-enter, &-appear":Object.assign(Object.assign({},e),{"&-active":t}),"&-leave":Object.assign(Object.assign({},t),{"&-active":e})}),B=(e,t)=>Object.assign({"&-enter, &-appear, &-leave":{"&-start":{transition:"none"},"&-active":{transition:`all ${t}`}}},P({opacity:e},{opacity:1})),A=(0,H.genStyleHooks)("Drawer",e=>{let t=(0,L.mergeToken)(e,{});return[(e=>{let{borderRadiusSM:t,componentCls:n,zIndexPopup:a,colorBgMask:l,colorBgElevated:o,motionDurationSlow:i,motionDurationMid:r,paddingXS:s,padding:c,paddingLG:u,fontSizeLG:d,lineHeightLG:f,lineWidth:m,lineType:v,colorSplit:p,marginXS:g,colorIcon:h,colorIconHover:b,colorBgTextHover:y,colorBgTextActive:w,colorText:x,fontWeightStrong:$,footerPaddingBlock:C,footerPaddingInline:O,calc:S}=e,k=`${n}-content-wrapper`;return{[n]:{position:"fixed",inset:0,zIndex:a,pointerEvents:"none",color:x,"&-pure":{position:"relative",background:o,display:"flex",flexDirection:"column",[`&${n}-left`]:{boxShadow:e.boxShadowDrawerLeft},[`&${n}-right`]:{boxShadow:e.boxShadowDrawerRight},[`&${n}-top`]:{boxShadow:e.boxShadowDrawerUp},[`&${n}-bottom`]:{boxShadow:e.boxShadowDrawerDown}},"&-inline":{position:"absolute"},[`${n}-mask`]:{position:"absolute",inset:0,zIndex:a,background:l,pointerEvents:"auto"},[k]:{position:"absolute",zIndex:a,maxWidth:"100vw",transition:`all ${i}`,"&-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},[`${n}-content`]:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"auto",background:o,pointerEvents:"auto"},[`${n}-header`]:{display:"flex",flex:0,alignItems:"center",padding:`${(0,D.unit)(c)} ${(0,D.unit)(u)}`,fontSize:d,lineHeight:f,borderBottom:`${(0,D.unit)(m)} ${v} ${p}`,"&-title":{display:"flex",flex:1,alignItems:"center",minWidth:0,minHeight:0}},[`${n}-extra`]:{flex:"none"},[`${n}-close`]:Object.assign({display:"inline-flex",width:S(d).add(s).equal(),height:S(d).add(s).equal(),borderRadius:t,justifyContent:"center",alignItems:"center",color:h,fontWeight:$,fontSize:d,fontStyle:"normal",lineHeight:1,textAlign:"center",textTransform:"none",textDecoration:"none",background:"transparent",border:0,cursor:"pointer",transition:`all ${r}`,textRendering:"auto",[`&${n}-close-end`]:{marginInlineStart:g},[`&:not(${n}-close-end)`]:{marginInlineEnd:g},"&:hover":{color:b,backgroundColor:y,textDecoration:"none"},"&:active":{backgroundColor:w}},(0,I.genFocusStyle)(e)),[`${n}-title`]:{flex:1,margin:0,fontWeight:e.fontWeightStrong,fontSize:d,lineHeight:f},[`${n}-body`]:{flex:1,minWidth:0,minHeight:0,padding:u,overflow:"auto",[`${n}-body-skeleton`]:{width:"100%",height:"100%",display:"flex",justifyContent:"center"}},[`${n}-footer`]:{flexShrink:0,padding:`${(0,D.unit)(C)} ${(0,D.unit)(O)}`,borderTop:`${(0,D.unit)(m)} ${v} ${p}`},"&-rtl":{direction:"rtl"}}}})(t),(e=>{let{componentCls:t,motionDurationSlow:n}=e;return{[t]:{[`${t}-mask-motion`]:B(0,n),[`${t}-panel-motion`]:["left","right","top","bottom"].reduce((e,t)=>{let a;return Object.assign(Object.assign({},e),{[`&-${t}`]:[B(.7,n),P({transform:(a="100%",({left:`translateX(-${a})`,right:`translateX(${a})`,top:`translateY(-${a})`,bottom:`translateY(${a})`})[t])},{transform:"none"})]})},{})}}})(t)]},e=>({zIndexPopup:e.zIndexPopupBase,footerPaddingBlock:e.paddingXS,footerPaddingInline:e.padding}));var K=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(n[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])&&(n[a[l]]=e[a[l]]);return n};let T={distance:180},V=e=>{let{rootClassName:a,width:l,height:o,size:i="default",mask:r=!0,push:s=T,open:c,afterOpenChange:u,onClose:d,prefixCls:f,getContainer:m,panelRef:v=null,style:g,className:h,"aria-labelledby":b,visible:y,afterVisibleChange:w,maskStyle:x,drawerStyle:R,contentWrapperStyle:M,destroyOnClose:D,destroyOnHidden:I}=e,H=K(e,["rootClassName","width","height","size","mask","push","open","afterOpenChange","onClose","prefixCls","getContainer","panelRef","style","className","aria-labelledby","visible","afterVisibleChange","maskStyle","drawerStyle","contentWrapperStyle","destroyOnClose","destroyOnHidden"]),L=(0,C.default)(),P=H.title?L:void 0,{getPopupContainer:B,getPrefixCls:V,direction:U,className:F,style:W,classNames:X,styles:q}=(0,N.useComponentConfig)("drawer"),Y=V("drawer",f),[_,G,Z]=A(Y),J=void 0===m&&B?()=>B(document.body):m,Q=(0,n.default)({"no-mask":!r,[`${Y}-rtl`]:"rtl"===U},a,G,Z),ee=t.useMemo(()=>null!=l?l:"large"===i?736:378,[l,i]),et=t.useMemo(()=>null!=o?o:"large"===i?736:378,[o,i]),en={motionName:(0,k.getTransitionName)(Y,"mask-motion"),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500},ea=(0,j.usePanelRef)(),el=(0,p.composeRef)(v,ea),[eo,ei]=(0,S.useZIndex)("Drawer",H.zIndex),{classNames:er={},styles:es={}}=H;return _(t.createElement(O.default,{form:!0,space:!0},t.createElement(E.default.Provider,{value:ei},t.createElement($,Object.assign({prefixCls:Y,onClose:d,maskMotion:en,motion:e=>({motionName:(0,k.getTransitionName)(Y,`panel-motion-${e}`),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500})},H,{classNames:{mask:(0,n.default)(er.mask,X.mask),content:(0,n.default)(er.content,X.content),wrapper:(0,n.default)(er.wrapper,X.wrapper)},styles:{mask:Object.assign(Object.assign(Object.assign({},es.mask),x),q.mask),content:Object.assign(Object.assign(Object.assign({},es.content),R),q.content),wrapper:Object.assign(Object.assign(Object.assign({},es.wrapper),M),q.wrapper)},open:null!=c?c:y,mask:r,push:s,width:ee,height:et,style:Object.assign(Object.assign({},W),g),className:(0,n.default)(F,h),rootClassName:Q,getContainer:J,afterOpenChange:null!=u?u:w,panelRef:el,zIndex:eo,"aria-labelledby":null!=b?b:P,destroyOnClose:null!=I?I:D}),t.createElement(z,Object.assign({prefixCls:Y},H,{ariaId:P,onClose:d}))))))};V._InternalPanelDoNotUseOrYouWillBeFired=e=>{let{prefixCls:a,style:l,className:o,placement:i="right"}=e,r=K(e,["prefixCls","style","className","placement"]),{getPrefixCls:s}=t.useContext(N.ConfigContext),c=s("drawer",a),[u,d,f]=A(c),m=(0,n.default)(c,`${c}-pure`,`${c}-${i}`,d,f,o);return u(t.createElement("div",{className:m,style:l},t.createElement(z,Object.assign({prefixCls:c},r))))},e.s(["Drawer",0,V],608856)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/01q1b-t4kl710.js b/litellm/proxy/_experimental/out/_next/static/chunks/01q1b-t4kl710.js new file mode 100644 index 00000000000..edb2a6a89e7 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/01q1b-t4kl710.js @@ -0,0 +1,41 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,266027,869230,254440,469637,e=>{"use strict";let t;var r=e.i(175555),n=e.i(273911),i=e.i(540143),l=e.i(286491),o=e.i(915823),a=e.i(793803),s=e.i(619273),c=e.i(180166),u=class extends o.Subscribable{constructor(e,t){super(),this.options=t,this.#e=e,this.#t=null,this.#r=(0,a.pendingThenable)(),this.bindMethods(),this.setOptions(t)}#e;#n=void 0;#i=void 0;#l=void 0;#o;#a;#r;#t;#s;#c;#u;#d;#h;#p;#f=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){1===this.listeners.size&&(this.#n.addObserver(this),d(this.#n,this.options)?this.#m():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return h(this.#n,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return h(this.#n,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#g(),this.#b(),this.#n.removeObserver(this)}setOptions(e){let t=this.options,r=this.#n;if(this.options=this.#e.defaultQueryOptions(e),void 0!==this.options.enabled&&"boolean"!=typeof this.options.enabled&&"function"!=typeof this.options.enabled&&"boolean"!=typeof(0,s.resolveQueryBoolean)(this.options.enabled,this.#n))throw Error("Expected enabled to be a boolean or a callback that returns a boolean");this.#v(),this.#n.setOptions(this.options),t._defaulted&&!(0,s.shallowEqualObjects)(this.options,t)&&this.#e.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#n,observer:this});let n=this.hasListeners();n&&p(this.#n,r,this.options,t)&&this.#m(),this.updateResult(),n&&(this.#n!==r||(0,s.resolveQueryBoolean)(this.options.enabled,this.#n)!==(0,s.resolveQueryBoolean)(t.enabled,this.#n)||(0,s.resolveStaleTime)(this.options.staleTime,this.#n)!==(0,s.resolveStaleTime)(t.staleTime,this.#n))&&this.#O();let i=this.#R();n&&(this.#n!==r||(0,s.resolveQueryBoolean)(this.options.enabled,this.#n)!==(0,s.resolveQueryBoolean)(t.enabled,this.#n)||i!==this.#p)&&this.#x(i)}getOptimisticResult(e){var t,r;let n=this.#e.getQueryCache().build(this.#e,e),i=this.createResult(n,e);return t=this,r=i,(0,s.shallowEqualObjects)(t.getCurrentResult(),r)||(this.#l=i,this.#a=this.options,this.#o=this.#n.state),i}getCurrentResult(){return this.#l}trackResult(e,t){return new Proxy(e,{get:(e,r)=>(this.trackProp(r),t?.(r),"promise"===r&&(this.trackProp("data"),this.options.experimental_prefetchInRender||"pending"!==this.#r.status||this.#r.reject(Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(e,r))})}trackProp(e){this.#f.add(e)}getCurrentQuery(){return this.#n}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),r=this.#e.getQueryCache().build(this.#e,t);return r.fetch().then(()=>this.createResult(r,t))}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#l))}#m(e){this.#v();let t=this.#n.fetch(this.options,e);return e?.throwOnError||(t=t.catch(s.noop)),t}#O(){this.#g();let e=(0,s.resolveStaleTime)(this.options.staleTime,this.#n);if(n.environmentManager.isServer()||this.#l.isStale||!(0,s.isValidTimeout)(e))return;let t=(0,s.timeUntilStale)(this.#l.dataUpdatedAt,e);this.#d=c.timeoutManager.setTimeout(()=>{this.#l.isStale||this.updateResult()},t+1)}#R(){return("function"==typeof this.options.refetchInterval?this.options.refetchInterval(this.#n):this.options.refetchInterval)??!1}#x(e){this.#b(),this.#p=e,!n.environmentManager.isServer()&&!1!==(0,s.resolveQueryBoolean)(this.options.enabled,this.#n)&&(0,s.isValidTimeout)(this.#p)&&0!==this.#p&&(this.#h=c.timeoutManager.setInterval(()=>{(this.options.refetchIntervalInBackground||r.focusManager.isFocused())&&this.#m()},this.#p))}#y(){this.#O(),this.#x(this.#R())}#g(){void 0!==this.#d&&(c.timeoutManager.clearTimeout(this.#d),this.#d=void 0)}#b(){void 0!==this.#h&&(c.timeoutManager.clearInterval(this.#h),this.#h=void 0)}createResult(e,t){let r,n=this.#n,i=this.options,o=this.#l,c=this.#o,u=this.#a,h=e!==n?e.state:this.#i,{state:m}=e,y={...m},g=!1;if(t._optimisticResults){let r=this.hasListeners(),o=!r&&d(e,t),a=r&&p(e,n,t,i);(o||a)&&(y={...y,...(0,l.fetchState)(m.data,e.options)}),"isRestoring"===t._optimisticResults&&(y.fetchStatus="idle")}let{error:b,errorUpdatedAt:v,status:O}=y;r=y.data;let R=!1;if(void 0!==t.placeholderData&&void 0===r&&"pending"===O){let e;o?.isPlaceholderData&&t.placeholderData===u?.placeholderData?(e=o.data,R=!0):e="function"==typeof t.placeholderData?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,void 0!==e&&(O="success",r=(0,s.replaceData)(o?.data,e,t),g=!0)}if(t.select&&void 0!==r&&!R)if(o&&r===c?.data&&t.select===this.#s)r=this.#c;else try{this.#s=t.select,r=t.select(r),r=(0,s.replaceData)(o?.data,r,t),this.#c=r,this.#t=null}catch(e){this.#t=e}this.#t&&(b=this.#t,r=this.#c,v=Date.now(),O="error");let x="fetching"===y.fetchStatus,w="pending"===O,S="error"===O,E=w&&x,C=void 0!==r,T={status:O,fetchStatus:y.fetchStatus,isPending:w,isSuccess:"success"===O,isError:S,isInitialLoading:E,isLoading:E,data:r,dataUpdatedAt:y.dataUpdatedAt,error:b,errorUpdatedAt:v,failureCount:y.fetchFailureCount,failureReason:y.fetchFailureReason,errorUpdateCount:y.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:y.dataUpdateCount>h.dataUpdateCount||y.errorUpdateCount>h.errorUpdateCount,isFetching:x,isRefetching:x&&!w,isLoadingError:S&&!C,isPaused:"paused"===y.fetchStatus,isPlaceholderData:g,isRefetchError:S&&C,isStale:f(e,t),refetch:this.refetch,promise:this.#r,isEnabled:!1!==(0,s.resolveQueryBoolean)(t.enabled,e)};if(this.options.experimental_prefetchInRender){let t=void 0!==T.data,r="error"===T.status&&!t,i=e=>{r?e.reject(T.error):t&&e.resolve(T.data)},l=()=>{i(this.#r=T.promise=(0,a.pendingThenable)())},o=this.#r;switch(o.status){case"pending":e.queryHash===n.queryHash&&i(o);break;case"fulfilled":(r||T.data!==o.value)&&l();break;case"rejected":r&&T.error===o.reason||l()}}return T}updateResult(){let e=this.#l,t=this.createResult(this.#n,this.options);if(this.#o=this.#n.state,this.#a=this.options,void 0!==this.#o.data&&(this.#u=this.#n),(0,s.shallowEqualObjects)(t,e))return;this.#l=t;let r=()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,r="function"==typeof t?t():t;if("all"===r||!r&&!this.#f.size)return!0;let n=new Set(r??this.#f);return this.options.throwOnError&&n.add("error"),Object.keys(this.#l).some(t=>this.#l[t]!==e[t]&&n.has(t))};this.#w({listeners:r()})}#v(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#n)return;let t=this.#n;this.#n=e,this.#i=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#w(e){i.notifyManager.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#l)}),this.#e.getQueryCache().notify({query:this.#n,type:"observerResultsUpdated"})})}};function d(e,t){return!1!==(0,s.resolveQueryBoolean)(t.enabled,e)&&void 0===e.state.data&&("error"!==e.state.status||!1!==(0,s.resolveQueryBoolean)(t.retryOnMount,e))||void 0!==e.state.data&&h(e,t,t.refetchOnMount)}function h(e,t,r){if(!1!==(0,s.resolveQueryBoolean)(t.enabled,e)&&"static"!==(0,s.resolveStaleTime)(t.staleTime,e)){let n="function"==typeof r?r(e):r;return"always"===n||!1!==n&&f(e,t)}return!1}function p(e,t,r,n){return(e!==t||!1===(0,s.resolveQueryBoolean)(n.enabled,e))&&(!r.suspense||"error"!==e.state.status)&&f(e,r)}function f(e,t){return!1!==(0,s.resolveQueryBoolean)(t.enabled,e)&&e.isStaleByTime((0,s.resolveStaleTime)(t.staleTime,e))}e.s(["QueryObserver",0,u],869230),e.i(247167);var m=e.i(271645),y=e.i(912598);e.i(843476);var g=m.createContext((t=!1,{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t})),b=m.createContext(!1);b.Provider;var v=e=>{if(e.suspense){let t=e=>"static"===e?e:Math.max(e??1e3,1e3),r=e.staleTime;e.staleTime="function"==typeof r?(...e)=>t(r(...e)):t(r),"number"==typeof e.gcTime&&(e.gcTime=Math.max(e.gcTime,1e3))}},O=(e,t)=>e.isLoading&&e.isFetching&&!t,R=(e,t)=>e?.suspense&&t.isPending,x=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function w(e,t,r){let l,o=m.useContext(b),a=m.useContext(g),c=(0,y.useQueryClient)(r),u=c.defaultQueryOptions(e);c.getDefaultOptions().queries?._experimental_beforeQuery?.(u);let d=c.getQueryCache().get(u.queryHash);u._optimisticResults=o?"isRestoring":"optimistic",v(u),l=d?.state.error&&"function"==typeof u.throwOnError?(0,s.shouldThrowError)(u.throwOnError,[d.state.error,d]):u.throwOnError,(u.suspense||u.experimental_prefetchInRender||l)&&!a.isReset()&&(u.retryOnMount=!1),m.useEffect(()=>{a.clearReset()},[a]);let h=!c.getQueryCache().get(u.queryHash),[p]=m.useState(()=>new t(c,u)),f=p.getOptimisticResult(u),w=!o&&!1!==e.subscribed;if(m.useSyncExternalStore(m.useCallback(e=>{let t=w?p.subscribe(i.notifyManager.batchCalls(e)):s.noop;return p.updateResult(),t},[p,w]),()=>p.getCurrentResult(),()=>p.getCurrentResult()),m.useEffect(()=>{p.setOptions(u)},[u,p]),R(u,f))throw x(u,p,a);if((({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(i&&void 0===e.data||(0,s.shouldThrowError)(r,[e.error,n])))({result:f,errorResetBoundary:a,throwOnError:u.throwOnError,query:d,suspense:u.suspense}))throw f.error;if(c.getDefaultOptions().queries?._experimental_afterQuery?.(u,f),u.experimental_prefetchInRender&&!n.environmentManager.isServer()&&O(f,o)){let e=h?x(u,p,a):d?.promise;e?.catch(s.noop).finally(()=>{p.updateResult()})}return u.notifyOnChangeProps?f:p.trackResult(f)}e.s(["defaultThrowOnError",0,(e,t)=>void 0===t.state.data,"ensureSuspenseTimers",0,v,"fetchOptimistic",0,x,"shouldSuspend",0,R,"willFetch",0,O],254440),e.s(["useBaseQuery",0,w],469637),e.s(["useQuery",0,function(e,t){return w(e,u,t)}],266027)},243652,e=>{"use strict";e.s(["createQueryKeys",0,function(e){let t=[e];return{all:t,lists:()=>[...t,"list"],list:e=>[...t,"list",{params:e}],details:()=>[...t,"detail"],detail:e=>[...t,"detail",e]}}])},612256,e=>{"use strict";var t=e.i(602869),r=e.i(266027);let n=(0,e.i(243652).createQueryKeys)("uiConfig");e.s(["useUIConfig",0,()=>(0,r.useQuery)({queryKey:n.list({}),queryFn:async()=>await (0,t.getUiConfig)(),staleTime:864e5,gcTime:864e5})])},321836,e=>{"use strict";let t="litellm_return_url",r="redirect_to";function n(){return window.location.href}function i(){if("u"typeof document&&(document.cookie=`${t}=; path=/; max-age=0`)}catch(e){console.error("Failed to clear return URL cookie:",e)}}function o(){return new URLSearchParams(window.location.search).get(r)}function a(){let e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||"::1"===e||e.startsWith("127.")||e.endsWith(".local")}function s(e){if(!e)return!1;if(e.startsWith("/")&&!e.startsWith("//"))return!0;try{let t=new URL(e),r=window.location.hostname;if(t.hostname!==r)return!1;if(a())return!0;return t.origin===window.location.origin}catch{return!1}}e.s(["buildLoginUrlWithReturn",0,function(e,t){let i=t||n();if(!i||i.includes("/login"))return e;let l=e.includes("?")?"&":"?";return`${e}${l}${r}=${encodeURIComponent(i)}`},"clearStoredReturnUrl",0,l,"consumeReturnUrl",0,function(){let e=o();if(e){if(s(e))return l(),e;a()&&console.warn("[returnUrlUtils] Invalid return URL in params rejected:",e)}let t=i();if(t){if(s(t))return l(),t;a()&&console.warn("[returnUrlUtils] Invalid return URL in cookie rejected:",t)}return null},"getLoginUrl",0,function(e=""){return`${e}/ui/login/`},"getReturnUrl",0,function(){let e=o();if(e)return e;let t=i();return t||null},"isValidReturnUrl",0,s,"normalizeUrlForCompare",0,function(e){try{let t=new URL(e,window.location.origin),r=t.pathname;r.length>1&&r.endsWith("/")&&(r=r.slice(0,-1));let n=new URLSearchParams(t.search),i=new URLSearchParams;Array.from(n.entries()).sort(([e],[t])=>e.localeCompare(t)).forEach(([e,t])=>{i.append(e,t)});let l=i.toString(),o=t.hash||"";return`${t.origin}${r}${l?`?${l}`:""}${o}`}catch{return e}},"storeReturnUrl",0,function(){let e=n();e&&function(e,t,r=300){if("u"{"use strict";var t=e.i(654310),r=function(e){if((0,t.default)()&&window.document.documentElement){var r=Array.isArray(e)?e:[e],n=window.document.documentElement;return r.some(function(e){return e in n.style})}return!1},n=function(e,t){if(!r(e))return!1;var n=document.createElement("div"),i=n.style[e];return n.style[e]=t,n.style[e]!==i};e.s(["isStyleSupport",0,function(e,t){return Array.isArray(e)||void 0===t?r(e):n(e,t)}])},190144,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:"M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z"}}]},name:"copy",theme:"outlined"};var i=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(i.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["default",0,l],190144)},486794,(e,t,r)=>{t.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,r=[],n=0;n{"use strict";var n=e.r(486794),i={"text/plain":"Text","text/html":"Url",default:"Text"};t.exports=function(e,t){var r,l,o,a,s,c,u,d,h=!1;t||(t={}),o=t.debug||!1;try{if(s=n(),c=document.createRange(),u=document.getSelection(),(d=document.createElement("span")).textContent=e,d.ariaHidden="true",d.style.all="unset",d.style.position="fixed",d.style.top=0,d.style.clip="rect(0, 0, 0, 0)",d.style.whiteSpace="pre",d.style.webkitUserSelect="text",d.style.MozUserSelect="text",d.style.msUserSelect="text",d.style.userSelect="text",d.addEventListener("copy",function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),void 0===r.clipboardData){o&&console.warn("unable to use e.clipboardData"),o&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var n=i[t.format]||i.default;window.clipboardData.setData(n,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))}),document.body.appendChild(d),c.selectNodeContents(d),u.addRange(c),!document.execCommand("copy"))throw Error("copy command was unsuccessful");h=!0}catch(n){o&&console.error("unable to copy using execCommand: ",n),o&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(t.format||"text",e),t.onCopy&&t.onCopy(window.clipboardData),h=!0}catch(n){o&&console.error("unable to copy using clipboardData: ",n),o&&console.error("falling back to prompt"),r="message"in t?t.message:"Copy to clipboard: #{key}, Enter",l=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C",a=r.replace(/#{\s*key\s*}/g,l),window.prompt(a,e)}}finally{u&&("function"==typeof u.removeRange?u.removeRange(c):u.removeAllRanges()),d&&document.body.removeChild(d),s()}return h}},898586,401361,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(8211),n=e.i(931067);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M257.7 752c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 000-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 009.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9zm67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z"}}]},name:"edit",theme:"outlined"};var l=e.i(9583),o=t.forwardRef(function(e,r){return t.createElement(l.default,(0,n.default)({},e,{ref:r,icon:i}))});e.s(["default",0,o],401361);var a=e.i(343794),s=e.i(430073),c=e.i(876556),u=e.i(174428),d=e.i(914949),h=e.i(529681),p=e.i(611935),f=e.i(735049),m=e.i(242064),y=e.i(929447),g=e.i(491816);let b={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M864 170h-60c-4.4 0-8 3.6-8 8v518H310v-73c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-75h498c35.3 0 64-28.7 64-64V178c0-4.4-3.6-8-8-8z"}}]},name:"enter",theme:"outlined"};var v=t.forwardRef(function(e,r){return t.createElement(l.default,(0,n.default)({},e,{ref:r,icon:b}))}),O=e.i(404948),R=e.i(763731),x=e.i(635432),w=e.i(183293),S=e.i(246422);e.i(765846);var E=e.i(896091);let C=(0,S.genStyleHooks)("Typography",e=>{let t,{componentCls:r,titleMarginTop:n}=e;return{[r]:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({color:e.colorText,wordBreak:"break-word",lineHeight:e.lineHeight,[`&${r}-secondary`]:{color:e.colorTextDescription},[`&${r}-success`]:{color:e.colorSuccessText},[`&${r}-warning`]:{color:e.colorWarningText},[`&${r}-danger`]:{color:e.colorErrorText,"a&:active, a&:focus":{color:e.colorErrorTextActive},"a&:hover":{color:e.colorErrorTextHover}},[`&${r}-disabled`]:{color:e.colorTextDisabled,cursor:"not-allowed",userSelect:"none"},[` + div&, + p + `]:{marginBottom:"1em"}},(t={},[1,2,3,4,5].forEach(r=>{t[` + h${r}&, + div&-h${r}, + div&-h${r} > textarea, + h${r} + `]=((e,t,r,n)=>{let{titleMarginBottom:i,fontWeightStrong:l}=n;return{marginBottom:i,color:r,fontWeight:l,fontSize:e,lineHeight:t}})(e[`fontSizeHeading${r}`],e[`lineHeightHeading${r}`],e.colorTextHeading,e)}),t)),{[` + & + h1${r}, + & + h2${r}, + & + h3${r}, + & + h4${r}, + & + h5${r} + `]:{marginTop:n},[` + div, + ul, + li, + p, + h1, + h2, + h3, + h4, + h5`]:{[` + + h1, + + h2, + + h3, + + h4, + + h5 + `]:{marginTop:n}}}),{code:{margin:"0 0.2em",paddingInline:"0.4em",paddingBlock:"0.2em 0.1em",fontSize:"85%",fontFamily:e.fontFamilyCode,background:"rgba(150, 150, 150, 0.1)",border:"1px solid rgba(100, 100, 100, 0.2)",borderRadius:3},kbd:{margin:"0 0.2em",paddingInline:"0.4em",paddingBlock:"0.15em 0.1em",fontSize:"90%",fontFamily:e.fontFamilyCode,background:"rgba(150, 150, 150, 0.06)",border:"1px solid rgba(100, 100, 100, 0.2)",borderBottomWidth:2,borderRadius:3},mark:{padding:0,backgroundColor:E.gold[2]},"u, ins":{textDecoration:"underline",textDecorationSkipInk:"auto"},"s, del":{textDecoration:"line-through"},strong:{fontWeight:e.fontWeightStrong},"ul, ol":{marginInline:0,marginBlock:"0 1em",padding:0,li:{marginInline:"20px 0",marginBlock:0,paddingInline:"4px 0",paddingBlock:0}},ul:{listStyleType:"circle",ul:{listStyleType:"disc"}},ol:{listStyleType:"decimal"},"pre, blockquote":{margin:"1em 0"},pre:{padding:"0.4em 0.6em",whiteSpace:"pre-wrap",wordWrap:"break-word",background:"rgba(150, 150, 150, 0.1)",border:"1px solid rgba(100, 100, 100, 0.2)",borderRadius:3,fontFamily:e.fontFamilyCode,code:{display:"inline",margin:0,padding:0,fontSize:"inherit",fontFamily:"inherit",background:"transparent",border:0}},blockquote:{paddingInline:"0.6em 0",paddingBlock:0,borderInlineStart:"4px solid rgba(100, 100, 100, 0.2)",opacity:.85}}),(e=>{let{componentCls:t}=e;return{"a&, a":Object.assign(Object.assign({},(0,w.operationUnit)(e)),{userSelect:"text",[`&[disabled], &${t}-disabled`]:{color:e.colorTextDisabled,cursor:"not-allowed","&:active, &:hover":{color:e.colorTextDisabled},"&:active":{pointerEvents:"none"}}})}})(e)),{[` + ${r}-expand, + ${r}-collapse, + ${r}-edit, + ${r}-copy + `]:Object.assign(Object.assign({},(0,w.operationUnit)(e)),{marginInlineStart:e.marginXXS})}),(e=>{let{componentCls:t,paddingSM:r}=e;return{"&-edit-content":{position:"relative","div&":{insetInlineStart:e.calc(e.paddingSM).mul(-1).equal(),insetBlockStart:e.calc(r).div(-2).add(1).equal(),marginBottom:e.calc(r).div(2).sub(2).equal()},[`${t}-edit-content-confirm`]:{position:"absolute",insetInlineEnd:e.calc(e.marginXS).add(2).equal(),insetBlockEnd:e.marginXS,color:e.colorIcon,fontWeight:"normal",fontSize:e.fontSize,fontStyle:"normal",pointerEvents:"none"},textarea:{margin:"0!important",MozTransition:"none",height:"1em"}}}})(e)),{[`${e.componentCls}-copy-success`]:{[` + &, + &:hover, + &:focus`]:{color:e.colorSuccess}},[`${e.componentCls}-copy-icon-only`]:{marginInlineStart:0}}),{[` + a&-ellipsis, + span&-ellipsis + `]:{display:"inline-block",maxWidth:"100%"},"&-ellipsis-single-line":{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis","a&, span&":{verticalAlign:"bottom"},"> code":{paddingBlock:0,maxWidth:"calc(100% - 1.2em)",display:"inline-block",overflow:"hidden",textOverflow:"ellipsis",verticalAlign:"bottom",boxSizing:"content-box"}},"&-ellipsis-multiple-line":{display:"-webkit-box",overflow:"hidden",WebkitLineClamp:3,WebkitBoxOrient:"vertical"}}),{"&-rtl":{direction:"rtl"}})}},()=>({titleMarginTop:"1.2em",titleMarginBottom:"0.5em"})),T=e=>{let{prefixCls:r,"aria-label":n,className:i,style:l,direction:o,maxLength:s,autoSize:c=!0,value:u,onSave:d,onCancel:h,onEnd:p,component:f,enterIcon:m=t.createElement(v,null)}=e,y=t.useRef(null),g=t.useRef(!1),b=t.useRef(null),[w,S]=t.useState(u);t.useEffect(()=>{S(u)},[u]),t.useEffect(()=>{var e;if(null==(e=y.current)?void 0:e.resizableTextArea){let{textArea:e}=y.current.resizableTextArea;e.focus();let{length:t}=e.value;e.setSelectionRange(t,t)}},[]);let E=()=>{d(w.trim())},[T,j,I]=C(r),k=(0,a.default)(r,`${r}-edit-content`,{[`${r}-rtl`]:"rtl"===o,[`${r}-${f}`]:!!f},i,j,I);return T(t.createElement("div",{className:k,style:l},t.createElement(x.default,{ref:y,maxLength:s,value:w,onChange:({target:e})=>{S(e.value.replace(/[\n\r]/g,""))},onKeyDown:({keyCode:e})=>{g.current||(b.current=e)},onKeyUp:({keyCode:e,ctrlKey:t,altKey:r,metaKey:n,shiftKey:i})=>{b.current!==e||g.current||t||r||n||i||(e===O.default.ENTER?(E(),null==p||p()):e===O.default.ESC&&h())},onCompositionStart:()=>{g.current=!0},onCompositionEnd:()=>{g.current=!1},onBlur:()=>{E()},"aria-label":n,rows:1,autoSize:c}),null!==m?(0,R.cloneElement)(m,{className:`${r}-edit-content-confirm`}):null))};var j=e.i(844343),I=e.i(175066);function k(e,r){return t.useMemo(()=>{let t=!!e;return[t,Object.assign(Object.assign({},r),t&&"object"==typeof e?e:null)]},[e])}var Q=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 $=t.forwardRef((e,r)=>{let{prefixCls:n,component:i="article",className:l,rootClassName:o,setContentRef:s,children:c,direction:u,style:d}=e,h=Q(e,["prefixCls","component","className","rootClassName","setContentRef","children","direction","style"]),{getPrefixCls:f,direction:y,className:g,style:b}=(0,m.useComponentConfig)("typography"),v=s?(0,p.composeRef)(r,s):r,O=f("typography",n),[R,x,w]=C(O),S=(0,a.default)(O,g,{[`${O}-rtl`]:"rtl"===(null!=u?u:y)},l,o,x,w),E=Object.assign(Object.assign({},b),d);return R(t.createElement(i,Object.assign({className:S,style:E,ref:v},h),c))});var U=e.i(121229),D=e.i(190144),M=e.i(739295);function P(e){return!1===e?[!1,!1]:Array.isArray(e)?e:[e]}function B(e,t,r){return!0===e||void 0===e?t:e||r&&t}let L=e=>["string","number"].includes(typeof e),F=({prefixCls:e,copied:r,locale:n,iconOnly:i,tooltips:l,icon:o,tabIndex:s,onCopy:c,loading:u})=>{let d=P(l),h=P(o),{copied:p,copy:f}=null!=n?n:{},m=r?p:f,y=B(d[+!!r],m),b="string"==typeof y?y:m;return t.createElement(g.default,{title:y},t.createElement("button",{type:"button",className:(0,a.default)(`${e}-copy`,{[`${e}-copy-success`]:r,[`${e}-copy-icon-only`]:i}),onClick:c,"aria-label":b,tabIndex:s},r?B(h[1],t.createElement(U.default,null),!0):B(h[0],u?t.createElement(M.default,null):t.createElement(D.default,null),!0)))},H=t.forwardRef(({style:e,children:r},n)=>{let i=t.useRef(null);return t.useImperativeHandle(n,()=>({isExceed:()=>{let e=i.current;return e.scrollHeight>e.clientHeight},getHeight:()=>i.current.clientHeight})),t.createElement("span",{"aria-hidden":!0,ref:i,style:Object.assign({position:"fixed",display:"block",left:0,top:0,pointerEvents:"none",backgroundColor:"rgba(255, 0, 0, 0.65)"},e)},r)});function W(e,t){let r=0,n=[];for(let i=0;it){let e=t-r;return n.push(String(l).slice(0,e)),n}n.push(l),r=o}return e}let A={display:"-webkit-box",overflow:"hidden",WebkitBoxOrient:"vertical"};function z(e){let{enableMeasure:n,width:i,text:l,children:o,rows:a,expanded:s,miscDeps:d,onEllipsis:h}=e,p=t.useMemo(()=>(0,c.default)(l),[l]),f=t.useMemo(()=>p.reduce((e,t)=>e+(L(t)?String(t).length:1),0),[l]),m=t.useMemo(()=>o(p,!1),[l]),[y,g]=t.useState(null),b=t.useRef(null),v=t.useRef(null),O=t.useRef(null),R=t.useRef(null),x=t.useRef(null),[w,S]=t.useState(!1),[E,C]=t.useState(0),[T,j]=t.useState(0),[I,k]=t.useState(null);(0,u.default)(()=>{n&&i&&f?C(1):C(0)},[i,l,a,n,p]),(0,u.default)(()=>{var e,t,r,n;if(1===E)C(2),k(v.current&&getComputedStyle(v.current).whiteSpace);else if(2===E){let i=!!(null==(e=O.current)?void 0:e.isExceed());C(i?3:4),g(i?[0,f]:null),S(i),j(Math.max((null==(t=O.current)?void 0:t.getHeight())||0,(1===a?0:(null==(r=R.current)?void 0:r.getHeight())||0)+((null==(n=x.current)?void 0:n.getHeight())||0))+1),h(i)}},[E]);let Q=y?Math.ceil((y[0]+y[1])/2):0;(0,u.default)(()=>{var e;let[t,r]=y||[0,0];if(t!==r){let n=((null==(e=b.current)?void 0:e.getHeight())||0)>T,i=Q;r-t==1&&(i=n?t:r),g(n?[t,i]:[i,r])}},[y,Q]);let $=t.useMemo(()=>{if(!n)return o(p,!1);if(3!==E||!y||y[0]!==y[1]){let e=o(p,!1);return[4,0].includes(E)?e:t.createElement("span",{style:Object.assign(Object.assign({},A),{WebkitLineClamp:a})},e)}return o(s?p:W(p,y[0]),w)},[s,E,y,p].concat((0,r.default)(d))),U={width:i,margin:0,padding:0,whiteSpace:"nowrap"===I?"normal":"inherit"};return t.createElement(t.Fragment,null,$,2===E&&t.createElement(t.Fragment,null,t.createElement(H,{style:Object.assign(Object.assign(Object.assign({},U),A),{WebkitLineClamp:a}),ref:O},m),t.createElement(H,{style:Object.assign(Object.assign(Object.assign({},U),A),{WebkitLineClamp:a-1}),ref:R},m),t.createElement(H,{style:Object.assign(Object.assign(Object.assign({},U),A),{WebkitLineClamp:1}),ref:x},o([],!0))),3===E&&y&&y[0]!==y[1]&&t.createElement(H,{style:Object.assign(Object.assign({},U),{top:400}),ref:b},o(W(p,Q),!0)),1===E&&t.createElement("span",{style:{whiteSpace:"inherit"},ref:v}))}let q=({enableEllipsis:e,isEllipsis:r,children:n,tooltipProps:i})=>(null==i?void 0:i.title)&&e?t.createElement(g.default,Object.assign({open:!!r&&void 0},i),n):n;var _=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 N=["delete","mark","code","underline","strong","keyboard","italic"],V=t.forwardRef((e,n)=>{var i;let l,b,v,{prefixCls:O,className:R,style:x,type:w,disabled:S,children:E,ellipsis:C,editable:Q,copyable:U,component:D,title:M}=e,P=_(e,["prefixCls","className","style","type","disabled","children","ellipsis","editable","copyable","component","title"]),{getPrefixCls:B,direction:H}=t.useContext(m.ConfigContext),[W]=(0,y.default)("Text"),A=t.useRef(null),V=t.useRef(null),K=B("typography",O),X=(0,h.default)(P,N),[G,J]=k(Q),[Y,Z]=(0,d.default)(!1,{value:J.editing}),{triggerType:ee=["icon"]}=J,et=e=>{var t;e&&(null==(t=J.onStart)||t.call(J)),Z(e)},er=(l=(0,t.useRef)(void 0),(0,t.useEffect)(()=>{l.current=Y}),l.current);(0,u.default)(()=>{var e;!Y&&er&&(null==(e=V.current)||e.focus())},[Y]);let en=e=>{null==e||e.preventDefault(),et(!0)},[ei,el]=k(U),{copied:eo,copyLoading:ea,onClick:es}=(({copyConfig:e,children:r})=>{let[n,i]=t.useState(!1),[l,o]=t.useState(!1),a=t.useRef(null),s=()=>{a.current&&clearTimeout(a.current)},c={};e.format&&(c.format=e.format),t.useEffect(()=>s,[]);let u=(0,I.default)(t=>{var n,l,u,d;return n=void 0,l=void 0,u=void 0,d=function*(){var n;null==t||t.preventDefault(),null==t||t.stopPropagation(),o(!0);try{let l="function"==typeof e.text?yield e.text():e.text;(0,j.default)(l||((e,t=!1)=>t&&null==e?[]:Array.isArray(e)?e:[e])(r,!0).join("")||"",c),o(!1),i(!0),s(),a.current=setTimeout(()=>{i(!1)},3e3),null==(n=e.onCopy)||n.call(e,t)}catch(e){throw o(!1),e}},new(u||(u=Promise))(function(e,t){function r(e){try{o(d.next(e))}catch(e){t(e)}}function i(e){try{o(d.throw(e))}catch(e){t(e)}}function o(t){var n;t.done?e(t.value):((n=t.value)instanceof u?n:new u(function(e){e(n)})).then(r,i)}o((d=d.apply(n,l||[])).next())})});return{copied:n,copyLoading:l,onClick:u}})({copyConfig:el,children:E}),[ec,eu]=t.useState(!1),[ed,eh]=t.useState(!1),[ep,ef]=t.useState(!1),[em,ey]=t.useState(!1),[eg,eb]=t.useState(!0),[ev,eO]=k(C,{expandable:!1,symbol:e=>e?null==W?void 0:W.collapse:null==W?void 0:W.expand}),[eR,ex]=(0,d.default)(eO.defaultExpanded||!1,{value:eO.expanded}),ew=ev&&(!eR||"collapsible"===eO.expandable),{rows:eS=1}=eO,eE=t.useMemo(()=>ew&&(void 0!==eO.suffix||eO.onEllipsis||eO.expandable||G||ei),[ew,eO,G,ei]);(0,u.default)(()=>{ev&&!eE&&(eu((0,f.isStyleSupport)("webkitLineClamp")),eh((0,f.isStyleSupport)("textOverflow")))},[eE,ev]);let[eC,eT]=t.useState(ew),ej=t.useMemo(()=>!eE&&(1===eS?ed:ec),[eE,ed,ec]);(0,u.default)(()=>{eT(ej&&ew)},[ej,ew]);let eI=ew&&(eC?em:ep),ek=ew&&1===eS&&eC,eQ=ew&&eS>1&&eC,[e$,eU]=t.useState(0),eD=e=>{var t;ef(e),ep!==e&&(null==(t=eO.onEllipsis)||t.call(eO,e))};t.useEffect(()=>{let e=A.current;if(ev&&eC&&e){let t,r,n,i=(t=document.createElement("em"),e.appendChild(t),r=e.getBoundingClientRect(),n=t.getBoundingClientRect(),e.removeChild(t),r.left>n.left||n.right>r.right||r.top>n.top||n.bottom>r.bottom);em!==i&&ey(i)}},[ev,eC,E,eQ,eg,e$]),t.useEffect(()=>{let e=A.current;if("u"{eb(!!e.offsetParent)});return t.observe(e),()=>{t.disconnect()}},[eC,ew]);let eM=(b=eO.tooltip,v=J.text,(0,t.useMemo)(()=>!0===b?{title:null!=v?v:E}:(0,t.isValidElement)(b)?{title:b}:"object"==typeof b?Object.assign({title:null!=v?v:E},b):{title:b},[b,v,E])),eP=t.useMemo(()=>{if(ev&&!eC)return[J.text,E,M,eM.title].find(L)},[ev,eC,M,eM.title,eI]);return Y?t.createElement(T,{value:null!=(i=J.text)?i:"string"==typeof E?E:"",onSave:e=>{var t;null==(t=J.onChange)||t.call(J,e),et(!1)},onCancel:()=>{var e;null==(e=J.onCancel)||e.call(J),et(!1)},onEnd:J.onEnd,prefixCls:K,className:R,style:x,direction:H,component:D,maxLength:J.maxLength,autoSize:J.autoSize,enterIcon:J.enterIcon}):t.createElement(s.default,{onResize:({offsetWidth:e})=>{eU(e)},disabled:!ew},i=>t.createElement(q,{tooltipProps:eM,enableEllipsis:ew,isEllipsis:eI},t.createElement($,Object.assign({className:(0,a.default)({[`${K}-${w}`]:w,[`${K}-disabled`]:S,[`${K}-ellipsis`]:ev,[`${K}-ellipsis-single-line`]:ek,[`${K}-ellipsis-multiple-line`]:eQ},R),prefixCls:O,style:Object.assign(Object.assign({},x),{WebkitLineClamp:eQ?eS:void 0}),component:D,ref:(0,p.composeRef)(i,A,n),direction:H,onClick:ee.includes("text")?en:void 0,"aria-label":null==eP?void 0:eP.toString(),title:M},X),t.createElement(z,{enableMeasure:ew&&!eC,text:E,rows:eS,width:e$,onEllipsis:eD,expanded:eR,miscDeps:[eo,eR,ea,G,ei,W].concat((0,r.default)(N.map(t=>e[t])))},(r,n)=>{let i;return function({mark:e,code:r,underline:n,delete:i,strong:l,keyboard:o,italic:a},s){let c=s;function u(e,r){r&&(c=t.createElement(e,{},c))}return u("strong",l),u("u",n),u("del",i),u("code",r),u("mark",e),u("kbd",o),u("i",a),c}(e,t.createElement(t.Fragment,null,r.length>0&&n&&!eR&&eP?t.createElement("span",{key:"show-content","aria-hidden":!0},r):r,[(i=n)&&!eR&&t.createElement("span",{"aria-hidden":!0,key:"ellipsis"},"..."),eO.suffix,[i&&(()=>{let{expandable:e,symbol:r}=eO;return e?t.createElement("button",{type:"button",key:"expand",className:`${K}-${eR?"collapse":"expand"}`,onClick:e=>{var t,r;ex((t={expanded:!eR}).expanded),null==(r=eO.onExpand)||r.call(eO,e,t)},"aria-label":eR?W.collapse:null==W?void 0:W.expand},"function"==typeof r?r(eR):r):null})(),(()=>{if(!G)return;let{icon:e,tooltip:r,tabIndex:n}=J,i=(0,c.default)(r)[0]||(null==W?void 0:W.edit),l="string"==typeof i?i:"";return ee.includes("icon")?t.createElement(g.default,{key:"edit",title:!1===r?"":i},t.createElement("button",{type:"button",ref:V,className:`${K}-edit`,onClick:en,"aria-label":l,tabIndex:n},e||t.createElement(o,{role:"button"}))):null})(),ei?t.createElement(F,Object.assign({key:"copy"},el,{prefixCls:K,copied:eo,locale:W,onCopy:es,loading:ea,iconOnly:null==E})):null]]))}))))});var K=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 X=t.forwardRef((e,r)=>{let{ellipsis:n,rel:i,children:l,navigate:o}=e,a=K(e,["ellipsis","rel","children","navigate"]),s=Object.assign(Object.assign({},a),{rel:void 0===i&&"_blank"===a.target?"noopener noreferrer":i});return t.createElement(V,Object.assign({},s,{ref:r,ellipsis:!!n,component:"a"}),l)});var G=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 J=t.forwardRef((e,r)=>{let{children:n}=e,i=G(e,["children"]);return t.createElement(V,Object.assign({ref:r},i,{component:"div"}),n)});var Y=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 Z=t.forwardRef((e,r)=>{let{ellipsis:n,children:i}=e,l=Y(e,["ellipsis","children"]),o=t.useMemo(()=>n&&"object"==typeof n?(0,h.default)(n,["expandable","rows"]):n,[n]);return t.createElement(V,Object.assign({ref:r},l,{ellipsis:o,component:"span"}),i)});var ee=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 et=[1,2,3,4,5],er=t.forwardRef((e,r)=>{let{level:n=1,children:i}=e,l=ee(e,["level","children"]),o=et.includes(n)?`h${n}`:"h1";return t.createElement(V,Object.assign({ref:r},l,{component:o}),i)});$.Text=Z,$.Link=X,$.Title=er,$.Paragraph=J,e.s(["Typography",0,$],898586)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/033zbmm2193x9.js b/litellm/proxy/_experimental/out/_next/static/chunks/033zbmm2193x9.js new file mode 100644 index 00000000000..4e3ef4aa385 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/033zbmm2193x9.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,254709,e=>{"use strict";var t=e.i(843476),s=e.i(271645),r=e.i(727749),n=e.i(144267);e.i(32117);var a=e.i(343053),l=e.i(519455),i=e.i(515288),o=e.i(131792),c=e.i(677572),d=e.i(16715),u=e.i(602869),m=e.i(768371),h=e.i(135214),p=e.i(595468),x=e.i(373884);let g=(0,e.i(475254).default)("clipboard-copy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]),y=({responseTimeMs:e})=>null==e?null:(0,t.jsxs)("div",{className:"flex items-center space-x-1 text-xs text-gray-500 font-mono",children:[(0,t.jsx)("svg",{className:"w-4 h-4",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,t.jsx)("path",{d:"M12 6V12L16 14M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2Z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),(0,t.jsxs)("span",{children:[e.toFixed(0),"ms"]})]}),f=e=>{let t=e;if("string"==typeof t)try{t=JSON.parse(t)}catch{}return t},b=({label:e,value:r})=>{let[n,a]=s.default.useState(!1),l=r?.toString()||"N/A",i=l.length>50?l.substring(0,50)+"...":l;return(0,t.jsx)("tr",{className:"hover:bg-muted/50",children:(0,t.jsx)("td",{className:"px-4 py-2 align-top",colSpan:2,children:(0,t.jsxs)("div",{className:"group flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex flex-1 items-center",children:[(0,t.jsx)("button",{onClick:()=>a(!n),className:"mr-2 text-muted-foreground hover:text-foreground",children:n?"▼":"▶"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:e}),(0,t.jsx)("pre",{className:"mt-1 font-mono text-sm whitespace-pre-wrap",children:n?l:i})]})]}),(0,t.jsx)("button",{onClick:()=>{navigator.clipboard.writeText(l)},className:"text-muted-foreground opacity-0 group-hover:opacity-100 hover:text-foreground",children:(0,t.jsx)(g,{className:"size-4"})})]})})})},j=({response:e})=>{let s=null,r={},n={};try{if(e?.error)try{let t="string"==typeof e.error.message?JSON.parse(e.error.message):e.error.message;s={message:t?.message||"Unknown error",traceback:t?.traceback||"No traceback available",litellm_params:t?.litellm_cache_params||{},health_check_cache_params:t?.health_check_cache_params||{}},r=f(s.litellm_params)||{},n=f(s.health_check_cache_params)||{}}catch(t){console.warn("Error parsing error details:",t),s={message:String(e.error.message||"Unknown error"),traceback:"Error parsing details",litellm_params:{},health_check_cache_params:{}}}else r=f(e?.litellm_cache_params)||{},n=f(e?.health_check_cache_params)||{}}catch(e){console.warn("Error in response parsing:",e),r={},n={}}let a={redis_host:n?.redis_client?.connection_pool?.connection_kwargs?.host||n?.redis_async_client?.connection_pool?.connection_kwargs?.host||n?.connection_kwargs?.host||n?.host||"N/A",redis_port:n?.redis_client?.connection_pool?.connection_kwargs?.port||n?.redis_async_client?.connection_pool?.connection_kwargs?.port||n?.connection_kwargs?.port||n?.port||"N/A",redis_version:n?.redis_version||"N/A",startup_nodes:(()=>{try{if(n?.redis_kwargs?.startup_nodes)return JSON.stringify(n.redis_kwargs.startup_nodes);let e=n?.redis_client?.connection_pool?.connection_kwargs?.host||n?.redis_async_client?.connection_pool?.connection_kwargs?.host,t=n?.redis_client?.connection_pool?.connection_kwargs?.port||n?.redis_async_client?.connection_pool?.connection_kwargs?.port;return e&&t?JSON.stringify([{host:e,port:t}]):"N/A"}catch(e){return"N/A"}})(),namespace:n?.namespace||"N/A"};return(0,t.jsx)("div",{className:"rounded-lg bg-card shadow-sm",children:(0,t.jsxs)(c.Tabs,{defaultValue:"summary",children:[(0,t.jsxs)(c.TabsList,{className:"border-b border-border px-4",children:[(0,t.jsx)(c.TabsTrigger,{value:"summary",className:"flex-none",children:"Summary"}),(0,t.jsx)(c.TabsTrigger,{value:"raw",className:"flex-none",children:"Raw Response"})]}),(0,t.jsx)(c.TabsContent,{value:"summary",className:"p-4",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6 flex items-center",children:[e?.status==="healthy"?(0,t.jsx)(p.CheckCircle2,{className:"mr-2 size-5 text-green-600"}):(0,t.jsx)(x.XCircle,{className:"mr-2 size-5 text-destructive"}),(0,t.jsxs)("p",{className:`text-sm font-medium ${e?.status==="healthy"?"text-green-600":"text-destructive"}`,children:["Cache Status: ",e?.status||"unhealthy"]})]}),(0,t.jsx)("table",{className:"w-full border-collapse",children:(0,t.jsxs)("tbody",{children:[s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:2,className:"pt-4 pb-2 font-semibold text-destructive",children:"Error Details"})}),(0,t.jsx)(b,{label:"Error Message",value:s.message}),(0,t.jsx)(b,{label:"Traceback",value:s.traceback})]}),(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:2,className:"pt-4 pb-2 font-semibold",children:"Cache Details"})}),(0,t.jsx)(b,{label:"Cache Configuration",value:String(r?.type)}),(0,t.jsx)(b,{label:"Ping Response",value:String(e.ping_response)}),(0,t.jsx)(b,{label:"Set Cache Response",value:e.set_cache_response||"N/A"}),(0,t.jsx)(b,{label:"litellm_settings.cache_params",value:JSON.stringify(r,null,2)}),r?.type==="redis"&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:2,className:"pt-4 pb-2 font-semibold",children:"Redis Details"})}),(0,t.jsx)(b,{label:"Redis Host",value:a.redis_host||"N/A"}),(0,t.jsx)(b,{label:"Redis Port",value:a.redis_port||"N/A"}),(0,t.jsx)(b,{label:"Redis Version",value:a.redis_version||"N/A"}),(0,t.jsx)(b,{label:"Startup Nodes",value:a.startup_nodes||"N/A"}),(0,t.jsx)(b,{label:"Namespace",value:a.namespace||"N/A"})]})]})})]})}),(0,t.jsx)(c.TabsContent,{value:"raw",className:"p-4",children:(0,t.jsx)("div",{className:"rounded-md bg-muted p-4 font-mono text-sm",children:(0,t.jsx)("pre",{className:"whitespace-pre-wrap wrap-break-word overflow-auto max-h-[500px]",children:(()=>{try{let t={...e,litellm_cache_params:r,health_check_cache_params:n},s=JSON.parse(JSON.stringify(t,(e,t)=>{if("string"==typeof t)try{return JSON.parse(t)}catch{}return t}));return JSON.stringify(s,null,2)}catch(e){return"Error formatting JSON: "+e.message}})()})})})]})})},v=({accessToken:e,healthCheckResponse:r,runCachingHealthCheck:n,responseTimeMs:a})=>{let[i,o]=s.default.useState(null),[c,d]=s.default.useState(!1),u=async()=>{d(!0);let e=performance.now();await n(),o(performance.now()-e),d(!1)};return(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)(l.Button,{onClick:u,disabled:c,children:c?"Running Health Check...":"Run Health Check"}),(0,t.jsx)(y,{responseTimeMs:i})]}),r&&(0,t.jsx)(j,{response:r})]})};var C=e.i(994388),S=e.i(677667),N=e.i(898667),T=e.i(130643),_=e.i(808613),w=e.i(695411),k=e.i(967489);let R={node:"Node (Single Instance)",cluster:"Cluster",sentinel:"Sentinel",semantic:"Semantic"},P=({redisType:e,redisTypeDescriptions:s,onTypeChange:r})=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium",children:"Redis Type"}),(0,t.jsxs)(k.Select,{value:e,onValueChange:e=>null!==e&&r(e),children:[(0,t.jsx)(k.SelectTrigger,{className:"w-full",children:(0,t.jsx)(k.SelectValue,{children:R[e]??e})}),(0,t.jsx)(k.SelectContent,{children:Object.entries(R).map(([e,s])=>(0,t.jsx)(k.SelectItem,{value:e,children:s},e))})]}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:s[e]||"Select the type of Redis deployment you're using"})]});var A=e.i(311451),L=e.i(199133),M=e.i(790848);let E=({field:e,embeddingModels:s,isSecretConfigured:r=!1})=>(0,t.jsx)(_.Form.Item,{name:e.name,label:e.label,extra:e.helpText,rules:e.rules,valuePropName:"boolean"===e.type?"checked":"value",children:((e,s,r)=>{switch(e.type){case"boolean":return(0,t.jsx)(M.Switch,{});case"password":return(0,t.jsx)(A.Input.Password,{placeholder:r,autoComplete:"new-password"});case"integer":case"float":return(0,t.jsx)(A.Input,{inputMode:"decimal",placeholder:r});case"list":return(0,t.jsx)(A.Input.TextArea,{rows:4,placeholder:r});case"model-select":return(0,t.jsx)(L.Select,{showSearch:!0,allowClear:!0,placeholder:"Search and select a model...",options:s,optionFilterProp:"label",style:{width:"100%"}});default:return(0,t.jsx)(A.Input,{placeholder:r})}})(e,s,r?"Already set. Enter a new value to replace it.":e.helpText)}),I=["node","cluster","sentinel","semantic"],F={node:"Standard Redis node/single instance",cluster:"Redis Cluster mode for high availability and horizontal scaling",sentinel:"Redis Sentinel mode for high availability with automatic failover",semantic:"Semantic caching that reuses responses for similar prompts"},O={validator:(e,t)=>{let s;if(null==t||""===String(t).trim())return Promise.resolve();try{s=JSON.parse(String(t))}catch{return Promise.reject(Error("Must be a valid JSON array (use double quotes)"))}return Array.isArray(s)?Promise.resolve():Promise.reject(Error("Must be a JSON array"))}},V={validator:(e,t)=>{if(null==t||""===String(t).trim())return Promise.resolve();let s=Number(t);return!Number.isInteger(s)||s<0?Promise.reject(Error("Must be a non-negative integer")):Promise.resolve()}},D={validator:(e,t)=>null==t||""===String(t).trim()?Promise.resolve():Number.isNaN(Number(t))?Promise.reject(Error("Must be a number")):Promise.resolve()},q=[{name:"url",label:"Redis URL",type:"string",section:"connection",helpText:"Full Redis/Valkey connection URL (e.g. redis://:password@host:6379/1). When set, it takes precedence over Host, Port, Password, and Database Index.",redisType:null,secret:!0},{name:"host",label:"Host",type:"string",section:"connection",helpText:"Redis server hostname or IP address",redisType:null},{name:"port",label:"Port",type:"string",section:"connection",helpText:"Redis server port number",redisType:null,defaultValue:"6379",rules:[{validator:(e,t)=>{if(null==t||""===String(t).trim())return Promise.resolve();let s=Number(t);return!Number.isInteger(s)||s<1||s>65535?Promise.reject(Error("Port must be an integer between 1 and 65535")):Promise.resolve()}}]},{name:"db",label:"Database Index",type:"integer",section:"connection",helpText:"Logical database index to isolate the cache (e.g. 1 for redis://host:6379/1)",redisType:null,rules:[V]},{name:"password",label:"Password",type:"password",section:"connection",helpText:"Redis server password",redisType:null,secret:!0},{name:"username",label:"Username",type:"string",section:"connection",helpText:"Redis server username (if required)",redisType:null},{name:"redis_startup_nodes",label:"Startup Nodes",type:"list",section:"cluster",helpText:'List of startup nodes for Redis Cluster (e.g., [{"host": "127.0.0.1", "port": "7001"}])',redisType:"cluster",rules:[O]},{name:"sentinel_nodes",label:"Sentinel Nodes",type:"list",section:"sentinel",helpText:'List of Sentinel nodes (e.g., [["localhost", 26379]])',redisType:"sentinel",rules:[O]},{name:"service_name",label:"Service Name",type:"string",section:"sentinel",helpText:"Master service name for Redis Sentinel",redisType:"sentinel"},{name:"sentinel_password",label:"Sentinel Password",type:"password",section:"sentinel",helpText:"Password for Redis Sentinel authentication",redisType:"sentinel",secret:!0},{name:"similarity_threshold",label:"Similarity Threshold",type:"float",section:"semantic",helpText:"Similarity threshold for semantic cache",redisType:"semantic",defaultValue:.8,rules:[D]},{name:"redis_semantic_cache_embedding_model",label:"Embedding Model",type:"model-select",section:"semantic",helpText:"Embedding model for semantic cache",redisType:"semantic"},{name:"ssl",label:"SSL",type:"boolean",section:"ssl",helpText:"Enable SSL/TLS connection",redisType:null,defaultValue:!1},{name:"ssl_cert_reqs",label:"SSL Cert Reqs",type:"string",section:"ssl",helpText:"SSL certificate requirements (None, CERT_REQUIRED, CERT_OPTIONAL)",redisType:null},{name:"ssl_check_hostname",label:"SSL Check Hostname",type:"boolean",section:"ssl",helpText:"Enable SSL hostname verification",redisType:null,defaultValue:!1},{name:"namespace",label:"Namespace",type:"string",section:"cacheManagement",helpText:"Namespace prefix for cache keys",redisType:null},{name:"ttl",label:"TTL (seconds)",type:"float",section:"cacheManagement",helpText:"Time-to-live for cached items in seconds",redisType:null,rules:[D]},{name:"max_connections",label:"Max Connections",type:"integer",section:"cacheManagement",helpText:"Maximum number of connections in the connection pool",redisType:null,rules:[V]},{name:"gcp_service_account",label:"GCP Service Account",type:"string",section:"gcp",helpText:"GCP service account for IAM authentication (e.g., projects/-/serviceAccounts/your-sa@project.iam.gserviceaccount.com)",redisType:null},{name:"gcp_ssl_ca_certs",label:"GCP SSL CA Certs",type:"string",section:"gcp",helpText:"Path to SSL CA certificate file for GCP Memorystore Redis",redisType:null}],B=(e,t)=>null===e.redisType||e.redisType===t,J=(e,t,{forTesting:s})=>({type:s||"semantic"!==e?"redis":"redis-semantic",...Object.fromEntries(q.filter(t=>B(t,e)).flatMap(e=>{let s=((e,t)=>{if(e.secret&&"***REDACTED***"===t)return;if("boolean"===e.type)return!!t;if("list"===e.type){if("string"!=typeof t||""===t.trim())return;try{return JSON.parse(t)}catch{return}}if("integer"===e.type||"float"===e.type){if(null==t||""===t)return;let e=Number(t);return Number.isNaN(e)?void 0:e}if("string"!=typeof t)return void 0===t?void 0:String(t);let s=t.trim();return""===s?void 0:s})(e,t[e.name]);return void 0===s?[]:[[e.name,s]]}))}),H=({title:e,section:s,redisType:r,embeddingModels:n,gridCols:a="grid-cols-1 gap-6 sm:grid-cols-2",headingLevel:l="h4",configuredSecrets:i})=>{let o=q.filter(e=>e.section===s&&B(e,r));return 0===o.length?null:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(l,{className:"text-sm font-medium text-gray-900",children:e}),(0,t.jsx)("div",{className:`grid ${a}`,children:o.map(e=>(0,t.jsx)(E,{field:e,embeddingModels:n,isSecretConfigured:i?.has(e.name)??!1},e.name))})]})},U=e=>I.includes(e)?e:"node",$=({accessToken:e})=>{let[n]=_.Form.useForm(),[a,l]=(0,s.useState)("node"),[i,o]=(0,s.useState)([]),[c,d]=(0,s.useState)(!1),[m,h]=(0,s.useState)(!1),[p,x]=(0,s.useState)(new Set),g=(0,s.useCallback)(async()=>{if(e)try{let t=(await (0,u.getCacheSettingsCall)(e)).current_values??{};n.setFieldsValue(Object.fromEntries(q.map(e=>[e.name,((e,t)=>{if(e.secret)return"";let s=t??e.defaultValue;return"boolean"===e.type?!0===s||"true"===s:"list"===e.type?null==s||""===s?"":"string"==typeof s?s:JSON.stringify(s,null,2):null==s?"":String(s)})(e,t[e.name])]))),x(new Set(q.filter(e=>{let s;return e.secret&&null!=(s=t[e.name])&&""!==s}).map(e=>e.name))),l(U(t.redis_type))}catch(e){console.error("Failed to load cache settings:",e),r.default.fromBackend("Failed to load cache settings")}},[e,n]);(0,s.useEffect)(()=>{g()},[g]),(0,s.useEffect)(()=>{e&&(0,w.fetchAvailableModels)(e).then(e=>o(e.filter(e=>"embedding"===e.mode).map(e=>({value:e.model_group,label:e.model_group})))).catch(e=>console.error("Error fetching embedding models:",e))},[e]);let y=async()=>{try{return await n.validateFields()}catch{return null}},f=async()=>{if(!e)return;let t=await y();if(null!==t){d(!0);try{let s=await (0,u.testCacheConnectionCall)(e,J(a,t,{forTesting:!0}));"success"===s.status?r.default.success("Cache connection test successful!"):r.default.fromBackend(`Connection test failed: ${s.message||s.error}`)}catch(e){console.error("Test connection error:",e),r.default.fromBackend(`Connection test failed: ${e instanceof Error?e.message:"Unknown error"}`)}finally{d(!1)}}},b=async()=>{if(!e)return;let t=await y();if(null!==t){h(!0);try{await (0,u.updateCacheSettingsCall)(e,J(a,t,{forTesting:!1})),r.default.success("Cache settings updated successfully"),await g()}catch(e){console.error("Failed to save cache settings:",e),r.default.fromBackend("Failed to update cache settings")}finally{h(!1)}}};return e?(0,t.jsxs)("div",{className:"w-full space-y-8 py-2",children:[(0,t.jsxs)(_.Form,{form:n,layout:"vertical",requiredMark:!1,className:"space-y-6",children:[(0,t.jsxs)("div",{className:"max-w-3xl",children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-gray-900",children:"Cache Settings"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-1",children:"Configure Redis cache for LiteLLM"})]}),(0,t.jsx)(P,{redisType:a,redisTypeDescriptions:F,onTypeChange:e=>l(U(e))}),(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(H,{title:"Connection Settings",section:"connection",redisType:a,embeddingModels:i,configuredSecrets:p})}),"cluster"===a&&(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(H,{title:"Cluster Configuration",section:"cluster",redisType:a,embeddingModels:i,gridCols:"grid-cols-1 gap-6"})}),"sentinel"===a&&(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(H,{title:"Sentinel Configuration",section:"sentinel",redisType:a,embeddingModels:i,configuredSecrets:p})}),"semantic"===a&&(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(H,{title:"Semantic Configuration",section:"semantic",redisType:a,embeddingModels:i})}),(0,t.jsxs)(S.Accordion,{className:"mt-4",children:[(0,t.jsx)(N.AccordionHeader,{children:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900",children:"Advanced Settings"})}),(0,t.jsx)(T.AccordionBody,{children:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(H,{title:"SSL Settings",section:"ssl",redisType:a,embeddingModels:i,headingLevel:"h5"}),(0,t.jsx)(H,{title:"Cache Management",section:"cacheManagement",redisType:a,embeddingModels:i,headingLevel:"h5"}),(0,t.jsx)(H,{title:"GCP Authentication",section:"gcp",redisType:a,embeddingModels:i,headingLevel:"h5"})]})})]})]}),(0,t.jsxs)("div",{className:"border-t border-gray-200 pt-6 flex justify-end gap-3",children:[(0,t.jsx)(C.Button,{variant:"secondary",size:"sm",onClick:f,disabled:c,className:"text-sm",children:c?"Testing...":"Test Connection"}),(0,t.jsx)(C.Button,{size:"sm",onClick:b,disabled:m,className:"text-sm font-medium",children:m?"Saving...":"Save Changes"})]})]}):null};var z=e.i(464571),G=e.i(112179),K=e.i(954616),Q=e.i(266027),W=e.i(912598);let X=(0,e.i(243652).createQueryKeys)("coordinationRedis"),Z=({field:e,isSecretConfigured:s})=>(0,t.jsx)(_.Form.Item,{name:e.name,label:e.label,extra:e.helpText,rules:e.rules,valuePropName:"boolean"===e.type?"checked":"value",children:((e,s)=>{switch(e.type){case"boolean":return(0,t.jsx)(M.Switch,{});case"password":return(0,t.jsx)(A.Input.Password,{placeholder:s,autoComplete:"new-password"});case"integer":return(0,t.jsx)(A.Input,{inputMode:"numeric",placeholder:s});case"list":return(0,t.jsx)(A.Input.TextArea,{rows:4,placeholder:s});default:return(0,t.jsx)(A.Input,{placeholder:s})}})(e,s?"Already set. Enter a new value to replace it.":e.helpText)}),Y=["node","cluster","sentinel"],ee={node:"Standard Redis node/single instance",cluster:"Redis Cluster mode for high availability and horizontal scaling",sentinel:"Redis Sentinel mode for high availability with automatic failover"},et={node:"Node (Single Instance)",cluster:"Cluster",sentinel:"Sentinel"},es={validator:(e,t)=>{let s;if(null==t||""===String(t).trim())return Promise.resolve();try{s=JSON.parse(String(t))}catch{return Promise.reject(Error("Must be a valid JSON array (use double quotes)"))}return Array.isArray(s)?Promise.resolve():Promise.reject(Error("Must be a JSON array"))}},er=[{name:"url",label:"Redis URL",type:"password",section:"connection",helpText:"Full Redis/Valkey connection URL (e.g. redis://:password@host:6379/1). When set, it takes precedence over Host, Port, Username, and Password.",redisType:null,secret:!0},{name:"host",label:"Host",type:"string",section:"connection",helpText:"Redis server hostname or IP address",redisType:null,secret:!1},{name:"port",label:"Port",type:"integer",section:"connection",helpText:"Redis server port number",redisType:null,secret:!1,defaultValue:"6379",rules:[{validator:(e,t)=>{if(null==t||""===String(t).trim())return Promise.resolve();let s=Number(t);return!Number.isInteger(s)||s<1||s>65535?Promise.reject(Error("Port must be an integer between 1 and 65535")):Promise.resolve()}}]},{name:"username",label:"Username",type:"string",section:"connection",helpText:"Redis server username (if required)",redisType:null,secret:!1},{name:"password",label:"Password",type:"password",section:"connection",helpText:"Redis server password",redisType:null,secret:!0},{name:"startup_nodes",label:"Startup Nodes",type:"list",section:"cluster",helpText:'List of startup nodes for Redis Cluster (e.g., [{"host": "127.0.0.1", "port": 7001}])',redisType:"cluster",secret:!1,rules:[es]},{name:"sentinel_nodes",label:"Sentinel Nodes",type:"list",section:"sentinel",helpText:'List of Sentinel nodes (e.g., [["localhost", 26379]])',redisType:"sentinel",secret:!1,rules:[es]},{name:"service_name",label:"Service Name",type:"string",section:"sentinel",helpText:"Master service name for Redis Sentinel",redisType:"sentinel",secret:!1},{name:"sentinel_password",label:"Sentinel Password",type:"password",section:"sentinel",helpText:"Password for Redis Sentinel authentication",redisType:"sentinel",secret:!0},{name:"ssl",label:"SSL",type:"boolean",section:"ssl",helpText:"Enable SSL/TLS connection",redisType:null,secret:!1,defaultValue:!1}],en=(e,t)=>null===e.redisType||e.redisType===t,ea=e=>{let t=Array.isArray(e)&&0===e.length;return null!=e&&""!==e&&!t},el=(e,t)=>Object.fromEntries(er.filter(t=>en(t,e)).flatMap(e=>{let s=((e,t)=>{if(e.secret&&"***REDACTED***"===t)return;if("boolean"===e.type)return!!t;if("list"===e.type){if("string"!=typeof t||""===t.trim())return;try{return JSON.parse(t)}catch{return}}if("integer"===e.type){if(null==t||""===t)return;let e=Number(t);return Number.isNaN(e)?void 0:e}if("string"!=typeof t)return void 0===t?void 0:String(t);let s=t.trim();return""===s?void 0:s})(e,t[e.name]);return void 0===s?[]:[[e.name,s]]})),ei={coordination_redis:{tone:"success",label:"Configured here",tooltip:"general_settings.coordination_redis is set, so coordination uses its own Redis connection."},cache_backend:{tone:"info",label:"Borrowed from response cache",tooltip:"No coordination Redis is configured; the proxy reuses the response cache's Redis connection."},environment:{tone:"info",label:"From REDIS_* environment",tooltip:"No coordination Redis is configured; the proxy falls back to the REDIS_* environment variables."}},eo={tone:"neutral",label:"Not configured",tooltip:"Cross-pod rate limits, spend tracking, and the pod lock manager have no Redis to coordinate through."},ec=({title:e,section:s,redisType:r,configuredSecrets:n,gridCols:a="grid-cols-1 gap-6 sm:grid-cols-2",headingLevel:l="h4"})=>{let i=er.filter(e=>e.section===s&&en(e,r));return 0===i.length?null:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(l,{className:"text-sm font-medium text-gray-900",children:e}),(0,t.jsx)("div",{className:`grid ${a}`,children:i.map(e=>(0,t.jsx)(Z,{field:e,isSecretConfigured:n.has(e.name)},e.name))})]})},ed=({redisType:e,onTypeChange:s})=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{htmlFor:"coordination-redis-type",className:"text-sm font-medium",children:"Redis Type"}),(0,t.jsxs)(k.Select,{value:e,onValueChange:e=>null!==e&&s(e),children:[(0,t.jsx)(k.SelectTrigger,{id:"coordination-redis-type",className:"w-full",children:(0,t.jsx)(k.SelectValue,{children:et[e]})}),(0,t.jsx)(k.SelectContent,{children:Y.map(e=>(0,t.jsx)(k.SelectItem,{value:e,children:et[e]},e))})]}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:ee[e]})]}),eu=()=>{var e,n;let[a]=_.Form.useForm(),[l,i]=(0,s.useState)(null),{data:o,isLoading:c,isError:d}=(()=>{let{accessToken:e}=(0,h.default)();return(0,Q.useQuery)({queryKey:X.list({}),queryFn:async()=>(0,u.getCoordinationRedisSettingsCall)(e),enabled:!!e})})(),m=(()=>{let{accessToken:e}=(0,h.default)(),t=(0,W.useQueryClient)();return(0,K.useMutation)({mutationFn:async t=>(0,u.updateCoordinationRedisSettingsCall)(e,t),onSuccess:()=>t.invalidateQueries({queryKey:X.all})})})(),p=(()=>{let{accessToken:e}=(0,h.default)();return(0,K.useMutation)({mutationFn:async t=>(0,u.testCoordinationRedisConnectionCall)(e,t)})})(),x=l??(ea((e=o?.values??{}).sentinel_nodes)?"sentinel":ea(e.startup_nodes)?"cluster":"node");(0,s.useEffect)(()=>{let e;o&&a.setFieldsValue((e=o.values,Object.fromEntries(er.map(t=>[t.name,((e,t)=>{if(e.secret)return"";let s=t??e.defaultValue;return"boolean"===e.type?!0===s||"true"===s:"list"===e.type?ea(s)?"string"==typeof s?s:JSON.stringify(s,null,2):"":null==s?"":String(s)})(t,e[t.name])]))))},[o,a]),(0,s.useEffect)(()=>{d&&r.default.fromBackend("Failed to load coordination Redis settings")},[d]);let g=async()=>{try{return await a.validateFields()}catch{return null}},y=async()=>{let e=await g();if(null!==e)try{let t=await p.mutateAsync(el(x,e));"healthy"===t.status?r.default.success("Coordination Redis connection test successful!"):r.default.fromBackend(`Connection test failed: ${t.error??"Unknown error"}`)}catch(e){r.default.fromBackend(`Connection test failed: ${e instanceof Error?e.message:"Unknown error"}`)}},f=async()=>{let e=await g();if(null!==e)try{await m.mutateAsync(el(x,e)),r.default.success("Coordination Redis settings saved. Restart the proxy to apply them.")}catch{r.default.fromBackend("Failed to update coordination Redis settings")}},b=(n=o?.source)&&ei[n]||eo,j=(0,s.useMemo)(()=>{let e;return e=o?.values??{},new Set(er.filter(t=>t.secret&&ea(e[t.name])).map(e=>e.name))},[o]);return(0,t.jsxs)("div",{className:"w-full space-y-8 py-2",children:[(0,t.jsxs)(_.Form,{form:a,layout:"vertical",requiredMark:!1,className:"space-y-6",children:[(0,t.jsxs)("div",{className:"max-w-3xl space-y-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-gray-900",children:"Coordination Redis"}),!c&&(0,t.jsx)(G.StatusBadge,{tone:b.tone,label:b.label,dataTestId:"coordination-redis-source"})]}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"Redis used to coordinate work across proxy pods: cross-pod rate limits, spend tracking, and the pod lock manager. It is configured independently of the response cache."}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:b.tooltip}),(0,t.jsx)("p",{className:"text-xs text-amber-600",children:"Saved changes take effect on proxy restart."})]}),(0,t.jsx)(ed,{redisType:x,onTypeChange:i}),(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(ec,{title:"Connection Settings",section:"connection",redisType:x,configuredSecrets:j})}),"cluster"===x&&(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(ec,{title:"Cluster Configuration",section:"cluster",redisType:x,configuredSecrets:j,gridCols:"grid-cols-1 gap-6"})}),"sentinel"===x&&(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(ec,{title:"Sentinel Configuration",section:"sentinel",redisType:x,configuredSecrets:j})}),(0,t.jsx)("div",{className:"pt-4 border-t border-gray-200",children:(0,t.jsx)(ec,{title:"SSL Settings",section:"ssl",redisType:x,configuredSecrets:j})})]}),(0,t.jsxs)("div",{className:"border-t border-gray-200 pt-6 flex justify-end gap-3",children:[(0,t.jsx)(z.Button,{onClick:y,loading:p.isPending,children:p.isPending?"Testing...":"Test Connection"}),(0,t.jsx)(z.Button,{type:"primary",onClick:f,loading:m.isPending,children:m.isPending?"Saving...":"Save Changes"})]})]})},em="LLM API requests",eh="Cache hit",ep="Failed requests",ex=e=>({name:e.call_type,[em]:e.api_requests,[eh]:e.cache_hits,[ep]:e.failed_requests,"Cached Completion Tokens":e.cached_completion_tokens,"Generated Completion Tokens":e.generated_completion_tokens}),eg=e=>{if(e)return e.toISOString().split("T")[0]};function ey(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}let ef=({accessToken:e,token:p,userRole:x,userID:g,premiumUser:y})=>{let[f,b]=(0,s.useState)([]),[j,C]=(0,s.useState)([]),[S,N]=(0,s.useState)({from:new Date(Date.now()-6048e5),to:new Date}),[T,_]=(0,s.useState)(""),[w,k]=(0,s.useState)(""),{data:R,refetch:P}=(({startDate:e,endDate:t,keyAliases:s,models:r})=>{let{accessToken:n}=(0,h.default)();return m.$api.useQuery("get","/global/activity/cache_hits",{params:{query:{start_date:e??"",end_date:t??"",key_aliases:s,models:r}}},{enabled:!!(n&&e&&t)})})({startDate:eg(S.from),endDate:eg(S.to),keyAliases:f,models:j});(0,s.useEffect)(()=>{_(new Date().toLocaleString())},[]);let A=R?.filter_options.key_aliases??[],L=R?.filter_options.models??[],M=(R?.groups??[]).map(ex),E=async()=>{try{r.default.info("Running cache health check..."),k("");let t=await (0,u.cachingHealthCheckCall)(null!==e?e:"");k(t)}catch(t){let e;if(console.error("Error running health check:",t),t&&t.message)try{let s=JSON.parse(t.message);s.error&&(s=s.error),e=s}catch(s){e={message:t.message}}else e={message:"Unknown error occurred"};k({error:e})}},I=R?.totals,F=null!=I&&I.api_requests+I.cache_hits+I.failed_requests>0,O=[{label:"Cache Hit Ratio",value:`${F?I.cache_hit_ratio.toFixed(2):"0"}%`},{label:"Cache Hits",value:ey(I?.cache_hits??0)},{label:"Cached Completion Tokens",value:ey(I?.cached_completion_tokens??0)}];return(0,t.jsxs)(c.Tabs,{defaultValue:"analytics",className:"mt-2 mb-8 w-full gap-2 p-8",children:[(0,t.jsxs)("div",{className:"mt-2 flex w-full items-center justify-between",children:[(0,t.jsxs)(c.TabsList,{children:[(0,t.jsx)(c.TabsTrigger,{value:"analytics",className:"flex-none",children:"Cache Analytics"}),(0,t.jsx)(c.TabsTrigger,{value:"health",className:"flex-none",children:"Cache Health"}),(0,t.jsx)(c.TabsTrigger,{value:"settings",className:"flex-none",children:"Cache Settings"}),(0,t.jsx)(c.TabsTrigger,{value:"coordination",className:"flex-none",children:"Coordination Redis"})]}),(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[T&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Last Refreshed: ",T]}),(0,t.jsx)(l.Button,{variant:"outline",size:"icon-sm",onClick:()=>{P(),_(new Date().toLocaleString())},"aria-label":"Refresh",children:(0,t.jsx)(d.RefreshCw,{})})]})]}),(0,t.jsx)(c.TabsContent,{value:"analytics",children:(0,t.jsx)(i.Card,{children:(0,t.jsxs)(i.CardContent,{children:[(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Analytics for LiteLLM's"," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/caching",target:"_blank",rel:"noreferrer",className:"underline",children:"response cache"})," ","(e.g. Redis / in-memory): requests answered from cache without calling the LLM provider. Provider-side"," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/completion/prompt_caching",target:"_blank",rel:"noreferrer",className:"underline",children:"prompt caching"})," ",'(cached input tokens from Anthropic, OpenAI, etc.) is not shown here; see "Prompt Caching Metrics" on the Usage page or individual requests in the Logs page.']}),(0,t.jsxs)("div",{className:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-3",children:[(0,t.jsxs)(o.Combobox,{multiple:!0,items:A,value:f,onValueChange:e=>b(e),children:[(0,t.jsxs)(o.ComboboxChips,{children:[(0,t.jsx)(o.ComboboxValue,{children:e=>e.map(e=>(0,t.jsx)(o.ComboboxChip,{"aria-label":e,children:e},e))}),(0,t.jsx)(o.ComboboxChipsInput,{placeholder:"Select Virtual Keys",className:"border-0 bg-transparent"})]}),(0,t.jsxs)(o.ComboboxContent,{children:[(0,t.jsx)(o.ComboboxEmpty,{children:"No virtual keys found"}),(0,t.jsx)(o.ComboboxList,{children:e=>(0,t.jsx)(o.ComboboxItem,{value:e,children:e},e)})]})]}),(0,t.jsxs)(o.Combobox,{multiple:!0,items:L,value:j,onValueChange:e=>C(e),children:[(0,t.jsxs)(o.ComboboxChips,{children:[(0,t.jsx)(o.ComboboxValue,{children:e=>e.map(e=>(0,t.jsx)(o.ComboboxChip,{"aria-label":e,children:e},e))}),(0,t.jsx)(o.ComboboxChipsInput,{placeholder:"Select Models",className:"border-0 bg-transparent"})]}),(0,t.jsxs)(o.ComboboxContent,{children:[(0,t.jsx)(o.ComboboxEmpty,{children:"No models found"}),(0,t.jsx)(o.ComboboxList,{children:e=>(0,t.jsx)(o.ComboboxItem,{value:e,children:e},e)})]})]}),(0,t.jsx)(n.default,{value:S,onValueChange:e=>{N(e)}})]}),(0,t.jsx)("div",{className:"mt-4 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3",children:O.map(e=>(0,t.jsx)(i.Card,{children:(0,t.jsxs)(i.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:e.label}),(0,t.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,t.jsx)("p",{className:"text-3xl font-semibold",children:e.value})})]})},e.label))}),(0,t.jsxs)(i.Card,{className:"mt-4",children:[(0,t.jsx)(i.CardHeader,{children:(0,t.jsx)(i.CardTitle,{className:"text-base font-semibold",children:"Cache Hits vs API Requests"})}),(0,t.jsx)(i.CardContent,{children:(0,t.jsx)(a.BarChart,{data:M,stack:!0,index:"name",valueFormatter:ey,categories:[em,eh,ep],colors:["sky","teal","red"],yAxisWidth:48})})]}),(0,t.jsxs)(i.Card,{className:"mt-6",children:[(0,t.jsx)(i.CardHeader,{children:(0,t.jsx)(i.CardTitle,{className:"text-base font-semibold",children:"Cached Completion Tokens vs Generated Completion Tokens"})}),(0,t.jsx)(i.CardContent,{children:(0,t.jsx)(a.BarChart,{data:M,stack:!0,index:"name",valueFormatter:ey,categories:["Generated Completion Tokens","Cached Completion Tokens"],colors:["sky","teal"],yAxisWidth:48})})]})]})})}),(0,t.jsx)(c.TabsContent,{value:"health",children:(0,t.jsx)(v,{accessToken:e,healthCheckResponse:w,runCachingHealthCheck:E})}),(0,t.jsx)(c.TabsContent,{value:"settings",children:(0,t.jsx)($,{accessToken:e,userRole:x,userID:g})}),(0,t.jsx)(c.TabsContent,{value:"coordination",children:(0,t.jsx)(eu,{})})]})};e.s(["default",0,function(){let{accessToken:e,userRole:s,userId:r,token:n,premiumUser:a}=(0,h.default)();return(0,t.jsx)(ef,{userID:r,userRole:s,token:n,accessToken:e,premiumUser:a})}],254709)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/03kaz3d0v3z45.js b/litellm/proxy/_experimental/out/_next/static/chunks/03kaz3d0v3z45.js deleted file mode 100644 index ea09603b861..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/03kaz3d0v3z45.js +++ /dev/null @@ -1,10 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,270377,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:"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=i.forwardRef(function(e,r){return i.createElement(l.default,(0,t.default)({},e,{ref:r,icon:a}))});e.s(["ExclamationCircleOutlined",0,r],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(343794),a=e.i(529681),l=e.i(242064),r=e.i(517455),s=e.i(185793),n=e.i(721369),o=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i};let d=e=>{var{prefixCls:a,className:r,hoverable:s=!0}=e,n=o(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(l.ConfigContext),c=d("card",a),u=(0,i.default)(`${c}-grid`,r,{[`${c}-grid-hoverable`]:s});return t.createElement("div",Object.assign({},n,{className:u}))};e.i(296059);var c=e.i(915654),u=e.i(183293),A=e.i(246422),g=e.i(838378);let h=(0,A.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:i,cardHeadPadding:a,colorBorderSecondary:l,boxShadowTertiary:r,bodyPadding:s,extraColor:n}=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:i,headerHeight:a,headerPadding:l,tabsMarginBottom:r}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:a,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),{[` - > ${i}-typography, - > ${i}-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,c.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:n,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:s,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:i,cardShadow:a,lineWidth:l}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` - ${(0,c.unit)(l)} 0 0 0 ${i}, - 0 ${(0,c.unit)(l)} 0 0 ${i}, - ${(0,c.unit)(l)} ${(0,c.unit)(l)} 0 0 ${i}, - ${(0,c.unit)(l)} 0 0 0 ${i} inset, - 0 ${(0,c.unit)(l)} 0 0 ${i} inset; - `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:a}}})(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:i,actionsLiMargin:a,cardActionsIconSize:l,colorBorderSecondary:r,actionsBg:s}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:s,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${r}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:a,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), > ${i}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,c.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${i}`]:{fontSize:l,lineHeight:(0,c.unit)(e.calc(l).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${r}`}}})})(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:i}},[`${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:a}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:i,headerPadding:a,bodyPadding:l}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(a)}`,background:i,"&-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:i,headerPaddingSM:a,headerHeightSM:l,headerFontSizeSM:r}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:l,padding:`0 ${(0,c.unit)(a)}`,fontSize:r,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:i}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,i;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!=(i=e.headerPadding)?i:e.paddingLG}});var m=e.i(792812),f=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i};let p=e=>{let{actionClasses:i,actions:a=[],actionStyle:l}=e;return t.createElement("ul",{className:i,style:l},a.map((e,i)=>{let l=`action-${i}`;return t.createElement("li",{style:{width:`${100/a.length}%`},key:l},t.createElement("span",null,e))}))},b=t.forwardRef((e,o)=>{let c,{prefixCls:u,className:A,rootClassName:g,style:b,extra:x,headStyle:O={},bodyStyle:y={},title:v,loading:E,bordered:C,variant:I,size:w,type:S,cover:R,actions:L,tabList:B,children:k,activeTabKey:_,defaultActiveTabKey:T,tabBarExtraContent:j,hoverable:M,tabProps:$={},classNames:H,styles:N}=e,P=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:z,direction:D,card:U}=t.useContext(l.ConfigContext),[W]=(0,m.default)("card",I,C),q=e=>{var t;return(0,i.default)(null==(t=null==U?void 0:U.classNames)?void 0:t[e],null==H?void 0:H[e])},G=e=>{var t;return Object.assign(Object.assign({},null==(t=null==U?void 0:U.styles)?void 0:t[e]),null==N?void 0:N[e])},F=t.useMemo(()=>{let e=!1;return t.Children.forEach(k,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[k]),Q=z("card",u),[V,K,Y]=h(Q),J=t.createElement(s.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},k),X=void 0!==_,Z=Object.assign(Object.assign({},$),{[X?"activeKey":"defaultActiveKey"]:X?_:T,tabBarExtraContent:j}),ee=(0,r.default)(w),et=ee&&"default"!==ee?ee:"large",ei=B?t.createElement(n.default,Object.assign({size:et},Z,{className:`${Q}-head-tabs`,onChange:t=>{var i;null==(i=e.onTabChange)||i.call(e,t)},items:B.map(e=>{var{tab:t}=e;return Object.assign({label:t},f(e,["tab"]))})})):null;if(v||x||ei){let e=(0,i.default)(`${Q}-head`,q("header")),a=(0,i.default)(`${Q}-head-title`,q("title")),l=(0,i.default)(`${Q}-extra`,q("extra")),r=Object.assign(Object.assign({},O),G("header"));c=t.createElement("div",{className:e,style:r},t.createElement("div",{className:`${Q}-head-wrapper`},v&&t.createElement("div",{className:a,style:G("title")},v),x&&t.createElement("div",{className:l,style:G("extra")},x)),ei)}let ea=(0,i.default)(`${Q}-cover`,q("cover")),el=R?t.createElement("div",{className:ea,style:G("cover")},R):null,er=(0,i.default)(`${Q}-body`,q("body")),es=Object.assign(Object.assign({},y),G("body")),en=t.createElement("div",{className:er,style:es},E?J:k),eo=(0,i.default)(`${Q}-actions`,q("actions")),ed=(null==L?void 0:L.length)?t.createElement(p,{actionClasses:eo,actionStyle:G("actions"),actions:L}):null,ec=(0,a.default)(P,["onTabChange"]),eu=(0,i.default)(Q,null==U?void 0:U.className,{[`${Q}-loading`]:E,[`${Q}-bordered`]:"borderless"!==W,[`${Q}-hoverable`]:M,[`${Q}-contain-grid`]:F,[`${Q}-contain-tabs`]:null==B?void 0:B.length,[`${Q}-${ee}`]:ee,[`${Q}-type-${S}`]:!!S,[`${Q}-rtl`]:"rtl"===D},A,g,K,Y),eA=Object.assign(Object.assign({},null==U?void 0:U.style),b);return V(t.createElement("div",Object.assign({ref:o},ec,{className:eu,style:eA}),c,el,en,ed))});var x=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i};b.Grid=d,b.Meta=e=>{let{prefixCls:a,className:r,avatar:s,title:n,description:o}=e,d=x(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(l.ConfigContext),u=c("card",a),A=(0,i.default)(`${u}-meta`,r),g=s?t.createElement("div",{className:`${u}-meta-avatar`},s):null,h=n?t.createElement("div",{className:`${u}-meta-title`},n):null,m=o?t.createElement("div",{className:`${u}-meta-description`},o):null,f=h||m?t.createElement("div",{className:`${u}-meta-detail`},h,m):null;return t.createElement("div",Object.assign({},d,{className:A}),g,f)},e.s(["Card",0,b],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(343794),a=e.i(908206),l=e.i(242064),r=e.i(517455),s=e.i(150073);let n={xxl:3,xl:3,lg:3,md:3,sm:2,xs:1},o=t.default.createContext({});var d=e.i(876556),c=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i},u=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i};let A=e=>{let{itemPrefixCls:a,component:l,span:r,className:s,style:n,labelStyle:d,contentStyle:c,bordered:u,label:A,content:g,colon:h,type:m,styles:f}=e,{classNames:p}=t.useContext(o),b=Object.assign(Object.assign({},d),null==f?void 0:f.label),x=Object.assign(Object.assign({},c),null==f?void 0:f.content);if(u)return t.createElement(l,{colSpan:r,style:n,className:(0,i.default)(s,{[`${a}-item-${m}`]:"label"===m||"content"===m,[null==p?void 0:p.label]:(null==p?void 0:p.label)&&"label"===m,[null==p?void 0:p.content]:(null==p?void 0:p.content)&&"content"===m})},null!=A&&t.createElement("span",{style:b},A),null!=g&&t.createElement("span",{style:x},g));return t.createElement(l,{colSpan:r,style:n,className:(0,i.default)(`${a}-item`,s)},t.createElement("div",{className:`${a}-item-container`},null!=A&&t.createElement("span",{style:b,className:(0,i.default)(`${a}-item-label`,null==p?void 0:p.label,{[`${a}-item-no-colon`]:!h})},A),null!=g&&t.createElement("span",{style:x,className:(0,i.default)(`${a}-item-content`,null==p?void 0:p.content)},g)))};function g(e,{colon:i,prefixCls:a,bordered:l},{component:r,type:s,showLabel:n,showContent:o,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:g,prefixCls:h=a,className:m,style:f,labelStyle:p,contentStyle:b,span:x=1,key:O,styles:y},v)=>"string"==typeof r?t.createElement(A,{key:`${s}-${O||v}`,className:m,style:f,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),p),null==y?void 0:y.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),b),null==y?void 0:y.content)},span:x,colon:i,component:r,itemPrefixCls:h,bordered:l,label:n?e:null,content:o?g:null,type:s}):[t.createElement(A,{key:`label-${O||v}`,className:m,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),p),null==y?void 0:y.label),span:1,colon:i,component:r[0],itemPrefixCls:h,bordered:l,label:e,type:"label"}),t.createElement(A,{key:`content-${O||v}`,className:m,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),f),b),null==y?void 0:y.content),span:2*x-1,component:r[1],itemPrefixCls:h,bordered:l,content:g,type:"content"})])}let h=e=>{let i=t.useContext(o),{prefixCls:a,vertical:l,row:r,index:s,bordered:n}=e;return l?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${s}`,className:`${a}-row`},g(r,e,Object.assign({component:"th",type:"label",showLabel:!0},i))),t.createElement("tr",{key:`content-${s}`,className:`${a}-row`},g(r,e,Object.assign({component:"td",type:"content",showContent:!0},i)))):t.createElement("tr",{key:s,className:`${a}-row`},g(r,e,Object.assign({component:n?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},i)))};e.i(296059);var m=e.i(915654),f=e.i(183293),p=e.i(246422),b=e.i(838378);let x=(0,p.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:i,itemPaddingBottom:a,itemPaddingEnd:l,colonMarginRight:r,colonMarginLeft:s,titleMarginBottom:n}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,f.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:i}=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:i,"&::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:n},[`${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:i,fontSize:e.fontSize},[`${t}-view`]:{width:"100%",borderRadius:e.borderRadiusLG,table:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse"}},[`${t}-row`]:{"> th, > td":{paddingBottom:a,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)(s)} ${(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,b.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 O=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[l]]=e[a[l]]);return i};let y=e=>{let A,{prefixCls:g,title:m,extra:f,column:p,colon:b=!0,bordered:y,layout:v,children:E,className:C,rootClassName:I,style:w,size:S,labelStyle:R,contentStyle:L,styles:B,items:k,classNames:_}=e,T=O(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:j,direction:M,className:$,style:H,classNames:N,styles:P}=(0,l.useComponentConfig)("descriptions"),z=j("descriptions",g),D=(0,s.default)(),U=t.useMemo(()=>{var e;return"number"==typeof p?p:null!=(e=(0,a.matchScreen)(D,Object.assign(Object.assign({},n),p)))?e:3},[D,p]),W=(A=t.useMemo(()=>k||(0,d.default)(E).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[k,E]),t.useMemo(()=>A.map(e=>{var{span:t}=e,i=c(e,["span"]);return"filled"===t?Object.assign(Object.assign({},i),{filled:!0}):Object.assign(Object.assign({},i),{span:"number"==typeof t?t:(0,a.matchScreen)(D,t)})}),[A,D])),q=(0,r.default)(S),G=((e,i)=>{let[a,l]=(0,t.useMemo)(()=>{let t,a,l,r;return t=[],a=[],l=!1,r=0,i.filter(e=>e).forEach(i=>{let{filled:s}=i,n=u(i,["filled"]);if(s){a.push(n),t.push(a),a=[],r=0;return}let o=e-r;(r+=i.span||1)>=e?(r>e?(l=!0,a.push(Object.assign(Object.assign({},n),{span:o}))):a.push(n),t.push(a),a=[],r=0):a.push(n)}),a.length>0&&t.push(a),[t=t.map(t=>{let i=t.reduce((e,t)=>e+(t.span||1),0);if(i({labelStyle:R,contentStyle:L,styles:{content:Object.assign(Object.assign({},P.content),null==B?void 0:B.content),label:Object.assign(Object.assign({},P.label),null==B?void 0:B.label)},classNames:{label:(0,i.default)(N.label,null==_?void 0:_.label),content:(0,i.default)(N.content,null==_?void 0:_.content)}}),[R,L,B,_,N,P]);return F(t.createElement(o.Provider,{value:K},t.createElement("div",Object.assign({className:(0,i.default)(z,$,N.root,null==_?void 0:_.root,{[`${z}-${q}`]:q&&"default"!==q,[`${z}-bordered`]:!!y,[`${z}-rtl`]:"rtl"===M},C,I,Q,V),style:Object.assign(Object.assign(Object.assign(Object.assign({},H),P.root),null==B?void 0:B.root),w)},T),(m||f)&&t.createElement("div",{className:(0,i.default)(`${z}-header`,N.header,null==_?void 0:_.header),style:Object.assign(Object.assign({},P.header),null==B?void 0:B.header)},m&&t.createElement("div",{className:(0,i.default)(`${z}-title`,N.title,null==_?void 0:_.title),style:Object.assign(Object.assign({},P.title),null==B?void 0:B.title)},m),f&&t.createElement("div",{className:(0,i.default)(`${z}-extra`,N.extra,null==_?void 0:_.extra),style:Object.assign(Object.assign({},P.extra),null==B?void 0:B.extra)},f)),t.createElement("div",{className:`${z}-view`},t.createElement("table",null,t.createElement("tbody",null,G.map((e,i)=>t.createElement(h,{key:i,index:i,colon:b,prefixCls:z,vertical:"vertical"===v,bordered:y,row:e}))))))))};y.Item=({children:e})=>e,e.s(["Descriptions",0,y],869216)},368869,e=>{"use strict";e.i(296059);var t=e.i(868297),i=e.i(732961),a=e.i(289882),l=e.i(170517),r=e.i(628882),s=e.i(320890),n=e.i(104458),o=e.i(722319),d=e.i(8398),c=e.i(279728);e.i(765846);var u=e.i(602716),A=e.i(328052),g=e.i(135551);let h=(e,t)=>new g.FastColor(e).setA(t).toRgbString(),m=(e,t)=>new g.FastColor(e).lighten(t).toHexString(),f=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]}},p=(e,t)=>{let i=e||"#000",a=t||"#fff";return{colorBgBase:i,colorTextBase:a,colorText:h(a,.85),colorTextSecondary:h(a,.65),colorTextTertiary:h(a,.45),colorTextQuaternary:h(a,.25),colorFill:h(a,.18),colorFillSecondary:h(a,.12),colorFillTertiary:h(a,.08),colorFillQuaternary:h(a,.04),colorBgSolid:h(a,.95),colorBgSolidHover:h(a,1),colorBgSolidActive:h(a,.9),colorBgElevated:m(i,12),colorBgContainer:m(i,8),colorBgLayout:m(i,0),colorBgSpotlight:m(i,26),colorBgBlur:h(a,.04),colorBorder:m(i,26),colorBorderSecondary:m(i,19)}},b={defaultSeed:s.defaultConfig.token,useToken:function(){let[e,t,i]=(0,n.useToken)();return{theme:e,token:t,hashId:i}},defaultAlgorithm:o.default,darkAlgorithm:(e,t)=>{let i=Object.keys(l.defaultPresetColors).map(t=>{let i=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,a,l)=>(e[`${t}-${l+1}`]=i[l],e[`${t}${l+1}`]=i[l],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),a=null!=t?t:(0,o.default)(e),r=(0,A.default)(e,{generateColorPalettes:f,generateNeutralColorPalettes:p});return Object.assign(Object.assign(Object.assign(Object.assign({},a),i),r),{colorPrimaryBg:r.colorPrimaryBorder,colorPrimaryBgHover:r.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let i=null!=t?t:(0,o.default)(e),a=i.fontSizeSM,l=i.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},i),function(e){let{sizeUnit:t,sizeStep:i}=e,a=i-2;return{sizeXXL:t*(a+10),sizeXL:t*(a+6),sizeLG:t*(a+2),sizeMD:t*(a+2),sizeMS:t*(a+1),size:t*a,sizeSM:t*a,sizeXS:t*(a-1),sizeXXS:t*(a-1)}}(null!=t?t:e)),(0,c.default)(a)),{controlHeight:l}),(0,d.default)(Object.assign(Object.assign({},i),{controlHeight:l})))},getDesignToken:e=>{let s=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):a.default,n=Object.assign(Object.assign({},l.default),null==e?void 0:e.token);return(0,i.getComputedToken)(n,{override:null==e?void 0:e.token},s,r.default)},defaultConfig:s.defaultConfig,_internalContext:s.DesignTokenContext};e.s(["theme",0,b],368869)},127952,e=>{"use strict";var t=e.i(843476),i=e.i(560445),a=e.i(175712),l=e.i(869216),r=e.i(311451),s=e.i(212931),n=e.i(898586),o=e.i(368869),d=e.i(270377),c=e.i(271645);e.s(["default",0,function({isOpen:e,title:u,alertMessage:A,message:g,resourceInformationTitle:h,resourceInformation:m,onCancel:f,onOk:p,confirmLoading:b,requiredConfirmation:x}){let{Title:O,Text:y}=n.Typography,{token:v}=o.theme.useToken(),[E,C]=(0,c.useState)("");return(0,c.useEffect)(()=>{e&&C("")},[e]),(0,t.jsx)(s.Modal,{title:u,open:e,onOk:p,onCancel:f,confirmLoading:b,okText:b?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!x&&E!==x||b},cancelButtonProps:{disabled:b},children:(0,t.jsxs)("div",{className:"space-y-4",children:[A&&(0,t.jsx)(i.Alert,{message:A,type:"warning"}),(0,t.jsx)(a.Card,{title:h,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:v.colorErrorBg,borderColor:v.colorErrorBorder}},style:{backgroundColor:v.colorErrorBg,borderColor:v.colorErrorBorder},children:(0,t.jsx)(l.Descriptions,{column:1,size:"small",children:m&&m.map(({label:e,value:i,...a})=>(0,t.jsx)(l.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)(y,{...a,children:i??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)(y,{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)(y,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)(y,{children:"Type "}),(0,t.jsx)(y,{strong:!0,type:"danger",children:x}),(0,t.jsx)(y,{children:" to confirm deletion:"})]}),(0,t.jsx)(r.Input,{value:E,onChange:e=>C(e.target.value),placeholder:x,className:"rounded-md",prefix:(0,t.jsx)(d.ExclamationCircleOutlined,{style:{color:v.colorError}}),autoFocus:!0})]})]})})}])},954616,e=>{"use strict";var t=e.i(271645),i=e.i(114272),a=e.i(540143),l=e.i(915823),r=e.i(619273),s=class extends l.Subscribable{#e;#t=void 0;#i;#a;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.#i,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,r.hashKey)(t.mutationKey)!==(0,r.hashKey)(this.options.mutationKey)?this.reset():this.#i?.state.status==="pending"&&this.#i.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#i?.removeObserver(this)}onMutationUpdate(e){this.#l(),this.#r(e)}getCurrentResult(){return this.#t}reset(){this.#i?.removeObserver(this),this.#i=void 0,this.#l(),this.#r()}mutate(e,t){return this.#a=t,this.#i?.removeObserver(this),this.#i=this.#e.getMutationCache().build(this.#e,this.options),this.#i.addObserver(this),this.#i.execute(e)}#l(){let e=this.#i?.state??(0,i.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){a.notifyManager.batch(()=>{if(this.#a&&this.hasListeners()){let t=this.#t.variables,i=this.#t.context,a={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#a.onSuccess?.(e.data,t,i,a)}catch(e){Promise.reject(e)}try{this.#a.onSettled?.(e.data,null,t,i,a)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#a.onError?.(e.error,t,i,a)}catch(e){Promise.reject(e)}try{this.#a.onSettled?.(void 0,e.error,t,i,a)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},n=e.i(912598);e.s(["useMutation",0,function(e,i){let l=(0,n.useQueryClient)(i),[o]=t.useState(()=>new s(l,e));t.useEffect(()=>{o.setOptions(e)},[o,e]);let d=t.useSyncExternalStore(t.useCallback(e=>o.subscribe(a.notifyManager.batchCalls(e)),[o]),()=>o.getCurrentResult(),()=>o.getCurrentResult()),c=t.useCallback((e,t)=>{o.mutate(e,t).catch(r.noop)},[o]);if(d.error&&(0,r.shouldThrowError)(o.options.throwOnError,[d.error]))throw d.error;return{...d,mutate:c,mutateAsync:d.mutate}}],954616)},107233,603908,e=>{"use strict";let t=(0,e.i(475254).default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["default",0,t],603908),e.s(["Plus",0,t],107233)},361653,e=>{"use strict";let t=(0,e.i(475254).default)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);e.s(["default",0,t])},519380,e=>{e.q("/litellm-asset-prefix/_next/static/media/bedrock.2vhamxr8q6y4o.svg")},946013,e=>{e.q("/litellm-asset-prefix/_next/static/media/google.3y8ypywwtqob_.svg")},641266,e=>{e.q("/litellm-asset-prefix/_next/static/media/microsoft_azure.3626-7zx7wf09.svg")},956529,e=>{e.q("/litellm-asset-prefix/_next/static/media/openai_small.3rj8nedgjpevh.svg")},913383,e=>{e.q("/litellm-asset-prefix/_next/static/media/a2a_agent.14el5-6dflh1h.png")},238564,e=>{e.q("/litellm-asset-prefix/_next/static/media/ai21.0m_u-tih8nm0v.svg")},941533,e=>{e.q("/litellm-asset-prefix/_next/static/media/aiml_api.1dq6dbpwklhlg.svg")},994636,e=>{e.q("/litellm-asset-prefix/_next/static/media/anthropic.3s95kgy8jpc64.svg")},824770,e=>{e.q("/litellm-asset-prefix/_next/static/media/assemblyai_small.0w_dslsra91uw.png")},920076,e=>{e.q("/litellm-asset-prefix/_next/static/media/baseten.41k2lnwp3c5g9.svg")},96889,e=>{e.q("/litellm-asset-prefix/_next/static/media/cerebras.1ur1xyfqk9ncz.svg")},348026,e=>{e.q("/litellm-asset-prefix/_next/static/media/cloudflare.2n1spdq7u5yki.svg")},727148,e=>{e.q("/litellm-asset-prefix/_next/static/media/cohere.22i3i2e449j5i.svg")},411703,e=>{e.q("/litellm-asset-prefix/_next/static/media/cometapi.3w0xficbg3dkk.svg")},922480,e=>{e.q("/litellm-asset-prefix/_next/static/media/cursor.1q1ev-_5l7exg.svg")},769490,e=>{e.q("/litellm-asset-prefix/_next/static/media/databricks.2hiet9qlqzn-g.svg")},829789,e=>{e.q("/litellm-asset-prefix/_next/static/media/deepgram.3-krp20p_xed3.png")},41730,e=>{e.q("/litellm-asset-prefix/_next/static/media/deepinfra.3lr_lsr7mhui6.png")},662576,e=>{e.q("/litellm-asset-prefix/_next/static/media/deepseek.3n4cu0x32i_7w.svg")},987202,e=>{e.q("/litellm-asset-prefix/_next/static/media/elevenlabs.2982m_dk2-h_y.png")},953265,e=>{e.q("/litellm-asset-prefix/_next/static/media/fal_ai.3rahrirki8sby.jpg")},346512,e=>{e.q("/litellm-asset-prefix/_next/static/media/featherless.3hmlef3fhc0h5.svg")},84416,e=>{e.q("/litellm-asset-prefix/_next/static/media/fireworks.3t1b6p8edeqyo.svg")},104602,e=>{e.q("/litellm-asset-prefix/_next/static/media/friendli.0ymiswh6l35bq.svg")},888193,e=>{e.q("/litellm-asset-prefix/_next/static/media/github_copilot.3k-8jyadoaq2u.svg")},447500,e=>{e.q("/litellm-asset-prefix/_next/static/media/groq.20csmqzsusp1k.svg")},270039,e=>{e.q("/litellm-asset-prefix/_next/static/media/huggingface.1-07ypt9ii_-p.svg")},227733,e=>{e.q("/litellm-asset-prefix/_next/static/media/hyperbolic.3le20v59sebn8.svg")},823929,e=>{e.q("/litellm-asset-prefix/_next/static/media/infinity.0s9s12bl4lccx.png")},333845,e=>{e.q("/litellm-asset-prefix/_next/static/media/jina.0ukab8o-3-5m_.png")},813878,e=>{e.q("/litellm-asset-prefix/_next/static/media/lambda.26_vz7cmyuodo.svg")},767788,e=>{e.q("/litellm-asset-prefix/_next/static/media/lmstudio.35s3-83mlhcms.svg")},808630,e=>{e.q("/litellm-asset-prefix/_next/static/media/meta_llama.1kxk24vwsem49.svg")},468732,e=>{e.q("/litellm-asset-prefix/_next/static/media/minimax.2mfkkqc-lnsen.svg")},610503,e=>{e.q("/litellm-asset-prefix/_next/static/media/mistral.0n8jv_67hgq4h.svg")},438969,e=>{e.q("/litellm-asset-prefix/_next/static/media/moonshot.3__i9wvf37ksm.svg")},852459,e=>{e.q("/litellm-asset-prefix/_next/static/media/morph.2av06eo-t0-ve.svg")},494696,e=>{e.q("/litellm-asset-prefix/_next/static/media/nebius.2ipf7rmjccira.svg")},148973,e=>{e.q("/litellm-asset-prefix/_next/static/media/novita.0_nzmm_rl4lrf.svg")},570036,e=>{e.q("/litellm-asset-prefix/_next/static/media/nvidia_nim.1fz-5ugf_um0v.svg")},151170,e=>{e.q("/litellm-asset-prefix/_next/static/media/nvidia_triton.1aotoxig_m2w1.png")},862330,e=>{e.q("/litellm-asset-prefix/_next/static/media/ollama.144cif369atc5.svg")},788158,e=>{e.q("/litellm-asset-prefix/_next/static/media/openrouter.1xk7748-_jixf.svg")},350567,e=>{e.q("/litellm-asset-prefix/_next/static/media/oracle.43kws59xxr8ig.svg")},822797,e=>{e.q("/litellm-asset-prefix/_next/static/media/perplexity-ai.2do8hoc8tw__0.svg")},840911,e=>{e.q("/litellm-asset-prefix/_next/static/media/qwen.0a49x9i08_0gz.png")},445735,e=>{e.q("/litellm-asset-prefix/_next/static/media/recraft.2f4cv-c9ad-mo.svg")},635202,e=>{e.q("/litellm-asset-prefix/_next/static/media/replicate.445bidyix2tyh.svg")},669161,e=>{e.q("/litellm-asset-prefix/_next/static/media/runway.2zzwye1fddnnn.png")},159508,e=>{e.q("/litellm-asset-prefix/_next/static/media/sambanova.1vcyu0faw1x8h.svg")},544025,e=>{e.q("/litellm-asset-prefix/_next/static/media/sap.1367hgge0s0xl.png")},100588,e=>{e.q("/litellm-asset-prefix/_next/static/media/snowflake.2_p8qqpi0r3lr.svg")},183804,e=>{e.q("/litellm-asset-prefix/_next/static/media/soniox.3nhjmssy7ybh7.svg")},865502,e=>{e.q("/litellm-asset-prefix/_next/static/media/togetherai.1wk-mouzgw5ho.svg")},96912,e=>{e.q("/litellm-asset-prefix/_next/static/media/topaz.3rjp3zvx4eags.svg")},395073,e=>{e.q("/litellm-asset-prefix/_next/static/media/v0.15trd3tb1ulop.svg")},407829,e=>{e.q("/litellm-asset-prefix/_next/static/media/vercel.1mvnwxofolt8y.svg")},846077,e=>{e.q("/litellm-asset-prefix/_next/static/media/vllm.3_gqby46r7s3x.png")},914861,e=>{e.q("/litellm-asset-prefix/_next/static/media/volcengine.23ly9ik_qc138.png")},285328,e=>{e.q("/litellm-asset-prefix/_next/static/media/voyage.0krq6ew-yr8dk.webp")},779278,e=>{e.q("/litellm-asset-prefix/_next/static/media/watsonx.19rrg39yvhpk8.svg")},325532,e=>{e.q("/litellm-asset-prefix/_next/static/media/xai.2kc3gjiopn9om.svg")},288330,e=>{e.q("/litellm-asset-prefix/_next/static/media/xinference.063cy_ievvy5u.svg")},922158,e=>{"use strict";let t={src:e.i(519380).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,t])},336712,e=>{"use strict";let t={src:e.i(946013).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,t])},39182,e=>{"use strict";let t={src:e.i(641266).default,width:200,height:58,blurWidth:0,blurHeight:0};e.s(["default",0,t])},980385,e=>{"use strict";let t={src:e.i(956529).default,width:28,height:28,blurWidth:0,blurHeight:0};e.s(["default",0,t])},555987,938137,301035,470524,901539,434339,857152,e=>{"use strict";var t=e.i(221688),i=e.i(950643);let a=/^(https?:|data:|blob:|\/\/)/i;e.s(["resolveLogoSrc",0,(e,l=t.serverRootPath)=>{let r;if(!e)return;if(a.test(e)||e.includes("/_next/static/"))return e;let s=(0,i.normalizeRootPath)(l);return s&&(e===s||e.startsWith(`${s}/`))?e:(r=(0,i.normalizeRootPath)(l),`${r}${e.startsWith("/")?e:`/${e}`}`)}],555987);let l={src:e.i(913383).default,width:661,height:768,blurWidth:7,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAwUlEQVR42h2OvQpGcByFf5dK7oBJFoooJDaDZFA+BoVkNBikGJSUJINyGeft/Q+nznDO00O6rsM0Tfi+z6JpGizLgqqqIEVR0HUdqqqCbdus930PWZZBy7IgCAKkaYpxHJEkCaIowjAMoGmaEMcx8jxHURRo2xZ1XaMsS9B5nrjvG+u6Yp5nfN+H53nwJ9JxHMiyDO/7Mtx1Xey1bRvIcRzwPI993xGGIZqmgSAIMAwDJEkSPM9jphzHsYHruhBFET+hn6S8pf6D7AAAAABJRU5ErkJggg=="};e.s(["default",0,l],938137);let r={src:e.i(238564).default,width:103,height:24,blurWidth:0,blurHeight:0};e.s(["default",0,r],301035);let s={src:e.i(941533).default,width:115,height:24,blurWidth:0,blurHeight:0};e.s(["default",0,s],470524);let n={src:e.i(994636).default,width:46,height:46,blurWidth:0,blurHeight:0};e.s(["default",0,n],901539);let o={src:e.i(824770).default,width:28,height:28,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAlElEQVR42m3OoQqDUBQGYF9mwzLbFiZsMNgwuGa4YFgYLC6PgcXuA5gFzdcgFkExGr33ogZRNIr6CAoKKgo/nAMfh/NTu3u4GWoY+0fIAsIC3C8LuIiRH9S2W5wBXsBPKaHTGGb+lZMJmCe2vPYjZe9/bMDswKMRbq9Yg9VRICcBq3p6FckINIf6o6ECwyOam/1YpwPFUFu+Lt2F2QAAAABJRU5ErkJggg=="};e.s(["default",0,o],434339);let d={src:e.i(920076).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,d],857152)},896614,9774,503119,272896,144923,562171,533881,837957,227247,708889,859320,586455,921117,21296,579967,e=>{"use strict";let t={src:e.i(96889).default,width:800,height:600,blurWidth:0,blurHeight:0};e.s(["default",0,t],896614);let i={src:e.i(348026).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,i],9774);let a={src:e.i(727148).default,width:75,height:75,blurWidth:0,blurHeight:0};e.s(["default",0,a],503119);let l={src:e.i(411703).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,l],272896);let r={src:e.i(922480).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,r],144923);let s={src:e.i(769490).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,s],562171);let n={src:e.i(829789).default,width:32,height:32,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAzklEQVR42k3PPWuDcBDHccUiiikYSwqhg+IkuKUpOLqK4OYrcBZcFCcH352mgy/Ch9mxEPg2+s+Q4W65zx33kyRJQpZlFOUNTdM4HN45Hi1Op0/O56+7tAHbtqmqiqZpKIqCy+Uby/rYkABhGLKuK+M4siwLt9sv1+sPpmkKEAQBwzCQpilxHDNNE3VdYxiGALqu47oujuMQRdEOyrJEVVUBFEUhSRK6rmOeZ/q+x/f97XkBHqfIsoy2bcnzHM/z9mSP2Q62dt/0c+O1/v4BYRxu3LgaR7UAAAAASUVORK5CYII="};e.s(["default",0,n],533881);let o={src:e.i(41730).default,width:225,height:225,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAfklEQVR42nVOvQqDMBjM+7+RpbQ0Ji2NQhwdzGIwCMZFiCAa9STqIPhxw/3A3UeW41w/AKck87w0tqvbngkFgEDCJOPoKc+fovxKzaUGiXkOk0zei1TRzDxYEbHiIw0kzD2Aji5BqHolW9Uv0+9U01AVxivr4r8CjHX7+N27K5WIrP56XsFTAAAAAElFTkSuQmCC"};e.s(["default",0,o],837957);let d={src:e.i(662576).default,width:293,height:215,blurWidth:0,blurHeight:0};e.s(["default",0,d],227247);let c={src:e.i(987202).default,width:1563,height:1563,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA5ElEQVR42h2PPwtBURjGj3wCk93sC1iUCYXFIlGSMjC4QiiTBSE3Ge5M3e0uPoJFBhOTP8NNukXduFL3uJ1Xzz11znCe93me38uitQSL11Pe8rAanKpycbSa5Ar9UiAmJT3QXHGwHGfvj/vJcRzOfz/7fLvsW4tuJFZLehicEIUQpOs6GYZBOIfrcZPp5f0MsXDatk2yLJOqqu6A9f2YjXk7zNCJWM45KYpCmqa5A6/P+ynNGiEGIHSiwjRNsiyLBAmxPezW6U7Gx0ALIHQiFk6I5WEl6G6BB7QAQqc0a4bgxD/uH4FYoVec8m3dAAAAAElFTkSuQmCC"};e.s(["default",0,c],708889);let u={src:e.i(953265).default,width:400,height:400,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtP9N/tL+PO/8A7ZeV/wDFUj6L917L+r3/AMj/2Q=="};e.s(["default",0,u],859320);let A={src:e.i(346512).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,A],586455);let g={src:e.i(84416).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,g],921117);let h={src:e.i(104602).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,h],21296);let m={src:e.i(888193).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,m],579967)},770752,383963,862493,902860,901372,206258,176228,728685,e=>{"use strict";let t={src:e.i(447500).default,width:26,height:26,blurWidth:0,blurHeight:0};e.s(["default",0,t],770752);let i={src:e.i(270039).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,i],383963);let a={src:e.i(227733).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,a],862493);let l={src:e.i(823929).default,width:128,height:129,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAApklEQVR42oWPsQrCMBRFY51KaUuwNktBQbcgSenQ32hCTBAHXfSfulUK4g/0/7yvdO+FB5dzXhLC2FoiJE3TfZ7nYrskyzIBVpBjTdPcu677GGPGtm1fmDd1YnVd31gIYSrLUnLOjxC9tfaLfhBCXLz307xQVZUCODvnfljoceAEpskxKeUV1w0Qo1LqobV+Lk8McI5tkDiOeZIkO9SIBr0gRm71l38QASaqNz7VMwAAAABJRU5ErkJggg=="};e.s(["default",0,l],902860);let r={src:e.i(333845).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAXUlEQVR42p2MoRHAMAwDQwJzCcgCwQEZIDjA03gED2BzewSPWRe2qFcB3Z+kU0o/lXNea4U/0t77OYeIACDq4FLKnSKimYmIqjKzu885U6117z3GCGitxTbg/flJF7DAEmcR3WAqAAAAAElFTkSuQmCC"};e.s(["default",0,r],901372);let s={src:e.i(813878).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,s],206258);let n={src:e.i(767788).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,n],176228);let o={src:e.i(808630).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,o],728685)},272967,551726,399495,740876,709103,277207,836473,768493,297720,e=>{"use strict";let t={src:e.i(468732).default,width:490,height:412,blurWidth:0,blurHeight:0};e.s(["default",0,t],272967);let i={src:e.i(610503).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,i],551726);let a={src:e.i(438969).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,a],399495);let l={src:e.i(852459).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,l],740876);let r={src:e.i(494696).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,r],709103);let s={src:e.i(148973).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,s],277207);let n={src:e.i(570036).default,width:16,height:16,blurWidth:0,blurHeight:0};e.s(["default",0,n],836473);let o={src:e.i(151170).default,width:95,height:81,blurWidth:8,blurHeight:7,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAA0UlEQVR42kXMvWrCUBjG8VxIL6KX0IvobXQSOrQd2kLSdMzQdMmaEErPUqoIIYtKOC5iFD9BEBwiaAY/AgpH/2oUfOGFh4cfj8blNmrNKK0zmFUZzmust2nea7u9IlkNkBMPv1Xgs3JHoXRDe1o+g8Vmyl/vnf++wU/7EdF54jW8JU6K14WTPgE3fjiCZ77kPa2kdAZZlrFcLpikXYLeN6Lxxm/zhfEsRimF5roupmli2zbGh4Gu61iWlX8URWhSSsIwxPM8hBA4jpNn3/cJgoADqC23HJzwo6wAAAAASUVORK5CYII="};e.s(["default",0,o],768493);let d={src:e.i(862330).default,width:646,height:854,blurWidth:0,blurHeight:0};e.s(["default",0,d],297720)},916925,247044,e=>{"use strict";var t,i=e.i(555987),a=e.i(938137),l=e.i(301035),r=e.i(470524),s=e.i(901539),n=e.i(434339),o=e.i(857152),d=e.i(922158),c=e.i(896614),u=e.i(9774),A=e.i(503119),g=e.i(272896),h=e.i(144923),m=e.i(562171),f=e.i(533881),p=e.i(837957),b=e.i(227247),x=e.i(708889),O=e.i(859320),y=e.i(586455),v=e.i(921117),E=e.i(21296),C=e.i(579967),I=e.i(336712),w=e.i(770752),S=e.i(383963),R=e.i(862493),L=e.i(902860),B=e.i(901372),k=e.i(206258),_=e.i(176228),T=e.i(728685),j=e.i(39182),M=e.i(272967),$=e.i(551726),H=e.i(399495),N=e.i(740876),P=e.i(709103),z=e.i(277207),D=e.i(836473),U=e.i(768493),W=e.i(297720),q=e.i(980385);let G={src:e.i(788158).default,width:300,height:300,blurWidth:0,blurHeight:0},F={src:e.i(350567).default,width:231,height:30,blurWidth:0,blurHeight:0},Q={src:e.i(822797).default,width:48,height:48,blurWidth:0,blurHeight:0},V={src:e.i(840911).default,width:1024,height:1024,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABE0lEQVR42gEIAff+AAAAAAAAAAAAEQwmIT8ukIAgGUpBBwYQDQQECggAAAAAAAIBBQQJBhUTFw80LUIxloZbR8+5UUS3oUA4kH0HBxEOACMUUkolFlVNCAYTERwUPzgkHFJIIhxNRCsmYVQODSAbADYffnNFKaCSDgkgHD0tjX4+MI5+CQgVEhQSLCULChgUABAKJiJTM7+vJhlYTzEkb2MxJm9iIh1NQywnZFYhH0o/AA8JIh9RMrurNiR9cQkHFhMQDSUgUkW5o1hOx60pJlxPAAcEDw4qGmJYFw80LhENKCMyKHFjUEK0nhEOJSADAwYFAAAAAAADAgcGBQMLCRUPMClCNJeEIRtLQgAAAQAAAAAAfjQxsiCQipMAAAAASUVORK5CYII="},K={src:e.i(445735).default,width:16,height:16,blurWidth:0,blurHeight:0},Y={src:e.i(635202).default,width:16,height:16,blurWidth:0,blurHeight:0},J={src:e.i(669161).default,width:320,height:320,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA7UlEQVR42lVQvc7BYBR+B/kM3w+fFm2p9m3fRhFRP7UQlTAQCVfAgE3EHZAQMTBIzBIrYbEgFhaza3ABrsF7bIYnOTl5/s5BVrvIY5MMvYTbUuy8hN8CcFIdW62CgHCKjFwie/So3PqH+b0Hc+GebkW6Lj9zUtJaHwEbFvGqWf7zOG5GJVmjcwUEAUOevQmhfKSTqJol+7f94RT+L7Yv25OV3PtsI699EByc85qpW5qcUCaMyB7orH9EgJLaTnPNgk/QfUsxKi0QtKWFzjRzA7a08IEPCivYKWkyQHAKtJUMPIVMQCAmz3FKHcELXnxEPy9E1lYCAAAAAElFTkSuQmCC"},X={src:e.i(159508).default,width:52,height:46,blurWidth:0,blurHeight:0},Z={src:e.i(544025).default,width:3300,height:2550,blurWidth:8,blurHeight:6,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAZklEQVR42oWNTQ5AMBhE3f8mEhux4BgiIRzAwoKWplrt146fBbVhkpnNvORF+El0jvMAV4RR2qtsJZD3DyA2h6xhiMsRSTUhrRm0DYBFE4qOI285yl5CGvdW0OEYhEE/G6jgvIGv7A4KupBwIVaNAAAAAElFTkSuQmCC"},ee={src:e.i(100588).default,width:146,height:139,blurWidth:0,blurHeight:0};e.s(["default",0,ee],247044);let et={src:e.i(183804).default,width:100,height:18,blurWidth:0,blurHeight:0},ei={src:e.i(865502).default,width:32,height:32,blurWidth:0,blurHeight:0},ea={src:e.i(96912).default,width:16,height:16,blurWidth:0,blurHeight:0},el={src:e.i(395073).default,width:16,height:16,blurWidth:0,blurHeight:0},er={src:e.i(407829).default,width:16,height:16,blurWidth:0,blurHeight:0},es={src:e.i(846077).default,width:64,height:64,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAo0lEQVR42lWOvQrCQBCE7718oUA6wVcQBF/AXhu1CIgcpgoi/qCNguBPwCaChYHDv9zt3e6ZeEFxq9n5GGaY/T8iq3QhWKFRkZGWzEPaaE/RDoiI5e7z0BILP7tMB2vyO3p2BJew8syvvJLGQTPEaheSVJeAQIi5F2+CWt80uHopLMEnNBpPuNc2vaXK+38A4RauTvUhbBNwDvsOlYD3DA2Se99kLK7hC5QFVQAAAABJRU5ErkJggg=="},en={src:e.i(914861).default,width:1024,height:1024,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA7ElEQVR42l2LMUsCAQBG39GFFQ02ad1oq0QIRR2hER4EGdQqdBDdQZAFEudU0NZSQ0O1VUOjiuJvEBxc3BQFEVQQdFAU9OROFwf9lg/e48Hiti8vWJekBSoIODacLK04CP79IAX8815cW2X3IYL3JIhaKuKLGdNGmMUCTo+Hq1yO72yB6HDEeTrFjm8fUVwGt3uL00eD5+6AfMvixbS5bTR5/43jcm2CooT4KNf56ltUGzafA5uoZZGpdJDlABhPr7z1TJLtMbXamMT0702T//aQu0gM5GOFvRuNkKoTDuucqRpeXePoWuPg0D8BGkpJjYhKXN4AAAAASUVORK5CYII="},eo={src:e.i(285328).default,width:400,height:399,blurWidth:8,blurHeight:8,blurDataURL:"data:image/webp;base64,UklGRgwBAABXRUJQVlA4TAABAAAvB8ABEM1VICICHggIDgIAAIDzDAACD0FoAAARAAwAAAAAAAAAAAAAAACAAABAAcBCAoAWgGyoXwUAAA8E7QQCAADg/N+nrsYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4CClZXkg5AQAAAAA538LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0HIgEAAAAAcP4ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMsHA39Qutr2AtkROu8CASWZ/nMlNyzz5AdgWmkK65oUI6AlgIkY/M3zxIW3iABq15KT/Uz7BXidCOONHieAz1v6HqAC"},ed={src:e.i(779278).default,width:16,height:16,blurWidth:0,blurHeight:0},ec={src:e.i(325532).default,width:1e3,height:1e3,blurWidth:0,blurHeight:0},eu={src:e.i(288330).default,width:16,height:16,blurWidth:0,blurHeight:0};var eA=((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 eg={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"},eh=new Set(["bedrock_mantle"]),em={"A2A Agent":a.default.src,Ai21:l.default.src,"Ai21 Chat":l.default.src,"AI/ML API":r.default.src,"Aiohttp Openai":q.default.src,Anthropic:s.default.src,"Anthropic Text":s.default.src,AssemblyAI:n.default.src,Azure:j.default.src,"Azure AI Foundry (Studio)":j.default.src,"Azure Text":j.default.src,Baseten:o.default.src,"Amazon Bedrock":d.default.src,"Amazon Bedrock Mantle":d.default.src,"AWS SageMaker":d.default.src,Cerebras:c.default.src,Cloudflare:u.default.src,Codestral:$.default.src,Cohere:A.default.src,"Cohere Chat":A.default.src,Cometapi:g.default.src,Cursor:h.default.src,"Databricks (Qwen API)":m.default.src,Dashscope:V.src,Deepseek:b.default.src,Deepgram:f.default.src,DeepInfra:p.default.src,ElevenLabs:x.default.src,"Fal AI":O.default.src,"Featherless Ai":y.default.src,"Fireworks AI":v.default.src,Friendliai:E.default.src,"Github Copilot":C.default.src,"Google AI Studio":I.default.src,Groq:w.default.src,vllm:es.src,Huggingface:S.default.src,Hyperbolic:R.default.src,Infinity:L.default.src,"Jina AI":B.default.src,"Lambda Ai":k.default.src,"Lm Studio":_.default.src,"Meta Llama":T.default.src,MiniMax:M.default.src,"Mistral AI":$.default.src,Moonshot:H.default.src,Morph:N.default.src,Nebius:P.default.src,Novita:z.default.src,"Nvidia Nim":D.default.src,Ollama:W.default.src,"Ollama Chat":W.default.src,Oobabooga:q.default.src,OpenAI:q.default.src,"Openai Like":q.default.src,"OpenAI Text Completion":q.default.src,"OpenAI-Compatible Completions (legacy /v1/completions)":q.default.src,"OpenAI-Compatible Chat Completions (Together AI, vLLM, etc.)":q.default.src,Openrouter:G.src,"Oracle Cloud Infrastructure (OCI)":F.src,Perplexity:Q.src,Recraft:K.src,Replicate:Y.src,RunwayML:J.src,Sagemaker:d.default.src,Sambanova:X.src,"SAP Generative AI Hub":Z.src,Snowflake:ee.src,Soniox:et.src,"Text-Completion-Codestral":$.default.src,TogetherAI:ei.src,Topaz:ea.src,Triton:U.default.src,V0:el.src,"Vercel Ai Gateway":er.src,"Vertex AI (Anthropic, Gemini, etc.)":I.default.src,"Vertex Ai Beta":I.default.src,Vllm:es.src,VolcEngine:en.src,"Voyage AI":eo.src,Watsonx:ed.src,"Watsonx Text":ed.src,xAI:ec.src,Xinference:eu.src};e.s(["Providers",()=>eA,"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,i.resolveLogoSrc)(em[e])??"",displayName:e}}let t=Object.keys(eg).find(t=>eg[t].toLowerCase()===e.toLowerCase())??Object.keys(eg).find(t=>t.toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let a=eA[t];return{logo:(0,i.resolveLogoSrc)(em[a])??"",displayName:a}},"getProviderModels",0,(e,t)=>{let i=eg[e],a=[];return e&&"object"==typeof t&&(Object.entries(t).forEach(([e,t])=>{if(null!==t&&"object"==typeof t&&"litellm_provider"in t){let l=t.litellm_provider,r="string"==typeof l&&(l.startsWith(`${i}_`)||l.startsWith(`${i}-`));(l===i||r&&!eh.has(l))&&a.push(e)}}),"Cohere"==e&&Object.entries(t).forEach(([e,t])=>{null!==t&&"object"==typeof t&&"litellm_provider"in t&&"cohere_chat"===t.litellm_provider&&a.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&&a.push(e)})),a},"providerLogoMap",0,em,"provider_map",0,eg],916925)},174553,e=>{"use strict";var t=e.i(843476),i=e.i(271645),a=e.i(916925),l=e.i(555987);e.s(["Logo",0,({provider:e,src:r,label:s,className:n="w-4 h-4"})=>{let[o,d]=(0,i.useState)(null),c=void 0!==e?(0,a.getProviderLogoAndName)(e).logo:(0,l.resolveLogoSrc)(r)??"",u=s??e??"";return o!==c&&c?(0,t.jsx)("img",{src:c,alt:`${u||"-"} logo`,className:n,onError:()=>{console.warn(`Logo failed to load: ${c}`),d(c)}}):(0,t.jsx)("div",{className:`${n} rounded-full bg-gray-200 flex items-center justify-center text-xs`,children:u.charAt(0)||"-"})}])},646563,e=>{"use strict";var t=e.i(959013);e.s(["PlusOutlined",()=>t.default])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/06sx0oh8weeph.js b/litellm/proxy/_experimental/out/_next/static/chunks/06sx0oh8weeph.js deleted file mode 100644 index 57f03aca8e1..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/06sx0oh8weeph.js +++ /dev/null @@ -1,8 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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 l=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}));l.displayName="TableHeader";let o=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}));o.displayName="TableBody";let i=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}));i.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,o,"TableCell",0,d,"TableFooter",0,i,"TableHead",0,u,"TableHeader",0,l,"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),l=e.i(552245),o=e.i(405005),i=e.i(209407);let s={...o.popupStateMapping,...i.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:a,className:n,style:o,forceRender:i=!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,l.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:i||!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:o,disabled:i=!1,nativeButton:s=!0,...u}=e,{store:g}=(0,r.useDialogRootContext)(),m=g.useState("open"),{getButtonProps:f,buttonRef:b}=(0,d.useButton)({disabled:i,native:s});return(0,l.useRenderElement)("button",e,{state:{disabled:i},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:o,id:i,...s}=e,{store:u}=(0,r.useDialogRootContext)(),d=(0,m.useBaseUiId)(i);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,l.useRenderElement)("p",e,{ref:t,props:[{id:d},s]})});e.s(["DialogDescription",0,f],209793);var b=e.i(61487);let x=((t={}).nestedDialogs="--nested-dialogs",t),h=((a={})[a.open=o.CommonPopupDataAttributes.open]="open",a[a.closed=o.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=o.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=o.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var y=e.i(733332);let C=n.createContext(void 0);function v(){let e=n.useContext(C);if(void 0===e)throw Error((0,y.default)(26));return e}e.s(["DialogPortalContext",0,C,"useDialogPortalContext",0,v],625834);var S=e.i(137584),w=e.i(673327),$=e.i(264111),D=e.i(843476);let j={...o.popupStateMapping,...i.transitionStatusMapping,nestedDialogOpen:e=>e?{[h.nestedDialogOpen]:""}:null},R=n.forwardRef(function(e,t){let{render:a,className:n,style:o,finalFocus:i,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"),h=d.useState("mounted"),y=d.useState("nested"),C=d.useState("nestedOpenDialogCount"),R=d.useState("open"),O=d.useState("openMethod"),N=d.useState("titleElementId"),k=d.useState("transitionStatus"),E=d.useState("role"),M=g.useState("floatingId"),P=u.id??M;v(),(0,S.useOpenChangeComplete)({open:R,ref:d.context.popupRef,onComplete(){R&&d.context.onOpenChangeComplete?.(!0)}});let T=void 0===s?(0,$.createDefaultInitialFocus)(d.context.popupRef):s,A=d.useStateSetter("popupElement"),I=(0,l.useRenderElement)("div",e,{state:{open:R,nested:y,transitionStatus:k,nestedDialogOpen:C>0},props:[m,{id:P,"aria-labelledby":N??void 0,"aria-describedby":c??void 0,role:E,...$.FOCUSABLE_POPUP_PROPS,hidden:!h,onKeyDown(e){w.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[x.nestedDialogs]:C}},u],ref:[t,d.context.popupRef,A],stateAttributesMapping:j});return(0,D.jsx)(b.FloatingFocusManager,{context:g,openInteractionType:O,disabled:!h,closeOnFocusOut:!p,initialFocus:T,returnFocus:i,modal:!1!==f,restoreFocus:"popup",children:I})});e.s(["DialogPopup",0,R],784324);var O=e.i(144394),N=e.i(726674),k=e.i(426);let E=n.forwardRef(function(e,t){let{keepMounted:a=!1,...n}=e,{store:l}=(0,r.useDialogRootContext)(),o=l.useState("mounted"),i=l.useState("modal"),s=l.useState("open");return o||a?(0,D.jsx)(C.Provider,{value:a,children:(0,D.jsxs)(N.FloatingPortal,{ref:t,...n,children:[o&&!0===i&&(0,D.jsx)(k.InternalBackdrop,{ref:l.context.internalBackdropRef,inert:(0,O.inertValue)(!s)}),e.children]})}):null});e.s(["DialogPortal",0,E],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),n=e.i(956789),r=e.i(17989),l=e.i(647554),o=e.i(675606),i=e.i(56434),s=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:o,isDrawer:i}){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,x]=t.useState(0),h=0===m,y=(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,l.getTarget)(t);return!!h&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,l.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:h});(0,a.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{f(e),x(t)}),e.useContextCallback("onNestedDialogClose",()=>{f(0),x(0)}),t.useEffect(()=>(o?.onNestedDialogOpen&&u&&o.onNestedDialogOpen(m+1,b+ +!!i),o?.onNestedDialogClose&&!u&&o.onNestedDialogClose(),()=>{o?.onNestedDialogClose&&u&&o.onNestedDialogClose()}),[i,u,m,b,o]);let C=y.reference??n.EMPTY_OBJECT,v=y.trigger??n.EMPTY_OBJECT,S=y.floating??n.EMPTY_OBJECT;return(0,s.usePopupInteractionProps)(e,{activeTriggerProps:C,inactiveTriggerProps:v,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:l}=(0,s.useOpenStateTransitions)(r,a),u=t.useCallback(()=>{a.setOpen(!1,(0,o.createChangeEventDetails)(i.REASONS.imperativeAction))},[a]);t.useImperativeHandle(n,()=>({unmount:l,close:u}),[l,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),n=e.i(67530),r=e.i(108821),l=e.i(616269),o=e.i(301252),i=e.i(116786),s=e.i(990627),u=e.i(264111);let d={...i.popupStoreSelectors,modal:(0,l.createSelector)(e=>e.modal),nested:(0,l.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,l.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,l.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,l.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,l.createSelector)(e=>e.openMethod),descriptionElementId:(0,l.createSelector)(e=>e.descriptionElementId),titleElementId:(0,l.createSelector)(e=>e.titleElementId),viewportElement:(0,l.createSelector)(e=>e.viewportElement),role:(0,l.createSelector)(e=>e.role)};class c extends o.ReactStore{constructor(e,a,n=!1){const r=new s.PopupTriggerMap,l=function(e={}){return{...(0,i.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);l.floatingRootContext=(0,i.createPopupFloatingRootContext)(r,a,n),super(l,{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,l="dialog"){let{children:o,open:i,defaultOpen:s=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:g=!1,modal:m=!0,actionsRef:f,handle:b,triggerId:x,defaultTriggerId:h=null}=e,y="alert-dialog"===l,C=(0,r.useDialogRootContext)(!0),v={modal:!!y||m,disablePointerDismissal:y||g,nested:!!C,role:y?"alertdialog":"dialog"},S=c.useStore(b?.store,{open:s,openProp:i,activeTriggerId:h,triggerIdProp:x,...v});(0,a.useOnFirstRender)(()=>{let e=void 0===i&&!1===S.state.open&&!0===s?{open:!0,activeTriggerId:h}:null;y?S.update(e?{...v,...e}:v):e&&S.update(e)}),S.useControlledProp("openProp",i),S.useControlledProp("triggerIdProp",x),S.useSyncedValues(v),S.useContextCallback("onOpenChange",u),S.useContextCallback("onOpenChangeComplete",d);let w=S.useState("open"),$=S.useState("mounted"),D=S.useState("payload");(0,n.useDialogRoot)({store:S,actionsRef:f});let j=t.useMemo(()=>({store:S}),[S]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:j,children:[(w||$)&&(0,p.jsx)(n.DialogInteractions,{store:S,parentContext:C?.store.context,isDrawer:"drawer"===l}),"function"==typeof o?o({payload:D}):o]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),n=e.i(552245),r=e.i(405005),l=e.i(209407),o=e.i(108821),i=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,...l.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:l,children:s,...d}=e,c=(0,i.useDialogPortalContext)(),{store:p}=(0,o.useDialogRootContext)(),g=p.useState("open"),m=p.useState("nested"),f=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),x=p.useState("mounted"),h=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||x,state:{open:g,nested:m,transitionStatus:f,nestedDialogOpen:b>0},ref:[t,h],stateAttributesMapping:u,props:[{role:"presentation",hidden:!x,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 l=t.forwardRef(function(e,t){let{render:l,className:o,style:i,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,l],77173);var o=e.i(733332),i=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,l){let{render:g,className:m,style:f,disabled:b=!1,nativeButton:x=!0,id:h,payload:y,handle:C,...v}=e,S=(0,a.useDialogRootContext)(!0),w=C?.store??S?.store;if(!w)throw Error((0,o.default)(79));let $=(0,r.useBaseUiId)(h),D=w.useState("floatingRootContext"),j=w.useState("isOpenedByTrigger",$),R=w.useState("triggerPopupId",$),O=t.useRef(null),{registerTrigger:N,isMountedByThisTrigger:k}=(0,d.useTriggerDataForwarding)($,O,w,{payload:y}),{getButtonProps:E,buttonRef:M}=(0,i.useButton)({disabled:b,native:x}),P=(0,c.useClick)(D,{enabled:null!=D}),T=(0,p.useOpenMethodTriggerProps)(()=>w.select("open"),e=>{w.set("openMethod",e)}),A=w.useState("triggerProps",k);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:j},ref:[M,l,N,O],props:[P.reference,A,T,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:$,"aria-haspopup":"dialog","aria-expanded":j,"aria-controls":R},v,E],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}])},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),l=e.i(264951),o=e.i(271645),i=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",()=>l.DialogPortal,"Root",0,function(e){let t=o.useContext(i.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)},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)},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])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},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 l=e=>{let{prefixCls:n,className:r,style:l,size:o,shape:i}=e,s=(0,a.default)({[`${n}-lg`]:"large"===o,[`${n}-sm`]:"small"===o}),u=(0,a.default)({[`${n}-circle`]:"circle"===i,[`${n}-square`]:"square"===i,[`${n}-round`]:"round"===i}),d=t.useMemo(()=>"number"==typeof o?{width:o,height:o,lineHeight:`${o}px`}:{},[o]);return t.createElement("span",{className:(0,a.default)(n,s,u,r),style:Object.assign(Object.assign({},d),l)})};e.i(296059);var o=e.i(694758),i=e.i(915654),s=e.i(246422),u=e.i(838378);let d=new o.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,i.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)),x=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:n,skeletonParagraphCls:r,skeletonButtonCls:l,skeletonInputCls:o,skeletonImageCls:i,controlHeight:s,controlHeightLG:u,controlHeightSM:c,gradientFromColor:x,padding:h,marginSM:y,borderRadius:C,titleHeight:v,blockRadius:S,paragraphLiHeight:w,controlHeightXS:$,paragraphMarginTop:D}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:h,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:x},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:v,background:x,borderRadius:S,[`+ ${r}`]:{marginBlockStart:c}},[r]:{padding:0,"> li":{width:"100%",height:w,listStyle:"none",background:x,borderRadius:S,"+ li":{marginBlockStart:$}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${r} > li`]:{borderRadius:C}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:y,[`+ ${r}`]:{marginBlockStart:D}}},[`${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:l,gradientFromColor:o,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:t,width:i(n).mul(2).equal(),minWidth:i(n).mul(2).equal()},b(n,i))},f(e,n,a)),{[`${a}-lg`]:Object.assign({},b(r,i))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(l,i))}),f(e,l,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:n,controlHeightLG:r,controlHeightSM:l}=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(l))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:n,controlHeightLG:r,controlHeightSM:l,gradientFromColor:o,calc:i}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:a},g(t,i)),[`${n}-lg`]:Object.assign({},g(r,i)),[`${n}-sm`]:Object.assign({},g(l,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:n,borderRadiusSM:r,calc:l}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:r},m(l(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},m(a)),{maxWidth:l(a).mul(4).equal(),maxHeight:l(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[l]:{width:"100%"},[o]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${n}, - ${r} > li, - ${a}, - ${l}, - ${o}, - ${i} - `]: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"]]}),h=e=>{let{prefixCls:n,className:r,style:l,rows:o=0}=e,i=Array.from({length:o}).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:l},i)},y=({prefixCls:e,className:n,width:r,style:l})=>t.createElement("h3",{className:(0,a.default)(e,n),style:Object.assign({width:r},l)});function C(e){return e&&"object"==typeof e?e:{}}let v=e=>{let{prefixCls:r,loading:o,className:i,rootClassName:s,style:u,children:d,avatar:c=!1,title:p=!0,paragraph:g=!0,active:m,round:f}=e,{getPrefixCls:b,direction:v,className:S,style:w}=(0,n.useComponentConfig)("skeleton"),$=b("skeleton",r),[D,j,R]=x($);if(o||!("loading"in e)){let e,n,r=!!c,o=!!p,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${$}-avatar`},o&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),C(c));e=t.createElement("div",{className:`${$}-header`},t.createElement(l,Object.assign({},a)))}if(o||d){let e,a;if(o){let a=Object.assign(Object.assign({prefixCls:`${$}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),C(p));e=t.createElement(y,Object.assign({},a))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${$}-paragraph`},(e={},r&&o||(e.width="61%"),!r&&o?e.rows=3:e.rows=2,e)),C(g));a=t.createElement(h,Object.assign({},n))}n=t.createElement("div",{className:`${$}-content`},e,a)}let b=(0,a.default)($,{[`${$}-with-avatar`]:r,[`${$}-active`]:m,[`${$}-rtl`]:"rtl"===v,[`${$}-round`]:f},S,i,s,j,R);return D(t.createElement("div",{className:b,style:Object.assign(Object.assign({},w),u)},e,n))}return null!=d?d:null};v.Button=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d=!1,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-button`,size:c},h))))},v.Avatar=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,shape:d="circle",size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls","className"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:c},h))))},v.Input=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-input`,size:c},h))))},v.Image=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s}=e,{getPrefixCls:u}=t.useContext(n.ConfigContext),d=u("skeleton",r),[c,p,g]=x(d),m=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:s},l,o,p,g);return c(t.createElement("div",{className:m},t.createElement("div",{className:(0,a.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`})))))},v.Node=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s,children:u}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),c=d("skeleton",r),[p,g,m]=x(c),f=(0,a.default)(c,`${c}-element`,{[`${c}-active`]:s},g,l,o,m);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${c}-image`,l),style:i},u)))},e.s(["default",0,v],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),l=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(n.add(a),l.current=a)}else n.remove(l.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 l=e<0?"-":"",o=Math.abs(e),i=o,s="";return o>=1e6?(i=o/1e6,s="M"):o>=1e3&&(i=o/1e3,s="K"),`${l}${i.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 l({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,l],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:r,tooltip:i,dataTestId:s}){let u=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":s,className:(0,n.cn)("whitespace-nowrap font-normal",o[e]),children:r});return i?(0,t.jsx)(l,{content:i,trigger:u}):u}],112179)},199931,e=>{"use strict";let t=(0,e.i(475254).default)("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]);e.s(["Waypoints",0,t],199931)},625901,e=>{"use strict";var t=e.i(266027),a=e.i(621482),n=e.i(912598),r=e.i(243652),l=e.i(602869),o=e.i(135214);let i=(0,r.createQueryKeys)("models"),s=(0,r.createQueryKeys)("modelHub"),u=(0,r.createQueryKeys)("allProxyModels");(0,r.createQueryKeys)("selectedTeamModels");let d=(0,r.createQueryKeys)("infiniteModels"),c=(0,r.createQueryKeys)("userModels"),p=new Set,g=e=>!!e?.litellm_params?.model?.startsWith("auto_router/"),m=e=>new Set(e.filter(g).map(e=>e.model_name).filter(e=>!!e)),f=e=>e.filter(g),b=async(e,t,a)=>{let n=await (0,l.modelInfoCall)(e,t,a,1,1e3),r=n?.total_pages??1;return[n,...await Promise.all(Array.from({length:Math.max(0,r-1)},(n,r)=>(0,l.modelInfoCall)(e,t,a,r+2,1e3)))].flatMap(e=>e?.data??[])},x=(e,t)=>i.list({filters:{scope:"autoRouters",...e&&{userId:e},...t&&{userRole:t}}});e.s(["useAllProxyModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:u.list({}),queryFn:async()=>await (0,l.modelAvailableCall)(e,a,n,!0,null,!0,!1,"expand"),enabled:!!(e&&a&&n)})},"useAutoRouterModelGroups",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)(),{data:r}=(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:m});return r??p},"useAutoRouters",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:f})},"useInfiniteModelInfo",0,(e=50,t)=>{let{accessToken:n,userId:r,userRole:i}=(0,o.default)();return(0,a.useInfiniteQuery)({queryKey:d.list({filters:{...r&&{userId:r},...i&&{userRole:i},size:e,...t&&{search:t}}}),queryFn:async({pageParam:a})=>await (0,l.modelInfoCall)(n,r,i,a,e,t),initialPageParam:1,getNextPageParam:e=>{if(e.current_page{let e=(0,n.useQueryClient)();return async()=>{await e.invalidateQueries({queryKey:i.lists()})}},"useModelHub",0,()=>{let{accessToken:e}=(0,o.default)();return(0,t.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,l.modelHubCall)(e),enabled:!!e})},"useModelsInfo",0,(e=1,a=50,n,r,s,u,d,c=!1)=>{let{accessToken:p,userId:g,userRole:m}=(0,o.default)();return(0,t.useQuery)({queryKey:i.list({filters:{...g&&{userId:g},...m&&{userRole:m},page:e,size:a,...n&&{search:n},...r&&{modelId:r},...s&&{teamId:s},...u&&{sortBy:u},...d&&{sortOrder:d},...c&&{excludeAutoRouters:"true"}}}),queryFn:async()=>await (0,l.modelInfoCall)(p,g,m,e,a,n,r,s,u,d,c),enabled:!!(p&&g&&m)})},"useUserModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:c.list({}),queryFn:async()=>(await (0,l.modelAvailableCall)(e,a,n)).data.map(e=>e.id),enabled:!!(e&&a&&n)})}])},548151,200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(199931),r=e.i(625901),l=e.i(487486),o=e.i(115504);let i=new Set,s=(0,a.createContext)(i);function u(e){let t=(0,a.useContext)(s);return!!e&&t.has(e)}e.s(["AutoRouterIcon",0,function({size:e=12,className:a}){return(0,t.jsx)(n.Waypoints,{size:e,className:a,"aria-hidden":!0})},"AutoRouterModelGroupsProvider",0,function({children:e}){let a=(0,r.useAutoRouterModelGroups)();return(0,t.jsx)(s.Provider,{value:a,children:e})},"AutoRouterTag",0,function({modelGroup:e,className:a}){return u(e)?(0,t.jsxs)(l.Badge,{variant:"secondary",title:`Routed by auto-router "${e}"`,className:(0,o.cn)("gap-1.5 px-2.5 py-1 text-sm font-normal text-foreground",a),children:[(0,t.jsx)(n.Waypoints,{"aria-hidden":!0}),e]}):null},"useIsAutoRoutedModelGroup",0,u],548151);var d=e.i(581070);let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=e=>String(e).padStart(2,"0"),g=(e,t)=>"date"===t?`${c[e.getMonth()]} ${e.getDate()}, ${e.getFullYear()}`:`${c[e.getMonth()]} ${e.getDate()}, ${p(e.getHours())}:${p(e.getMinutes())}:${p(e.getSeconds())}`;e.s(["DateCell",0,function({value:e,precision:a="datetime",fallback:n="-"}){let r,l,o,i=e?new Date(e):null;return!i||Number.isNaN(i.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:n}):(0,t.jsx)(d.CellTooltip,{content:(r=Intl.DateTimeFormat().resolvedOptions().timeZone,l=`${c[i.getMonth()]} ${i.getDate()}, ${i.getFullYear()}`,o=`${p(i.getHours())}:${p(i.getMinutes())}:${p(i.getSeconds())}`,`${l}, ${o} (${r})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:g(i,a)})})},"formatCellDate",0,g],200208);var m=e.i(174886),f=e.i(500330);let b={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:n,copyable:r=!1,truncate:l=!0,fallback:i="-",tooltip:s,disabled:u=!1,dataTestId:c,className:p}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:i});let g=!!n&&!u,x=(0,o.cn)(b[a].base,g&&b[a].clickable,l&&"block max-w-[15ch] truncate",u&&"opacity-50",p),h=g?(0,t.jsx)("button",{type:"button",className:x,"data-testid":c,onClick:()=>n(e),children:e}):(0,t.jsx)("span",{className:x,"data-testid":c,children:e}),y=(0,t.jsx)(d.CellTooltip,{content:s??e,trigger:h});return r?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[y,(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,f.copyToClipboard)(e)},children:(0,t.jsx)(m.Copy,{className:"size-3"})})]}):y}],399536);var x=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:n,onClick:r,className:l,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!=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,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",l),children:[s,(0,t.jsx)(x.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",l),children:s})}],997422);let h={hasModelAccess:!1,label:"Management"},y={hasModelAccess:!1,label:"Read-only"},C={hasModelAccess:!1,label:"SCIM"},v={hasModelAccess:!0,label:null},S=e=>e.startsWith("/scim"),w=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?h:"read_only"===t?y:Array.isArray(e)&&0!==e.length?e.every(S)?C:w(e,"management_routes")?h:w(e,"info_routes")?y:v:v],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),l=[],o=[];return r.forEach(e=>{e.endsWith("/*")?l.push(e):o.push(e)}),[...l,...o]}}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("/*",""),l=t.filter(e=>e.startsWith(r+"/"));n.push(...l),a.push(e)}else n.push(e)}),[...a,...n].filter((e,t,a)=>a.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";e.i(548151);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),l=e.i(487486);let o="all-proxy-models",i=e=>{if(e===o)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)(l.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)(l.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)(l.Badge,{variant:e===o?"secondary":"outline",children:i(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:i(e)},t))}),trigger:(0,a.jsxs)(l.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,l=t??n??null,o=null==t&&null!=n,i="number"==typeof l&&l>0,d=i?r/l*100:0,c=r>0?(0,s.getSpendString)(r,4):"$0.00",p=null===l?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(l)}${o?" (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})]}),i&&(0,a.jsx)(u.Meter,{value:r,max:l,"aria-valuetext":`${c} of $${(0,s.formatNumberWithCommas)(l)}`,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)},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/077dp65t7iug7.js b/litellm/proxy/_experimental/out/_next/static/chunks/077dp65t7iug7.js deleted file mode 100644 index 7644fde026f..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/077dp65t7iug7.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,207082,e=>{"use strict";var t=e.i(619273),l=e.i(266027),a=e.i(243652),s=e.i(602869),i=e.i(431703),r=e.i(135214);let n=(0,a.createQueryKeys)("keys"),o=async(e,t,l,a={})=>{try{let r=(0,s.getProxyBaseUrl)(),n=new URLSearchParams(Object.entries({team_id:a.teamID,project_id:a.projectID,agent_id:a.agentID,organization_id:a.organizationID,key_alias:a.selectedKeyAlias,key_hash:a.keyHash,user_id:a.userID,page:t,size:l,sort_by:a.sortBy,sort_order:a.sortOrder,expand:a.expand,status:a.status,return_full_object:"true",include_team_keys:"true",include_created_by_keys:"true",substring_matching:"true"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),o=`${r?`${r}/key/list`:"/key/list"}?${n}`,d=await fetch(o,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!d.ok){let e=await d.json(),t=(0,i.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await d.json()}catch(e){throw console.error("Failed to list keys:",e),e}},d=(0,a.createQueryKeys)("deletedKeys");e.s(["keyKeys",0,n,"useDeletedKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:d.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,{...s,status:"deleted"}),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})},"useKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:n.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,s),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})}])},510674,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(431703),i=e.i(135214),r=e.i(708347);let n=(0,l.createQueryKeys)("projects"),o=[...r.all_admin_roles,...r.internalUserRoles],d=async e=>{let t=(0,a.getProxyBaseUrl)(),l=`${t}/project/list`,i=await fetch(l,{method:"GET",headers:{[(0,a.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let e=await i.json(),t=(0,s.deriveErrorMessage)(e);throw(0,a.handleError)(t),Error(t)}return i.json()};e.s(["projectKeys",0,n,"useProjects",0,()=>{let{accessToken:e,userRole:l}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list({}),queryFn:async()=>d(e),enabled:!!e&&o.includes(l)})}])},557662,e=>{"use strict";let t={src:e.i(196361).default,width:823,height:807,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABCUlEQVR42k2Ov0sCYRjH3/f09c68NOuiLg+NvMM6qIaIhgKDlgbBBiH7ARbkFAr+wEFwUBzUSRwUN3+Am4Kbg4sIIg4iOugiguDm5F/gvaLiF57l83yf5/sFYC0VQdJJnS0bObUkSCgnwa4ggPD94O57KkYX46vw/HVftECMNzKRJ2JL8A+KekelfO6s1Y3utl6hNayWahmlznIfhQbv6V4oGP6aOrvtCIFRnH1LKQmkBC7G7BtehmZWzY0NRxEAEo7Dhz/MvrT3P6BvCk5irDVJQURhAx5aKpzh7Pkm7+2BZ1p4YeT0MYIy5Dx6/P+UrvAXFml0TyqjeVtUytsrGX6rac6ew+YNXwKfsTPy4XOyEQAAAABJRU5ErkJggg=="},l={src:e.i(614148).default,width:600,height:450,blurWidth:0,blurHeight:0},a={src:e.i(858236).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqklEQVR42mXOzQqCQBQF4NG8PVKLalNRrxW01EgUghZm4Tu0aV3gopBCaDDoh8LMyubaCzQzLj2c1fk2h/zwyZvjI8NTmtMXHj94yfBG5JqE0WrsDWyv70eLGOkbrwJotG316lDVeJvd2pouE3YW4M4nAEBkADTD1eOvBNPUFUUpQAMwplbK7gJsa6hWVG58bXTam0OAmAjYBT63kWk4Myeke2TiJynulvsHOZp6y2XrD90AAAAASUVORK5CYII="},s={src:e.i(508296).default,width:180,height:180,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvXivVvITItyZVvSwKFmDRbjjPYDB/SutONn6fiaaH/9k="},i={src:e.i(324755).default,width:48,height:48,blurWidth:0,blurHeight:0},r={src:e.i(475151).default,width:14,height:16,blurWidth:0,blurHeight:0},n={src:e.i(274286).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA/ElEQVR42m3Pz0vCUADA8ed7a3uBjb0sx5C1Ri1oIDJSKEdJgyEFtbwFgScpsGNR1CmyS0Ho0ZOggv+A4F3B30f9HwRRwYMICupNPPg5fa9fANazLQtCtC0jdGbSdFSmN6+Ry/tIHd/+w52jOwyRCDRZL+UJ6eREdXauR0dq8HtiBl7mD25r+MtyLfBO+Fpm19UXTsJ17LnPWhyf+rNvVWOiu38j+Zrgk/CNuHDYtfsiRUa1khYnpH9Y0viQtIGxf1oGfsVoFxzOYULR51f+p6lifo09wdjs0hvuvbKkAhDF7GkUFYpgnLhg8DPtOAghOfAGiWRs2KBz/dqKBVIdOzeF2+/ZAAAAAElFTkSuQmCC"},o={src:e.i(436494).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAnElEQVR42oXOsQqCUACF4ftWvUFbBFFzQSVRLQ5RmRDkUJFTIUFNEQgNDWFTNURjgyAiOgiiCF7FQRCcVFQQJ1H4t284B1gwzA0UAS/A2+N7pp8nmrne3yynJ6Cp3mBBoARZbfcqjVZ3tkSwlSw7QFHc5gitI+M1delM8LhafyhKNjCN4PPjsR2Fk8f59jDd7JnXHxp+Oh5zVsmrCGlHlzZm+jq8AAAAAElFTkSuQmCC"},d={src:e.i(204086).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhElEQVR42oWPuw0DIRBEr6g7aIGQAAQSEiTk1EAHVILogIQAQUPOxoKT5cSfYDbYedqdOc7zfFzXhU9a3vHNfGkDhBB472GMQQgB1lo45/Z+A4wx9N6Rc8acE7VWpJRuYI0YI1prW6UUjDHAOb9fLEAIAaXUPi2lhNYalNJ3hp8h/9V8AqCAe6iqrOaAAAAAAElFTkSuQmCC"},c={src:e.i(531150).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA40lEQVR42lWOvesBcQDGz0/9VmUl/4lSyqaUic5gM0jKSBlISgaXwWCwGc7gFPKeIikUMXAldec9Wdx5uft+v3KFMzzL8/k89WAIIUweyLG6W9tRFNmKGUHw9wMfAvgfDBfWddWbv5aNE5Gtmr9LiBSNzgq3uQv7UKzY2tZ9uXvfl/4IxxOvyeZn/niyQkWJJkXTjB7ez2oJHk6cNpzo5ohUjeTHRICnSScEQPliGIKistef23FPYUNSo6CwJHGw6xgQggpJEBYZ12UQiY2njOnCPVSv528oCWDbNopMySIv5XkCtum3l9/HqzEAAAAASUVORK5CYII="},u=[{id:"arize",displayName:"Arize",logo:t.src,supports_key_team_logging:!0,dynamic_params:{arize_api_key:"password",arize_space_id:"password"},description:"Arize Logging Integration"},{id:"braintrust",displayName:"Braintrust",logo:a.src,supports_key_team_logging:!1,dynamic_params:{braintrust_api_key:"password",braintrust_project_name:"text"},description:"Braintrust Logging Integration"},{id:"custom_callback_api",displayName:"Custom Callback API",supports_key_team_logging:!0,dynamic_params:{custom_callback_api_url:"text",custom_callback_api_headers:"text"},description:"Custom Callback API Logging Integration"},{id:"galileo",displayName:"Galileo",logo:i.src,supports_key_team_logging:!1,dynamic_params:{GALILEO_API_KEY:"password",GALILEO_PROJECT_ID:"text",GALILEO_LOG_STREAM_ID:"text",GALILEO_BASE_URL:"text",GALILEO_USERNAME:"text",GALILEO_PASSWORD:"password"},description:"Galileo AI Observability Integration"},{id:"datadog",displayName:"Datadog",logo:s.src,supports_key_team_logging:!1,dynamic_params:{dd_api_key:"password",dd_site:"text"},description:"Datadog Logging Integration"},{id:"lago",displayName:"Lago",logo:r.src,supports_key_team_logging:!1,dynamic_params:{lago_api_url:"text",lago_api_key:"password"},description:"Lago Billing Logging Integration"},{id:"langfuse",displayName:"Langfuse",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v2 Logging Integration"},{id:"langfuse_otel",displayName:"Langfuse OTEL",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v3 OTEL Logging Integration"},{id:"langsmith",displayName:"LangSmith",logo:o.src,supports_key_team_logging:!0,dynamic_params:{langsmith_api_key:"password",langsmith_project:"text",langsmith_base_url:"text",langsmith_sampling_rate:"number"},description:"Langsmith Logging Integration"},{id:"openmeter",displayName:"OpenMeter",logo:d.src,supports_key_team_logging:!1,dynamic_params:{openmeter_api_key:"password",openmeter_base_url:"text"},description:"OpenMeter Logging Integration"},{id:"otel",displayName:"Open Telemetry",logo:c.src,supports_key_team_logging:!1,dynamic_params:{otel_endpoint:"text",otel_headers:"text"},description:"OpenTelemetry Logging Integration"},{id:"s3",displayName:"S3",logo:l.src,supports_key_team_logging:!1,dynamic_params:{s3_bucket_name:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"S3 Bucket (AWS) Logging Integration"},{id:"SQS",displayName:"SQS",logo:l.src,supports_key_team_logging:!1,dynamic_params:{sqs_queue_url:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"SQS Queue (AWS) Logging Integration"}],m=u.reduce((e,t)=>(e[t.displayName]=t,e),{}),g=u.reduce((e,t)=>(e[t.displayName]=t.id,e),{}),p=u.reduce((e,t)=>(e[t.id]=t.displayName,e),{});e.s(["callbackInfo",0,m,"callback_map",0,g,"mapDisplayToInternalNames",0,e=>e.map(e=>g[e]||e),"mapInternalToDisplayNames",0,e=>e.map(e=>p[e]||e),"reverse_callback_map",0,p],557662)},810757,477386,e=>{"use strict";var t=e.i(271645);let l=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}))});e.s(["CogIcon",0,l],810757);let a=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"}))});e.s(["BanIcon",0,a],477386)},552130,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select agents",disabled:d=!1})=>{let[c,u]=(0,l.useState)([]),[m,g]=(0,l.useState)([]),[p,h]=(0,l.useState)(!1);(0,l.useEffect)(()=>{(async()=>{if(n){h(!0);try{let e=await (0,s.getAgentsList)(n),t=e?.agents||[];u(t);let l=new Set;t.forEach(e=>{let t=e.agent_access_groups;t&&Array.isArray(t)&&t.forEach(e=>l.add(e))}),g(Array.from(l))}catch(e){console.error("Error fetching agents:",e)}finally{h(!1)}}})()},[n]);let x=[...m.map(e=>({label:e,value:`group:${e}`,isAccessGroup:!0,searchText:`${e} Access Group`})),...c.map(e=>({label:`${e.agent_name||e.agent_id}`,value:e.agent_id,isAccessGroup:!1,searchText:`${e.agent_name||e.agent_id} ${e.agent_id} Agent`}))],y=[...i?.agents||[],...(i?.accessGroups||[]).map(e=>`group:${e}`)];return(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:o,onChange:t=>{e({agents:t.filter(e=>!e.startsWith("group:")),accessGroups:t.filter(e=>e.startsWith("group:")).map(e=>e.replace("group:",""))})},value:y,loading:p,className:r,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:d,filterOption:(e,t)=>(x.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:x.map(e=>(0,t.jsx)(a.Select.Option,{value:e.value,label:e.label,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:e.isAccessGroup?"#52c41a":"#722ed1",flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:e.isAccessGroup?"#52c41a":"#722ed1",fontSize:"12px",fontWeight:500,opacity:.8},children:e.isAccessGroup?"Access Group":"Agent"})]})},e.value))})})}])},9314,645526,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(981339);e.i(247167);var s=e.i(931067),i=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.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.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 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 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.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.9-1.7-203.3 89.2-203.3 199.9 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.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};var n=e.i(9583),o=i.forwardRef(function(e,t){return i.createElement(n.default,(0,s.default)({},e,{ref:t,icon:r}))});e.s(["TeamOutlined",0,o],645526);var d=e.i(599724),c=e.i(263147);e.s(["default",0,({value:e,onChange:s,placeholder:i="Select access groups",disabled:r=!1,style:n,className:u,showLabel:m=!1,labelText:g="Access Group",allowClear:p=!0})=>{let{data:h,isLoading:x,isError:y}=(0,c.useAccessGroups)();if(x)return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(a.Skeleton.Input,{active:!0,block:!0,style:{height:32,...n}})]});let b=(h??[]).map(e=>({label:(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-medium",children:e.access_group_name})," ",(0,t.jsxs)("span",{className:"text-gray-400 text-xs",children:["(",e.access_group_id,")"]})]}),value:e.access_group_id,selectedLabel:e.access_group_name,searchText:`${e.access_group_name} ${e.access_group_id}`}));return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(l.Select,{mode:"multiple",value:e,placeholder:i,onChange:s,disabled:r,allowClear:p,showSearch:!0,style:{width:"100%",...n},className:`rounded-md ${u??""}`,notFoundContent:y?(0,t.jsx)("span",{className:"text-red-500",children:"Failed to load access groups"}):"No access groups found",filterOption:(e,t)=>(b.find(e=>e.value===t?.value)?.searchText??"").toLowerCase().includes(e.toLowerCase()),optionLabelProp:"selectedLabel",options:b.map(e=>({label:e.label,value:e.value,selectedLabel:e.selectedLabel}))})]})}],9314)},392110,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(592968),i=e.i(312361),r=e.i(790848),n=e.i(536916),o=e.i(808613),d=e.i(827252),c=e.i(779241);let{Option:u}=a.Select;e.s(["default",0,({form:e,autoRotationEnabled:m,onAutoRotationChange:g,rotationInterval:p,onRotationIntervalChange:h,isCreateMode:x=!1,neverExpire:y=!1,onNeverExpireChange:b})=>{let f=p&&!["7d","30d","90d","180d","365d"].includes(p),[j,_]=(0,l.useState)(f),[v,A]=(0,l.useState)(f?p:"");return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Key Expiry Settings"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Expire Key"}),(0,t.jsx)(s.Tooltip,{title:"Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to keep the current expiry unchanged.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})}),!x&&b&&(0,t.jsx)(n.Checkbox,{checked:y,onChange:t=>{let l=t.target.checked;b(l),l&&(e&&"function"==typeof e.setFieldValue?e.setFieldValue("duration",""):e&&"function"==typeof e.setFieldsValue&&e.setFieldsValue({duration:""}))},className:"ml-2 text-sm font-normal text-gray-600",children:"Never Expire"})]}),(0,t.jsx)(o.Form.Item,{name:"duration",noStyle:!0,initialValue:"",children:(0,t.jsx)(c.TextInput,{placeholder:x?"e.g., 30d or leave empty to never expire":"e.g., 30d",className:"w-full",disabled:!x&&y})})]})]}),(0,t.jsx)(i.Divider,{}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Auto-Rotation Settings"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Enable Auto-Rotation"}),(0,t.jsx)(s.Tooltip,{title:"Key will automatically regenerate at the specified interval for enhanced security.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsx)(r.Switch,{checked:m,onChange:g,size:"default",className:m?"":"bg-gray-400"})]}),m&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Rotation Interval"}),(0,t.jsx)(s.Tooltip,{title:"How often the key should be automatically rotated. Choose the interval that best fits your security requirements.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(a.Select,{value:j?"custom":p,onChange:e=>{"custom"===e?_(!0):(_(!1),A(""),h(e))},className:"w-full",placeholder:"Select interval",children:[(0,t.jsx)(u,{value:"7d",children:"7 days"}),(0,t.jsx)(u,{value:"30d",children:"30 days"}),(0,t.jsx)(u,{value:"90d",children:"90 days"}),(0,t.jsx)(u,{value:"180d",children:"180 days"}),(0,t.jsx)(u,{value:"365d",children:"365 days"}),(0,t.jsx)(u,{value:"custom",children:"Custom interval"})]}),j&&(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(c.TextInput,{value:v,onChange:e=>{let t=e.target.value;A(t),h(t)},placeholder:"e.g., 1s, 5m, 2h, 14d"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Supported formats: seconds (s), minutes (m), hours (h), days (d)"})]})]})]})]}),m&&(0,t.jsx)("div",{className:"bg-blue-50 p-3 rounded-md text-sm text-blue-700",children:"When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period."})]})]})}])},844565,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select pass through routes",disabled:d=!1,teamId:c})=>{let[u,m]=(0,l.useState)([]),[g,p]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{(async()=>{if(n){p(!0);try{let e=await (0,s.getPassThroughEndpointsCall)(n,c);if(e.endpoints){let t=e.endpoints.flatMap(e=>{let t=e.path,l=e.methods;return l&&l.length>0?l.map(e=>({label:`${e} ${t}`,value:t})):[{label:t,value:t}]});m(t)}}catch(e){console.error("Error fetching pass through routes:",e)}finally{p(!1)}}})()},[n,c]),(0,t.jsx)(a.Select,{mode:"tags",placeholder:o,onChange:e,value:i,loading:g,className:r,allowClear:!0,options:u,optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:d})}])},939510,e=>{"use strict";var t=e.i(843476),l=e.i(808613),a=e.i(199133),s=e.i(592968),i=e.i(827252);let{Option:r}=a.Select;e.s(["default",0,({type:e,name:n,showDetailedDescriptions:o=!0,className:d="",initialValue:c=null,form:u,onChange:m})=>{let g=e.toUpperCase(),p=e.toLowerCase(),h=`Select 'guaranteed_throughput' to prevent overallocating ${g} limit when the key belongs to a Team with specific ${g} limits.`;return(0,t.jsx)(l.Form.Item,{label:(0,t.jsxs)("span",{children:[g," Rate Limit Type"," ",(0,t.jsx)(s.Tooltip,{title:h,children:(0,t.jsx)(i.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:n,initialValue:c,className:d,children:(0,t.jsx)(a.Select,{defaultValue:o?"default":void 0,placeholder:"Select rate limit type",style:{width:"100%"},optionLabelProp:o?"label":void 0,onChange:e=>{u&&u.setFieldValue(n,e),m&&m(e)},children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",label:"Default",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Default"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Best effort throughput - no error if we're overallocating ",p," (Team/Key Limits checked at runtime)."]})]})}),(0,t.jsx)(r,{value:"guaranteed_throughput",label:"Guaranteed throughput",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Guaranteed throughput"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Guaranteed throughput - raise an error if we're overallocating ",p," (also checks model-specific limits)"]})]})}),(0,t.jsx)(r,{value:"dynamic",label:"Dynamic",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Dynamic"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["If the key has a set ",g," (e.g. 2 ",g,") and there are no 429 errors, it can dynamically exceed the limit when the model being called is not erroring."]})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",children:"Best effort throughput"}),(0,t.jsx)(r,{value:"guaranteed_throughput",children:"Guaranteed throughput"}),(0,t.jsx)(r,{value:"dynamic",children:"Dynamic"})]})})})}])},363256,e=>{"use strict";var t=e.i(843476),l=e.i(199133);let{Text:a}=e.i(898586).Typography;e.s(["default",0,({organizations:e,value:s,onChange:i,disabled:r,loading:n,style:o})=>(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"All Organizations",value:s,onChange:i,disabled:r,loading:n,allowClear:!0,style:{minWidth:280,...o},filterOption:(t,l)=>{if(!l)return!1;let a=e?.find(e=>e.organization_id===l.key);if(!a)return!1;let s=t.toLowerCase().trim(),i=(a.organization_alias||"").toLowerCase(),r=(a.organization_id||"").toLowerCase();return i.includes(s)||r.includes(s)},children:e?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.organization_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,t.jsxs)(a,{type:"secondary",children:["(",e.organization_id,")"]})]},e.organization_id))})])},128233,319312,833400,e=>{"use strict";var t=e.i(843476),l=e.i(464571),a=e.i(199133),s=e.i(592968),i=e.i(425063),r=e.i(107233),n=e.i(37727),o=e.i(271645);e.s(["BudgetFallbacksEditor",0,function({value:e,onChange:d,availableModels:c}){let[u,m]=(0,o.useState)(()=>{let t;return 0===(t=Object.keys(e)).length?[]:t.map((t,l)=>({id:String(l+1),primaryModel:t,fallbackModels:e[t]}))}),g=e=>{m(e),d(Object.fromEntries(e.filter(e=>null!==e.primaryModel&&e.fallbackModels.length>0).map(e=>[e.primaryModel,e.fallbackModels])))},p=()=>{g([...u,{id:Date.now().toString(),primaryModel:null,fallbackModels:[]}])},h=(e,t)=>{g(u.map(l=>l.id===e?{...l,...t}:l))},x=new Set(u.map(e=>e.primaryModel).filter(Boolean));return 0===u.length?(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),u.map(e=>{let l=c.filter(t=>t===e.primaryModel||!x.has(t)),r=c.filter(t=>t!==e.primaryModel);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void g(u.filter(e=>e.id!==t))},className:"absolute top-2 right-2 text-gray-400 hover:text-red-500 transition-colors p-1",children:(0,t.jsx)(n.X,{className:"w-4 h-4"})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Primary Model"}),(0,t.jsx)(a.Select,{className:"w-full",placeholder:"Select model",value:e.primaryModel,onChange:t=>{let l=e.fallbackModels.filter(e=>e!==t);h(e.id,{primaryModel:t,fallbackModels:l})},showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:l.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body})]}),(0,t.jsx)("div",{className:"flex items-center justify-center -my-1 mb-2",children:(0,t.jsxs)("div",{className:"bg-amber-50 text-amber-600 px-3 py-0.5 rounded-full text-[10px] font-bold border border-amber-100 flex items-center gap-1",children:[(0,t.jsx)(i.ArrowDown,{className:"w-3 h-3"}),"IF BUDGET EXCEEDED, TRY"]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Fallback Models"}),(0,t.jsx)(a.Select,{mode:"multiple",className:"w-full",placeholder:e.primaryModel?"Select fallback models":"Select a primary model first",value:e.fallbackModels,onChange:t=>h(e.id,{fallbackModels:t}),disabled:!e.primaryModel,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:r.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(s.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})}),e.fallbackModels.length>1&&(0,t.jsx)("div",{className:"text-[10px] text-gray-400 mt-1 ml-1",children:"Tried in order; first model still within its own budget is used"})]})]},e.id)}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]})}],128233);var d=e.i(28651);let c=[{value:"1h",label:"Hourly",resetHint:"Resets every hour"},{value:"24h",label:"Daily",resetHint:"Resets daily at midnight UTC"},{value:"7d",label:"Weekly",resetHint:"Resets every Sunday at midnight UTC"},{value:"30d",label:"Monthly",resetHint:"Resets on the 1st of every month at midnight UTC"}];e.s(["BudgetWindowsEditor",0,function({value:e,onChange:s}){let i=(t,l,a)=>{s(e.map((e,s)=>s===t?{...e,[l]:a}:e))};return(0,t.jsxs)("div",{children:[e.map((r,n)=>{let o=c.find(e=>e.value===r.budget_duration)?.resetHint;return(0,t.jsxs)("div",{style:{marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsx)(a.Select,{value:r.budget_duration,onChange:e=>i(n,"budget_duration",e),style:{width:130},options:c.map(e=>({value:e.value,label:e.label}))}),(0,t.jsx)(d.InputNumber,{step:.01,min:0,precision:2,value:r.max_budget??void 0,onChange:e=>i(n,"max_budget",e??null),placeholder:"Max spend ($)",style:{width:160},prefix:"$"}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{s(e.filter((e,t)=>t!==n))},style:{padding:"0 4px"},children:"✕"})]}),o&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#888",marginTop:3,marginLeft:2},children:["↻ ",o]})]},n)}),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),s([...e,{budget_duration:"24h",max_budget:null}])},children:"+ Add Budget Window"})]})}],319312);var u=e.i(311451);let m=0,g=()=>`tag-row-${m++}`;e.s(["TagRateLimitEditor",0,function({value:e,onChange:a}){let s=(t,l,s)=>{a(e.map((e,a)=>a===t?{...e,[l]:s}:e))};return(0,t.jsxs)("div",{children:[e.map((i,r)=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12},children:[(0,t.jsx)(u.Input,{value:i.tag,onChange:e=>s(r,"tag",e.target.value),placeholder:"Tag (e.g. cell-1)",style:{width:180}}),(0,t.jsx)(d.InputNumber,{min:0,value:i.rpm_limit??void 0,onChange:e=>s(r,"rpm_limit",e??null),placeholder:"RPM",style:{width:120}}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{a(e.filter((e,t)=>t!==r))},style:{padding:"0 4px"},children:"✕"})]},i.id)),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),a([...e,{id:g(),tag:"",rpm_limit:null}])},children:"+ Add Tag Limit"})]})},"tagLimitsToRows",0,e=>{let t=(e=>{if(!e||"object"!=typeof e)return{};let t={};return Object.entries(e).forEach(([e,l])=>{"number"==typeof l&&(t[e]=l)}),t})(e);return Object.keys(t).map(e=>({id:g(),tag:e,rpm_limit:t[e]}))},"tagRowsToLimits",0,e=>{let t={};return e.forEach(({tag:e,rpm_limit:l})=>{let a=e.trim();a&&"number"==typeof l&&(t[a]=l)}),{tag_rpm_limit:t}}],833400)},109034,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(135214);let i=(0,l.createQueryKeys)("tags");e.s(["useTags",0,()=>{let{accessToken:e,userId:l,userRole:r}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,a.tagListCall)(e),enabled:!!(e&&l&&r)})}])},309426,e=>{"use strict";var t=e.i(290571),l=e.i(444755),a=e.i(673706),s=e.i(271645),i=e.i(46757);let r=(0,a.makeClassName)("Col"),n=s.default.forwardRef((e,a)=>{let n,o,d,c,{numColSpan:u=1,numColSpanSm:m,numColSpanMd:g,numColSpanLg:p,children:h,className:x}=e,y=(0,t.__rest)(e,["numColSpan","numColSpanSm","numColSpanMd","numColSpanLg","children","className"]),b=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"";return s.default.createElement("div",Object.assign({ref:a,className:(0,l.tremorTwMerge)(r("root"),(n=b(u,i.colSpan),o=b(m,i.colSpanSm),d=b(g,i.colSpanMd),c=b(p,i.colSpanLg),(0,l.tremorTwMerge)(n,o,d,c)),x)},y),h)});n.displayName="Col",e.s(["Col",0,n],309426)},533882,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(250980),s=e.i(797672),i=e.i(68155),r=e.i(304967),n=e.i(629569),o=e.i(599724),d=e.i(269200),c=e.i(427612),u=e.i(64848),m=e.i(942232),g=e.i(496020),p=e.i(977572),h=e.i(992619),x=e.i(727749);e.s(["default",0,({accessToken:e,initialModelAliases:y={},onAliasUpdate:b,showExampleConfig:f=!0})=>{let[j,_]=(0,l.useState)([]),[v,A]=(0,l.useState)({aliasName:"",targetModel:""}),[w,k]=(0,l.useState)(null);(0,l.useEffect)(()=>{_(Object.entries(y).map(([e,t],l)=>({id:`${l}-${e}`,aliasName:e,targetModel:t})))},[y]);let N=()=>{if(!w)return;if(!w.aliasName||!w.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.id!==w.id&&e.aliasName===w.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=j.map(e=>e.id===w.id?w:e);_(e),k(null);let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias updated successfully")},S=()=>{k(null)},C=j.reduce((e,t)=>(e[t.aliasName]=t.targetModel,e),{});return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Add New Alias"}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Alias Name"}),(0,t.jsx)("input",{type:"text",value:v.aliasName,onChange:e=>A({...v,aliasName:e.target.value}),placeholder:"e.g., gpt-4o",className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Target Model"}),(0,t.jsx)(h.default,{accessToken:e,value:v.targetModel,placeholder:"Select target model",onChange:e=>A({...v,targetModel:e}),showLabel:!1})]}),(0,t.jsx)("div",{className:"flex items-end",children:(0,t.jsxs)("button",{onClick:()=>{if(!v.aliasName||!v.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.aliasName===v.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=[...j,{id:`${Date.now()}-${v.aliasName}`,aliasName:v.aliasName,targetModel:v.targetModel}];_(e),A({aliasName:"",targetModel:""});let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias added successfully")},disabled:!v.aliasName||!v.targetModel,className:`flex items-center px-4 py-2 rounded-md text-sm ${!v.aliasName||!v.targetModel?"bg-gray-300 text-gray-500 cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700"}`,children:[(0,t.jsx)(a.PlusCircleIcon,{className:"w-4 h-4 mr-1"}),"Add Alias"]})})]})]}),(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Manage Existing Aliases"}),(0,t.jsx)("div",{className:"rounded-lg custom-border relative mb-6",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)(d.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,t.jsx)(c.TableHead,{children:(0,t.jsxs)(g.TableRow,{children:[(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Alias Name"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Target Model"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Actions"})]})}),(0,t.jsxs)(m.TableBody,{children:[j.map(l=>(0,t.jsx)(g.TableRow,{className:"h-8",children:w&&w.id===l.id?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)("input",{type:"text",value:w.aliasName,onChange:e=>k({...w,aliasName:e.target.value}),className:"w-full px-2 py-1 border border-gray-300 rounded-md text-sm"})}),(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)(h.default,{accessToken:e,value:w.targetModel,onChange:e=>k({...w,targetModel:e}),showLabel:!1,style:{height:"32px"}})}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:N,className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:"Save"}),(0,t.jsx)("button",{onClick:S,className:"text-xs bg-gray-50 text-gray-600 px-2 py-1 rounded-sm hover:bg-gray-100",children:"Cancel"})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-900",children:l.aliasName}),(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-500",children:l.targetModel}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>{k({...l})},className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:(0,t.jsx)(s.PencilIcon,{className:"w-3 h-3"})}),(0,t.jsx)("button",{onClick:()=>{var e;let t,a;return e=l.id,_(t=j.filter(t=>t.id!==e)),a={},void(t.forEach(e=>{a[e.aliasName]=e.targetModel}),b&&b(a),x.default.success("Alias deleted successfully"))},className:"text-xs bg-red-50 text-red-600 px-2 py-1 rounded-sm hover:bg-red-100",children:(0,t.jsx)(i.TrashIcon,{className:"w-3 h-3"})})]})})]})},l.id)),0===j.length&&(0,t.jsx)(g.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:3,className:"py-0.5 text-sm text-gray-500 text-center",children:"No aliases added yet. Add a new alias above."})})]})]})})}),f&&(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(n.Title,{className:"mb-4",children:"Configuration Example"}),(0,t.jsx)(o.Text,{className:"text-gray-600 mb-4",children:"Here's how your current aliases would look in the config:"}),(0,t.jsx)("div",{className:"bg-gray-100 rounded-lg p-4 font-mono text-sm",children:(0,t.jsxs)("div",{className:"text-gray-700",children:["model_aliases:",0===Object.keys(C).length?(0,t.jsxs)("span",{className:"text-gray-500",children:[(0,t.jsx)("br",{}),"  # No aliases configured yet"]}):Object.entries(C).map(([e,l])=>(0,t.jsxs)("span",{children:[(0,t.jsx)("br",{}),'  "',e,'": "',l,'"']},e))]})})]})]})}])},266484,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(592968),s=e.i(312361),i=e.i(827252),r=e.i(994388),n=e.i(304967),o=e.i(779241),d=e.i(988297),c=e.i(68155),u=e.i(810757),m=e.i(477386),g=e.i(557662),p=e.i(174553),h=e.i(435451);let{Option:x}=l.Select;e.s(["default",0,({value:e=[],onChange:y,disabledCallbacks:b=[],onDisabledCallbacksChange:f})=>{let j=Object.entries(g.callbackInfo).filter(([e,t])=>t.supports_key_team_logging).map(([e,t])=>e),_=Object.keys(g.callbackInfo),v=e=>{y?.(e)},A=(t,l,a)=>{let s=[...e];if("callback_name"===l){let e=g.callback_map[a]||a;s[t]={...s[t],[l]:e,callback_vars:{}}}else s[t]={...s[t],[l]:a};v(s)},w=(t,l,a)=>{let s=[...e];s[t]={...s[t],callback_vars:{...s[t].callback_vars,[l]:a}},v(s)};return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(m.BanIcon,{className:"w-5 h-5 text-red-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Disabled Callbacks"}),(0,t.jsx)(a.Tooltip,{title:"Select callbacks to disable for this key. Disabled callbacks will not receive any logging data.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Disabled Callbacks"}),(0,t.jsx)(l.Select,{mode:"multiple",placeholder:"Select callbacks to disable",value:b,onChange:e=>{let t=(0,g.mapDisplayToInternalNames)(e);f?.(t)},style:{width:"100%"},optionLabelProp:"label",children:_.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Select callbacks that should be disabled for this key. These callbacks will not receive any logging data."})]})]}),(0,t.jsx)(s.Divider,{}),(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(u.CogIcon,{className:"w-5 h-5 text-blue-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Logging Integrations"}),(0,t.jsx)(a.Tooltip,{title:"Configure callback logging integrations for this team.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsx)(r.Button,{variant:"secondary",onClick:()=>{v([...e,{callback_name:"",callback_type:"success",callback_vars:{}}])},icon:d.PlusIcon,size:"sm",className:"hover:border-blue-400 hover:text-blue-500",type:"button",children:"Add Integration"})]}),(0,t.jsx)("div",{className:"space-y-4",children:e.map((s,i)=>{let d=s.callback_name?Object.entries(g.callback_map).find(([e,t])=>t===s.callback_name)?.[0]:void 0;return(0,t.jsxs)(n.Card,{className:"border border-gray-200 shadow-xs hover:shadow-md transition-shadow duration-200",decoration:"top",decorationColor:"blue",children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[d&&(0,t.jsx)(p.Logo,{src:g.callbackInfo[d]?.logo,label:d,className:"w-5 h-5 object-contain"}),(0,t.jsxs)("span",{className:"text-sm font-medium",children:[d||"New Integration"," Configuration"]})]}),(0,t.jsx)(r.Button,{variant:"light",onClick:()=>{v(e.filter((e,t)=>t!==i))},icon:c.TrashIcon,size:"xs",color:"red",className:"hover:bg-red-50",type:"button",children:"Remove"})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Integration Type"}),(0,t.jsx)(l.Select,{value:d,placeholder:"Select integration",onChange:e=>A(i,"callback_name",e),className:"w-full",optionLabelProp:"label",children:j.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Event Type"}),(0,t.jsxs)(l.Select,{value:s.callback_type,onChange:e=>A(i,"callback_type",e),className:"w-full",children:[(0,t.jsx)(x,{value:"success",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"Success Only"})]})}),(0,t.jsx)(x,{value:"failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-red-500 rounded-full"}),(0,t.jsx)("span",{children:"Failure Only"})]})}),(0,t.jsx)(x,{value:"success_and_failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"Success & Failure"})]})})]})]})]}),((e,l)=>{if(!e.callback_name)return null;let a=Object.entries(g.callback_map).find(([t,l])=>l===e.callback_name)?.[0];if(!a)return null;let s=g.callbackInfo[a]?.dynamic_params||{};return 0===Object.keys(s).length?null:(0,t.jsxs)("div",{className:"mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-4",children:[(0,t.jsx)("div",{className:"w-3 h-3 bg-blue-100 rounded-full flex items-center justify-center",children:(0,t.jsx)("div",{className:"w-1.5 h-1.5 bg-blue-500 rounded-full"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Integration Parameters"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:Object.entries(s).map(([a,s])=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 capitalize flex items-center space-x-1",children:[(0,t.jsx)("span",{children:a.replace(/_/g," ")}),"password"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Sensitive"}),"number"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Number"})]}),"number"===s&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:"Value must be between 0 and 1"}),"number"===s?(0,t.jsx)(h.default,{step:.01,width:400,placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)}):(0,t.jsx)(o.TextInput,{type:"password"===s?"password":"text",placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)})]},a))})]})})(s,i)]})]},i)})}),0===e.length&&(0,t.jsxs)("div",{className:"text-center py-12 text-gray-500 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50",children:[(0,t.jsx)(u.CogIcon,{className:"w-12 h-12 text-gray-300 mb-3 mx-auto"}),(0,t.jsx)("div",{className:"text-base font-medium mb-1",children:"No logging integrations configured"}),(0,t.jsx)("div",{className:"text-sm text-gray-400",children:'Click "Add Integration" to configure logging for this team'})]})]})}])},651904,e=>{"use strict";var t=e.i(843476),l=e.i(599724),a=e.i(266484);e.s(["default",0,function({value:e,onChange:s,premiumUser:i=!1,disabledCallbacks:r=[],onDisabledCallbacksChange:n}){return i?(0,t.jsx)(a.default,{value:e,onChange:s,disabledCallbacks:r,onDisabledCallbacksChange:n}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-3",children:[(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ langfuse-logging"}),(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ datadog-logging"})]}),(0,t.jsx)("div",{className:"p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)(l.Text,{className:"text-sm text-yellow-800",children:["Setting Key/Team logging settings is a LiteLLM Enterprise feature. Global Logging Settings are available for all free users. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"}),"."]})})]})}])},460285,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(404206),s=e.i(723731),i=e.i(653824),r=e.i(881073),n=e.i(197647),o=e.i(343488),d=e.i(602869),c=e.i(158392),u=e.i(419470),m=e.i(695411);let g=(0,l.forwardRef)(({accessToken:e,value:g,onChange:p,modelData:h},x)=>{let[y,b]=(0,l.useState)({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),[f,j]=(0,l.useState)([]),[_,v]=(0,l.useState)([]),[A,w]=(0,l.useState)([]),[k,N]=(0,l.useState)([]),[S,C]=(0,l.useState)({}),[I,T]=(0,l.useState)({}),L=(0,l.useRef)(!1),E=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=g?.router_settings?JSON.stringify({routing_strategy:g.router_settings.routing_strategy,fallbacks:g.router_settings.fallbacks,enable_tag_filtering:g.router_settings.enable_tag_filtering}):null;if(L.current&&e===E.current){L.current=!1;return}if(L.current&&e!==E.current&&(L.current=!1),e!==E.current)if(E.current=e,g?.router_settings){let e=g.router_settings,{fallbacks:t,...l}=e;b({routerSettings:l,selectedStrategy:e.routing_strategy||null,enableTagFiltering:e.enable_tag_filtering??!1});let a=e.fallbacks||[];j(a),v(a&&0!==a.length?a.map((e,t)=>{let[l,a]=Object.entries(e)[0];return{id:(t+1).toString(),primaryModel:l||null,fallbackModels:a||[]}}):[{id:"1",primaryModel:null,fallbackModels:[]}])}else b({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),j([]),v([{id:"1",primaryModel:null,fallbackModels:[]}])},[g]),(0,l.useEffect)(()=>{e&&(0,d.getRouterSettingsCall)(e).then(e=>{if(e.fields){let t={};e.fields.forEach(e=>{t[e.field_name]={ui_field_name:e.ui_field_name,field_description:e.field_description,options:e.options,link:e.link}}),C(t);let l=e.fields.find(e=>"routing_strategy"===e.field_name);l?.options&&N(l.options),e.routing_strategy_descriptions&&T(e.routing_strategy_descriptions)}})},[e]),(0,l.useEffect)(()=>{e&&(async()=>{try{let t=await (0,m.fetchAvailableModels)(e);w(t)}catch(e){console.error("Error fetching model info for fallbacks:",e)}})()},[e]);let O=()=>{let e=new Set(["allowed_fails","cooldown_time","num_retries","timeout","retry_after"]),t=new Set(["model_group_alias","retry_policy"]),l=Object.fromEntries(Object.entries({...y.routerSettings,enable_tag_filtering:y.enableTagFiltering,routing_strategy:y.selectedStrategy,fallbacks:f.length>0?f:null}).map(([l,a])=>{if("routing_strategy_args"!==l&&"routing_strategy"!==l&&"enable_tag_filtering"!==l&&"fallbacks"!==l){let s=document.querySelector(`input[name="${l}"]`);if(s){if(void 0!==s.value&&""!==s.value){let i=((l,a,s)=>{if(null==a)return s;let i=String(a).trim();if(""===i||"null"===i.toLowerCase())return null;if(e.has(l)){let e=Number(i);return Number.isNaN(e)?s:e}if(t.has(l)){if(""===i)return null;try{return JSON.parse(i)}catch{return s}}return"true"===i.toLowerCase()||"false"!==i.toLowerCase()&&i})(l,s.value,a);return[l,i]}return[l,null]}}else if("routing_strategy"===l)return[l,y.selectedStrategy];else if("enable_tag_filtering"===l)return[l,y.enableTagFiltering];else if("fallbacks"===l)return[l,f.length>0?f:null];else if("routing_strategy_args"===l&&"latency-based-routing"===y.selectedStrategy){let e=document.querySelector('input[name="lowest_latency_buffer"]'),t=document.querySelector('input[name="ttl"]'),l={};return e?.value&&(l.lowest_latency_buffer=Number(e.value)),t?.value&&(l.ttl=Number(t.value)),["routing_strategy_args",Object.keys(l).length>0?l:null]}return[l,a]}).filter(e=>null!=e)),a=(e,t=!1)=>null==e||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length||t&&("number"!=typeof e||Number.isNaN(e))?null:e;return{routing_strategy:a(l.routing_strategy),allowed_fails:a(l.allowed_fails,!0),cooldown_time:a(l.cooldown_time,!0),num_retries:a(l.num_retries,!0),timeout:a(l.timeout,!0),retry_after:a(l.retry_after,!0),fallbacks:f.length>0?f:null,context_window_fallbacks:a(l.context_window_fallbacks),retry_policy:a(l.retry_policy),model_group_alias:a(l.model_group_alias),enable_tag_filtering:y.enableTagFiltering,routing_strategy_args:a(l.routing_strategy_args)}},F=(0,o.useDebouncedCallback)(()=>{p&&(L.current=!0,p({router_settings:O()}))},{wait:100});(0,l.useEffect)(()=>{p&&F()},[y,f]);let M=Array.from(new Set(A.map(e=>e.model_group))).sort();return((0,l.useImperativeHandle)(x,()=>({getValue:()=>({router_settings:O()})})),e)?(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)(i.TabGroup,{className:"w-full",children:[(0,t.jsxs)(r.TabList,{variant:"line",defaultValue:"1",className:"px-8 pt-4",children:[(0,t.jsx)(n.Tab,{value:"1",children:"Loadbalancing"}),(0,t.jsx)(n.Tab,{value:"2",children:"Fallbacks"})]}),(0,t.jsxs)(s.TabPanels,{className:"px-8 py-6",children:[(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(c.default,{value:y,onChange:b,routerFieldsMetadata:S,availableRoutingStrategies:k,routingStrategyDescriptions:I})}),(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(u.FallbackSelectionForm,{groups:_,onGroupsChange:e=>{v(e),j(e.filter(e=>e.primaryModel&&e.fallbackModels.length>0).map(e=>({[e.primaryModel]:e.fallbackModels})))},availableModels:M,maxGroups:5})})]})]})}):null});g.displayName="RouterSettingsAccordion",e.s(["default",0,g])},575260,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(482725),s=e.i(56456);e.s(["default",0,({projects:e,value:i,onChange:r,disabled:n,loading:o,teamId:d})=>{let c=d?e?.filter(e=>e.team_id===d):e;return(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"Search or select a project",value:i,onChange:r,disabled:n,loading:o,allowClear:!0,notFoundContent:o?(0,t.jsx)(a.Spin,{indicator:(0,t.jsx)(s.LoadingOutlined,{spin:!0}),size:"small"}):void 0,filterOption:(e,t)=>{if(!t)return!1;let l=c?.find(e=>e.project_id===t.key);if(!l)return!1;let a=e.toLowerCase().trim(),s=(l.project_alias||"").toLowerCase(),i=(l.project_id||"").toLowerCase();return s.includes(a)||i.includes(a)},optionFilterProp:"children",children:!o&&c?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.project_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.project_alias||e.project_id})," ",(0,t.jsxs)("span",{className:"text-gray-500",children:["(",e.project_id,")"]})]},e.project_id))})}])},364769,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(237016),s=e.i(464571),i=e.i(888259);e.s(["default",0,({apiKey:e})=>{let[r,n]=(0,l.useState)(!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2",children:["Please save this secret key somewhere safe and accessible. For security reasons,"," ",(0,t.jsx)("b",{children:"you will not be able to view it again"})," through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-3 mb-1",children:"Virtual Key:"}),(0,t.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,t.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal",margin:0},children:e})}),(0,t.jsx)(a.CopyToClipboard,{text:e,onCopy:()=>{n(!0),i.default.success("Key copied to clipboard"),setTimeout(()=>n(!1),2e3)},children:(0,t.jsx)(s.Button,{type:"primary",style:{marginTop:12},children:r?"Copied!":"Copy Virtual Key"})})]})}])},702597,e=>{"use strict";var t=e.i(843476),l=e.i(207082),a=e.i(109799),s=e.i(510674),i=e.i(109034),r=e.i(292639),n=e.i(135214),o=e.i(500330),d=e.i(827252),c=e.i(912598),u=e.i(677667),m=e.i(130643),g=e.i(898667),p=e.i(994388),h=e.i(309426),x=e.i(350967),y=e.i(599724),b=e.i(779241),f=e.i(629569),j=e.i(464571),_=e.i(808613),v=e.i(311451),A=e.i(212931),w=e.i(91739),k=e.i(199133),N=e.i(790848),S=e.i(262218),C=e.i(592968),I=e.i(898586),T=e.i(343488),L=e.i(741466),E=e.i(271645),O=e.i(708347),F=e.i(552130),M=e.i(557662),R=e.i(9314),B=e.i(860585),P=e.i(82946),D=e.i(392110),U=e.i(533882),z=e.i(844565),V=e.i(651904),K=e.i(939510),G=e.i(460285),Q=e.i(663435),W=e.i(363256),H=e.i(575260),q=e.i(371455),J=e.i(128233),$=e.i(319312),Y=e.i(833400),X=e.i(355619),Z=e.i(75921),ee=e.i(234713),et=e.i(390605),el=e.i(727749),ea=e.i(602869),es=e.i(364769),ei=e.i(435451),er=e.i(916940);let{Option:en}=k.Select,eo=async(e,t,l,a)=>{try{if(null===e||null===t)return[];if(null!==l)return(await (0,ea.modelAvailableCall)(l,e,t,!0,a,!0)).data.map(e=>e.id);return[]}catch(e){return console.error("Error fetching user models:",e),[]}},ed=async(e,t,l,a)=>{try{if(null===e||null===t)return;if(null!==l){let s=(await (0,ea.modelAvailableCall)(l,e,t)).data.map(e=>e.id);a(s)}}catch(e){console.error("Error fetching user models:",e)}};e.s(["default",0,({team:e,teams:ec,data:eu,addKey:em,autoOpenCreate:eg,prefillData:ep})=>{let{accessToken:eh,userId:ex,userRole:ey,premiumUser:eb}=(0,n.default)(),ef=eb||null!=ey&&O.rolesWithWriteAccess.includes(ey),{data:ej,isLoading:e_}=(0,a.useOrganizations)(),{data:ev,isLoading:eA}=(0,s.useProjects)(),{data:ew}=(0,r.useUISettings)(),{data:ek}=(0,i.useTags)(),eN=!!ew?.values?.enable_projects_ui,eS=!!ew?.values?.disable_custom_api_keys,eC=ek?Object.values(ek).map(e=>({value:e.name,label:e.name})):[],eI=(0,c.useQueryClient)(),[eT]=_.Form.useForm(),[eL,eE]=(0,E.useState)(!1),[eO,eF]=(0,E.useState)(null),[eM,eR]=(0,E.useState)(null),[eB,eP]=(0,E.useState)([]),[eD,eU]=(0,E.useState)([]),[ez,eV]=(0,E.useState)("you"),[eK,eG]=(0,E.useState)(!1),[eQ,eW]=(0,E.useState)(null),[eH,eq]=(0,E.useState)([]),[eJ,e$]=(0,E.useState)([]),[eY,eX]=(0,E.useState)([]),[eZ,e0]=(0,E.useState)([]),[e1,e4]=(0,E.useState)(e),[e2,e3]=(0,E.useState)(null),[e6,e5]=(0,E.useState)(null),[e7,e8]=(0,E.useState)(!1),[e9,te]=(0,E.useState)(null),[tt,tl]=(0,E.useState)({}),[ta,ts]=(0,E.useState)([]),[ti,tr]=(0,E.useState)(!1),[tn,to]=(0,E.useState)([]),[td,tc]=(0,E.useState)([]),[tu,tm]=(0,E.useState)("llm_api"),[tg,tp]=(0,E.useState)({}),[th,tx]=(0,E.useState)(!1),[ty,tb]=(0,E.useState)("30d"),[tf,tj]=(0,E.useState)(null),[t_,tv]=(0,E.useState)([]),[tA,tw]=(0,E.useState)([]),[tk,tN]=(0,E.useState)({}),[tS,tC]=(0,E.useState)(0),[tI,tT]=(0,E.useState)(0),[tL,tE]=(0,E.useState)([]),[tO,tF]=(0,E.useState)(null),tM=_.Form.useWatch("models",eT)??[],tR=()=>{eE(!1),eT.resetFields(),e0([]),tc([]),tm("llm_api"),tp({}),tx(!1),tb("30d"),tj(null),tT(e=>e+1),tF(null),e3(null),e5(null),tv([]),tw([]),tN({}),tC(e=>e+1)},tB=()=>{eE(!1),eF(null),e4(null),eT.resetFields(),e0([]),tc([]),tm("llm_api"),tp({}),tx(!1),tb("30d"),tj(null),tT(e=>e+1),tF(null),e3(null),e5(null),tv([]),tw([]),tN({}),tC(e=>e+1)};(0,E.useEffect)(()=>{ex&&ey&&eh&&ed(ex,ey,eh,eP)},[eh,ex,ey]),(0,E.useEffect)(()=>{eh&&(0,ea.getAgentsList)(eh).then(e=>tE(e?.agents||[])).catch(()=>tE([]))},[eh]),(0,E.useEffect)(()=>{let e=async()=>{try{let e=(await (0,ea.getPoliciesList)(eh)).policies.map(e=>e.policy_name);e$(e)}catch(e){console.error("Failed to fetch policies:",e)}},t=async()=>{try{let e=await (0,ea.getPromptsList)(eh);eX(e.prompts.map(e=>e.prompt_id))}catch(e){console.error("Failed to fetch prompts:",e)}};(async()=>{try{let e=(await (0,ea.getGuardrailsList)(eh)).guardrails.map(e=>e.guardrail_name);eq(e)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),e(),t()},[eh]),(0,E.useEffect)(()=>{(async()=>{try{if(eh){let e=sessionStorage.getItem("possibleUserRoles");if(e)tl(JSON.parse(e));else{let e=await (0,ea.getPossibleUserRoles)(eh);sessionStorage.setItem("possibleUserRoles",JSON.stringify(e)),tl(e)}}}catch(e){console.error("Error fetching possible user roles:",e)}})()},[eh]),(0,E.useEffect)(()=>{if(eg&&!eK&&ec&&ey&&O.rolesWithWriteAccess.includes(ey)&&(eE(!0),eG(!0),ep)){if(ep.owned_by&&("another_user"===ep.owned_by&&"Admin"!==ey?eV("you"):eV(ep.owned_by)),ep.team_id){let e=ec?.find(e=>e.team_id===ep.team_id)||null;e&&(e4(e),eT.setFieldsValue({team_id:ep.team_id}))}ep.key_alias&&eT.setFieldsValue({key_alias:ep.key_alias}),ep.models&&ep.models.length>0&&eW(ep.models),ep.key_type&&(tm(ep.key_type),eT.setFieldsValue({key_type:ep.key_type}))}},[eg,ep,ec,eK,eT,ey]);let tP=eD.includes("no-default-models")&&!e1,tD=async e=>{try{let t,a=e?.key_alias??"",s=e?.team_id??null;if((eu?.filter(e=>e.team_id===s).map(e=>e.key_alias)??[]).includes(a))throw Error(`Key alias ${a} already exists for team with ID ${s}, please provide another key alias`);if(el.default.info("Making API Call"),eE(!0),"you"===ez)e.user_id=ex;else if("agent"===ez){if(!tO)return void el.default.fromBackend("Please select an agent");e.agent_id=tO}let i={};try{i=JSON.parse(e.metadata||"{}")}catch(e){console.error("Error parsing metadata:",e)}if("service_account"===ez&&(i.service_account_id=e.key_alias),eZ.length>0&&(i={...i,logging:eZ.filter(e=>e.callback_name)}),td.length>0){let e=(0,M.mapDisplayToInternalNames)(td);i={...i,litellm_disabled_callbacks:e}}if(th&&(e.auto_rotate=!0,e.rotation_interval=ty),e.duration&&""!==e.duration.trim()||(e.duration=null),e.metadata=JSON.stringify(i),e.disable_global_guardrails||delete e.disable_global_guardrails,e.allowed_vector_store_ids&&e.allowed_vector_store_ids.length>0&&(e.object_permission={vector_stores:e.allowed_vector_store_ids},delete e.allowed_vector_store_ids),e.allowed_mcp_servers_and_groups&&(e.allowed_mcp_servers_and_groups.servers?.length>0||e.allowed_mcp_servers_and_groups.accessGroups?.length>0||e.allowed_mcp_servers_and_groups.toolsets?.length>0)){e.object_permission||(e.object_permission={});let{servers:t,accessGroups:l,toolsets:a}=e.allowed_mcp_servers_and_groups;t&&t.length>0&&(e.object_permission.mcp_servers=t),l&&l.length>0&&(e.object_permission.mcp_access_groups=l),a&&a.length>0&&(e.object_permission.mcp_toolsets=a),delete e.allowed_mcp_servers_and_groups}let r=e.mcp_tool_permissions||{};if(Object.keys(r).length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_tool_permissions=r),delete e.mcp_tool_permissions,e.allowed_mcp_access_groups&&e.allowed_mcp_access_groups.length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_access_groups=e.allowed_mcp_access_groups,delete e.allowed_mcp_access_groups),e.allowed_agents_and_groups&&(e.allowed_agents_and_groups.agents?.length>0||e.allowed_agents_and_groups.accessGroups?.length>0)){e.object_permission||(e.object_permission={});let{agents:t,accessGroups:l}=e.allowed_agents_and_groups;t&&t.length>0&&(e.object_permission.agents=t),l&&l.length>0&&(e.object_permission.agent_access_groups=l),delete e.allowed_agents_and_groups}Object.keys(tg).length>0&&(e.aliases=JSON.stringify(tg)),tf?.router_settings&&Object.values(tf.router_settings).some(e=>null!=e&&""!==e)&&(e.router_settings=tf.router_settings);let n=t_.filter(e=>e.budget_duration&&null!==e.max_budget&&void 0!==e.max_budget);n.length>0&&(e.budget_limits=n);let{tag_rpm_limit:o}=(0,Y.tagRowsToLimits)(tA);Object.keys(o).length>0&&(e.tag_rpm_limit=o),Object.keys(tk).length>0&&(e.budget_fallbacks=tk),t="service_account"===ez?await (0,ea.keyCreateServiceAccountCall)(eh,e):await (0,ea.keyCreateCall)(eh,ex,e),em(t),eI.invalidateQueries({queryKey:l.keyKeys.lists()}),eF(t.key),eR(t.soft_budget),el.default.success("Virtual Key Created"),eT.resetFields(),tv([]),tw([]),tN({}),tC(e=>e+1),localStorage.removeItem("userData"+ex)}catch(t){let e=(e=>{let t;if(!(t=!e||"object"!=typeof e||e instanceof Error?String(e):JSON.stringify(e)).includes("/key/generate")&&!t.includes("KeyManagementRoutes.KEY_GENERATE"))return`Error creating the key: ${e}`;let l=t;try{if(!e||"object"!=typeof e||e instanceof Error){let e=t.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]),a=t?.error||t;a?.message&&(l=a.message)}}else{let t=e?.error||e;t?.message&&(l=t.message)}}catch(e){}return t.includes("team_member_permission_error")||l.includes("Team member does not have permissions")?"Team member does not have permission to generate key for this team. Ask your proxy admin to configure the team member permission settings.":`Error creating the key: ${e}`})(t);el.default.fromBackend(e)}};(0,E.useEffect)(()=>{if(e6){let e=ev?.find(e=>e.project_id===e6);eU(e?.models??[]),eT.setFieldValue("models",[]);return}ex&&ey&&eh&&eo(ex,ey,eh,e1?.team_id??null).then(e=>{eU((0,X.excludeProxyWideSentinel)(Array.from(new Set([...e1?.models??[],...e]))))}),eQ||eT.setFieldValue("models",[]),eT.setFieldValue("allowed_mcp_servers_and_groups",{servers:[],accessGroups:[]})},[e1,e6,eh,ex,ey,eT]),(0,E.useEffect)(()=>{if(!eQ||0===eQ.length||!eD||0===eD.length)return;let e=eQ.filter(e=>eD.includes(e));e.length>0&&eT.setFieldsValue({models:e}),eW(null)},[eQ,eD,eT]),(0,E.useEffect)(()=>{if(!e6||!ec)return;let e=ev?.find(e=>e.project_id===e6);if(!e?.team_id||e1?.team_id===e.team_id)return;let t=ec.find(t=>t.team_id===e.team_id)||null;t&&(e4(t),eT.setFieldValue("team_id",t.team_id))},[ec,e6,ev]);let tU=async e=>{if(!e)return void ts([]);tr(!0);try{let t=new URLSearchParams;if(t.append("user_email",e),null==eh)return;let l=(await (0,ea.userFilterUICall)(eh,t)).map(e=>({label:`${e.user_email} (${e.user_id})`,value:e.user_id,user:e}));ts(l)}catch(e){console.error("Error fetching users:",e),el.default.fromBackend("Failed to search for users")}finally{tr(!1)}},tz=(0,T.useDebouncedCallback)(e=>tU(e),{wait:L.DEBOUNCE_WAIT_MS});return(0,t.jsxs)("div",{children:[ey&&O.rolesWithWriteAccess.includes(ey)&&(0,t.jsx)(p.Button,{className:"mx-auto",onClick:()=>eE(!0),"data-testid":"create-key-button",children:"+ Create New Key"}),(0,t.jsx)(A.Modal,{open:eL,width:1e3,footer:null,onOk:tR,onCancel:tB,children:(0,t.jsxs)(_.Form,{form:eT,onFinish:tD,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Ownership"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Owned By"," ",(0,t.jsx)(C.Tooltip,{title:"Select who will own this Virtual Key",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),className:"mb-4",children:(0,t.jsxs)(w.Radio.Group,{onChange:e=>eV(e.target.value),value:ez,children:[(0,t.jsx)(w.Radio,{value:"you",children:"You"}),(0,t.jsx)(w.Radio,{value:"service_account",children:"Service Account"}),"Admin"===ey&&(0,t.jsx)(w.Radio,{value:"another_user",children:"Another User"}),(0,t.jsxs)(w.Radio,{value:"agent",children:["Agent ",(0,t.jsx)(S.Tag,{color:"purple",children:"New"})]})]})}),"another_user"===ez&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["User ID"," ",(0,t.jsx)(C.Tooltip,{title:"The user who will own this key and be responsible for its usage",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"user_id",className:"mt-4",rules:[{required:"another_user"===ez,message:"Please input the user ID of the user you are assigning the key to"}],children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",marginBottom:"8px"},children:[(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Type email to search for users",filterOption:!1,onSearch:tz,onSelect:(e,t)=>{let l;return l=t.user,void eT.setFieldsValue({user_id:l.user_id})},options:ta,loading:ti,allowClear:!0,style:{width:"100%"},notFoundContent:ti?"Searching...":"No users found"}),(0,t.jsx)(j.Button,{onClick:()=>e8(!0),style:{marginLeft:"8px"},children:"Create User"})]}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Search by email to find users"})]})}),"agent"===ez&&(0,t.jsxs)("div",{className:"mt-4 p-4 bg-purple-50 border border-purple-200 rounded-md",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Select Agent ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Select an agent",style:{width:"100%"},value:tO,onChange:e=>tF(e),filterOption:(e,t)=>t?.label?.toLowerCase().includes(e.toLowerCase()),options:tL.map(e=>({label:e.agent_name||e.agent_id,value:e.agent_id}))}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-2",children:"This key will be used by the selected agent to make requests to LiteLLM"})]}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Organization"," ",(0,t.jsx)(C.Tooltip,{title:"The organization this key belongs to. Selecting an organization filters the available teams.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",className:"mt-4",children:(0,t.jsx)(W.default,{organizations:ej,loading:e_,disabled:"Admin"!==ey,onChange:e=>{e3(e||null),e4(null),e5(null),eT.setFieldValue("team_id",void 0),eT.setFieldValue("project_id",void 0)}})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Team"," ",(0,t.jsx)(C.Tooltip,{title:"The team this key belongs to, which determines available models and budget limits",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"team_id",initialValue:e?e.team_id:null,className:"mt-4",rules:[{required:"service_account"===ez,message:"Please select a team for the service account"}],help:"service_account"===ez?"required":"",children:(0,t.jsx)(Q.default,{disabled:null!==e6,organizationId:e2,onTeamSelect:e=>{e4(e),e5(null),eT.setFieldValue("project_id",void 0),e?.organization_id?(e3(e.organization_id),eT.setFieldValue("organization_id",e.organization_id)):e||(e3(null),eT.setFieldValue("organization_id",void 0))}})}),eN&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Project"," ",(0,t.jsx)(C.Tooltip,{title:"Assign this key to a project. Selecting a project will lock the team to the project's team.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"project_id",className:"mt-4",children:(0,t.jsx)(H.default,{projects:ev,teamId:e1?.team_id,loading:eA||!ec,onChange:e=>{if(!e){e5(null),e4(null),eT.setFieldValue("team_id",void 0);return}e5(e)}})})]}),tP&&(0,t.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,t.jsx)(y.Text,{className:"text-blue-800 text-sm",children:"Please select a team to continue configuring your Virtual Key. If you do not see any teams, please contact your Proxy Admin to either provide you with access to models or to add you to a team."})}),!tP&&(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Details"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["you"===ez||"another_user"===ez?"Key Name":"Service Account ID"," ",(0,t.jsx)(C.Tooltip,{title:"you"===ez||"another_user"===ez?"A descriptive name to identify this key":"Unique identifier for this service account",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_alias",rules:[{required:!0,message:`Please input a ${"you"===ez?"key name":"service account ID"}`}],help:"required",children:(0,t.jsx)(b.TextInput,{placeholder:""})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Models"," ",(0,t.jsx)(C.Tooltip,{title:"Select which models this key can access. Choose 'All Team Models' to grant access to all models available to the team. Leave empty to allow access to all models.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",rules:[],help:"management"===tu||"read_only"===tu?"Models field is disabled for this key type":"optional - leave empty to allow access to all models",className:"mt-4",children:(0,t.jsxs)(k.Select,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},disabled:"management"===tu||"read_only"===tu,onChange:e=>{e.includes("all-team-models")?eT.setFieldsValue({models:["all-team-models"]}):e.includes("all-proxy-models")&&eT.setFieldsValue({models:["all-proxy-models"]})},children:[!e6&&e1&&(0,t.jsx)(en,{value:"all-team-models",children:"All Team Models"},"all-team-models"),!e6&&!e1&&(0,t.jsx)(en,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),eD.map(e=>(0,t.jsx)(en,{value:e,disabled:(0,X.hasAllModelsSentinel)(tM),children:(0,X.getModelDisplayName)(e)},e))]})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Key Type"," ",(0,t.jsx)(C.Tooltip,{title:"Select the type of key to determine what routes and operations this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_type",initialValue:"llm_api",className:"mt-4",children:(0,t.jsxs)(k.Select,{defaultValue:"llm_api",placeholder:"Select key type",style:{width:"100%"},optionLabelProp:"label",onChange:e=>{tm(e),("management"===e||"read_only"===e)&&eT.setFieldsValue({models:[]})},children:[(0,t.jsx)(en,{value:"llm_api",label:"AI APIs",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"AI APIs"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only AI API routes (chat/completions, embeddings, etc.)"})]})}),(0,t.jsx)(en,{value:"management",label:"Management",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Management"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only management routes (user/team/key management)"})]})}),(0,t.jsx)(en,{value:"default",label:"Full Access",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Full Access"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call all routes (AI APIs, Management, and read-only)"})]})})]})})]}),!tP&&(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)(f.Title,{className:"m-0",children:"Optional Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Max Budget (USD)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum amount in USD this key can spend. When reached, the key will be blocked from making further requests",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"max_budget",help:`Budget cannot exceed team max budget: $${e?.max_budget!==null&&e?.max_budget!==void 0?e?.max_budget:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.max_budget&&l>e.max_budget)throw Error(`Budget cannot exceed team max budget: $${(0,o.formatNumberWithCommas)(e.max_budget,4)}`)}}],children:(0,t.jsx)(ei.default,{step:.01,precision:2,width:200})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Reset Budget"," ",(0,t.jsx)(C.Tooltip,{title:"How often the budget should reset. For example, setting 'daily' will reset the budget every 24 hours",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"budget_duration",help:`Team Reset Budget: ${e?.budget_duration!==null&&e?.budget_duration!==void 0?e?.budget_duration:"None"}`,children:(0,t.jsx)(B.default,{onChange:e=>eT.setFieldValue("budget_duration",e)})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Windows"," ",(0,t.jsx)(C.Tooltip,{title:"Set multiple independent budget windows (e.g., hourly $10 AND monthly $200). Each window tracks spend separately and resets on its own schedule.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)($.BudgetWindowsEditor,{value:t_,onChange:tv})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Fallbacks"," ",(0,t.jsx)(C.Tooltip,{title:"When a model exceeds its per-model budget (model_max_budget), requests automatically reroute to fallback models instead of failing. Configure per-model budgets in Advanced Settings.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(J.BudgetFallbacksEditor,{value:tk,onChange:tN,availableModels:eD},tS)}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Tokens per minute Limit (TPM)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum number of tokens this key can process per minute. Helps control usage and costs",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tpm_limit",help:`TPM cannot exceed team TPM limit: ${e?.tpm_limit!==null&&e?.tpm_limit!==void 0?e?.tpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.tpm_limit&&l>e.tpm_limit)throw Error(`TPM limit cannot exceed team TPM limit: ${e.tpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"tpm",name:"tpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Requests per minute Limit (RPM)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum number of API requests this key can make per minute. Helps prevent abuse and manage load",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"rpm_limit",help:`RPM cannot exceed team RPM limit: ${e?.rpm_limit!==null&&e?.rpm_limit!==void 0?e?.rpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.rpm_limit&&l>e.rpm_limit)throw Error(`RPM limit cannot exceed team RPM limit: ${e.rpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"rpm",name:"rpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Per-Tag Rate Limits"," ",(0,t.jsx)(C.Tooltip,{title:"Scope rate limits to a request tag so each tag (e.g. a cell or group) gets its own RPM counter. Requests without a matching tag fall back to the key-level limit.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(Y.TagRateLimitEditor,{value:tA,onChange:tw})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Throttle on budget exceeded"," ",(0,t.jsx)(C.Tooltip,{title:"When this key exceeds its max budget, throttle its TPM/RPM to the globally configured percentage instead of blocking access entirely. Requires budget_exceeded_throttle_percentage in litellm_settings and a TPM/RPM limit on the key.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"throttle_on_budget_exceeded",valuePropName:"checked",children:(0,t.jsx)(N.Switch,{checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Guardrails"," ",(0,t.jsx)(C.Tooltip,{title:"Apply safety guardrails to this key to filter content or enforce policies",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-4",help:ef?"Select existing guardrails or enter new ones":"Premium feature - Upgrade to set guardrails by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!ef,placeholder:ef?"Select or enter guardrails":"Premium feature - Upgrade to set guardrails by key",options:eH.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,t.jsx)(C.Tooltip,{title:"When enabled, this key will bypass any guardrails configured to run on every request (global guardrails)",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:ef?"Bypass global guardrails for this key":"Premium feature - Upgrade to disable global guardrails by key",children:(0,t.jsx)(N.Switch,{disabled:!ef,checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Policies"," ",(0,t.jsx)(C.Tooltip,{title:"Apply policies to this key to control guardrails and other settings",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-4",help:eb?"Select existing policies or enter new ones":"Premium feature - Upgrade to set policies by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter policies":"Premium feature - Upgrade to set policies by key",options:eJ.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Prompts"," ",(0,t.jsx)(C.Tooltip,{title:"Allow this key to use specific prompt templates",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/prompt_management",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"prompts",className:"mt-4",help:eb?"Select existing prompts or enter new ones":"Premium feature - Upgrade to set prompts by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter prompts":"Premium feature - Upgrade to set prompts by key",options:eY.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Access Groups"," ",(0,t.jsx)(C.Tooltip,{title:"Assign access groups to this key. Access groups control which models, MCP servers, and agents this key can use",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-4",help:"Select access groups to assign to this key",children:(0,t.jsx)(R.default,{placeholder:"Select access groups (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Pass Through Routes"," ",(0,t.jsx)(C.Tooltip,{title:"Allow this key to use specific pass through routes",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/pass_through",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"allowed_passthrough_routes",className:"mt-4",help:eb?"Select existing pass through routes or enter new ones":"Premium feature - Upgrade to set pass through routes by key",children:(0,t.jsx)(z.default,{accessToken:eh,placeholder:eb?"Select or enter pass through routes":"Premium feature - Upgrade to set pass through routes by key",disabled:!eb,teamId:e1?e1.team_id:null})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,t.jsx)(C.Tooltip,{title:"Select which vector stores this key can access. If none selected, the key will have access to all available vector stores",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-4",help:"Select vector stores this key can access. Leave empty for access to all vector stores",children:(0,t.jsx)(er.default,{onChange:e=>eT.setFieldValue("allowed_vector_store_ids",e),value:eT.getFieldValue("allowed_vector_store_ids"),accessToken:eh,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Metadata"," ",(0,t.jsx)(C.Tooltip,{title:"JSON object with additional information about this key. Used for tracking or custom logic",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"metadata",className:"mt-4",children:(0,t.jsx)(v.Input.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Tags"," ",(0,t.jsx)(C.Tooltip,{title:"Tags for tracking spend and/or doing tag-based routing. Used for analytics and filtering",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tags",className:"mt-4",help:"Tags for tracking spend and/or doing tag-based routing.",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter tags",tokenSeparators:[","],options:eC})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"MCP Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,t.jsx)(C.Tooltip,{title:"Select which MCP servers or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",help:"Select MCP servers or access groups this key can access",children:(0,t.jsx)(Z.default,{onChange:e=>eT.setFieldValue("allowed_mcp_servers_and_groups",e),value:eT.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:eh,teamId:e1?.team_id??null,placeholder:"Select MCP servers or access groups (optional)",allowNoMcpServers:!0})}),(0,t.jsx)(_.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,t.jsx)(v.Input,{type:"hidden"})}),(0,t.jsx)(_.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.allowed_mcp_servers_and_groups!==t.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==t.mcp_tool_permissions,children:()=>(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(et.default,{accessToken:eh,selectedServers:(eT.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[]).filter(e=>e!==ee.NO_MCP_SERVERS_SENTINEL),toolPermissions:eT.getFieldValue("mcp_tool_permissions")||{},onChange:e=>eT.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Agent Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Agents"," ",(0,t.jsx)(C.Tooltip,{title:"Select which agents or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",help:"Select agents or access groups this key can access",children:(0,t.jsx)(F.default,{onChange:e=>eT.setFieldValue("allowed_agents_and_groups",e),value:eT.getFieldValue("allowed_agents_and_groups"),accessToken:eh,placeholder:"Select agents or access groups (optional)"})})})]}),eb?(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eZ,onChange:e0,premiumUser:!0,disabledCallbacks:td,onDisabledCallbacksChange:tc})})})]}):(0,t.jsx)(C.Tooltip,{title:(0,t.jsxs)("span",{children:["Key-level logging settings is an enterprise feature, get in touch -",(0,t.jsx)("a",{href:"https://www.litellm.ai/enterprise",target:"_blank",children:"https://www.litellm.ai/enterprise"})]}),placement:"top",children:(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsx)("div",{style:{opacity:.5},children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eZ,onChange:e0,premiumUser:!1,disabledCallbacks:td,onDisabledCallbacksChange:tc})})})]})}),(0,t.jsx)("div",{style:{position:"absolute",inset:0,cursor:"not-allowed"}})]})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Router Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4 w-full",children:(0,t.jsx)(G.default,{accessToken:eh||"",value:tf||void 0,onChange:tj,modelData:eB.length>0?{data:eB.map(e=>({model_name:e}))}:void 0},tI)})})]},`router-settings-accordion-${tI}`),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Model Aliases"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)(y.Text,{className:"text-sm text-gray-600 mb-4",children:"Create custom aliases for models that can be used in API calls. This allows you to create shortcuts for specific models."}),(0,t.jsx)(U.default,{accessToken:eh,initialModelAliases:tg,onAliasUpdate:tp,showExampleConfig:!1})]})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Key Lifecycle"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(D.default,{form:eT,autoRotationEnabled:th,onAutoRotationChange:tx,rotationInterval:ty,onRotationIntervalChange:tb,isCreateMode:!0})})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("b",{children:"Advanced Settings"}),(0,t.jsx)(C.Tooltip,{title:(0,t.jsxs)("span",{children:["Learn more about advanced settings in our"," ",(0,t.jsx)("a",{href:ea.proxyBaseUrl?`${ea.proxyBaseUrl}/#/key%20management/generate_key_fn_key_generate_post`:"/#/key%20management/generate_key_fn_key_generate_post",target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 hover:text-blue-300",children:"documentation"})]}),children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-300 cursor-help"})})]})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(P.default,{schemaComponent:"GenerateKeyRequest",form:eT,excludedFields:["key_alias","team_id","organization_id","models","duration","metadata","tags","guardrails","max_budget","budget_duration","tpm_limit","rpm_limit",...eS?["key"]:[]]})})]})]})]})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(j.Button,{htmlType:"submit",disabled:tP,style:{opacity:tP?.5:1},children:"Create Key"})})]})}),e7&&(0,t.jsx)(A.Modal,{title:"Create New User",open:e7,onCancel:()=>e8(!1),footer:null,width:800,children:(0,t.jsx)(q.CreateUserButton,{userID:ex,accessToken:eh,teams:ec,possibleUIRoles:tt,onUserCreated:e=>{te(e),eT.setFieldsValue({user_id:e}),e8(!1)},isEmbedded:!0})}),eO&&(0,t.jsx)(A.Modal,{open:eL,onOk:tR,onCancel:tB,footer:null,children:(0,t.jsxs)(x.Grid,{numItems:1,className:"gap-2 w-full",children:[(0,t.jsx)(f.Title,{children:"Save your Key"}),(0,t.jsx)(h.Col,{numColSpan:1,children:null!=eO?(0,t.jsx)(es.default,{apiKey:eO}):(0,t.jsx)(y.Text,{children:"Key being created, this might take 30s"})})]})})]})},"fetchTeamModels",0,eo,"fetchUserModels",0,ed],702597)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/07sexl9lqn8w6.js b/litellm/proxy/_experimental/out/_next/static/chunks/07sexl9lqn8w6.js new file mode 100644 index 00000000000..e0c0ae4cb8b --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/07sexl9lqn8w6.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,372024,e=>{"use strict";var t=e.i(843476),a=e.i(994388),l=e.i(304967),s=e.i(350967),r=e.i(35983),n=e.i(793130),i=e.i(197647),o=e.i(653824),c=e.i(269200),d=e.i(942232),u=e.i(977572),m=e.i(427612),h=e.i(64848),x=e.i(496020),g=e.i(881073),f=e.i(404206),p=e.i(723731),j=e.i(599724),b=e.i(779241),y=e.i(271645),C=e.i(464571),k=e.i(808613),v=e.i(311451),_=e.i(212931),w=e.i(199133),T=e.i(519455),N=e.i(515288),S=e.i(793479),F=e.i(727749),E=e.i(602869),I=e.i(257428),P=e.i(772436),A=e.i(302747);let B=({accessToken:e})=>{let[a,l]=(0,y.useState)(!0),[s,r]=(0,y.useState)([]);(0,y.useEffect)(()=>{n()},[e]);let n=async()=>{if(e){l(!0);try{let t=await (0,E.getEmailEventSettings)(e);r(t.settings)}catch(e){console.error("Failed to fetch email event settings:",e),F.default.fromBackend(e)}finally{l(!1)}}},i=async()=>{if(e)try{await (0,E.updateEmailEventSettings)(e,{settings:s}),F.default.success("Email event settings updated successfully")}catch(e){console.error("Failed to update email event settings:",e),F.default.fromBackend(e)}},o=async()=>{if(e)try{await (0,E.resetEmailEventSettings)(e),F.default.success("Email event settings reset to defaults"),n()}catch(e){console.error("Failed to reset email event settings:",e),F.default.fromBackend(e)}};return(0,t.jsxs)(N.Card,{children:[(0,t.jsxs)(N.CardHeader,{children:[(0,t.jsx)(N.CardTitle,{className:"text-base",children:"Email Notifications"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Select which events should trigger email notifications."})]}),(0,t.jsxs)(N.CardContent,{children:[(0,t.jsx)(P.Separator,{className:"mb-6"}),a?(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)(A.Skeleton,{className:"h-10 w-full"}),(0,t.jsx)(A.Skeleton,{className:"h-10 w-full"})]}):(0,t.jsx)("div",{className:"space-y-4",children:s.map(e=>(0,t.jsxs)("div",{className:"flex items-start",children:[(0,t.jsx)(I.Checkbox,{checked:e.enabled,onCheckedChange:t=>{var a,l;return a=e.event,l=!0===t,void r(s.map(e=>e.event===a?{...e,enabled:l}:e))},className:"mt-1"}),(0,t.jsxs)("div",{className:"ml-3",children:[(0,t.jsx)("p",{className:"text-sm",children:e.event}),(0,t.jsx)("div",{className:"block text-sm text-muted-foreground",children:(e=>{if(e.includes("Virtual Key Created"))return"An email will be sent to the user when a new virtual key is created with their user ID";{if(e.includes("New User Invitation"))return"An email will be sent to the email address of the user when a new user is created";let t=e.split(/(?=[A-Z])/).join(" ").toLowerCase();return`Receive an email notification when ${t}`}})(e.event)})]})]},e.event))}),(0,t.jsxs)("div",{className:"mt-6 flex gap-4",children:[(0,t.jsx)(T.Button,{onClick:i,disabled:a,children:"Save Changes"}),(0,t.jsx)(T.Button,{variant:"secondary",onClick:o,disabled:a,children:"Reset to Defaults"})]})]})]})},L=(0,t.jsx)("span",{className:"text-destructive",children:" Required * "}),D={SMTP_HOST:(0,t.jsxs)(t.Fragment,{children:["Enter the SMTP host address, e.g. `smtp.resend.com`",L]}),SMTP_PORT:(0,t.jsxs)(t.Fragment,{children:["Enter the SMTP port number, e.g. `587`",L]}),SMTP_USERNAME:(0,t.jsxs)(t.Fragment,{children:["Enter the SMTP username, e.g. `username`",L]}),SMTP_PASSWORD:L,SMTP_SENDER_EMAIL:(0,t.jsxs)(t.Fragment,{children:["Enter the sender email address, e.g. `sender@berri.ai`",L]}),TEST_EMAIL_ADDRESS:(0,t.jsxs)(t.Fragment,{children:["Email Address to send `Test Email Alert` to. example: `info@berri.ai`",L]}),EMAIL_LOGO_URL:(0,t.jsx)(t.Fragment,{children:"(Optional) Customize the Logo that appears in the email, pass a url to your logo"}),EMAIL_SUPPORT_CONTACT:(0,t.jsx)(t.Fragment,{children:"(Optional) Customize the support email address that appears in the email. Default is support@berri.ai"})},z=["EMAIL_LOGO_URL","EMAIL_SUPPORT_CONTACT"],M=({accessToken:e,premiumUser:a,alerts:l})=>{let s=async()=>{if(!e)return;let t={};l.filter(e=>"email"===e.name).forEach(e=>{Object.entries(e.variables??{}).forEach(([e,a])=>{let l=document.querySelector(`input[name="${e}"]`);l&&l.value&&l.value!==(null==a?"":String(a))&&(t[e]=l.value)})});try{await (0,E.setCallbacksCall)(e,{general_settings:{alerting:["email"]},environment_variables:t}),F.default.success("Email settings updated successfully")}catch(e){F.default.fromBackend(e)}};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"mt-6 mb-6",children:(0,t.jsx)(B,{accessToken:e})}),(0,t.jsxs)(N.Card,{children:[(0,t.jsxs)(N.CardHeader,{children:[(0,t.jsx)(N.CardTitle,{className:"text-base",children:"Email Server Settings"}),(0,t.jsx)("p",{className:"text-sm",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/email",target:"_blank",rel:"noreferrer",className:"text-primary underline underline-offset-4",children:"LiteLLM Docs: email alerts"})})]}),(0,t.jsxs)(N.CardContent,{children:[l.filter(e=>"email"===e.name).map((e,l)=>(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2",children:Object.entries(e.variables??{}).map(([e,l])=>{let s=!a&&z.includes(e);return(0,t.jsxs)("div",{className:"space-y-1",children:[s?(0,t.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",rel:"noreferrer",className:"text-sm text-primary underline underline-offset-4",children:["✨ ",e]}):(0,t.jsx)("p",{className:"text-sm",children:e}),(0,t.jsx)(S.Input,{name:e,defaultValue:l,type:"password",disabled:s,className:"max-w-100"}),(0,t.jsx)("div",{className:"text-xs text-muted-foreground italic",children:D[e]})]},e)})},l)),(0,t.jsxs)("div",{className:"mt-6 flex gap-2",children:[(0,t.jsx)(T.Button,{onClick:()=>s(),children:"Save Changes"}),(0,t.jsx)(T.Button,{variant:"secondary",onClick:async()=>{if(e)try{await (0,E.serviceHealthCheck)(e,"email"),F.default.success("Email test triggered. Check your configured email inbox/logs.")}catch(e){F.default.fromBackend(e)}},children:"Test Email Alerts"})]})]})]})]})};var O=e.i(174553),U=e.i(905536),Z=e.i(28651),R=e.i(68155),H=e.i(220508),$=e.i(389083),q=e.i(752978);let K=({alertingSettings:e,handleInputChange:l,handleResetField:s,handleSubmit:r,premiumUser:i})=>{let[o]=k.Form.useForm();return(0,t.jsxs)(k.Form,{form:o,onFinish:()=>{let e=o.getFieldsValue();Object.entries(e).every(([e,t])=>"boolean"!=typeof t&&(""===t||null==t))||r(e)},labelAlign:"left",children:[e.map((e,r)=>(0,t.jsxs)(x.TableRow,{children:[(0,t.jsxs)(u.TableCell,{align:"center",children:[(0,t.jsx)(j.Text,{children:e.field_name}),(0,t.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),e.premium_field?i?(0,t.jsx)(k.Form.Item,{name:e.field_name,children:(0,t.jsx)(u.TableCell,{children:"Integer"===e.field_type?(0,t.jsx)(Z.InputNumber,{step:1,value:e.field_value,onChange:t=>l(e.field_name,t)}):"Boolean"===e.field_type?(0,t.jsx)(n.Switch,{checked:e.field_value,onChange:t=>l(e.field_name,t)}):(0,t.jsx)(v.Input,{value:e.field_value,onChange:t=>l(e.field_name,t)})})}):(0,t.jsx)(u.TableCell,{children:(0,t.jsx)(a.Button,{className:"flex items-center justify-center",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})})}):(0,t.jsx)(k.Form.Item,{name:e.field_name,className:"mb-0",valuePropName:"Boolean"===e.field_type?"checked":"value",children:(0,t.jsx)(u.TableCell,{children:"Integer"===e.field_type?(0,t.jsx)(Z.InputNumber,{step:1,value:e.field_value,onChange:t=>l(e.field_name,t),className:"p-0"}):"Boolean"===e.field_type?(0,t.jsx)(n.Switch,{checked:e.field_value,onChange:t=>{l(e.field_name,t),o.setFieldsValue({[e.field_name]:t})}}):(0,t.jsx)(v.Input,{value:e.field_value,onChange:t=>l(e.field_name,t)})})}),(0,t.jsx)(u.TableCell,{children:!0==e.stored_in_db?(0,t.jsx)($.Badge,{icon:H.CheckCircleIcon,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,t.jsx)($.Badge,{className:"text-gray bg-white outline-solid",children:"In Config"}):(0,t.jsx)($.Badge,{className:"text-gray bg-white outline-solid",children:"Not Set"})}),(0,t.jsx)(u.TableCell,{children:(0,t.jsx)(q.Icon,{icon:R.TrashIcon,color:"red",onClick:()=>s(e.field_name,r),children:"Reset"})})]},r)),(0,t.jsx)("div",{children:(0,t.jsx)(C.Button,{htmlType:"submit",children:"Update Settings"})})]})},G=({accessToken:e,premiumUser:a})=>{let[l,s]=(0,y.useState)([]);return(0,y.useEffect)(()=>{e&&(0,E.alertingSettingsCall)(e).then(e=>{s(e)})},[e]),(0,t.jsx)(K,{alertingSettings:l,handleInputChange:(e,t)=>{s(l.map(a=>a.field_name===e?{...a,field_value:t}:a))},handleResetField:(t,a)=>{if(e)try{let e=l.map(e=>e.field_name===t?{...e,stored_in_db:null,field_value:e.field_default_value}:e);s(e)}catch(e){}},handleSubmit:t=>{if(!e||null==t||void 0==t)return;let a={};l.forEach(e=>{a[e.field_name]=e.field_value});let{slack_alerting:s,...r}={...t,...a};try{(0,E.updateConfigFieldSetting)(e,"alerting_args",r),"boolean"==typeof s&&(!0==s?(0,E.updateConfigFieldSetting)(e,"alerting",["slack"]):(0,E.updateConfigFieldSetting)(e,"alerting",[])),F.default.success("Wait 10s for proxy to update.")}catch(e){}},premiumUser:a})};var W=e.i(954616),Q=e.i(266027),V=e.i(912598),J=e.i(243652);let X=(0,J.createQueryKeys)("cloudZeroSettings"),Y=async e=>{let t=(0,E.getProxyBaseUrl)(),a=t?`${t}/cloudzero/settings`:"/cloudzero/settings",l=await fetch(a,{method:"GET",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!l.ok){let e="Failed to fetch CloudZero settings";try{let t=await l.json();"object"==typeof t&&null!==t?e=t?.error?.message||t?.error||t?.message||t?.detail||("string"==typeof t?.error?t.error:e):"string"==typeof t&&(e=t)}catch{e=l.statusText||e}throw Error(e)}let s=await l.json();return s&&(s.api_key_masked||s.connection_id)?s:null},ee=async(e,t)=>{let a=(0,E.getProxyBaseUrl)(),l=a?`${a}/cloudzero/settings`:"/cloudzero/settings",s=await fetch(l,{method:"PUT",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({...t.connection_id&&{connection_id:t.connection_id},...t.timezone&&{timezone:t.timezone},...t.api_key&&{api_key:t.api_key}})});if(!s.ok){let e="Failed to update CloudZero settings";try{let t=await s.json();"object"==typeof t&&null!==t?e=t?.error?.message||t?.error||t?.message||t?.detail||("string"==typeof t?.error?t.error:e):"string"==typeof t&&(e=t)}catch{e=s.statusText||e}throw Error(e)}return await s.json()},et=async e=>{let t=(0,E.getProxyBaseUrl)(),a=t?`${t}/cloudzero/delete`:"/cloudzero/delete",l=await fetch(a,{method:"DELETE",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!l.ok){let e="Failed to delete CloudZero settings";try{let t=await l.json();"object"==typeof t&&null!==t?e=t?.error?.message||t?.error||t?.message||t?.detail||("string"==typeof t?.error?t.error:e):"string"==typeof t&&(e=t)}catch{e=l.statusText||e}throw Error(e)}return await l.json()};var ea=e.i(135214),el=e.i(332102);function es({startCreation:e}){return(0,t.jsx)("div",{className:"mx-auto mt-8 max-w-2xl rounded-lg border border-dashed border-border bg-card p-12 text-center",children:(0,t.jsxs)("div",{className:"flex flex-col items-center gap-2",children:[(0,t.jsx)(el.Inbox,{className:"size-10 text-muted-foreground","aria-hidden":!0}),(0,t.jsx)("h4",{className:"text-base font-semibold",children:"No CloudZero Integration Found"}),(0,t.jsx)("p",{className:"mx-auto max-w-md text-sm text-muted-foreground",children:"Connect your CloudZero account to start tracking and analyzing your cloud costs directly from LiteLLM."}),(0,t.jsx)(T.Button,{size:"lg",onClick:e,className:"mt-4",children:"Add CloudZero Integration"})]})})}var er=e.i(888259);let en=async(e,t)=>{let a=(0,E.getProxyBaseUrl)(),l=a?`${a}/cloudzero/init`:"/cloudzero/init",s=await fetch(l,{method:"POST",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({connection_id:t.connection_id,timezone:t.timezone??"UTC",...t.api_key&&{api_key:t.api_key}})});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(e?.error?.message||e?.message||e?.detail||"Failed to create CloudZero integration")}return await s.json()};function ei({open:e,onOk:a,onCancel:l}){let s,{accessToken:r}=(0,ea.default)(),[n]=k.Form.useForm(),i=(s=r||"",(0,W.useMutation)({mutationFn:async e=>{if(!s)throw Error("Access token is required");return await en(s,e)}}));(0,y.useEffect)(()=>{e&&n.resetFields()},[e,n]);let o=async()=>{try{let e=await n.validateFields();i.mutate({connection_id:e.connection_id,timezone:e.timezone||"UTC",...e.api_key&&{api_key:e.api_key}},{onSuccess:()=>{er.default.success("CloudZero integration created successfully"),n.resetFields(),a()},onError:e=>{e?.errorFields||er.default.error(e?.message||"Failed to create CloudZero integration")}})}catch(e){if(e?.errorFields)return;er.default.error(e?.message||"Failed to create CloudZero integration")}};return(0,t.jsx)(_.Modal,{title:"Create CloudZero Integration",open:e,onOk:o,onCancel:()=>{n.resetFields(),l()},confirmLoading:i.isPending,okText:i.isPending?"Creating...":"Create",cancelText:"Cancel",okButtonProps:{disabled:i.isPending},cancelButtonProps:{disabled:i.isPending},children:(0,t.jsxs)(k.Form,{form:n,layout:"vertical",onFinish:o,children:[(0,t.jsx)(k.Form.Item,{label:"CloudZero API Key",name:"api_key",rules:[{required:!0,message:"Please enter your CloudZero API key"}],children:(0,t.jsx)(v.Input.Password,{placeholder:"Enter your CloudZero API key"})}),(0,t.jsx)(k.Form.Item,{label:"Connection ID",name:"connection_id",rules:[{required:!0,message:"Please enter your CloudZero connection ID"}],children:(0,t.jsx)(v.Input,{placeholder:"Enter your CloudZero connection ID"})}),(0,t.jsx)(k.Form.Item,{label:"Timezone",name:"timezone",tooltip:"Timezone for date handling (defaults to UTC if not provided)",children:(0,t.jsx)(v.Input,{placeholder:"UTC"})})]})})}let eo=async(e,t={})=>{let a=(0,E.getProxyBaseUrl)(),l=a?`${a}/cloudzero/dry-run`:"/cloudzero/dry-run",s=await fetch(l,{method:"POST",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({limit:t.limit??10})});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(e?.error?.message||e?.message||e?.detail||"Failed to perform dry run")}return await s.json()},ec=async(e,t={})=>{let a=(0,E.getProxyBaseUrl)(),l=a?`${a}/cloudzero/export`:"/cloudzero/export",s=await fetch(l,{method:"POST",headers:{[(0,E.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({operation:t.operation??"replace_hourly"})});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(e?.error?.message||e?.message||e?.detail||"Failed to export data")}return await s.json()};var ed=e.i(127952),eu=e.i(439573),em=e.i(487486),eh=e.i(868499),ex=e.i(269638),eg=e.i(788699),ef=e.i(431343),ep=e.i(727612),ej=e.i(569074);function eb({open:e,onOk:a,onCancel:l,settings:s}){var r;let n,{accessToken:i}=(0,ea.default)(),[o]=k.Form.useForm(),c=(r=i||"",n=(0,V.useQueryClient)(),(0,W.useMutation)({mutationFn:async e=>{if(!r)throw Error("Access token is required");return await ee(r,e)},onSuccess:()=>{n.invalidateQueries({queryKey:X.list({})})}}));(0,y.useEffect)(()=>{e&&s?o.setFieldsValue({connection_id:s.connection_id,timezone:s.timezone||"UTC",api_key:""}):e&&o.resetFields()},[e,s,o]);let d=async()=>{try{let e=await o.validateFields();c.mutate({connection_id:e.connection_id,timezone:e.timezone||"UTC",...e.api_key&&{api_key:e.api_key}},{onSuccess:()=>{er.default.success("CloudZero integration updated successfully"),o.resetFields(),a()},onError:e=>{e?.errorFields||er.default.error(e?.message||"Failed to update CloudZero integration")}})}catch(e){if(e?.errorFields)return;er.default.error(e?.message||"Failed to update CloudZero integration")}};return(0,t.jsx)(_.Modal,{title:"Edit CloudZero Integration",open:e,onOk:d,onCancel:()=>{o.resetFields(),l()},confirmLoading:c.isPending,okText:c.isPending?"Updating...":"Update",cancelText:"Cancel",okButtonProps:{disabled:c.isPending},cancelButtonProps:{disabled:c.isPending},children:(0,t.jsxs)(k.Form,{form:o,layout:"vertical",onFinish:d,children:[(0,t.jsx)(k.Form.Item,{label:"CloudZero API Key",name:"api_key",rules:[{required:!1,message:"Please enter your CloudZero API key"}],tooltip:"Leave empty to keep the existing API key",children:(0,t.jsx)(v.Input.Password,{placeholder:"Leave empty to keep existing"})}),(0,t.jsx)(k.Form.Item,{label:"Connection ID",name:"connection_id",rules:[{required:!0,message:"Please enter your CloudZero connection ID"}],children:(0,t.jsx)(v.Input,{placeholder:"Enter your CloudZero connection ID"})}),(0,t.jsx)(k.Form.Item,{label:"Timezone",name:"timezone",tooltip:"Timezone for date handling (defaults to UTC if not provided)",children:(0,t.jsx)(v.Input,{placeholder:"UTC"})})]})})}let ey=({label:e,children:a})=>(0,t.jsxs)("div",{className:"grid grid-cols-1 border-b border-border last:border-b-0 sm:grid-cols-[220px_minmax(0,1fr)]",children:[(0,t.jsx)("dt",{className:"bg-muted/50 px-4 py-3 text-sm font-medium",children:e}),(0,t.jsx)("dd",{className:"px-4 py-3 text-sm",children:a})]}),eC=()=>(0,t.jsx)("span",{className:"text-muted-foreground italic",children:"Not configured"});function ek({settings:e,onSettingsUpdated:a}){var l;let s,r,n,{accessToken:i}=(0,ea.default)(),[o,c]=(0,y.useState)(!1),[d,u]=(0,y.useState)(!1),[m,h]=(0,y.useState)(!1),x=(s=i||"",(0,W.useMutation)({mutationFn:async(e={})=>{if(!s)throw Error("Access token is required");return await eo(s,e)}})),g=(r=i||"",(0,W.useMutation)({mutationFn:async(e={})=>{if(!r)throw Error("Access token is required");return await ec(r,e)}})),f=(l=i||"",n=(0,V.useQueryClient)(),(0,W.useMutation)({mutationFn:async()=>{if(!l)throw Error("Access token is required");return await et(l)},onSuccess:()=>{n.invalidateQueries({queryKey:X.list({})})}})),p=x.data?JSON.stringify(x.data,null,2):null,j=async()=>{c(!1),a()};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"mx-auto w-full max-w-4xl space-y-6",children:(0,t.jsxs)(N.Card,{children:[(0,t.jsxs)(N.CardHeader,{children:[(0,t.jsxs)(N.CardTitle,{className:"flex items-center gap-2 text-lg",children:["CloudZero Configuration",(0,t.jsx)(em.Badge,{variant:"secondary",className:"capitalize",children:e.status||"Active"})]}),(0,t.jsxs)(N.CardAction,{className:"flex gap-2",children:[(0,t.jsxs)(T.Button,{variant:"outline",onClick:()=>{c(!0)},children:[(0,t.jsx)(eg.Pencil,{}),"Edit"]}),(0,t.jsxs)(T.Button,{variant:"destructive",onClick:()=>{u(!0)},children:[(0,t.jsx)(ep.Trash2,{}),"Delete"]})]})]}),(0,t.jsxs)(N.CardContent,{children:[(0,t.jsxs)("dl",{className:"rounded-md border border-border",children:[(0,t.jsx)(ey,{label:"API Key (Redacted)",children:(0,t.jsx)("span",{className:"font-mono",children:e.api_key_masked||(0,t.jsx)(eC,{})})}),(0,t.jsx)(ey,{label:"Connection ID",children:(0,t.jsx)("span",{className:"font-mono",children:e.connection_id||(0,t.jsx)(eC,{})})}),(0,t.jsx)(ey,{label:"Timezone",children:e.timezone||(0,t.jsx)("span",{className:"text-muted-foreground italic",children:"Default (UTC)"})})]}),(0,t.jsxs)("div",{className:"mt-6 flex items-center gap-3",children:[(0,t.jsx)("span",{className:"text-sm text-muted-foreground",children:"Actions"}),(0,t.jsx)(P.Separator,{className:"flex-1"})]}),(0,t.jsxs)("div",{className:"mt-4 mb-6 flex flex-wrap gap-4",children:[(0,t.jsxs)(T.Button,{variant:"outline",onClick:()=>{i&&x.mutate({limit:10},{onSuccess:e=>{er.default.success("Dry run completed successfully")},onError:e=>{er.default.error(e?.message||"Failed to perform dry run")}})},disabled:x.isPending,children:[(0,t.jsx)(ef.Play,{}),"Run Dry Run Simulation"]}),(0,t.jsxs)(T.Button,{onClick:()=>h(!0),disabled:g.isPending,children:[(0,t.jsx)(ej.Upload,{}),"Export Data Now"]})]}),p&&(0,t.jsxs)(eu.Alert,{children:[(0,t.jsx)(ex.CheckCircle,{}),(0,t.jsx)(eu.AlertTitle,{children:"Dry Run Results"}),(0,t.jsxs)(eu.AlertDescription,{children:[(0,t.jsxs)("p",{children:["Simulation output for connection: ",e.connection_id]}),(0,t.jsx)("pre",{className:"overflow-x-auto rounded-md border border-border bg-muted p-4 font-mono text-xs text-foreground",children:p})]})]})]})]})}),(0,t.jsx)(eh.AlertDialog,{open:m,onOpenChange:h,children:(0,t.jsxs)(eh.AlertDialogContent,{children:[(0,t.jsxs)(eh.AlertDialogHeader,{children:[(0,t.jsx)(eh.AlertDialogTitle,{children:"Export Data to CloudZero"}),(0,t.jsx)(eh.AlertDialogDescription,{children:"This will push the current accumulated cost data to CloudZero. Continue?"})]}),(0,t.jsxs)(eh.AlertDialogFooter,{children:[(0,t.jsx)(eh.AlertDialogCancel,{disabled:g.isPending,children:"Cancel"}),(0,t.jsx)(T.Button,{onClick:()=>{i&&g.mutate({operation:"replace_hourly"},{onSuccess:()=>{er.default.success("Data successfully exported to CloudZero"),h(!1)},onError:e=>{er.default.error(e?.message||"Failed to export data")}})},disabled:g.isPending,children:"Export"})]})]})}),(0,t.jsx)(eb,{open:o,onOk:j,onCancel:()=>{c(!1)},settings:e}),(0,t.jsx)(ed.default,{isOpen:d,title:"Delete CloudZero Integration?",message:"Are you sure you want to delete this CloudZero integration? All associated settings and configurations will be permanently removed.",resourceInformationTitle:"Integration Details",resourceInformation:[{label:"Connection ID",value:e.connection_id,code:!0},{label:"Timezone",value:e.timezone||"Default (UTC)"}],onCancel:()=>{u(!1)},onOk:()=>{i&&f.mutate(void 0,{onSuccess:()=>{er.default.success("CloudZero integration deleted successfully"),u(!1),a()},onError:e=>{er.default.error(e?.message||"Failed to delete CloudZero integration")}})},confirmLoading:f.isPending})]})}function ev(){let{accessToken:e}=(0,ea.default)(),{data:a,isLoading:l,error:s}=(0,Q.useQuery)({queryKey:X.list({}),queryFn:async()=>await Y(e),enabled:!!e,staleTime:36e5,gcTime:36e5}),r=(0,V.useQueryClient)(),n=(0,J.createQueryKeys)("cloudZeroSettings"),[i,o]=(0,y.useState)(!1),c=async()=>{o(!1),await r.invalidateQueries({queryKey:n.list({})})};return l?(0,t.jsx)(N.Card,{children:(0,t.jsx)(N.CardContent,{children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading CloudZero settings..."})})}):s?(0,t.jsx)(N.Card,{children:(0,t.jsx)(N.CardContent,{children:(0,t.jsxs)("p",{className:"text-sm text-destructive",children:["Error loading CloudZero settings: ",s instanceof Error?s.message:String(s)]})})}):a?(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(ek,{settings:a,onSettingsUpdated:c})}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(es,{startCreation:()=>o(!0)}),(0,t.jsx)(ei,{open:i,onOk:c,onCancel:()=>{o(!1)}})]})}var e_=e.i(107233);e.i(707701);var ew=e.i(807235),eT=e.i(541071);e.i(622826);var eN=e.i(112179),eS=e.i(755146),eF=e.i(115504);let eE=e=>e.type||e.mode||"success",eI={success:"Success",failure:"Failure",success_and_failure:"Success & Failure"};function eP({callback:e,onTest:a,onEdit:l,onDelete:s}){return(0,t.jsxs)(eS.DropdownMenu,{children:[(0,t.jsx)(eS.DropdownMenuTrigger,{"aria-label":"Open callback actions","data-testid":`callback-actions-${e.name}-${eE(e)}`,className:(0,eF.cn)((0,T.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,t.jsx)(eT.MoreHorizontal,{className:"size-4"})}),(0,t.jsxs)(eS.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,t.jsxs)(eS.DropdownMenuItem,{"data-testid":"callback-action-test",onClick:()=>void a(e),children:[(0,t.jsx)(ef.Play,{}),"Test"]}),(0,t.jsxs)(eS.DropdownMenuItem,{"data-testid":"callback-action-edit",onClick:()=>l(e),children:[(0,t.jsx)(eg.Pencil,{}),"Edit"]}),(0,t.jsx)(eS.DropdownMenuSeparator,{}),(0,t.jsxs)(eS.DropdownMenuItem,{variant:"destructive","data-testid":"callback-action-delete",onClick:()=>s(e),children:[(0,t.jsx)(ep.Trash2,{}),"Delete"]})]})]})}function eA(){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)(el.Inbox,{className:"size-5 text-muted-foreground"})}),(0,t.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No callbacks configured"}),(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:"Add your first callback to start logging data to external services."})]})}let eB=({callbacks:e,availableCallbacks:a={},isLoading:l=!1,onTest:s=()=>{},onEdit:r=()=>{},onDelete:n=()=>{},onAdd:i=()=>{}})=>{let o=(0,y.useMemo)(()=>(({availableCallbacks:e,onTest:a,onEdit:l,onDelete:s})=>[{id:"name",accessorKey:"name",meta:{title:"Callback Name"},header:"Callback Name",enableSorting:!1,cell:({row:a})=>{let l=a.original.name,s=e[l]?.ui_callback_name||l;return(0,t.jsx)("span",{className:"block max-w-72 truncate text-sm font-medium",title:s,children:s})}},{id:"mode",meta:{title:"Mode",skeleton:"badge"},header:"Mode",size:240,enableSorting:!1,cell:({row:e})=>{let a=eE(e.original);return(0,t.jsx)(eN.StatusBadge,{tone:"success"===a?"success":"failure"===a?"error":"info",label:eI[a]||a})}},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,t.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:e})=>(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(eP,{callback:e.original,onTest:a,onEdit:l,onDelete:s})})}])({availableCallbacks:a,onTest:s,onEdit:r,onDelete:n}),[a,s,r,n]);return(0,t.jsxs)("div",{className:"mt-4 flex w-full flex-col gap-4",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold tracking-tight text-foreground",children:"Active Logging Callbacks"}),(0,t.jsx)("div",{children:(0,t.jsxs)(T.Button,{onClick:i,children:[(0,t.jsx)(e_.Plus,{}),"Add Callback"]})}),(0,t.jsx)(ew.DataTable,{data:e,columns:o,getRowId:(e,t)=>`${e.name||t}-${eE(e)}`,isLoading:l,loadingMessage:"Loading callbacks…",noDataMessage:(0,t.jsx)(eA,{}),size:"compact"})]})};var eL=e.i(190702);let eD=({params:e,callbackConfigs:a,selectedCallback:l})=>e&&0!==e.length?(0,t.jsx)("div",{className:"space-y-4 mt-6 p-4 bg-gray-50 rounded-lg border",children:e.map(e=>{let s=a.find(e=>e.id===l),r=s?.dynamic_params?.[e]||{},n=r.type||"text",i=r.ui_name||e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),o=r.required||!1;return(0,t.jsx)(U.default,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:[i," "]}),name:e,className:"mb-4",rules:o?[{required:!0,message:`Please enter the ${i.toLowerCase()}`}]:void 0,children:"password"===n?(0,t.jsx)(v.Input.Password,{size:"large",placeholder:`Enter your ${i.toLowerCase()}`,className:"w-full rounded-md border-gray-300 shadow-xs focus:border-blue-500 focus:ring-blue-500"}):"number"===n?(0,t.jsx)(v.Input,{type:"number",size:"large",placeholder:`Enter ${i.toLowerCase()}`,className:"w-full rounded-md border-gray-300 shadow-xs focus:border-blue-500 focus:ring-blue-500",min:0,max:1,step:.1}):(0,t.jsx)(v.Input,{size:"large",placeholder:`Enter your ${i.toLowerCase()}`,className:"w-full rounded-md border-gray-300 shadow-xs focus:border-blue-500 focus:ring-blue-500"})},e)})}):null,ez=({callbackConfigs:e,selectedCallback:a,onCallbackChange:l,disabled:s=!1})=>(0,t.jsx)(U.default,{label:"Callback",name:"callback",rules:s?void 0:[{required:!0,message:"Please select a callback"}],children:(0,t.jsx)(w.Select,{placeholder:"Choose a logging callback...",size:"large",className:"w-full",showSearch:!0,disabled:s,value:a,filterOption:(e,t)=>(t?.value?.toString()??"").toLowerCase().includes(e.toLowerCase()),onChange:l,children:e.map(e=>(0,t.jsx)(r.SelectItem,{value:e.id,children:(0,t.jsxs)("div",{className:"flex items-center space-x-3 py-1",children:[(0,t.jsx)("div",{className:"w-6 h-6 flex items-center justify-center",children:(0,t.jsx)(O.Logo,{src:(e=>{if(e)return e.includes("/")||e.startsWith("data:")||e.startsWith("http")?e:`/ui/assets/logos/${e}`})(e.logo),label:e.displayName,className:"w-6 h-6 rounded-sm object-contain"})}),(0,t.jsx)("span",{className:"font-medium text-gray-900",children:e.displayName})]})},e.id))})}),eM=(e,t,a)=>{if(!e)return a?Object.keys(a):[];let l=t.find(t=>t.id===e);return l?.dynamic_params?Object.keys(l.dynamic_params):a?Object.keys(a):[]},eO=({accessToken:e,userRole:r,userID:v,premiumUser:w})=>{let[T,N]=(0,y.useState)([]),[S,I]=(0,y.useState)(!0),[P,A]=(0,y.useState)([]),[B]=k.Form.useForm(),[L]=k.Form.useForm(),[D,z]=(0,y.useState)(null),[O,U]=(0,y.useState)(""),[Z,R]=(0,y.useState)({}),[H,$]=(0,y.useState)([]),[q,K]=(0,y.useState)(!1),[W,Q]=(0,y.useState)([]),[V,J]=(0,y.useState)({}),[X,Y]=(0,y.useState)([]),[ee,et]=(0,y.useState)(!1),[ea,el]=(0,y.useState)(null),[es,er]=(0,y.useState)(!1),[en,ei]=(0,y.useState)(null),[eo,ec]=(0,y.useState)(!1),[eu,em]=(0,y.useState)(!1),[eh,ex]=(0,y.useState)(!1);(0,y.useEffect)(()=>{e&&(0,E.getCallbackConfigsCall)(e).then(e=>{Q(e||[])}).catch(e=>{F.default.fromBackend("Failed to load callback configs: "+(0,eL.parseErrorMessage)(e))})},[e]),(0,y.useEffect)(()=>{if(ee&&ea){let e=Object.fromEntries(Object.entries(ea.variables||{}).map(([e,t])=>[e,t??""]));L.setFieldsValue({...e,callback:ea.name})}},[ee,ea,L]);let eg=e=>{H.includes(e)?$(H.filter(t=>t!==e)):$([...H,e])},ef={llm_exceptions:"LLM Exceptions",llm_too_slow:"LLM Responses Too Slow",llm_requests_hanging:"LLM Requests Hanging",budget_alerts:"Budget Alerts (API Keys, Users)",db_exceptions:"Database Exceptions (Read/Write)",daily_reports:"Weekly/Monthly Spend Reports",outage_alerts:"Outage Alerts",region_outage_alerts:"Region Outage Alerts"};(0,y.useEffect)(()=>{(async()=>{if(!e||!r||!v)return I(!1);try{let t=await (0,E.getCallbacksCall)(e,v,r);N(t.callbacks),J(t.available_callbacks);let a=t.alerts;if(a&&a.length>0){let e=a[0],t=e.variables.SLACK_WEBHOOK_URL,l=e.active_alerts;$(l),U(t),R(e.alerts_to_webhook)}A(a)}finally{I(!1)}})()},[e,r,v]);let ep=e=>H&&H.includes(e),ej=async(t,a,l)=>{if(e){l?ec(!0):em(!0);try{if(await (0,E.setCallbacksCall)(e,{environment_variables:t,litellm_settings:{success_callback:[a]}}),F.default.success(l?"Callback updated successfully":`Callback ${a} added successfully`),l?(et(!1),L.resetFields(),el(null)):(K(!1),B.resetFields(),z(null),Y([])),v&&r){let t=await (0,E.getCallbacksCall)(e,v,r);N(t.callbacks)}}catch(e){F.default.fromBackend(e)}finally{l?ec(!1):em(!1)}}},eb=async e=>{ea&&await ej(e,ea.name,!0)},ey=async e=>{let t=e?.callback;t&&await ej(e,t,!1)},eC=async()=>{if(!e)return;let t={};Object.entries(ef).forEach(([e,a])=>{let l=document.querySelector(`input[name="${e}"]`),s=l?.value||"";t[e]=s});try{await (0,E.setCallbacksCall)(e,{general_settings:{alert_to_webhook_url:t,alert_types:H}})}catch(e){F.default.fromBackend(e)}F.default.success("Alerts updated successfully")},ek=async()=>{if(en&&e)try{if(ex(!0),await (0,E.deleteCallback)(e,en.name),F.default.success(`Callback ${en.name} deleted successfully`),v&&r){let t=await (0,E.getCallbacksCall)(e,v,r);N(t.callbacks)}er(!1),ei(null)}catch(e){console.error("Failed to delete callback:",e),F.default.fromBackend(e)}finally{ex(!1)}};return e?(0,t.jsxs)("div",{className:"mx-4",children:[(0,t.jsx)(s.Grid,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,t.jsxs)(o.TabGroup,{children:[(0,t.jsxs)(g.TabList,{variant:"line",defaultValue:"1",children:[(0,t.jsx)(i.Tab,{value:"1",children:"Logging Callbacks"}),(0,t.jsx)(i.Tab,{value:"2",children:"CloudZero Cost Tracking"}),(0,t.jsx)(i.Tab,{value:"2",children:"Alerting Types"}),(0,t.jsx)(i.Tab,{value:"3",children:"Alerting Settings"}),(0,t.jsx)(i.Tab,{value:"4",children:"Email Alerts"})]}),(0,t.jsxs)(p.TabPanels,{children:[(0,t.jsx)(f.TabPanel,{children:(0,t.jsx)(eB,{callbacks:T,availableCallbacks:V,isLoading:S,onAdd:()=>K(!0),onEdit:e=>{el(e),et(!0)},onDelete:e=>{ei(e),er(!0)},onTest:async t=>{try{await (0,E.serviceHealthCheck)(e,t.name),F.default.success("Health check triggered")}catch(e){F.default.fromBackend((0,eL.parseErrorMessage)(e))}}})}),(0,t.jsx)(f.TabPanel,{children:(0,t.jsx)("div",{className:"p-8",children:(0,t.jsx)(ev,{})})}),(0,t.jsx)(f.TabPanel,{children:(0,t.jsxs)(l.Card,{children:[(0,t.jsxs)(j.Text,{className:"my-2",children:["Alerts are only supported for Slack Webhook URLs. Get your webhook urls from"," ",(0,t.jsx)("a",{href:"https://api.slack.com/messaging/webhooks",target:"_blank",style:{color:"blue"},children:"here"})]}),(0,t.jsxs)(c.Table,{children:[(0,t.jsx)(m.TableHead,{children:(0,t.jsxs)(x.TableRow,{children:[(0,t.jsx)(h.TableHeaderCell,{}),(0,t.jsx)(h.TableHeaderCell,{}),(0,t.jsx)(h.TableHeaderCell,{children:"Slack Webhook URL"})]})}),(0,t.jsx)(d.TableBody,{children:Object.entries(ef).map(([e,l],s)=>(0,t.jsxs)(x.TableRow,{children:[(0,t.jsx)(u.TableCell,{children:"region_outage_alerts"==e?w?(0,t.jsx)(n.Switch,{id:"switch",name:"switch",checked:ep(e),onChange:()=>eg(e)}):(0,t.jsx)(a.Button,{className:"flex items-center justify-center",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})}):(0,t.jsx)(n.Switch,{id:"switch",name:"switch",checked:ep(e),onChange:()=>eg(e)})}),(0,t.jsx)(u.TableCell,{children:(0,t.jsx)(j.Text,{children:l})}),(0,t.jsx)(u.TableCell,{children:(0,t.jsx)(b.TextInput,{name:e,type:"password",defaultValue:Z&&Z[e]?Z[e]:O})})]},s))})]}),(0,t.jsx)(a.Button,{size:"xs",className:"mt-2",onClick:eC,children:"Save Changes"}),(0,t.jsx)(a.Button,{onClick:async()=>{try{await (0,E.serviceHealthCheck)(e,"slack"),F.default.success("Alert test triggered. Test request to slack made - check logs/alerts on slack to verify")}catch(e){F.default.fromBackend((0,eL.parseErrorMessage)(e))}},className:"mx-2",children:"Test Alerts"})]})}),(0,t.jsx)(f.TabPanel,{children:(0,t.jsx)(G,{accessToken:e,premiumUser:w})}),(0,t.jsx)(f.TabPanel,{children:(0,t.jsx)(M,{accessToken:e,premiumUser:w,alerts:P})})]})]})}),(0,t.jsxs)(_.Modal,{title:"Add Logging Callback",open:q,width:800,onCancel:()=>{K(!1),z(null),Y([])},footer:null,children:[(0,t.jsxs)("a",{href:"https://docs.litellm.ai/docs/proxy/logging",className:"mb-8 mt-4",target:"_blank",style:{color:"blue"},children:[" ","LiteLLM Docs: Logging"]}),(0,t.jsxs)(k.Form,{form:B,onFinish:ey,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsx)(ez,{callbackConfigs:W,selectedCallback:D,onCallbackChange:e=>{z(e),Y(eM(e,W))}}),(0,t.jsx)(eD,{params:X,callbackConfigs:W,selectedCallback:D}),(0,t.jsxs)("div",{className:"flex justify-end space-x-3 pt-6 mt-6 border-t border-gray-200",children:[(0,t.jsx)(C.Button,{onClick:()=>{K(!1),z(null),Y([]),B.resetFields()},disabled:eu,children:"Cancel"}),(0,t.jsx)(C.Button,{htmlType:"submit",loading:eu,disabled:eu,children:eu?"Adding...":"Add Callback"})]})]})]}),(0,t.jsx)(_.Modal,{open:ee,width:800,title:"Edit Callback Settings",onCancel:()=>{et(!1),el(null),L.resetFields()},footer:null,children:(0,t.jsxs)(k.Form,{form:L,onFinish:eb,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[ea&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(ez,{callbackConfigs:W,selectedCallback:ea.name,onCallbackChange:()=>{},disabled:!0}),(0,t.jsx)(eD,{params:eM(ea.name,W,ea.variables),callbackConfigs:W,selectedCallback:ea.name})]}),(0,t.jsxs)("div",{className:"flex justify-end space-x-3 pt-6 mt-6 border-t border-gray-200",children:[(0,t.jsx)(C.Button,{onClick:()=>{et(!1),el(null),L.resetFields()},disabled:eo,children:"Cancel"}),(0,t.jsx)(C.Button,{onClick:()=>{L.submit()},loading:eo,disabled:eo,children:eo?"Saving...":"Save Changes"})]})]})}),(0,t.jsx)(ed.default,{isOpen:es,title:"Delete Callback",message:"Are you sure you want to delete this callback? This action cannot be undone.",resourceInformationTitle:"Callback Information",resourceInformation:[{label:"Callback Name",value:en?.name},{label:"Mode",value:en?.mode||"success"}],onCancel:()=>{er(!1),ei(null)},onOk:ek,confirmLoading:eh})]}):null};e.s(["default",0,function(){let{accessToken:e,userRole:a,userId:l,premiumUser:s}=(0,ea.default)();return(0,t.jsx)(eO,{userID:l,userRole:a,accessToken:e,premiumUser:s})}],372024)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/08eaumdx0krrt.js b/litellm/proxy/_experimental/out/_next/static/chunks/08eaumdx0krrt.js deleted file mode 100644 index 33533275853..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/08eaumdx0krrt.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,655063,e=>{"use strict";var t=e.i(399029),a=e.i(271645);e.s(["useDebouncedValue",0,function(e,r,s){let[l,i,n]=(0,t.useDebouncedState)(e,r,s);return(0,a.useEffect)(()=>{i(e)},[e,i]),[l,n]}])},263005,e=>{"use strict";var t=e.i(843476);e.s(["PageHeader",0,function({title:e,subtitle:a,icon:r,actions:s}){return(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[null!=r&&(0,t.jsx)("span",{className:"flex flex-none items-center text-foreground",children:r}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold tracking-tight text-foreground",children:e}),null!=a&&(0,t.jsx)("p",{className:"mt-0.5 text-sm text-muted-foreground",children:a})]})]}),null!=s&&(0,t.jsx)("div",{className:"flex items-center gap-2",children:s})]})}])},72713,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:"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z"}}]},name:"calendar",theme:"outlined"};var s=e.i(9583),l=a.forwardRef(function(e,l){return a.createElement(s.default,(0,t.default)({},e,{ref:l,icon:r}))});e.s(["CalendarOutlined",0,l],72713)},278587,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:"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"}))});e.s(["RefreshIcon",0,a],278587)},871943,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:"M19 9l-7 7-7-7"}))});e.s(["ChevronDownIcon",0,a],871943)},502547,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:"M9 5l7 7-7 7"}))});e.s(["ChevronRightIcon",0,a],502547)},953960,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(599724),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:"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 i=e.i(871943),n=e.i(502547),o=e.i(592968),d=e.i(602869),c=e.i(234713);e.s(["default",0,function({mcpServers:e,mcpAccessGroups:u=[],mcpToolPermissions:m={},mcpToolsets:p=[],accessToken:x}){let[g,h]=(0,a.useState)([]),[f,v]=(0,a.useState)([]),[b,y]=(0,a.useState)(new Set),[w,j]=(0,a.useState)(new Set);(0,a.useEffect)(()=>{(async()=>{if(x&&e.length>0)try{let e=await (0,d.fetchMCPServers)(x);e&&Array.isArray(e)?h(e):e.data&&Array.isArray(e.data)&&h(e.data)}catch(e){console.error("Error fetching MCP servers:",e)}})()},[x,e.length]),(0,a.useEffect)(()=>{(async()=>{if(x&&p.length>0)try{let e=await (0,d.fetchMCPToolsets)(x),t=Array.isArray(e)?e.filter(e=>p.includes(e.toolset_id)):[];v(t)}catch(e){console.error("Error fetching toolsets:",e)}})()},[x,p.length]);let _=e.includes(c.NO_MCP_SERVERS_SENTINEL),N=e.includes(c.ALL_PROXY_MCP_SERVERS_SENTINEL),k=[...e.filter(e=>e!==c.NO_MCP_SERVERS_SENTINEL&&e!==c.ALL_PROXY_MCP_SERVERS_SENTINEL).map(e=>({type:"server",value:e})),...u.map(e=>({type:"accessGroup",value:e}))],S=k.length+p.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)(l,{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:_?"red":"blue",size:"xs",children:_?"Blocked":N?"All":S})]}),_?(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)(l,{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"})]}):N?(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)(l,{className:"h-4 w-4 text-blue-400"}),(0,t.jsx)(r.Text,{className:"text-blue-700 text-sm",children:"All Proxy MCP Servers"})]}):S>0?(0,t.jsxs)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:[k.map((e,a)=>{let r="server"===e.type?m[e.value]:void 0,s=r&&r.length>0,l=b.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 y(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a}))},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)(o.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=g.find(t=>t.server_id===e);if(t){let a=e.length>7?`${e.slice(0,3)}...${e.slice(-4)}`:e;return`${t.alias||t.server_name||e} (${a})`}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:r.length}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===r.length?"tool":"tools"}),l?(0,t.jsx)(i.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(n.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:r.map((e,a)=>(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},a))})})]},a)}),p.length>0&&p.map((e,a)=>{let r=f.find(t=>t.toolset_id===e),s=w.has(e),l=r?.tools.length??0;return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>l>0&&void j(t=>{let a=new Set(t);return a.has(e)?a.delete(e):a.add(e),a}),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:r?.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)(i.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(n.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),l>0&&s&&r&&(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:r.tools.map((e,a)=>(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]},a))})})]},`toolset-${a}`)})]}):(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 MCP servers, access groups, or toolsets configured"})]})]})}],953960)},384767,e=>{"use strict";var t=e.i(843476),a=e.i(599724),r=e.i(271645),s=e.i(389083);let l=r.forwardRef(function(e,t){return r.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),r.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 i=e.i(602869);let n=function({vectorStores:e,accessToken:n}){let[o,d]=(0,r.useState)([]);return(0,r.useEffect)(()=>{(async()=>{if(n&&0!==e.length)try{let e=await (0,i.vectorStoreListCall)(n);e.data&&d(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)}})()},[n,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)(a.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,a)=>{let r;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:(r=o.find(t=>t.vector_store_id===e))?`${r.vector_store_name||r.vector_store_id} (${r.vector_store_id})`:e},a)})}):(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)(a.Text,{className:"text-gray-500 text-sm",children:"No vector stores configured"})]})]})};var o=e.i(953960);let d=r.forwardRef(function(e,t){return r.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),r.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"}))});var c=e.i(592968);let u=function({agents:e,agentAccessGroups:l=[],accessToken:n}){let[o,u]=(0,r.useState)([]);(0,r.useEffect)(()=>{(async()=>{if(n&&e.length>0)try{let e=await (0,i.getAgentsList)(n);e&&e.agents&&Array.isArray(e.agents)&&u(e.agents)}catch(e){console.error("Error fetching agents:",e)}})()},[n,e.length]);let m=[...e.map(e=>({type:"agent",value:e})),...l.map(e=>({type:"accessGroup",value:e}))],p=m.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)(d,{className:"h-4 w-4 text-purple-600"}),(0,t.jsx)(a.Text,{className:"font-semibold text-gray-900",children:"Agents"}),(0,t.jsx)(s.Badge,{color:"purple",size:"xs",children:p})]}),p>0?(0,t.jsx)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:m.map((e,a)=>(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)(c.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 a=e.length>7?`${e.slice(0,3)}...${e.slice(-4)}`:e;return`${t.agent_name} (${a})`}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"})]})})})},a))}):(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)(d,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(a.Text,{className:"text-gray-500 text-sm",children:"No agents or access groups configured"})]})]})};e.s(["default",0,function({objectPermission:e,variant:r="card",className:s="",accessToken:l}){let i=e?.vector_stores||[],d=e?.mcp_servers||[],c=e?.mcp_access_groups||[],m=e?.mcp_tool_permissions||{},p=e?.mcp_toolsets||[],x=e?.agents||[],g=e?.agent_access_groups||[],h=e?.search_tools||[],f=(0,t.jsxs)("div",{className:"card"===r?"grid grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-3 gap-6":"space-y-4",children:[(0,t.jsx)(n,{vectorStores:i,accessToken:l}),(0,t.jsx)(o.default,{mcpServers:d,mcpAccessGroups:c,mcpToolPermissions:m,mcpToolsets:p,accessToken:l}),(0,t.jsx)(u,{agents:x,agentAccessGroups:g,accessToken:l}),(0,t.jsxs)("div",{className:"rounded-md border border-gray-100 p-4",children:[(0,t.jsx)(a.Text,{className:"text-sm font-medium text-gray-800",children:"Search tools"}),0===h.length?(0,t.jsx)(a.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)(a.Text,{className:"mt-1 block text-xs text-gray-700",children:h.join(", ")})]})]});return"card"===r?(0,t.jsxs)("div",{className:`@container 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)(a.Text,{className:"font-semibold text-gray-900",children:"Object Permissions"}),(0,t.jsx)(a.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)(a.Text,{className:"font-medium text-gray-900 mb-3",children:"Object Permissions"}),f]})}],384767)},891547,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:l,className:i,accessToken:n,disabled:o})=>{let[d,c]=(0,a.useState)([]),[u,m]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{(async()=>{if(n){m(!0);try{let e=await (0,s.getGuardrailsList)(n);e.guardrails&&c(e.guardrails)}catch(e){console.error("Error fetching guardrails:",e)}finally{m(!1)}}})()},[n]),(0,t.jsx)("div",{children:(0,t.jsx)(r.Select,{mode:"multiple",disabled:o,placeholder:o?"Setting guardrails is a premium feature.":"Select guardrails",onChange:t=>{e(t)},value:l,loading:u,className:i,allowClear:!0,options:d.map(e=>({label:`${e.guardrail_name}`,value:e.guardrail_name})),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})}])},921511,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(199133),s=e.i(602869);function l(e){return e.filter(e=>(e.version_status??"draft")!=="draft").map(e=>{var t;let a=e.version_number??1,r=e.version_status??"draft";return{label:`${e.policy_name} — v${a} (${r})${e.description?` — ${e.description}`:""}`,value:"production"===r?e.policy_name:e.policy_id?(t=e.policy_id,`policy_${t}`):e.policy_name}})}e.s(["default",0,({onChange:e,value:i,className:n,accessToken:o,disabled:d,onPoliciesLoaded:c})=>{let[u,m]=(0,a.useState)([]),[p,x]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{(async()=>{if(o){x(!0);try{let e=await (0,s.getPoliciesList)(o);e.policies&&(m(e.policies),c?.(e.policies))}catch(e){console.error("Error fetching policies:",e)}finally{x(!1)}}})()},[o,c]),(0,t.jsx)("div",{children:(0,t.jsx)(r.Select,{mode:"multiple",disabled:d,placeholder:d?"Setting policies is a premium feature.":"Select policies (production or published versions)",onChange:t=>{e(t)},value:i,loading:p,className:n,allowClear:!0,options:l(u),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})},"getPolicyOptionEntries",0,l])},595727,234662,677241,281092,688594,e=>{"use strict";let t=Symbol.for("constructDateFrom");function a(e,a){return"function"==typeof e?e(a):e&&"object"==typeof e&&t in e?e[t](a):e instanceof Date?new e.constructor(a):new Date(a)}function r(e,t){return a(t||e,e)}e.s(["constructFromSymbol",0,t,"millisecondsInDay",0,864e5,"millisecondsInHour",0,36e5,"millisecondsInMinute",0,6e4,"millisecondsInSecond",0,1e3,"millisecondsInWeek",0,6048e5],234662),e.s(["constructFrom",0,a],677241),e.s(["toDate",0,r],281092),e.s(["addDays",0,function(e,t,s){let l=r(e,s?.in);return isNaN(t)?a(s?.in||e,NaN):(t&&l.setDate(l.getDate()+t),l)}],595727),e.s(["addMonths",0,function(e,t,s){let l=r(e,s?.in);if(isNaN(t))return a(s?.in||e,NaN);if(!t)return l;let i=l.getDate(),n=a(s?.in||e,l.getTime());return(n.setMonth(l.getMonth()+t+1,0),i>=n.getDate())?n:(l.setFullYear(n.getFullYear(),n.getMonth(),i),l)}],688594)},24529,e=>{"use strict";var t=e.i(595727),a=e.i(688594),r=e.i(677241),s=e.i(281092);function l(e,l,i){let{years:n=0,months:o=0,weeks:d=0,days:c=0,hours:u=0,minutes:m=0,seconds:p=0}=l,x=(0,s.toDate)(e,i?.in),g=o||n?(0,a.addMonths)(x,o+12*n):x,h=c||d?(0,t.addDays)(g,c+7*d):g;return(0,r.constructFrom)(i?.in||e,+h+1e3*(p+60*(m+60*u)))}let i=/[zZ]$|[+-]\d{2}:?\d{2}$/;function n(e){return Date.parse(i.test(e)?e:`${e}Z`)}e.s(["calculateExpiryPreviewFromDuration",0,function(e){if(!e)return null;try{let t,a=parseInt(e);if(Number.isNaN(a))throw Error("Invalid duration format");let r=new Date;if(e.endsWith("mo"))t=l(r,{months:a});else if(e.endsWith("s"))t=l(r,{seconds:a});else if(e.endsWith("m"))t=l(r,{minutes:a});else if(e.endsWith("h"))t=l(r,{hours:a});else if(e.endsWith("d"))t=l(r,{days:a});else if(e.endsWith("w"))t=l(r,{weeks:a});else throw Error("Invalid duration format");return t.toLocaleString()}catch{return null}},"formatExpiresUtc",0,function(e){let t=n(e);return Number.isNaN(t)?e:new Date(t).toLocaleString()},"isKeyExpired",0,function(e){if(!e)return!1;let t=n(e);return!Number.isNaN(t)&&t{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504);let s=a.forwardRef(({className:e,...a},s)=>(0,t.jsx)("textarea",{ref:s,"data-slot":"textarea",className:(0,r.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground 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 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...a}));s.displayName="Textarea",e.s(["Textarea",0,s])},950594,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504),s=e.i(519455),l=e.i(793479),i=e.i(624687);let n=(0,r.cva)({base:"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",variants:{align:{"inline-start":"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}}),o=(0,r.cva)({base:"flex items-center gap-2 text-sm shadow-none",variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}}),d=a.forwardRef(({className:e,type:a="button",variant:l="ghost",size:i="xs",...n},d)=>(0,t.jsx)(s.Button,{ref:d,type:a,"data-size":i,variant:l,className:(0,r.cn)(o({size:i}),e),...n}));d.displayName="InputGroupButton";let c=a.forwardRef(({className:e,...a},s)=>(0,t.jsx)(l.Input,{ref:s,"data-slot":"input-group-control",className:(0,r.cn)("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...a}));c.displayName="InputGroupInput",a.forwardRef(({className:e,...a},s)=>(0,t.jsx)(i.Textarea,{ref:s,"data-slot":"input-group-control",className:(0,r.cn)("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...a})).displayName="InputGroupTextarea",e.s(["InputGroup",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"input-group",role:"group",className:(0,r.cn)("group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...a})},"InputGroupAddon",0,function({className:e,align:a="inline-start",...s}){return(0,t.jsx)("div",{role:"group","data-slot":"input-group-addon","data-align":a,className:(0,r.cn)(n({align:a}),e),onClick:e=>{e.target.closest("button")||e.currentTarget.parentElement?.querySelector("input")?.focus()},...s})},"InputGroupButton",0,d,"InputGroupInput",0,c,"InputGroupText",0,function({className:e,...a}){return(0,t.jsx)("span",{className:(0,r.cn)("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...a})}])},552546,e=>{"use strict";var t=e.i(843476),a=e.i(131792);let r=(e,t)=>{let a=t.trim().toLowerCase();return!a||e.label.toLowerCase().includes(a)||(e.sublabel?.toLowerCase().includes(a)??!1)};e.s(["SearchSelect",0,function({options:e,value:s,onValueChange:l,placeholder:i="Select…",emptyText:n="No results",disabled:o=!1,className:d}){let c=e.find(e=>e.value===s)??null;return(0,t.jsxs)(a.Combobox,{items:e,value:c,onValueChange:e=>l(e?.value??""),isItemEqualToValue:(e,t)=>e.value===t.value,itemToStringLabel:e=>e.label,filter:r,disabled:o,children:[(0,t.jsx)(a.ComboboxInput,{placeholder:i,showClear:null!=s&&""!==s,className:`w-full ${d??""}`}),(0,t.jsxs)(a.ComboboxContent,{children:[(0,t.jsx)(a.ComboboxEmpty,{children:n}),(0,t.jsx)(a.ComboboxList,{children:e=>(0,t.jsx)(a.ComboboxItem,{value:e,children:(0,t.jsxs)("span",{className:"flex min-w-0 flex-col",children:[(0,t.jsx)("span",{className:"truncate",children:e.label}),null!=e.sublabel&&""!==e.sublabel&&(0,t.jsx)("span",{className:"truncate text-xs text-muted-foreground",children:e.sublabel})]})},e.value)})]})]})}])},611363,e=>{"use strict";e.s(["navigateWithParams",0,function(e,t="push"){let a=new URLSearchParams(window.location.search);e(a);let r=a.toString(),s=r?`${window.location.pathname}?${r}`:window.location.pathname;"replace"===t?window.history.replaceState(null,"",s):window.history.pushState(null,"",s)}])},502501,e=>{"use strict";var t=e.i(843476),a=e.i(785242),r=e.i(135214),s=e.i(268004),l=e.i(309426),i=e.i(350967),n=e.i(947293),o=e.i(271645),d=e.i(602869);let c=async(e,t,a,r,s)=>{s("Admin"!=a&&"Admin Viewer"!=a?await (0,d.teamListCall)(e,r?.organization_id||null,t):await (0,d.teamListCall)(e,r?.organization_id||null))};var u=e.i(702597),m=e.i(618566),p=e.i(611363),x=e.i(266027),g=e.i(207082),h=e.i(109799),f=e.i(741466);e.i(707701);var v=e.i(807235),b=e.i(981080),y=e.i(531649),w=e.i(552546),j=e.i(263005),_=e.i(793479),N=e.i(655063),k=e.i(465261),S=e.i(20147),C=e.i(827252),I=e.i(282786),E=e.i(898586),T=e.i(494862),D=e.i(302747);e.i(622826);var z=e.i(200208),M=e.i(399536),R=e.i(997422),A=e.i(547227),L=e.i(630500),P=e.i(112179),V=e.i(304911);let U=[{id:"spend",label:"Spend"},{id:"max_budget",label:"Budget"}],O=({userAlias:e,userEmail:a,userId:r,width:s})=>{let l=e||a||r,i="default_user_id"===r,n=(0,t.jsx)("div",{className:"flex flex-col gap-2 text-xs min-w-[200px] max-w-[300px]",children:[{label:"User Alias",value:e},{label:"User Email",value:a},{label:"User ID",value:r}].map(({label:e,value:a})=>(0,t.jsxs)("div",{className:"flex flex-col min-w-0",children:[(0,t.jsx)("span",{className:"text-gray-400",children:e}),a?(0,t.jsx)(E.Typography.Text,{className:"font-mono text-xs",ellipsis:{tooltip:a},copyable:!0,children:a}):(0,t.jsx)("span",{className:"font-mono",children:"-"})]},e))});return!i||e||a?(0,t.jsx)(I.Popover,{content:n,trigger:"hover",placement:"bottomLeft",children:(0,t.jsx)("span",{className:"font-mono text-xs truncate block cursor-default",style:{maxWidth:s,overflow:"hidden"},children:l||"-"})}):(0,t.jsx)(I.Popover,{content:n,trigger:"hover",placement:"bottomLeft",children:(0,t.jsx)("span",{className:"cursor-default",children:(0,t.jsx)(V.default,{userId:r})})})},B=({label:e,tooltip:a})=>(0,t.jsxs)("span",{className:"flex items-center gap-1",children:[e,(0,t.jsx)(I.Popover,{content:a,trigger:"hover",children:(0,t.jsx)(C.InfoCircleOutlined,{className:"text-gray-400 text-xs cursor-help"})})]}),K={token:!1,organization_alias:!1,created_by:!1,updated_at:!1,expires:!1,rate_limits:!1},$=[{id:"created_at",desc:!0}],F={team_id:"Team",org_id:"Organization",user_id:"User ID",key_hash:"Key ID"};function G({headerActions:e}){let s,l,i,{data:n}=(0,h.useOrganizations)(),c=(0,o.useMemo)(()=>n??[],[n]),{data:u}=(0,a.useAllTeams)(),C=(0,o.useMemo)(()=>u??[],[u]),{keyId:I,openKey:E,close:V}=(s=(0,m.useSearchParams)(),l=(0,o.useCallback)(e=>{(0,p.navigateWithParams)(t=>{t.set("key",e)})},[]),i=(0,o.useCallback)(()=>{(0,p.navigateWithParams)(e=>{e.delete("key")})},[]),{keyId:s?.get("key")??null,openKey:l,close:i}),[W,H]=(0,o.useState)($),[q,Y]=(0,o.useState)({pageIndex:0,pageSize:50}),[J,X]=(0,o.useState)([]),[Z,Q]=(0,o.useState)(!1),[ee,et]=(0,o.useState)(""),[ea]=(0,N.useDebouncedValue)(ee,{wait:f.DEBOUNCE_WAIT_MS}),er=(0,o.useCallback)(e=>{let t=J.find(t=>t.id===e);return"string"==typeof t?.value&&t.value.trim()?t.value.trim():void 0},[J]),es=W[0]?.id,el=(e=>{let t=e[0];if(t)return t.desc?"desc":"asc"})(W),ei={teamID:er("team_id"),organizationID:er("org_id"),selectedKeyAlias:ea.trim()||void 0,userID:er("user_id"),keyHash:er("key_hash"),sortBy:es,sortOrder:el,expand:"user"},{data:en,isPending:eo,isFetching:ed,refetch:ec}=(0,g.useKeys)(q.pageIndex+1,q.pageSize,ei),eu=(0,o.useMemo)(()=>en?.keys??[],[en]),em=en?.total_count??0,ep=(0,o.useCallback)(e=>{et(e),Y(e=>({...e,pageIndex:0}))},[]),ex=(0,o.useCallback)(e=>{H(e),Y(e=>({...e,pageIndex:0}))},[]),eg=(0,o.useCallback)(e=>{X(e),Y(e=>({...e,pageIndex:0}))},[]),eh=(0,o.useMemo)(()=>(({allTeams:e,organizations:a,onSelectKey:r})=>[{id:"key_alias",accessorKey:"key_alias",meta:{title:"Key",renderSkeleton:()=>(0,t.jsxs)("div",{className:"flex flex-col gap-1 py-1",children:[(0,t.jsx)(D.Skeleton,{className:"h-4 w-32"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(D.Skeleton,{className:"h-3 w-20"}),(0,t.jsx)(D.Skeleton,{className:"h-5 w-16 rounded-full"})]})]})},header:({column:e})=>(0,t.jsx)(T.DataTableSortHeader,{column:e,title:"Key",variant:"header-cycle"}),size:260,enableSorting:!0,cell:({row:e})=>{let a=(e=>{if(!0===e.blocked)return{tone:"error",label:"Blocked",tooltip:e.metadata?.scim_blocked===!0?"Blocked by SCIM (external identity provider deactivated or deleted the owning user).":"Blocked. Requests using this key will be rejected with 401."};let t=e.expires?Date.parse(e.expires):NaN;return!Number.isNaN(t)&&tr(e.original)})}},{id:"token",accessorKey:"token",meta:{title:"Key ID"},header:({column:e})=>(0,t.jsx)(T.DataTableSortHeader,{column:e,title:"Key ID",variant:"header-cycle"}),size:120,enableSorting:!0,cell:e=>(0,t.jsx)(M.IdCell,{value:e.getValue(),onClick:()=>r(e.row.original)})},{id:"team_alias",accessorKey:"team_id",meta:{title:"Team"},header:"Team",size:120,enableSorting:!1,cell:a=>{let r=a.getValue();if(!r)return"-";let s=e.find(e=>e.team_id===r),l=s?.team_alias||r,i=a.cell.column.getSize();return(0,t.jsx)("span",{className:"font-mono text-xs truncate block",style:{maxWidth:i,overflow:"hidden"},children:l})}},{id:"organization_alias",accessorKey:"org_id",meta:{title:"Organization"},header:"Organization",size:140,enableSorting:!1,cell:e=>{let r=e.getValue();if(!r)return"-";let s=a.find(e=>e.organization_id===r),l=s?.organization_alias||r,i=e.cell.column.getSize();return(0,t.jsx)("span",{className:"font-mono text-xs truncate block",style:{maxWidth:i,overflow:"hidden"},children:l})}},{id:"user",accessorKey:"user",meta:{title:"User"},header:()=>(0,t.jsx)(B,{label:"User",tooltip:"Displays the first available value: User Alias, User Email, or User ID."}),size:160,enableSorting:!1,cell:({row:e})=>{let a=e.original;return(0,t.jsx)(O,{userAlias:a.user?.user_alias??null,userEmail:a.user?.user_email??a.user_email??null,userId:a.user_id??null,width:160})}},{id:"created_at",accessorKey:"created_at",meta:{title:"Created At"},header:({column:e})=>(0,t.jsx)(T.DataTableSortHeader,{column:e,title:"Created At",variant:"header-cycle"}),size:120,enableSorting:!0,cell:e=>(0,t.jsx)(z.DateCell,{value:e.getValue(),precision:"date"})},{id:"created_by",accessorKey:"created_by",meta:{title:"Created By"},header:"Created By",size:160,enableSorting:!1,cell:e=>{let a=e.getValue();if(!a)return"-";let r=e.row.original.created_by_user;return(0,t.jsx)(O,{userAlias:r?.user_alias??null,userEmail:r?.user_email??null,userId:a,width:160})}},{id:"updated_at",accessorKey:"updated_at",meta:{title:"Updated At"},header:({column:e})=>(0,t.jsx)(T.DataTableSortHeader,{column:e,title:"Updated At",variant:"header-cycle"}),size:120,enableSorting:!0,cell:e=>(0,t.jsx)(z.DateCell,{value:e.getValue(),precision:"date",fallback:"Never"})},{id:"last_active",accessorKey:"last_active",meta:{title:"Last Active"},header:()=>(0,t.jsx)(B,{label:"Last Active",tooltip:"This is a new field and is not backfilled. Only new key usage will update this value."}),size:130,enableSorting:!1,cell:e=>(0,t.jsx)(z.DateCell,{value:e.getValue(),precision:"date",fallback:"Unknown"})},{id:"expires",accessorKey:"expires",meta:{title:"Expires"},header:"Expires",size:120,enableSorting:!1,cell:e=>(0,t.jsx)(z.DateCell,{value:e.getValue(),precision:"date",fallback:"Never"})},{id:"spend",accessorKey:"spend",meta:{title:"Spend / Budget",skeleton:"meter"},header:({table:e})=>(0,t.jsx)(T.DataTableMultiSortHeader,{table:e,fields:U}),size:180,enableSorting:!0,cell:({row:a})=>{let r=a.original.team_id,s=e.find(e=>e.team_id===r);return(0,t.jsx)(L.SpendBudgetCell,{spend:a.original.spend,maxBudget:a.original.max_budget,teamMaxBudget:s?.max_budget??null})}},{id:"budget_reset_at",accessorKey:"budget_reset_at",meta:{title:"Budget Reset"},header:"Budget Reset",size:130,enableSorting:!1,cell:e=>(0,t.jsx)(z.DateCell,{value:e.getValue(),fallback:"Never"})},{id:"models",accessorKey:"models",meta:{title:"Models",skeleton:"chips"},header:"Models",size:220,enableSorting:!1,cell:e=>(0,t.jsx)(A.ModelsCell,{models:e.getValue(),allowedRoutes:e.row.original.allowed_routes,keyType:e.row.original.key_type})},{id:"rate_limits",meta:{title:"Rate Limits"},header:"Rate Limits",size:140,enableSorting:!1,cell:({row:e})=>{let a=e.original;return(0,t.jsxs)("div",{className:"text-xs",children:[(0,t.jsxs)("div",{children:["TPM: ",null!==a.tpm_limit?a.tpm_limit:"Unlimited"]}),(0,t.jsxs)("div",{children:["RPM: ",null!==a.rpm_limit?a.rpm_limit:"Unlimited"]})]})}}])({allTeams:C,organizations:c,onSelectKey:e=>E(e.token)}),[C,c,E]),ef=(0,o.useMemo)(()=>eu.find(e=>e.token===I),[eu,I]),{data:ev,isError:eb}=function(e,t){let{accessToken:a}=(0,r.default)();return(0,x.useQuery)({queryKey:[...g.keyKeys.detail(e??""),a],queryFn:async()=>{if(!a||!e)throw Error("Missing access token or key id");return{...(await (0,d.keyInfoV1Call)(a,e)).info,token:e,api_key:e}},enabled:!!(a&&e)&&(t?.enabled??!0)})}(I,{enabled:!ef}),ey=ef??ev,ew=(0,o.useMemo)(()=>C.map(e=>({label:e.team_alias||e.team_id,value:e.team_id,sublabel:e.team_alias?e.team_id:void 0})),[C]),ej=(0,o.useMemo)(()=>c.filter(e=>e.organization_id).map(e=>{let t=e.organization_id;return{label:e.organization_alias||t,value:t,sublabel:e.organization_alias?t:void 0}}),[c]),e_=(0,o.useCallback)((e,t)=>{let a=String(t);return"team_id"===e?C.find(e=>e.team_id===a)?.team_alias||a:"org_id"===e&&c.find(e=>e.organization_id===a)?.organization_alias||a},[C,c]);return I?ey||eb?(0,t.jsx)("div",{className:"w-full h-full overflow-hidden",children:(0,t.jsx)(S.default,{keyId:I,onClose:V,keyData:ey,teams:C,onDelete:ec})}):(0,t.jsx)("div",{className:"p-4 text-sm text-muted-foreground",children:"Loading key..."}):(0,t.jsxs)("div",{className:"flex h-full flex-col gap-4 overflow-hidden py-2",children:[(0,t.jsx)(j.PageHeader,{icon:(0,t.jsx)(k.KeyRound,{className:"size-5"}),title:"Virtual Keys",subtitle:"Every key that authenticates requests to the gateway."}),e,(0,t.jsx)(v.DataTable,{data:eu,columns:eh,getRowId:e=>e.token,defaultColumnVisibility:K,sortingMode:"server",sorting:W,onSortingChange:ex,paginationMode:"server",pagination:q,onPaginationChange:Y,rowCount:em,filterMode:"server",columnFilters:J,onColumnFiltersChange:eg,enableColumnResizing:!0,columnResizeMode:"onChange",isLoading:eo,loadingMessage:"Loading keys...",noDataMessage:"No keys found",maxBodyHeight:"calc(75vh - 210px)",size:"compact",toolbar:e=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(y.DataTableToolbar,{table:e,searchValue:ee,onSearchChange:ep,searchPlaceholder:"Search by key alias…",onRefresh:()=>ec?.(),isRefreshing:ed,onOpenFilters:()=>Q(!0),filterLabels:F,formatFilterValue:e_}),(0,t.jsx)(b.DataTableFilterDrawer,{table:e,open:Z,onOpenChange:Q,title:"Filters",description:"Narrow down virtual keys",children:({get:e,set:a})=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(b.DataTableFilterField,{label:"Team",children:(0,t.jsx)(w.SearchSelect,{options:ew,value:e("team_id")||void 0,onValueChange:e=>a("team_id",e),placeholder:"Select a team…",emptyText:"No teams found"})}),(0,t.jsx)(b.DataTableFilterField,{label:"Organization",children:(0,t.jsx)(w.SearchSelect,{options:ej,value:e("org_id")||void 0,onValueChange:e=>a("org_id",e),placeholder:"Select an organization…",emptyText:"No organizations found"})}),(0,t.jsx)(b.DataTableFilterField,{label:"User ID",children:(0,t.jsx)(_.Input,{value:e("user_id")??"",onChange:e=>a("user_id",e.target.value),placeholder:"Enter User ID…"})}),(0,t.jsx)(b.DataTableFilterField,{label:"Key ID",children:(0,t.jsx)(_.Input,{value:e("key_hash")??"",onChange:e=>a("key_hash",e.target.value),placeholder:"Enter Key ID…"})})]})})]})})]})}let W=({userID:e,userRole:a,teams:r,keys:m,setUserRole:p,userEmail:x,setUserEmail:g,setTeams:h,setKeys:f,premiumUser:v,addKey:b,createClicked:y,autoOpenCreate:w,prefillData:j})=>{let[_,N]=(0,o.useState)(null),[k,S]=(0,o.useState)(null),C=(0,s.getCookie)("token"),[I,E]=(0,o.useState)(null),[T,D]=(0,o.useState)(null),[z,M]=(0,o.useState)([]),[R,A]=(0,o.useState)(null),[L,P]=(0,o.useState)(null);function V(){(0,s.clearTokenCookies)();let e=(0,d.getProxyBaseUrl)(),t=e?`${e}/sso/key/generate`:"/sso/key/generate";return window.location.href=t,null}if((0,o.useEffect)(()=>{let e=()=>{let e=sessionStorage.getItem("token");sessionStorage.clear(),e&&sessionStorage.setItem("token",e)};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),(0,o.useEffect)(()=>{if(C){let e=(0,n.jwtDecode)(C);e&&(E(e.key),e.user_role&&p(function(e){if(!e)return"Undefined Role";switch(e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";case"internal_user":return"Internal User";case"internal_user_viewer":return"Internal Viewer";default:return"Unknown Role"}}(e.user_role)),e.user_email&&g(e.user_email))}if(e&&I&&a&&!_){let t=sessionStorage.getItem("userModels"+e);t?M(JSON.parse(t)):((async()=>{try{let t=await (0,d.getProxyUISettings)(I);A(t);let r=await (0,d.userGetInfoV2)(I,e);N(r),sessionStorage.setItem("userSpendData"+e,JSON.stringify(r));let s=(await (0,d.modelAvailableCall)(I,e,a)).data.map(e=>e.id);M(s),sessionStorage.setItem("userModels"+e,JSON.stringify(s))}catch(e){console.error("There was an error fetching the data",e),e.message.includes("Invalid proxy server token passed")&&V()}})(),c(I,e,a,k,h))}},[e,C,I,a]),(0,o.useEffect)(()=>{I&&(async()=>{try{await (0,d.keyInfoCall)(I,[I])}catch(e){e.message.includes("Invalid proxy server token passed")&&V()}})()},[I]),(0,o.useEffect)(()=>{I&&c(I,e,a,k,h)},[k]),(0,o.useEffect)(()=>{if(null!==m&&null!=L&&null!==L.team_id){let e=0;for(let t of m)L.hasOwnProperty("team_id")&&null!==t.team_id&&t.team_id===L.team_id&&(e+=t.spend);D(e)}else if(null!==m){let e=0;for(let t of m)e+=t.spend;D(e)}},[L]),null==C)return V(),null;try{let e=(0,n.jwtDecode)(C).exp,t=Math.floor(Date.now()/1e3);if(e&&t>=e)return V(),null}catch(e){return console.error("Error decoding token:",e),(0,s.clearTokenCookies)(),V(),null}if(null==I)return null;if(null==e)return(0,t.jsx)("h1",{children:"User ID is not set"});null==a&&p("App Owner");let U="Admin Viewer"!==a&&"proxy_admin_viewer"!==a;return(0,t.jsx)("div",{className:"mx-4 h-[75vh]",children:(0,t.jsx)(i.Grid,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,t.jsx)(l.Col,{numColSpan:1,className:"flex flex-col gap-2",children:(0,t.jsx)(G,{headerActions:U?(0,t.jsx)(u.default,{team:L,teams:r,data:m,addKey:b,autoOpenCreate:w,prefillData:j},L?L.team_id:null):void 0})})})})};var H=e.i(557951);e.s(["default",0,function(){let{userId:e,userRole:s,userEmail:l,accessToken:i,premiumUser:n}=(0,r.default)(),{setUserRole:d,setUserEmail:c}=(0,H.useAuth)(),u=(0,m.useSearchParams)(),[p,x]=(0,o.useState)(null),[g,h]=(0,o.useState)([]),[f,v]=(0,o.useState)(!1),b="true"===u.get("create"),y=(0,o.useMemo)(()=>{if(!b)return;let e=u.get("owned_by"),t=u.get("team_id"),a=u.get("key_alias"),r=u.get("models"),s=u.get("key_type");if(!e&&!t&&!a&&!r&&!s)return;let l=e&&["you","service_account","another_user"].includes(e)?e:void 0,i=s&&["default","llm_api","management"].includes(s)?s:void 0,n=a?a.trim().slice(0,256):void 0,o=r?r.split(",").slice(0,100).map(e=>e.trim().slice(0,256)).filter(e=>e.length>0):void 0;return{owned_by:l,team_id:t?.trim()||void 0,key_alias:n,models:o&&o.length>0?o:void 0,key_type:i}},[u,b]);return(0,o.useEffect)(()=>{i&&e&&s&&(0,a.teamListCall)(i,1,100,{userID:"Admin"!==s&&"Admin Viewer"!==s?e:null}).then(e=>x(e.teams??[])).catch(console.error)},[i,e,s]),(0,t.jsx)(W,{userID:e,userRole:s,premiumUser:n??!1,teams:p,keys:g,setUserRole:d,userEmail:l,setUserEmail:c,setTeams:x,setKeys:h,addKey:e=>{h(t=>t?[...t,e]:[e]),v(e=>!e)},createClicked:f,autoOpenCreate:b,prefillData:y})}],502501)},871135,e=>{"use strict";var t=e.i(843476),a=e.i(502501),r=e.i(936578),s=e.i(602869),l=e.i(557951),i=e.i(321836),n=e.i(571353),o=e.i(618566),d=e.i(271645);function c(){let{authLoading:e,token:c}=(0,l.useAuth)(),u=(0,o.useRouter)(),m=(0,o.useSearchParams)().get("page"),p=(0,d.useRef)(!1),x=!1===e&&null===c;(0,d.useEffect)(()=>{if(x){(0,i.storeReturnUrl)();let e=(0,i.getLoginUrl)(s.proxyBaseUrl||""),t=(0,i.buildLoginUrlWithReturn)(e);window.location.replace(t)}},[x]);let g=null!==m&&m in n.MIGRATED_PAGES;(0,d.useEffect)(()=>{!e&&g&&u.replace((0,n.migratedHref)(n.MIGRATED_PAGES[m]))},[e,g,m,u]),(0,d.useEffect)(()=>{if(e||!c||p.current)return;p.current=!0;let t=(0,i.consumeReturnUrl)();if(t&&(0,i.isValidReturnUrl)(t)){let e=new URL(t,window.location.origin);if(e.origin!==window.location.origin)return;let a=window.location.href;(0,i.normalizeUrlForCompare)(t)!==(0,i.normalizeUrlForCompare)(a)&&window.location.replace(e.href)}},[e,c]),(0,d.useEffect)(()=>{c||(p.current=!1)},[c]);let h=x||g;return e||h?(0,t.jsx)(r.default,{}):(0,t.jsx)(a.default,{})}e.s(["default",0,function(){return(0,t.jsx)(d.Suspense,{fallback:(0,t.jsx)(r.default,{}),children:(0,t.jsx)(c,{})})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/08ldu6o5kiz9c.js b/litellm/proxy/_experimental/out/_next/static/chunks/08ldu6o5kiz9c.js new file mode 100644 index 00000000000..aa8ea0ec0f0 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/08ldu6o5kiz9c.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,678784,e=>{"use strict";var t=e.i(678745);e.s(["CheckIcon",()=>t.default])},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 o=(await (0,t.modelAvailableCall)(a,e,r,!0,null,!0)).data.map(e=>e.id),n=[],l=[];return o.forEach(e=>{e.endsWith("/*")?n.push(e):l.push(e)}),[...n,...l]}}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 o=e.replace("/*",""),n=t.filter(e=>e.startsWith(o+"/"));a.push(...n),r.push(e)}else a.push(e)}),[...r,...a].filter((e,t,r)=>r.indexOf(e)===t)}])},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(242064),o=e.i(529681);let n=e=>{let{prefixCls:a,className:o,style:n,size:l,shape:s}=e,i=(0,r.default)({[`${a}-lg`]:"large"===l,[`${a}-sm`]:"small"===l}),d=(0,r.default)({[`${a}-circle`]:"circle"===s,[`${a}-square`]:"square"===s,[`${a}-round`]:"round"===s}),u=t.useMemo(()=>"number"==typeof l?{width:l,height:l,lineHeight:`${l}px`}:{},[l]);return t.createElement("span",{className:(0,r.default)(a,i,d,o),style:Object.assign(Object.assign({},u),n)})};e.i(296059);var l=e.i(694758),s=e.i(915654),i=e.i(246422),d=e.i(838378);let u=new l.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,s.unit)(e)}),m=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)),f=e=>Object.assign({width:e},c(e)),b=(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()},c(e)),h=(0,i.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:a,skeletonParagraphCls:o,skeletonButtonCls:n,skeletonInputCls:l,skeletonImageCls:s,controlHeight:i,controlHeightLG:d,controlHeightSM:c,gradientFromColor:h,padding:x,marginSM:v,borderRadius:C,titleHeight:k,blockRadius:w,paragraphLiHeight:y,controlHeightXS:T,paragraphMarginTop:E}=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:h},m(i)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},m(d)),[`${r}-sm`]:Object.assign({},m(c))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[a]:{width:"100%",height:k,background:h,borderRadius:w,[`+ ${o}`]:{marginBlockStart:c}},[o]:{padding:0,"> li":{width:"100%",height:y,listStyle:"none",background:h,borderRadius:w,"+ li":{marginBlockStart:T}}},[`${o}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${a}, ${o} > li`]:{borderRadius:C}}},[`${t}-with-avatar ${t}-content`]:{[a]:{marginBlockStart:v,[`+ ${o}`]:{marginBlockStart:E}}},[`${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:o,controlHeightSM:n,gradientFromColor:l,calc:s}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:l,borderRadius:t,width:s(a).mul(2).equal(),minWidth:s(a).mul(2).equal()},p(a,s))},b(e,a,r)),{[`${r}-lg`]:Object.assign({},p(o,s))}),b(e,o,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},p(n,s))}),b(e,n,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:a,controlHeightLG:o,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(o)),[`${t}${t}-sm`]:Object.assign({},m(n))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:a,controlHeightLG:o,controlHeightSM:n,gradientFromColor:l,calc:s}=e;return{[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:l,borderRadius:r},g(t,s)),[`${a}-lg`]:Object.assign({},g(o,s)),[`${a}-sm`]:Object.assign({},g(n,s))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:a,borderRadiusSM:o,calc:n}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:a,borderRadius:o},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%"},[l]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${a}, + ${o} > li, + ${r}, + ${n}, + ${l}, + ${s} + `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:u,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:o,style:n,rows:l=0}=e,s=Array.from({length:l}).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,o),style:n},s)},v=({prefixCls:e,className:a,width:o,style:n})=>t.createElement("h3",{className:(0,r.default)(e,a),style:Object.assign({width:o},n)});function C(e){return e&&"object"==typeof e?e:{}}let k=e=>{let{prefixCls:o,loading:l,className:s,rootClassName:i,style:d,children:u,avatar:c=!1,title:m=!0,paragraph:g=!0,active:f,round:b}=e,{getPrefixCls:p,direction:k,className:w,style:y}=(0,a.useComponentConfig)("skeleton"),T=p("skeleton",o),[E,N,P]=h(T);if(l||!("loading"in e)){let e,a,o=!!c,l=!!m,u=!!g;if(o){let r=Object.assign(Object.assign({prefixCls:`${T}-avatar`},l&&!u?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),C(c));e=t.createElement("div",{className:`${T}-header`},t.createElement(n,Object.assign({},r)))}if(l||u){let e,r;if(l){let r=Object.assign(Object.assign({prefixCls:`${T}-title`},!o&&u?{width:"38%"}:o&&u?{width:"50%"}:{}),C(m));e=t.createElement(v,Object.assign({},r))}if(u){let e,a=Object.assign(Object.assign({prefixCls:`${T}-paragraph`},(e={},o&&l||(e.width="61%"),!o&&l?e.rows=3:e.rows=2,e)),C(g));r=t.createElement(x,Object.assign({},a))}a=t.createElement("div",{className:`${T}-content`},e,r)}let p=(0,r.default)(T,{[`${T}-with-avatar`]:o,[`${T}-active`]:f,[`${T}-rtl`]:"rtl"===k,[`${T}-round`]:b},w,s,i,N,P);return E(t.createElement("div",{className:p,style:Object.assign(Object.assign({},y),d)},e,a))}return null!=u?u:null};k.Button=e=>{let{prefixCls:l,className:s,rootClassName:i,active:d,block:u=!1,size:c="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",l),[f,b,p]=h(g),x=(0,o.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d,[`${g}-block`]:u},s,i,b,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-button`,size:c},x))))},k.Avatar=e=>{let{prefixCls:l,className:s,rootClassName:i,active:d,shape:u="circle",size:c="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",l),[f,b,p]=h(g),x=(0,o.default)(e,["prefixCls","className"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d},s,i,b,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-avatar`,shape:u,size:c},x))))},k.Input=e=>{let{prefixCls:l,className:s,rootClassName:i,active:d,block:u,size:c="default"}=e,{getPrefixCls:m}=t.useContext(a.ConfigContext),g=m("skeleton",l),[f,b,p]=h(g),x=(0,o.default)(e,["prefixCls"]),v=(0,r.default)(g,`${g}-element`,{[`${g}-active`]:d,[`${g}-block`]:u},s,i,b,p);return f(t.createElement("div",{className:v},t.createElement(n,Object.assign({prefixCls:`${g}-input`,size:c},x))))},k.Image=e=>{let{prefixCls:o,className:n,rootClassName:l,style:s,active:i}=e,{getPrefixCls:d}=t.useContext(a.ConfigContext),u=d("skeleton",o),[c,m,g]=h(u),f=(0,r.default)(u,`${u}-element`,{[`${u}-active`]:i},n,l,m,g);return c(t.createElement("div",{className:f},t.createElement("div",{className:(0,r.default)(`${u}-image`,n),style:s},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${u}-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:`${u}-image-path`})))))},k.Node=e=>{let{prefixCls:o,className:n,rootClassName:l,style:s,active:i,children:d}=e,{getPrefixCls:u}=t.useContext(a.ConfigContext),c=u("skeleton",o),[m,g,f]=h(c),b=(0,r.default)(c,`${c}-element`,{[`${c}-active`]:i},g,n,l,f);return m(t.createElement("div",{className:b},t.createElement("div",{className:(0,r.default)(`${c}-image`,n),style:s},d)))},e.s(["default",0,k],185793)},922611,e=>{"use strict";var t=e.i(271645),r=e.i(175066);function a(){}let o=t.createContext({add:a,remove:a});e.s(["usePanelRef",0,function(e){let a=t.useContext(o),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)})}])},629569,e=>{"use strict";var t=e.i(290571),r=e.i(95779),a=e.i(444755),o=e.i(673706),n=e.i(271645);let l=n.default.forwardRef((e,l)=>{let{color:s,children:i,className:d}=e,u=(0,t.__rest)(e,["color","children","className"]);return n.default.createElement("p",Object.assign({ref:l,className:(0,a.tremorTwMerge)("font-medium text-tremor-title",s?(0,o.getColorClassNames)(s,r.colorPalette.darkText).textColor:"text-tremor-content-strong dark:text-dark-tremor-content-strong",d)},u),i)});l.displayName="Title",e.s(["Title",0,l],629569)},95779,e=>{"use strict";var t=e.i(480731);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}])},599724,936325,e=>{"use strict";var t=e.i(95779),r=e.i(444755),a=e.i(673706),o=e.i(271645);let n=o.default.forwardRef((e,n)=>{let{color:l,className:s,children:i}=e;return o.default.createElement("p",{ref:n,className:(0,r.tremorTwMerge)("text-tremor-default",l?(0,a.getColorClassNames)(l,t.colorPalette.text).textColor:(0,r.tremorTwMerge)("text-tremor-content","dark:text-dark-tremor-content"),s)},i)});n.displayName="Text",e.s(["default",0,n],936325),e.s(["Text",0,n],599724)},994388,e=>{"use strict";var t=e.i(290571),r=e.i(829087),a=e.i(271645);let o=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],n=e=>({_s:e,status:o[e],isEnter:e<3,isMounted:6!==e,isResolved:2===e||e>4}),l=e=>e?6:5,s=(e,t,r,a,o)=>{clearTimeout(a.current);let l=n(e);t(l),r.current=l,o&&o({current:l})};var i=e.i(480731),d=e.i(444755),u=e.i(673706);let c=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 m=e.i(95779);let g={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"}},f=(e,t)=>{switch(e){case"primary":return{textColor:t?(0,u.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",hoverTextColor:t?(0,u.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,u.getColorClassNames)(t,m.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",hoverBgColor:t?(0,u.getColorClassNames)(t,m.colorPalette.darkBackground).hoverBgColor:"hover:bg-tremor-brand-emphasis dark:hover:bg-dark-tremor-brand-emphasis",borderColor:t?(0,u.getColorClassNames)(t,m.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",hoverBorderColor:t?(0,u.getColorClassNames)(t,m.colorPalette.darkBorder).hoverBorderColor:"hover:border-tremor-brand-emphasis dark:hover:border-dark-tremor-brand-emphasis"};case"secondary":return{textColor:t?(0,u.getColorClassNames)(t,m.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,u.getColorClassNames)(t,m.colorPalette.text).textColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,u.getColorClassNames)("transparent").bgColor,hoverBgColor:t?(0,d.tremorTwMerge)((0,u.getColorClassNames)(t,m.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,u.getColorClassNames)(t,m.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand"};case"light":return{textColor:t?(0,u.getColorClassNames)(t,m.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,u.getColorClassNames)(t,m.colorPalette.darkText).hoverTextColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,u.getColorClassNames)("transparent").bgColor,borderColor:"",hoverBorderColor:""}}},b=(0,u.makeClassName)("Button"),p=({loading:e,iconSize:t,iconPosition:r,Icon:o,needMargin:n,transitionStatus:l})=>{let s=n?r===i.HorizontalPositions.Left?(0,d.tremorTwMerge)("-ml-1","mr-1.5"):(0,d.tremorTwMerge)("-mr-1","ml-1.5"):"",u=(0,d.tremorTwMerge)("w-0 h-0"),m={default:u,entering:u,entered:t,exiting:t,exited:u};return e?a.default.createElement(c,{className:(0,d.tremorTwMerge)(b("icon"),"animate-spin shrink-0",s,m.default,m[l]),style:{transition:"width 150ms"}}):a.default.createElement(o,{className:(0,d.tremorTwMerge)(b("icon"),"shrink-0",t,s)})},h=a.default.forwardRef((e,o)=>{let{icon:c,iconPosition:m=i.HorizontalPositions.Left,size:h=i.Sizes.SM,color:x,variant:v="primary",disabled:C,loading:k=!1,loadingText:w,children:y,tooltip:T,className:E}=e,N=(0,t.__rest)(e,["icon","iconPosition","size","color","variant","disabled","loading","loadingText","children","tooltip","className"]),P=k||C,$=void 0!==c||k,O=k&&w,I=!(!y&&!O),R=(0,d.tremorTwMerge)(g[h].height,g[h].width),M="light"!==v?(0,d.tremorTwMerge)("rounded-tremor-default border","shadow-tremor-input","dark:shadow-dark-tremor-input"):"",S=f(v,x),F=("light"!==v?{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"}})[h],{tooltipProps:B,getReferenceProps:j}=(0,r.useTooltip)(300),[A,z]=(({enter:e=!0,exit:t=!0,preEnter:r,preExit:o,timeout:i,initialEntered:d,mountOnEnter:u,unmountOnExit:c,onStateChange:m}={})=>{let[g,f]=(0,a.useState)(()=>n(d?2:l(u))),b=(0,a.useRef)(g),p=(0,a.useRef)(0),[h,x]="object"==typeof i?[i.enter,i.exit]:[i,i],v=(0,a.useCallback)(()=>{let e=((e,t)=>{switch(e){case 1:case 0:return 2;case 4:case 3:return l(t)}})(b.current._s,c);e&&s(e,f,b,p,m)},[m,c]);return[g,(0,a.useCallback)(a=>{let n=e=>{switch(s(e,f,b,p,m),e){case 1:h>=0&&(p.current=((...e)=>setTimeout(...e))(v,h));break;case 4:x>=0&&(p.current=((...e)=>setTimeout(...e))(v,x));break;case 0:case 3:p.current=((...e)=>setTimeout(...e))(()=>{isNaN(document.body.offsetTop)||n(e+1)},0)}},i=b.current.isEnter;"boolean"!=typeof a&&(a=!i),a?i||n(e?+!r:2):i&&n(t?o?3:4:l(c))},[v,m,e,t,r,o,h,x,c]),v]})({timeout:50});return(0,a.useEffect)(()=>{z(k)},[k]),a.default.createElement("button",Object.assign({ref:(0,u.mergeRefs)([o,B.refs.setReference]),className:(0,d.tremorTwMerge)(b("root"),"shrink-0 inline-flex justify-center items-center group font-medium outline-none",M,F.paddingX,F.paddingY,F.fontSize,S.textColor,S.bgColor,S.borderColor,S.hoverBorderColor,P?"opacity-50 cursor-not-allowed":(0,d.tremorTwMerge)(f(v,x).hoverTextColor,f(v,x).hoverBgColor,f(v,x).hoverBorderColor),E),disabled:P},j,N),a.default.createElement(r.default,Object.assign({text:T},B)),$&&m!==i.HorizontalPositions.Right?a.default.createElement(p,{loading:k,iconSize:R,iconPosition:m,Icon:c,transitionStatus:A.status,needMargin:I}):null,O||y?a.default.createElement("span",{className:(0,d.tremorTwMerge)(b("text"),"text-tremor-default whitespace-nowrap")},O?w:y):null,$&&m===i.HorizontalPositions.Right?a.default.createElement(p,{loading:k,iconSize:R,iconPosition:m,Icon:c,transitionStatus:A.status,needMargin:I}):null)});h.displayName="Button",e.s(["Button",0,h],994388)},2788,e=>{"use strict";let t;var r=e.i(700020),a=((t=a||{})[t.None=1]="None",t[t.Focusable=2]="Focusable",t[t.Hidden=4]="Hidden",t);let o=(0,r.forwardRefWithAs)(function(e,t){var a;let{features:o=1,...n}=e,l={ref:t,"aria-hidden":(2&o)==2||(null!=(a=n["aria-hidden"])?a:void 0),hidden:(4&o)==4||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(4&o)==4&&(2&o)!=2&&{display:"none"}}};return(0,r.useRender)()({ourProps:l,theirProps:n,slot:{},defaultTag:"span",name:"Hidden"})});e.s(["Hidden",0,o,"HiddenFeatures",0,a])},553521,e=>{"use strict";var t=e.i(271645),r=e.i(835696);e.s(["useIsMounted",0,function(){let e=(0,t.useRef)(!1);return(0,r.useIsoMorphicEffect)(()=>(e.current=!0,()=>{e.current=!1}),[]),e}])},652265,e=>{"use strict";let t,r,a,o,n;e.i(544508);var l=e.i(397701),s=e.i(402155);let i=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(","),d=["[data-autofocus]"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var u=((t=u||{})[t.First=1]="First",t[t.Previous=2]="Previous",t[t.Next=4]="Next",t[t.Last=8]="Last",t[t.WrapAround=16]="WrapAround",t[t.NoScroll=32]="NoScroll",t[t.AutoFocus=64]="AutoFocus",t),c=((r=c||{})[r.Error=0]="Error",r[r.Overflow=1]="Overflow",r[r.Success=2]="Success",r[r.Underflow=3]="Underflow",r),m=((a=m||{})[a.Previous=-1]="Previous",a[a.Next=1]="Next",a);function g(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(i)).sort((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER)))}var f=((o=f||{})[o.Strict=0]="Strict",o[o.Loose=1]="Loose",o),b=((n=b||{})[n.Keyboard=0]="Keyboard",n[n.Mouse=1]="Mouse",n);function p(e,t=e=>e){return e.slice().sort((e,r)=>{let a=t(e),o=t(r);if(null===a||null===o)return 0;let n=a.compareDocumentPosition(o);return n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function h(e,t,{sorted:r=!0,relativeTo:a=null,skipElements:o=[]}={}){var n,l,s;let i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,u=Array.isArray(e)?r?p(e):e:64&t?function(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(d)).sort((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER)))}(e):g(e);o.length>0&&u.length>1&&(u=u.filter(e=>!o.some(t=>null!=t&&"current"in t?(null==t?void 0:t.current)===e:t===e))),a=null!=a?a:i.activeElement;let c=(()=>{if(5&t)return 1;if(10&t)return -1;throw Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),m=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,u.indexOf(a))-1;if(4&t)return Math.max(0,u.indexOf(a))+1;if(8&t)return u.length-1;throw Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),f=32&t?{preventScroll:!0}:{},b=0,x=u.length,v;do{if(b>=x||b+x<=0)return 0;let e=m+b;if(16&t)e=(e+x)%x;else{if(e<0)return 3;if(e>=x)return 1}null==(v=u[e])||v.focus(f),b+=c}while(v!==i.activeElement)return 6&t&&null!=(s=null==(l=null==(n=v)?void 0:n.matches)?void 0:l.call(n,"textarea,input"))&&s&&v.select(),2}"u">typeof window&&"u">typeof document&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{1===e.detail?delete document.documentElement.dataset.headlessuiFocusVisible:0===e.detail&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0)),e.s(["Focus",0,u,"FocusResult",0,c,"FocusableMode",0,f,"focusFrom",0,function(e,t){return h(g(),t,{relativeTo:e})},"focusIn",0,h,"getFocusableElements",0,g,"isFocusableElement",0,function(e,t=0){var r;return e!==(null==(r=(0,s.getOwnerDocument)(e))?void 0:r.body)&&(0,l.match)(t,{0:()=>e.matches(i),1(){let t=e;for(;null!==t;){if(t.matches(i))return!0;t=t.parentElement}return!1}})},"sortByDomNode",0,p])},970554,e=>{"use strict";let t,r,a;var o=e.i(783222),n=e.i(433336),l=e.i(271645),s=e.i(394487),i=e.i(914189),d=e.i(835696),u=e.i(941444),c=e.i(144279),m=e.i(294316),g=e.i(553521),f=e.i(2788);function b({onFocus:e}){let[t,r]=(0,l.useState)(!0),a=(0,g.useIsMounted)();return t?l.default.createElement(f.Hidden,{as:"button",type:"button",features:f.HiddenFeatures.Focusable,onFocus:t=>{t.preventDefault();let o,n=50;o=requestAnimationFrame(function t(){if(n--<=0){o&&cancelAnimationFrame(o);return}if(e()){if(cancelAnimationFrame(o),!a.current)return;r(!1);return}o=requestAnimationFrame(t)})}}):null}var p=e.i(652265),h=e.i(397701),x=e.i(368578),v=e.i(402155),C=e.i(700020);let k=l.createContext(null);function w({children:e}){let t=l.useRef({groups:new Map,get(e,t){var r;let a=this.groups.get(e);a||(a=new Map,this.groups.set(e,a));let o=null!=(r=a.get(t))?r:0;return a.set(t,o+1),[Array.from(a.keys()).indexOf(t),function(){let e=a.get(t);e>1?a.set(t,e-1):a.delete(t)}]}});return l.createElement(k.Provider,{value:t},e)}function y(e){let t=l.useContext(k);if(!t)throw Error("You must wrap your component in a ");let r=l.useId(),[a,o]=t.current.get(e,r);return l.useEffect(()=>o,[]),a}var T=e.i(998348),E=((t=E||{})[t.Forwards=0]="Forwards",t[t.Backwards=1]="Backwards",t),N=((r=N||{})[r.Less=-1]="Less",r[r.Equal=0]="Equal",r[r.Greater=1]="Greater",r),P=((a=P||{})[a.SetSelectedIndex=0]="SetSelectedIndex",a[a.RegisterTab=1]="RegisterTab",a[a.UnregisterTab=2]="UnregisterTab",a[a.RegisterPanel=3]="RegisterPanel",a[a.UnregisterPanel=4]="UnregisterPanel",a);let $={0(e,t){var r;let a=(0,p.sortByDomNode)(e.tabs,e=>e.current),o=(0,p.sortByDomNode)(e.panels,e=>e.current),n=a.filter(e=>{var t;return!(null!=(t=e.current)&&t.hasAttribute("disabled"))}),l={...e,tabs:a,panels:o};if(t.index<0||t.index>a.length-1){let r=(0,h.match)(Math.sign(t.index-e.selectedIndex),{[-1]:()=>1,0:()=>(0,h.match)(Math.sign(t.index),{[-1]:()=>0,0:()=>0,1:()=>1}),1:()=>0});if(0===n.length)return l;let o=(0,h.match)(r,{0:()=>a.indexOf(n[0]),1:()=>a.indexOf(n[n.length-1])});return{...l,selectedIndex:-1===o?e.selectedIndex:o}}let s=a.slice(0,t.index),i=[...a.slice(t.index),...s].find(e=>n.includes(e));if(!i)return l;let d=null!=(r=a.indexOf(i))?r:e.selectedIndex;return -1===d&&(d=e.selectedIndex),{...l,selectedIndex:d}},1(e,t){if(e.tabs.includes(t.tab))return e;let r=e.tabs[e.selectedIndex],a=(0,p.sortByDomNode)([...e.tabs,t.tab],e=>e.current),o=e.selectedIndex;return e.info.current.isControlled||-1===(o=a.indexOf(r))&&(o=e.selectedIndex),{...e,tabs:a,selectedIndex:o}},2:(e,t)=>({...e,tabs:e.tabs.filter(e=>e!==t.tab)}),3:(e,t)=>e.panels.includes(t.panel)?e:{...e,panels:(0,p.sortByDomNode)([...e.panels,t.panel],e=>e.current)},4:(e,t)=>({...e,panels:e.panels.filter(e=>e!==t.panel)})},O=(0,l.createContext)(null);function I(e){let t=(0,l.useContext)(O);if(null===t){let t=Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,I),t}return t}O.displayName="TabsDataContext";let R=(0,l.createContext)(null);function M(e){let t=(0,l.useContext)(R);if(null===t){let t=Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,M),t}return t}function S(e,t){return(0,h.match)(t.type,$,e,t)}R.displayName="TabsActionsContext";let F=C.RenderFeatures.RenderStrategy|C.RenderFeatures.Static,B=Object.assign((0,C.forwardRefWithAs)(function(e,t){var r,a;let u=(0,l.useId)(),{id:g=`headlessui-tabs-tab-${u}`,disabled:f=!1,autoFocus:b=!1,...k}=e,{orientation:w,activation:E,selectedIndex:N,tabs:P,panels:$}=I("Tab"),O=M("Tab"),R=I("Tab"),[S,F]=(0,l.useState)(null),B=(0,l.useRef)(null),j=(0,m.useSyncRefs)(B,t,F);(0,d.useIsoMorphicEffect)(()=>O.registerTab(B),[O,B]);let A=y("tabs"),z=P.indexOf(B);-1===z&&(z=A);let L=z===N,D=(0,i.useEvent)(e=>{var t;let r=e();if(r===p.FocusResult.Success&&"auto"===E){let e=null==(t=(0,v.getOwnerDocument)(B))?void 0:t.activeElement,r=R.tabs.findIndex(t=>t.current===e);-1!==r&&O.change(r)}return r}),_=(0,i.useEvent)(e=>{let t=P.map(e=>e.current).filter(Boolean);if(e.key===T.Keys.Space||e.key===T.Keys.Enter){e.preventDefault(),e.stopPropagation(),O.change(z);return}switch(e.key){case T.Keys.Home:case T.Keys.PageUp:return e.preventDefault(),e.stopPropagation(),D(()=>(0,p.focusIn)(t,p.Focus.First));case T.Keys.End:case T.Keys.PageDown:return e.preventDefault(),e.stopPropagation(),D(()=>(0,p.focusIn)(t,p.Focus.Last))}if(D(()=>(0,h.match)(w,{vertical:()=>e.key===T.Keys.ArrowUp?(0,p.focusIn)(t,p.Focus.Previous|p.Focus.WrapAround):e.key===T.Keys.ArrowDown?(0,p.focusIn)(t,p.Focus.Next|p.Focus.WrapAround):p.FocusResult.Error,horizontal:()=>e.key===T.Keys.ArrowLeft?(0,p.focusIn)(t,p.Focus.Previous|p.Focus.WrapAround):e.key===T.Keys.ArrowRight?(0,p.focusIn)(t,p.Focus.Next|p.Focus.WrapAround):p.FocusResult.Error}))===p.FocusResult.Success)return e.preventDefault()}),q=(0,l.useRef)(!1),H=(0,i.useEvent)(()=>{var e;q.current||(q.current=!0,null==(e=B.current)||e.focus({preventScroll:!0}),O.change(z),(0,x.microTask)(()=>{q.current=!1}))}),W=(0,i.useEvent)(e=>{e.preventDefault()}),{isFocusVisible:G,focusProps:K}=(0,o.useFocusRing)({autoFocus:b}),{isHovered:X,hoverProps:V}=(0,n.useHover)({isDisabled:f}),{pressed:Y,pressProps:U}=(0,s.useActivePress)({disabled:f}),Z=(0,l.useMemo)(()=>({selected:L,hover:X,active:Y,focus:G,autofocus:b,disabled:f}),[L,X,G,Y,b,f]),J=(0,C.mergeProps)({ref:j,onKeyDown:_,onMouseDown:W,onClick:H,id:g,role:"tab",type:(0,c.useResolveButtonType)(e,S),"aria-controls":null==(a=null==(r=$[z])?void 0:r.current)?void 0:a.id,"aria-selected":L,tabIndex:L?0:-1,disabled:f||void 0,autoFocus:b},K,V,U);return(0,C.useRender)()({ourProps:J,theirProps:k,slot:Z,defaultTag:"button",name:"Tabs.Tab"})}),{Group:(0,C.forwardRefWithAs)(function(e,t){let{defaultIndex:r=0,vertical:a=!1,manual:o=!1,onChange:n,selectedIndex:s=null,...c}=e,g=a?"vertical":"horizontal",f=o?"manual":"auto",h=null!==s,x=(0,u.useLatestValue)({isControlled:h}),v=(0,m.useSyncRefs)(t),[k,y]=(0,l.useReducer)(S,{info:x,selectedIndex:null!=s?s:r,tabs:[],panels:[]}),T=(0,l.useMemo)(()=>({selectedIndex:k.selectedIndex}),[k.selectedIndex]),E=(0,u.useLatestValue)(n||(()=>{})),N=(0,u.useLatestValue)(k.tabs),P=(0,l.useMemo)(()=>({orientation:g,activation:f,...k}),[g,f,k]),$=(0,i.useEvent)(e=>(y({type:1,tab:e}),()=>y({type:2,tab:e}))),I=(0,i.useEvent)(e=>(y({type:3,panel:e}),()=>y({type:4,panel:e}))),M=(0,i.useEvent)(e=>{F.current!==e&&E.current(e),h||y({type:0,index:e})}),F=(0,u.useLatestValue)(h?e.selectedIndex:k.selectedIndex),B=(0,l.useMemo)(()=>({registerTab:$,registerPanel:I,change:M}),[]);(0,d.useIsoMorphicEffect)(()=>{y({type:0,index:null!=s?s:r})},[s]),(0,d.useIsoMorphicEffect)(()=>{if(void 0===F.current||k.tabs.length<=0)return;let e=(0,p.sortByDomNode)(k.tabs,e=>e.current);e.some((e,t)=>k.tabs[t]!==e)&&M(e.indexOf(k.tabs[F.current]))});let j=(0,C.useRender)();return l.default.createElement(w,null,l.default.createElement(R.Provider,{value:B},l.default.createElement(O.Provider,{value:P},P.tabs.length<=0&&l.default.createElement(b,{onFocus:()=>{var e,t;for(let r of N.current)if((null==(e=r.current)?void 0:e.tabIndex)===0)return null==(t=r.current)||t.focus(),!0;return!1}}),j({ourProps:{ref:v},theirProps:c,slot:T,defaultTag:"div",name:"Tabs"}))))}),List:(0,C.forwardRefWithAs)(function(e,t){let{orientation:r,selectedIndex:a}=I("Tab.List"),o=(0,m.useSyncRefs)(t),n=(0,l.useMemo)(()=>({selectedIndex:a}),[a]);return(0,C.useRender)()({ourProps:{ref:o,role:"tablist","aria-orientation":r},theirProps:e,slot:n,defaultTag:"div",name:"Tabs.List"})}),Panels:(0,C.forwardRefWithAs)(function(e,t){let{selectedIndex:r}=I("Tab.Panels"),a=(0,m.useSyncRefs)(t),o=(0,l.useMemo)(()=>({selectedIndex:r}),[r]);return(0,C.useRender)()({ourProps:{ref:a},theirProps:e,slot:o,defaultTag:"div",name:"Tabs.Panels"})}),Panel:(0,C.forwardRefWithAs)(function(e,t){var r,a,n,s;let i=(0,l.useId)(),{id:u=`headlessui-tabs-panel-${i}`,tabIndex:c=0,...g}=e,{selectedIndex:b,tabs:p,panels:h}=I("Tab.Panel"),x=M("Tab.Panel"),v=(0,l.useRef)(null),k=(0,m.useSyncRefs)(v,t);(0,d.useIsoMorphicEffect)(()=>x.registerPanel(v),[x,v]);let w=y("panels"),T=h.indexOf(v);-1===T&&(T=w);let E=T===b,{isFocusVisible:N,focusProps:P}=(0,o.useFocusRing)(),$=(0,l.useMemo)(()=>({selected:E,focus:N}),[E,N]),O=(0,C.mergeProps)({ref:k,id:u,role:"tabpanel","aria-labelledby":null==(a=null==(r=p[T])?void 0:r.current)?void 0:a.id,tabIndex:E?c:-1},P),R=(0,C.useRender)();return E||null!=(n=g.unmount)&&!n||null!=(s=g.static)&&s?R({ourProps:O,theirProps:g,slot:$,defaultTag:"div",features:F,visible:E,name:"Tabs.Panel"}):l.default.createElement(f.Hidden,{"aria-hidden":"true",...O})})});e.s(["Tab",0,B],970554)},653824,e=>{"use strict";var t=e.i(290571),r=e.i(970554),a=e.i(444755),o=e.i(673706),n=e.i(271645);let l=(0,o.makeClassName)("TabGroup"),s=n.default.forwardRef((e,o)=>{let{defaultIndex:s,index:i,onIndexChange:d,children:u,className:c}=e,m=(0,t.__rest)(e,["defaultIndex","index","onIndexChange","children","className"]);return n.default.createElement(r.Tab.Group,Object.assign({as:"div",ref:o,defaultIndex:s,selectedIndex:i,onChange:d,className:(0,a.tremorTwMerge)(l("root"),"w-full",c)},m),u)});s.displayName="TabGroup",e.s(["TabGroup",0,s],653824)},405371,910342,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(480731);let o=(0,r.createContext)(a.BaseColors.Blue);e.s(["default",0,o],910342);var n=e.i(970554),l=e.i(444755);let s=(0,e.i(673706).makeClassName)("TabList"),i=(0,r.createContext)("line"),d={line:(0,l.tremorTwMerge)("flex border-b space-x-4","border-tremor-border","dark:border-dark-tremor-border"),solid:(0,l.tremorTwMerge)("inline-flex p-0.5 rounded-tremor-default space-x-1.5","bg-tremor-background-subtle","dark:bg-dark-tremor-background-subtle")},u=r.default.forwardRef((e,a)=>{let{color:u,variant:c="line",children:m,className:g}=e,f=(0,t.__rest)(e,["color","variant","children","className"]);return r.default.createElement(n.Tab.List,Object.assign({ref:a,className:(0,l.tremorTwMerge)(s("root"),"justify-start overflow-x-clip",d[c],g)},f),r.default.createElement(i.Provider,{value:c},r.default.createElement(o.Provider,{value:u},m)))});u.displayName="TabList",e.s(["TabVariantContext",0,i,"default",0,u],405371)},881073,e=>{"use strict";var t=e.i(405371);e.s(["TabList",()=>t.default])},197647,e=>{"use strict";var t=e.i(290571),r=e.i(970554),a=e.i(95779),o=e.i(444755),n=e.i(673706),l=e.i(271645),s=e.i(405371),i=e.i(910342);let d=(0,n.makeClassName)("Tab"),u=l.default.forwardRef((e,u)=>{let{icon:c,className:m,children:g}=e,f=(0,t.__rest)(e,["icon","className","children"]),b=(0,l.useContext)(s.TabVariantContext),p=(0,l.useContext)(i.default);return l.default.createElement(r.Tab,Object.assign({ref:u,className:(0,o.tremorTwMerge)(d("root"),"flex whitespace-nowrap truncate max-w-xs outline-none data-focus-visible:ring text-tremor-default transition duration-100",function(e,t){switch(e){case"line":return(0,o.tremorTwMerge)("data-[selected]:border-b-2 hover:border-b-2 border-transparent transition duration-100 -mb-px px-2 py-2","hover:border-tremor-content hover:text-tremor-content-emphasis text-tremor-content","[&:not([data-selected])]:dark:hover:border-dark-tremor-content-emphasis [&:not([data-selected])]:dark:hover:text-dark-tremor-content-emphasis [&:not([data-selected])]:dark:text-dark-tremor-content",t?(0,n.getColorClassNames)(t,a.colorPalette.border).selectBorderColor:["data-[selected]:border-tremor-brand data-[selected]:text-tremor-brand","data-[selected]:dark:border-dark-tremor-brand data-[selected]:dark:text-dark-tremor-brand"]);case"solid":return(0,o.tremorTwMerge)("border-transparent border rounded-tremor-small px-2.5 py-1","data-[selected]:border-tremor-border data-[selected]:bg-tremor-background data-[selected]:shadow-tremor-input [&:not([data-selected])]:hover:text-tremor-content-emphasis data-[selected]:text-tremor-brand [&:not([data-selected])]:text-tremor-content","dark:data-[selected]:border-dark-tremor-border dark:data-[selected]:bg-dark-tremor-background dark:data-[selected]:shadow-dark-tremor-input dark:[&:not([data-selected])]:hover:text-dark-tremor-content-emphasis dark:data-[selected]:text-dark-tremor-brand dark:[&:not([data-selected])]:text-dark-tremor-content",t?(0,n.getColorClassNames)(t,a.colorPalette.text).selectTextColor:"text-tremor-content dark:text-dark-tremor-content")}}(b,p),m,p&&(0,n.getColorClassNames)(p,a.colorPalette.text).selectTextColor)},f),c?l.default.createElement(c,{className:(0,o.tremorTwMerge)(d("icon"),"flex-none h-5 w-5",g?"mr-2":"")}):null,g?l.default.createElement("span",null,g):null)});u.displayName="Tab",e.s(["Tab",0,u],197647)},751734,144582,e=>{"use strict";var t=e.i(271645);let r=(0,t.createContext)(0);e.s(["default",0,r],751734);let a=(0,t.createContext)({selectedValue:void 0,handleValueChange:void 0});e.s(["default",0,a],144582)},723731,e=>{"use strict";var t=e.i(290571),r=e.i(970554),a=e.i(751734),o=e.i(144582),n=e.i(444755),l=e.i(673706),s=e.i(271645);let i=(0,l.makeClassName)("TabPanels"),d=s.default.forwardRef((e,l)=>{let{children:d,className:u}=e,c=(0,t.__rest)(e,["children","className"]);return s.default.createElement(r.Tab.Panels,Object.assign({as:"div",ref:l,className:(0,n.tremorTwMerge)(i("root"),"w-full",u)},c),({selectedIndex:e})=>s.default.createElement(o.default.Provider,{value:{selectedValue:e}},s.default.Children.map(d,(e,t)=>s.default.createElement(a.default.Provider,{value:t},e))))});d.displayName="TabPanels",e.s(["TabPanels",0,d],723731)},404206,e=>{"use strict";var t=e.i(290571),r=e.i(751734),a=e.i(144582),o=e.i(444755),n=e.i(673706),l=e.i(271645);let s=(0,n.makeClassName)("TabPanel"),i=l.default.forwardRef((e,n)=>{let{children:i,className:d}=e,u=(0,t.__rest)(e,["children","className"]),{selectedValue:c}=(0,l.useContext)(a.default),m=c===(0,l.useContext)(r.default);return l.default.createElement("div",Object.assign({ref:n,className:(0,o.tremorTwMerge)(s("root"),"w-full mt-2",m?"":"hidden",d),"aria-selected":m?"true":"false"},u),i)});i.displayName="TabPanel",e.s(["TabPanel",0,i],404206)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/08uoywqkfbbbt.js b/litellm/proxy/_experimental/out/_next/static/chunks/08uoywqkfbbbt.js new file mode 100644 index 00000000000..8492ec34afb --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/08uoywqkfbbbt.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,111672,858488,625005,66146,714004,e=>{"use strict";var a=e.i(843476),l=e.i(109799),r=e.i(785242),s=e.i(135214),t=e.i(143488),i=e.i(268004),n=e.i(321836),o=e.i(592392),d=e.i(602869),c=e.i(275144),p=e.i(487486),u=e.i(519455),x=e.i(759684),g=e.i(271645),m=e.i(527930),h=e.i(115504);let f=g.createContext({collapsed:!1}),b=g.forwardRef(({className:e,collapsed:l=!1,children:r,...s},t)=>(0,a.jsx)(f.Provider,{value:{collapsed:l},children:(0,a.jsx)("aside",{ref:t,"data-slot":"sidebar","data-collapsed":l,className:(0,h.cn)("group/sidebar flex h-full flex-none flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-in-out",l?"w-[72px]":"w-[280px]",e),...s,children:r})}));b.displayName="Sidebar";let y=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("div",{ref:r,"data-slot":"sidebar-header",className:(0,h.cn)("flex flex-none flex-col gap-2 p-3",e),...l}));y.displayName="SidebarHeader",g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("nav",{ref:r,"data-slot":"sidebar-content",className:(0,h.cn)("flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-3 pb-3",e),...l})).displayName="SidebarContent";let k=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("div",{ref:r,"data-slot":"sidebar-footer",className:(0,h.cn)("flex flex-none flex-col gap-2.5 border-t border-sidebar-border p-3",e),...l}));k.displayName="SidebarFooter";let j=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("div",{ref:r,"data-slot":"sidebar-group",className:(0,h.cn)("flex flex-col gap-0.5 py-1",e),...l}));j.displayName="SidebarGroup";let v=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("div",{ref:r,"data-slot":"sidebar-group-label",className:(0,h.cn)("px-2 pt-3 pb-1.5 text-[11px] font-semibold tracking-wider text-muted-foreground uppercase group-data-[collapsed=true]/sidebar:hidden",e),...l}));v.displayName="SidebarGroupLabel";let w=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("ul",{ref:r,"data-slot":"sidebar-menu",className:(0,h.cn)("flex w-full flex-col gap-0.5",e),...l}));w.displayName="SidebarMenu";let N=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("li",{ref:r,"data-slot":"sidebar-menu-item",className:(0,h.cn)("relative",e),...l}));N.displayName="SidebarMenuItem";let _=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("ul",{ref:r,"data-slot":"sidebar-menu-sub",className:(0,h.cn)("mx-3.5 my-0.5 flex min-w-0 flex-col gap-0.5 border-l border-sidebar-border py-0.5 pl-3 group-data-[collapsed=true]/sidebar:hidden",e),...l}));_.displayName="SidebarMenuSub",g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("span",{ref:r,"data-slot":"sidebar-menu-badge",className:(0,h.cn)("ml-auto flex-none rounded-full bg-sidebar-primary/10 px-1.5 py-px text-[10px] font-semibold text-sidebar-primary tabular-nums group-data-[collapsed=true]/sidebar:hidden",e),...l})).displayName="SidebarMenuBadge";let S=(0,h.cva)({base:"group/menu-btn relative flex w-full items-center gap-2.5 overflow-hidden rounded-md px-2.5 text-left text-[13px] font-medium no-underline text-sidebar-foreground/70 outline-none transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 focus-visible:ring-sidebar-ring disabled:pointer-events-none disabled:opacity-50 [&>svg]:size-[18px] [&>svg]:shrink-0 group-data-[collapsed=true]/sidebar:mx-auto group-data-[collapsed=true]/sidebar:size-9 group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:gap-0 group-data-[collapsed=true]/sidebar:px-0",variants:{isActive:{true:"bg-sidebar-accent text-sidebar-accent-foreground before:absolute before:inset-y-1.5 before:left-0 before:w-[3px] before:rounded-r-full before:bg-sidebar-primary group-data-[collapsed=true]/sidebar:before:hidden",false:""},size:{default:"h-[34px]",sub:"h-[34px]"}},defaultVariants:{isActive:!1,size:"default"}}),C=g.forwardRef(({className:e,isActive:l,size:r,...s},t)=>(0,a.jsx)(m.Button,{ref:t,"data-slot":"sidebar-menu-button","data-active":l||void 0,className:(0,h.cn)(S({isActive:l,size:r,className:e})),...s}));C.displayName="SidebarMenuButton";let L=g.forwardRef(({className:e,...l},r)=>(0,a.jsx)("div",{ref:r,"data-slot":"sidebar-separator",className:(0,h.cn)("mx-2 my-2 h-px bg-sidebar-border",e),...l}));L.displayName="SidebarSeparator";var T=e.i(475254);let A=(0,T.default)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);var M=e.i(217923);let B=(0,T.default)("bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]),R=(0,T.default)("blocks",[["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["path",{d:"M10 21V8a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H3",key:"1fpvtg"}]]);var z=e.i(531245);let U=(0,T.default)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);var P=e.i(607486);let I=(0,T.default)("boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);var E=e.i(463059),D=e.i(997625),O=e.i(658041),H=e.i(778917),V=e.i(178583),q=e.i(38982);let G=(0,T.default)("folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);var W=e.i(61574),$=e.i(465261),K=e.i(373264);let F=(0,T.default)("network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]),Z=(0,T.default)("palette",[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]]),Y=(0,T.default)("panel-left-close",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]]),Q=(0,T.default)("panel-left-open",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]]);var X=e.i(487074),J=e.i(875475),J=J;let ee=(0,T.default)("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);var ea=e.i(176516),el=e.i(555436),er=e.i(618393),es=e.i(239616),et=e.i(98919),ei=e.i(581418);let en=(0,T.default)("tags",[["path",{d:"m15 5 6.3 6.3a2.4 2.4 0 0 1 0 3.4L17 19",key:"1cbfv1"}],["path",{d:"M9.586 5.586A2 2 0 0 0 8.172 5H3a1 1 0 0 0-1 1v5.172a2 2 0 0 0 .586 1.414L8.29 18.29a2.426 2.426 0 0 0 3.42 0l3.58-3.58a2.426 2.426 0 0 0 0-3.42z",key:"135mg7"}],["circle",{cx:"6.5",cy:"9.5",r:".5",fill:"currentColor",key:"5pm5xn"}]]);var eo=e.i(868054),ed=e.i(284614),ec=e.i(761911),ep=e.i(252754),eu=e.i(195116);let ex=(0,T.default)("workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);var eg=e.i(522016),em=e.i(751247),eh=e.i(708347),ef=e.i(218842),eb=e.i(844444),ey=e.i(731565),ek=e.i(912089),ej=e.i(814431),ev=e.i(636772),ew=e.i(115571),eN=e.i(222038),e_=e.i(922407),eS=e.i(799676),eC=e.i(337822),eL=e.i(772436),eT=e.i(699375),eA=e.i(344523);let eM=(0,T.default)("crown",[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]]),eB=(0,T.default)("id-card",[["path",{d:"M16 10h2",key:"8sgtl7"}],["path",{d:"M16 14h2",key:"epxaof"}],["path",{d:"M6.17 15a3 3 0 0 1 5.66 0",key:"n6f512"}],["circle",{cx:"9",cy:"11",r:"2",key:"yxgjnd"}],["rect",{x:"2",y:"5",width:"20",height:"14",rx:"2",key:"qneu4z"}]]),eR=(0,T.default)("log-out",[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]]),ez=(0,T.default)("mail",[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7",key:"132q7q"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}]]),eU=({icon:e,label:l,children:r})=>(0,a.jsxs)("div",{className:"flex min-h-[34px] items-center justify-between gap-3",children:[(0,a.jsxs)("span",{className:"flex items-center gap-2 text-[13px] text-muted-foreground",children:[e,l]}),r]}),eP=({value:e,copyLabel:l})=>(0,a.jsxs)("span",{className:"flex min-w-0 items-center gap-1",children:[(0,a.jsx)("span",{className:"max-w-[150px] truncate font-mono text-[13px] font-medium text-foreground",title:e||"-",children:e||"-"}),(0,a.jsx)(e_.default,{value:e,label:l})]}),eI=({onLogout:e,collapsed:l=!1})=>{let{userId:r,userEmail:i,userRoleLabel:n,premiumUser:o,accessToken:d}=(0,s.default)(),{data:c}=(0,t.useHealthReadinessDetails)(d),x=c?.litellm_version,g=(0,ev.useDisableShowPrompts)(),m=(0,ey.useDisableBlogPosts)(),f=(0,ek.useDisableBouncingIcon)(),b=(0,ej.useDisableShowNewBadge)(),y=(e,a)=>{a?(0,ew.setLocalStorageItem)(e,"true"):(0,ew.removeLocalStorageItem)(e),(0,ew.emitLocalStorageChange)(e)},k=[{key:"disableShowNewBadge",label:"Hide New Feature Indicators",ariaLabel:"Toggle hide new feature indicators",checked:b,onCheckedChange:e=>y("disableShowNewBadge",e)},{key:"disableShowPrompts",label:"Hide All Prompts",ariaLabel:"Toggle hide all prompts",checked:g,onCheckedChange:e=>y("disableShowPrompts",e)},{key:"disableBlogPosts",label:"Hide Blog Posts",ariaLabel:"Toggle hide blog posts",checked:m,onCheckedChange:e=>y("disableBlogPosts",e)},{key:"disableBouncingIcon",label:"Hide Bouncing Icon",ariaLabel:"Toggle hide bouncing icon",checked:f,onCheckedChange:e=>y("disableBouncingIcon",e)}],j=i||r||"user",v=function(e,a){let l=e?.split("@")[0]?.trim();if(l){let e=l.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 a=e[0];return a.length>=2?a.slice(0,2).toUpperCase():`${a.charAt(0)}`.toUpperCase()}}return a&&a.length>=2?a.slice(0,2).toUpperCase():a&&1===a.length?`${a.toUpperCase()}•`:"?"}(i,r),w=function(e){let a=0;for(let l=0;l(0,a.jsxs)("div",{className:"flex h-[38px] items-center justify-between gap-3 px-3",children:[(0,a.jsx)("span",{className:"text-[13px] text-foreground",children:e.label}),(0,a.jsx)(eT.Switch,{size:"sm",checked:e.checked,onCheckedChange:e.onCheckedChange,"aria-label":e.ariaLabel})]},e.key))}),(0,a.jsx)(eL.Separator,{}),(0,a.jsxs)(u.Button,{variant:"ghost",onClick:e,className:"h-[42px] w-full justify-start gap-2.5 rounded-none px-3 text-sm font-medium text-foreground",children:[(0,a.jsx)(eR,{className:"size-[19px] text-muted-foreground"}),"Logout"]})]})]})};var eE=e.i(266027),eD=e.i(243652);let eO=(0,eD.createQueryKeys)("licenseInfo"),eH=e=>{let a={queryKey:eO.detail("license"),queryFn:()=>(0,d.getLicenseInfo)(e),enabled:!!e,staleTime:3e5,retry:!1};return(0,eE.useQuery)(a)};e.s(["useLicenseInfo",0,eH],858488);let eV=(e,a=new Date)=>{if(!e)return null;let l=new Date(`${e}T00:00:00Z`);if(Number.isNaN(l.getTime()))return null;let r=Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate());return Math.ceil((l.getTime()-r)/864e5)},eq={year:"numeric",month:"short",day:"numeric",timeZone:"UTC"},eG=e=>{let a=new Date(`${e}T00:00:00Z`);return Number.isNaN(a.getTime())?e:a.toLocaleDateString("en-US",eq)},eW=(e,a=new Date)=>{let l=eV(e,a);return null===e||null===l?"No expiration":l<0?`Expired ${eG(e)}`:`Expires ${eG(e)}`};e.s(["formatExpirationStatus",0,eW,"formatExpiryDate",0,eG,"getDaysUntilExpiration",0,eV,"getLicenseExpiryTier",0,(e,a=new Date)=>{let l=eV(e,a);return null===l?"none":l<0?"expired":l<=7?"critical":l<=30?"warning":"none"}],625005);var e$=e.i(204258),eK=e.i(944835);let eF=(0,T.default)("award",[["path",{d:"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526",key:"1yiouv"}],["circle",{cx:"12",cy:"8",r:"6",key:"1vp47v"}]]);var eZ=e.i(664659),eY=e.i(531278);let eQ=({label:e,used:l,total:r})=>{let s=r>0?l/r*100:0;return(0,a.jsxs)(eK.Meter,{value:l,max:r,"aria-valuetext":`${l.toLocaleString()} of ${r.toLocaleString()}`,children:[(0,a.jsxs)("div",{className:"flex items-baseline justify-between gap-2",children:[(0,a.jsx)(eK.MeterLabel,{children:e}),(0,a.jsxs)("span",{className:"text-xs font-medium tabular-nums",children:[(0,a.jsx)("span",{className:"text-foreground",children:l.toLocaleString()}),(0,a.jsxs)("span",{className:"text-muted-foreground",children:[" / ",r.toLocaleString()]})]})]}),(0,a.jsx)(eK.MeterTrack,{children:(0,a.jsx)(eK.MeterIndicator,{tone:s>100?"over":s>=80?"warning":"default"})})]})};function eX({accessToken:e,collapsed:l,onExpandRail:r}){let s=eH(e).data??null,{data:t,isLoading:i}=(0,eE.useQuery)({queryKey:["sidebarRemainingUsers",e],queryFn:()=>(0,d.getRemainingUsers)(e),enabled:!!e,retry:!1,staleTime:3e5}),n=t??null,o=null!==n&&(null!==n.total_users||null!==n.total_teams),c=!s?.has_license||!i&&!o;if(!e||c)return null;if(l)return(0,a.jsx)(u.Button,{variant:"outline",onClick:r,title:"Enterprise usage",className:"h-9 w-full rounded-lg border-sidebar-border bg-sidebar text-sidebar-primary shadow-none hover:bg-sidebar-accent hover:text-sidebar-primary",children:(0,a.jsx)(eF,{className:"size-[18px]",strokeWidth:1.75})});let p=s?.expiration_date?eW(s.expiration_date):"Active plan",x=n?[...null!=n.total_users?[{label:"Seats",used:n.total_users_used,total:n.total_users}]:[],...null!=n.total_teams?[{label:"Teams",used:n.total_teams_used,total:n.total_teams}]:[]]:[];return(0,a.jsxs)(e$.Collapsible,{defaultOpen:!0,className:"overflow-hidden rounded-xl border border-sidebar-border bg-sidebar",children:[(0,a.jsxs)(e$.CollapsibleTrigger,{className:"group/usage flex w-full items-center gap-2.5 px-3 py-2.5 text-left transition-colors hover:bg-sidebar-accent",children:[(0,a.jsx)("span",{className:"flex size-[26px] flex-none items-center justify-center rounded-md bg-sidebar-primary/10 text-sidebar-primary",children:(0,a.jsx)(eF,{className:"size-4",strokeWidth:1.75})}),(0,a.jsxs)("span",{className:"min-w-0 flex-1 leading-tight",children:[(0,a.jsx)("span",{className:"block text-[13px] font-semibold text-foreground",children:"Enterprise usage"}),(0,a.jsx)("span",{className:"block truncate text-[11px] text-muted-foreground",children:p})]}),(0,a.jsx)(eZ.ChevronDown,{className:"size-4 flex-none -rotate-90 text-muted-foreground transition-transform group-data-[panel-open]/usage:rotate-0"})]}),(0,a.jsx)(e$.CollapsibleContent,{className:"flex flex-col gap-3 px-3 pt-0.5 pb-3",children:i&&0===x.length?(0,a.jsxs)("div",{className:"flex items-center gap-2 py-1 text-xs text-muted-foreground",children:[(0,a.jsx)(eY.Loader2,{className:"size-3.5 animate-spin"})," Loading…"]}):x.map(e=>(0,a.jsx)(eQ,{...e},e.label))})]})}var eJ=e.i(571353);let e0={strokeWidth:1.75},e1=[{groupLabel:"AI GATEWAY",items:[{key:"api-keys",page:"api-keys",label:"Virtual Keys",icon:(0,a.jsx)($.KeyRound,{...e0})},{key:"llm-playground",page:"llm-playground",label:"Playground",icon:(0,a.jsx)(J.default,{...e0}),roles:eh.rolesWithWriteAccess},{key:"models",page:"models",label:"Models + Endpoints",icon:(0,a.jsx)(F,{...e0}),roles:eh.rolesAllowedToViewWriteScopedPages},{key:"agentic",page:"agentic",label:"Agentic",icon:(0,a.jsx)(z.Bot,{...e0}),children:[{key:"agents",page:"agents",label:"Agents",icon:(0,a.jsx)(z.Bot,{...e0}),roles:eh.rolesAllowedToViewWriteScopedPages},{key:"workflows",page:"workflows",label:"Workflow Runs",icon:(0,a.jsx)(ex,{...e0})},{key:"memory",page:"memory",label:"Memory",icon:(0,a.jsx)(O.Database,{...e0})}]},{key:"mcp-servers",page:"mcp-servers",label:"MCP Servers",icon:(0,a.jsx)(er.Server,{...e0})},{key:"skills",page:"skills",label:"Skills",icon:(0,a.jsx)(R,{...e0}),roles:eh.all_admin_roles},{key:"guardrails",page:"guardrails",label:"Guardrails",icon:(0,a.jsx)(et.Shield,{...e0})},{key:"policies",page:"policies",label:"Policies",icon:(0,a.jsx)(ea.ScrollText,{...e0}),roles:eh.all_admin_roles},{key:"tools",page:"tools",label:"Tools",icon:(0,a.jsx)(eu.Wrench,{...e0}),children:[{key:"search-tools",page:"search-tools",label:"Search Tools",icon:(0,a.jsx)(el.Search,{...e0})},{key:"vector-stores",page:"vector-stores",label:"Vector Stores",icon:(0,a.jsx)(O.Database,{...e0})},{key:"tool-policies",page:"tool-policies",label:"Tool Policies",icon:(0,a.jsx)(ei.ShieldCheck,{...e0}),roles:(0,em.rolesWithCapability)("viewToolPolicies")}]}]},{groupLabel:"OBSERVABILITY",items:[{key:"new_usage",page:"new_usage",icon:(0,a.jsx)(M.BarChart3,{...e0}),roles:[...eh.all_admin_roles,...eh.internalUserRoles],label:"Usage"},{key:"cost-optimization",page:"cost-optimization",icon:(0,a.jsx)(X.PiggyBank,{...e0}),roles:[...eh.all_admin_roles,...eh.internalUserRoles],label:(0,a.jsxs)("span",{className:"flex items-center gap-2",children:["Cost Optimization ",(0,a.jsx)(ef.default,{})]})},{key:"logs",page:"logs",label:"Logs",icon:(0,a.jsx)(A,{...e0})},{key:"guardrails-monitor",page:"guardrails-monitor",label:"Guardrails Monitor",icon:(0,a.jsx)(W.HeartPulse,{...e0}),roles:[...eh.all_admin_roles,...eh.internalUserRoles]}]},{groupLabel:"ACCESS CONTROL",items:[{key:"teams",page:"teams",label:"Teams",icon:(0,a.jsx)(ec.Users,{...e0})},{key:"projects",page:"projects",label:(0,a.jsxs)("span",{className:"flex items-center gap-2",children:["Projects ",(0,a.jsx)(ef.default,{})]}),icon:(0,a.jsx)(G,{...e0}),roles:eh.all_admin_roles},{key:"users",page:"users",label:"Internal Users",icon:(0,a.jsx)(ed.User,{...e0}),roles:eh.all_admin_roles},{key:"organizations",page:"organizations",label:"Organizations",icon:(0,a.jsx)(P.Building2,{...e0}),roles:eh.all_admin_roles},{key:"access-groups",page:"access-groups",label:"Access Groups",icon:(0,a.jsx)(I,{...e0}),roles:eh.all_admin_roles},{key:"budgets",page:"budgets",label:"Budgets",icon:(0,a.jsx)(ep.Wallet,{...e0}),roles:eh.all_admin_roles}]},{groupLabel:"DEVELOPER TOOLS",items:[{key:"api_ref",page:"api_ref",label:"API Reference",icon:(0,a.jsx)(D.Code2,{...e0})},{key:"model-hub-table",page:"model-hub-table",label:"AI Hub",icon:(0,a.jsx)(K.LayoutGrid,{...e0})},{key:"learning-resources",page:"learning-resources",label:"Learning Resources",icon:(0,a.jsx)(U,{...e0}),external_url:"https://models.litellm.ai/cookbook"},{key:"caching",page:"caching",label:"Response Cache",icon:(0,a.jsx)(O.Database,{...e0}),roles:eh.all_admin_roles},{key:"experimental",page:"experimental",label:"Experimental",icon:(0,a.jsx)(q.FlaskConical,{...e0}),children:[{key:"prompts",page:"prompts",label:"Prompts",icon:(0,a.jsx)(V.FileText,{...e0}),roles:eh.all_admin_roles},{key:"transform-request",page:"transform-request",label:"API Playground",icon:(0,a.jsx)(eo.Terminal,{...e0}),roles:[...eh.all_admin_roles,...eh.internalUserRoles]},{key:"tag-management",page:"tag-management",label:"Tag Management",icon:(0,a.jsx)(en,{...e0}),roles:eh.all_admin_roles},{key:"4",page:"usage",label:"Old Usage",icon:(0,a.jsx)(M.BarChart3,{...e0})}]}]},{groupLabel:"SETTINGS",roles:eh.all_admin_roles,items:[{key:"settings",page:"settings",label:(0,a.jsxs)("span",{className:"flex items-center gap-2",children:["Settings ",(0,a.jsx)(eb.default,{})]}),icon:(0,a.jsx)(es.Settings,{...e0}),roles:eh.all_admin_roles,children:[{key:"router-settings",page:"router-settings",label:"Router Settings",icon:(0,a.jsx)(ee,{...e0}),roles:eh.all_admin_roles},{key:"logging-and-alerts",page:"logging-and-alerts",label:"Logging & Alerts",icon:(0,a.jsx)(B,{...e0}),roles:eh.all_admin_roles},{key:"admin-panel",page:"admin-panel",label:(0,a.jsxs)("span",{className:"flex items-center gap-2",children:["Admin Settings"," ",(0,a.jsx)(eb.default,{dot:!0,children:(0,a.jsx)("span",{})})]}),icon:(0,a.jsx)(es.Settings,{...e0}),roles:eh.all_admin_roles},{key:"cost-tracking",page:"cost-tracking",label:"Cost Tracking",icon:(0,a.jsx)(M.BarChart3,{...e0}),roles:eh.all_admin_roles},{key:"ui-theme",page:"ui-theme",label:"UI Theme",icon:(0,a.jsx)(Z,{...e0}),roles:eh.all_admin_roles}]}]}],e2=e=>{for(let a of e1)for(let l of a.items)if(l.children?.some(a=>a.page===e||a.key===e))return l.key;return null},e5={"AI GATEWAY":"AI Gateway",OBSERVABILITY:"Observability","ACCESS CONTROL":"Access Control","DEVELOPER TOOLS":"Developer Tools",SETTINGS:"Settings"},e3=e=>e.split(/[-_]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" "),e4=e=>"string"==typeof e.label?e.label:e3(e.key);e.s(["default",0,({setPage:e,defaultSelectedKey:m,collapsed:f=!1,onToggleCollapsed:T,enabledPagesInternalUsers:A,enableProjectsUI:M,disableAgentsForInternalUsers:B,allowAgentsForTeamAdmins:R,disableVectorStoresForInternalUsers:z,allowVectorStoresForTeamAdmins:U})=>{let P,{userId:I,accessToken:D,userRole:O,isViewOnly:V}=(0,s.default)(),{data:q}=(0,l.useOrganizations)(),{data:G}=(0,r.useTeams)(),{logoUrl:W}=(0,c.useTheme)(),{data:$}=(0,t.useHealthReadinessDetails)(D),K=(P=(0,o.default)(D),()=>{(0,i.clearTokenCookies)(),(0,n.clearStoredReturnUrl)(),localStorage.removeItem("litellm_selected_worker_id"),localStorage.removeItem("litellm_worker_url"),window.location.href=P.PROXY_LOGOUT_URL||""}),F=(0,d.getProxyBaseUrl)(),Z=$?.litellm_version,X=(e=>{for(let a of e1)for(let l of a.items){if(l.page===e)return l.key;let a=l.children?.find(a=>a.page===e);if(a)return a.key}return"api-keys"})(m),[J,ee]=(0,g.useState)(()=>{let e=e2(m);return new Set(e?[e]:[])}),[ea,el]=(0,g.useState)(m);if(m!==ea){el(m);let e=e2(m);e&&!J.has(e)&&ee(a=>new Set(a).add(e))}let er=(0,g.useMemo)(()=>!!I&&!!q&&q.some(e=>e.members?.some(e=>e.user_id===I&&"org_admin"===e.user_role)),[I,q]),es=(0,g.useMemo)(()=>(0,eh.isUserTeamAdminForAnyTeam)(G??null,I??""),[G,I]),et=e=>{let a=(0,eh.isAdminRole)(O);return e.map(e=>({...e,children:e.children?et(e.children):void 0})).filter(e=>{if("llm-playground"===e.key&&V)return!1;if("organizations"===e.key||"users"===e.key)return!!(!e.roles||e.roles.includes(O)||er)&&(!!a||null==A||A.includes(e.page));if("projects"===e.key&&!M||!a&&"agents"===e.key&&B&&!(R&&es)||!a&&"vector-stores"===e.key&&z&&!(U&&es)||e.roles&&!e.roles.includes(O))return!1;if(!a&&null!=A)return!!(e.children&&e.children.length>0&&e.children.some(e=>A.includes(e.page)))||A.includes(e.page);return!0})},ei=e1.filter(e=>!e.roles||e.roles.includes(O)).map(e=>({groupLabel:e.groupLabel,items:et(e.items)})).filter(e=>e.items.length>0),en=(l,r)=>{let s=X===l.key,t=r?"sub":"default",i=(0,a.jsx)("span",{className:"flex-1 truncate group-data-[collapsed=true]/sidebar:hidden",children:l.label});if(l.external_url)return(0,a.jsxs)("a",{href:l.external_url,target:"_blank",rel:"noopener noreferrer",title:f?e4(l):void 0,"data-active":s||void 0,className:(0,h.cn)(S({isActive:s,size:t})),children:[l.icon,i,(0,a.jsx)(H.ExternalLink,{className:"size-3.5 shrink-0 opacity-70 group-data-[collapsed=true]/sidebar:hidden"})]},l.key);let n=eJ.MIGRATED_PAGES[l.page]?(0,eJ.migratedHref)(eJ.MIGRATED_PAGES[l.page]):(0,eJ.legacyPageHref)(l.page);return(0,a.jsxs)("a",{href:n,onClick:a=>{l.external_url||!a.metaKey&&!a.ctrlKey&&!a.shiftKey&&1!==a.button&&(a.preventDefault(),e(l.page))},title:f?e4(l):void 0,"data-active":s||void 0,className:(0,h.cn)(S({isActive:s,size:t})),children:[l.icon,i]},l.key)},eo=W||`${F}/get_image`;return(0,a.jsxs)(b,{collapsed:f,children:[(0,a.jsx)(y,{className:"h-14 border-b border-border group-data-[collapsed=true]/sidebar:h-auto",children:(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2 group-data-[collapsed=true]/sidebar:flex-col",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,a.jsx)(eg.default,{href:(0,eJ.migratedHref)(""),className:"flex min-w-0 items-center","aria-label":"LiteLLM home",children:(0,a.jsx)("img",{src:eo,alt:"LiteLLM",className:"h-7 w-auto max-w-[150px] object-contain group-data-[collapsed=true]/sidebar:w-7"})}),Z&&(0,a.jsxs)(p.Badge,{variant:"outline",render:(0,a.jsx)("a",{href:"https://docs.litellm.ai/release_notes",target:"_blank",rel:"noopener noreferrer"}),className:"px-1.5 py-0 font-mono text-[10px] font-medium text-muted-foreground group-data-[collapsed=true]/sidebar:hidden",children:["v",Z]})]}),T&&(0,a.jsx)(u.Button,{variant:"ghost",size:"icon-sm",onClick:T,"aria-label":f?"Expand sidebar":"Collapse sidebar",className:"flex-none text-muted-foreground",children:f?(0,a.jsx)(Q,{}):(0,a.jsx)(Y,{})})]})}),(0,a.jsx)(x.ScrollArea,{className:"min-h-0 flex-1",children:(0,a.jsx)("nav",{className:"flex flex-col gap-0.5 px-3 pb-3",children:ei.map((e,l)=>(0,a.jsxs)(j,{children:[l>0&&(0,a.jsx)(L,{className:"hidden group-data-[collapsed=true]/sidebar:block"}),(0,a.jsx)(v,{children:e.groupLabel}),(0,a.jsx)(w,{children:e.items.map(e=>(e=>{if(!(e.children&&e.children.length>0))return(0,a.jsx)(N,{children:en(e,!1)},e.key);let l=X===e.key,r=J.has(e.key);return(0,a.jsxs)(N,{children:[(0,a.jsxs)(C,{isActive:l,onClick:()=>(e=>{if(f){T?.(),ee(a=>new Set(a).add(e));return}ee(a=>{let l=new Set(a);return l.has(e)?l.delete(e):l.add(e),l})})(e.key),title:f?e4(e):void 0,children:[e.icon,(0,a.jsx)("span",{className:"flex-1 truncate group-data-[collapsed=true]/sidebar:hidden",children:e.label}),(0,a.jsx)(E.ChevronRight,{className:(0,h.cn)("size-4 shrink-0 transition-transform group-data-[collapsed=true]/sidebar:hidden",r&&"rotate-90")})]}),r&&(0,a.jsx)(_,{children:e.children.map(e=>(0,a.jsx)(N,{children:en(e,!0)},e.key))})]},e.key)})(e))})]},e.groupLabel))})}),(0,a.jsxs)(k,{children:[(0,eh.isAdminRole)(O)&&(0,a.jsx)(eX,{accessToken:D,collapsed:f,onExpandRail:()=>T?.()}),(0,a.jsx)(eI,{onLogout:K,collapsed:f})]})]})},"getBreadcrumb",0,e=>{for(let a of e1)for(let l of a.items){let r=e5[a.groupLabel]??a.groupLabel;if(l.page===e)return{section:r,title:"string"==typeof l.label?l.label:e3(l.key)};let s=l.children?.find(a=>a.page===e);if(s)return{section:r,title:"string"==typeof s.label?s.label:e3(s.key)}}return{section:null,title:e3(e)}},"menuGroups",0,e1],111672);var e7=e.i(918789),e6=e.i(742531),e8=e.i(707621),e9=e.i(952571),ae=e.i(89128),aa=e.i(37727),al=e.i(439573);let ar=(0,eD.createQueryKeys)("userBanner"),as=e=>{let a={queryKey:ar.list({}),queryFn:async()=>{if(!e)throw Error("Access token is required");return await (0,d.getUserBanner)(e)},enabled:!!e,staleTime:6e4,gcTime:3e5};return(0,eE.useQuery)(a)};e.s(["useUserBanner",0,as,"userBannerKeys",0,ar],66146);let at="litellm:userBannerDismissed",ai={info:(0,a.jsx)(e9.Info,{}),warning:(0,a.jsx)(ae.TriangleAlert,{}),error:(0,a.jsx)(e8.CircleAlert,{})},an=({message:e})=>(0,a.jsx)(e7.default,{remarkPlugins:[e6.default],components:{a:({node:e,...l})=>(0,a.jsx)("a",{...l,target:"_blank",rel:"noopener noreferrer"})},children:e});e.s(["SEVERITY_ICONS",0,ai,"UserBanner",0,({accessToken:e})=>{let{data:l}=as(e),[r,s]=(0,g.useState)(()=>localStorage.getItem(at));if(!l?.enabled||""===l.message.trim())return null;let t=JSON.stringify({message:l.message,severity:l.severity,revision:l.revision});return r===t?null:(0,a.jsxs)(al.Alert,{variant:l.severity,className:"rounded-none border-x-0 border-t-0",children:[ai[l.severity],(0,a.jsx)(al.AlertDescription,{children:(0,a.jsx)(an,{message:l.message})}),(0,a.jsx)(al.AlertAction,{children:(0,a.jsx)(u.Button,{variant:"ghost",size:"icon-sm","aria-label":"Dismiss banner",onClick:()=>{localStorage.setItem(at,t),s(t)},children:(0,a.jsx)(aa.X,{})})})]})},"UserBannerMarkdown",0,an],714004)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0_8sguvytg2x1.js b/litellm/proxy/_experimental/out/_next/static/chunks/0_8sguvytg2x1.js deleted file mode 100644 index 0d3659fb84b..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0_8sguvytg2x1.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,618566,(e,t,r)=>{t.exports=e.r(976562)},434166,e=>{"use strict";e.s(["getSecureItem",0,function(e){try{let t=window.sessionStorage.getItem(e);if(null===t)return null;return decodeURIComponent(atob(t).split("").map(e=>"%"+e.charCodeAt(0).toString(16).padStart(2,"0")).join(""))}catch{return null}},"setSecureItem",0,function(e,t){window.sessionStorage.setItem(e,btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(e,t)=>String.fromCharCode(parseInt(t,16)))))}])},346328,e=>{"use strict";var t=e.i(843476),r=e.i(271645),l=e.i(618566),s=e.i(434166);let i=()=>{let e=(0,l.useSearchParams)(),i=(0,r.useMemo)(()=>e?{type:"litellm-mcp-oauth",code:e.get("code"),state:e.get("state"),error:e.get("error"),error_description:e.get("error_description")}:null,[e]);return(0,r.useEffect)(()=>{if(!i)return;try{let e=JSON.stringify(i);(0,s.setSecureItem)("litellm-mcp-oauth-result",e),(0,s.setSecureItem)("litellm-user-mcp-oauth-result",e),(0,s.setSecureItem)("litellm-tools-mcp-oauth-result",e)}catch(e){}let e=(0,s.getSecureItem)("litellm-mcp-oauth-return-url"),t=(()=>{let e=window.location.pathname||"",t=e.indexOf("/ui");if(t>=0){let r=e.slice(0,t+3);return r.endsWith("/")?r:`${r}`}return"/"})();if(e)try{let r=new URL(e,window.location.origin);r.origin===window.location.origin&&(t=r.href)}catch{}window.location.replace(t)},[i]),(0,t.jsx)("div",{className:"min-h-screen flex items-center justify-center bg-slate-50 p-6",children:(0,t.jsxs)("div",{className:"max-w-lg w-full rounded-lg bg-white shadow-md p-8 text-center space-y-4",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold text-slate-900",children:"LiteLLM MCP OAuth"}),(0,t.jsx)("p",{className:"text-sm text-slate-700",children:"Authorization complete. You may close this window and return to the LiteLLM dashboard."}),(0,t.jsx)("p",{className:"text-xs text-slate-500",children:"If the window does not close automatically, everything is still saved—you can close it manually."})]})})};e.s(["default",0,()=>(0,t.jsx)(r.Suspense,{fallback:(0,t.jsx)("div",{className:"min-h-screen flex items-center justify-center",children:"Loading..."}),children:(0,t.jsx)(i,{})})])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0ak2vacq91c7k.js b/litellm/proxy/_experimental/out/_next/static/chunks/0ak2vacq91c7k.js deleted file mode 100644 index e0319eca696..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0ak2vacq91c7k.js +++ /dev/null @@ -1,89 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,366321,e=>{"use strict";var t=e.i(843476),s=e.i(708347),r=e.i(475254);let l=(0,r.default)("circle-help",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);var a=e.i(555436),n=e.i(487486),i=e.i(519455),o=e.i(950594),c=e.i(967489),d=e.i(677572),u=e.i(746798),m=e.i(571303),h=e.i(868499),x=e.i(844444),p=e.i(271645),g=e.i(266027),f=e.i(500727),j=e.i(912598),v=e.i(243652),b=e.i(602869),y=e.i(135214);let _=(0,v.createQueryKeys)("mcpServerHealth");var N=e.i(727749),w=e.i(988846),k=e.i(678784),C=e.i(995926),T=e.i(328196),S=e.i(302202),A=e.i(409797),I=e.i(54131),O=e.i(440987);let P=[{label:"Documentation",fields:[{key:"description",label:"Description",description:"Must have a non-empty description",check:e=>!!e.description?.trim()},{key:"alias",label:"Alias",description:"Must have a display alias",check:e=>!!e.alias?.trim()}]},{label:"Source",fields:[{key:"source_url",label:"GitHub / Source URL",description:"Must link to a source repository",check:e=>!!e.source_url?.trim()}]},{label:"Connection",fields:[{key:"url",label:"Server URL",description:"Must have a URL configured",check:e=>!!e.url?.trim()}]},{label:"Security",fields:[{key:"auth_type",label:"Auth configured",description:"Must use authentication (not 'none')",check:e=>!!e.auth_type&&"none"!==e.auth_type}]}],M=P.flatMap(e=>e.fields),F="mcp_required_fields",E={active:{label:"Active",bg:"bg-green-50",text:"text-green-700",dot:"bg-green-500"},pending_review:{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"}};function L({label:e,value:s,color:r}){return(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg px-4 py-3",children:[(0,t.jsx)("div",{className:`text-2xl font-bold ${r}`,children:s}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-0.5",children:e})]})}function R({action:e,serverName:s,isCurrentlyActive:r,onConfirm:l,onCancel:a}){let[n,i]=(0,p.useState)(""),o="approve"===e;return(0,t.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,t.jsxs)("div",{className:"bg-white rounded-xl shadow-xl p-6 max-w-sm w-full mx-4",children:[(0,t.jsx)("div",{className:`w-10 h-10 rounded-full flex items-center justify-center mb-4 ${o?"bg-green-100":"bg-red-100"}`,children:o?(0,t.jsx)(k.CheckIcon,{className:"h-5 w-5 text-green-600"}):(0,t.jsx)(T.AlertCircleIcon,{className:"h-5 w-5 text-red-600"})}),(0,t.jsx)("h3",{className:"text-base font-semibold text-gray-900 mb-1",children:o?"Approve MCP Server":"Reject MCP Server"}),(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-4",children:["Are you sure you want to ",e," ",(0,t.jsxs)("span",{className:"font-medium text-gray-700",children:['"',s,'"']}),"?"," ",o?"This will activate the server. The submitting user will see it in their MCP Servers list once approved.":r?"This server is currently live. Rejecting it will immediately remove it from the proxy runtime.":"This will mark the submission as rejected."]}),!o&&(0,t.jsx)("textarea",{placeholder:"Reason for rejection (optional)",value:n,onChange:e=>i(e.target.value),className:"w-full border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500 mb-4 resize-none",rows:3}),(0,t.jsxs)("div",{className:"flex gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:a,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,t.jsx)("button",{type:"button",onClick:()=>l(o?void 0:n||void 0),className:`flex-1 text-white text-sm font-medium py-2 rounded-md transition-colors ${o?"bg-green-500 hover:bg-green-600":"bg-red-500 hover:bg-red-600"}`,children:o?"Approve":"Reject"})]})]})})}function U({requiredFields:e,onChange:s,onSave:r,isSaving:l}){let[a,n]=(0,p.useState)(!1),i=M.filter(t=>e.includes(t.key));return(0,t.jsxs)("div",{className:"mb-5 border border-gray-200 rounded-lg bg-white overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 cursor-pointer select-none",onClick:()=>n(e=>!e),children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(O.SettingsIcon,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-800",children:"Submission Rules"}),i.length>0?(0,t.jsxs)("span",{className:"text-xs text-gray-500",children:["(",i.length," required field",1!==i.length?"s":"",")"]}):(0,t.jsx)("span",{className:"text-xs text-gray-400 italic",children:"no rules set"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[!a&&i.length>0&&(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5 max-w-md",children:i.map(e=>(0,t.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs bg-blue-50 text-blue-700 border border-blue-200 px-2 py-0.5 rounded-full",children:[(0,t.jsx)(k.CheckIcon,{className:"h-3 w-3"}),e.label]},e.key))}),a?(0,t.jsx)(I.ChevronUpIcon,{className:"h-4 w-4 text-gray-400"}):(0,t.jsx)(A.ChevronDownIcon,{className:"h-4 w-4 text-gray-400"})]})]}),a&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 pt-4 pb-4",children:[(0,t.jsx)("p",{className:"text-xs text-gray-500 mb-4",children:"Select which fields must be filled in before a submission is considered compliant. LiteLLM will show ✓ / ✗ for each rule on every submission card below."}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-8 gap-y-5",children:P.map(r=>(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2",children:r.label}),(0,t.jsx)("div",{className:"space-y-2",children:r.fields.map(r=>{let l=e.includes(r.key);return(0,t.jsxs)("label",{className:"flex items-start gap-2.5 cursor-pointer group",children:[(0,t.jsx)("input",{type:"checkbox",checked:l,onChange:()=>{var t;return t=r.key,void s(e.includes(t)?e.filter(e=>e!==t):[...e,t])},className:"mt-0.5 h-4 w-4 rounded-sm border-gray-300 text-blue-600 focus:ring-blue-500 cursor-pointer"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-medium text-gray-800 group-hover:text-blue-700 transition-colors",children:r.label}),(0,t.jsx)("div",{className:"text-xs text-gray-400",children:r.description})]})]},r.key)})})]},r.label))}),(0,t.jsxs)("div",{className:"mt-5 flex items-center gap-3",children:[(0,t.jsx)("button",{type:"button",disabled:l,onClick:async()=>{await r(),n(!1)},className:"px-4 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 disabled:opacity-50 rounded-md transition-colors",children:l?"Saving…":"Save Rules"}),(0,t.jsx)("button",{type:"button",onClick:()=>n(!1),className:"px-4 py-1.5 text-sm font-medium text-gray-600 hover:text-gray-900 border border-gray-200 rounded-md hover:bg-gray-50 transition-colors",children:"Cancel"})]})]})]})}function z({server:e,onApprove:s,onReject:r,requiredFields:l}){let a=e.approval_status??"active",n=E[a]??E.active,i=M.filter(e=>l.includes(e.key)).map(t=>({key:t.key,label:t.label,description:t.description,passed:t.check(e)})),o=i.filter(e=>e.passed).length,c=i.length-o,d=i.length>0&&0===c;return(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"px-4 pt-4 pb-3",children:(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:"flex items-center gap-2 mb-1.5",children:(0,t.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${n.bg} ${n.text}`,children:[(0,t.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${n.dot}`}),n.label]})}),(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:e.alias??e.server_name??e.server_id}),e.description&&(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5 line-clamp-1",children:e.description}),e.url&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5 mt-1.5",children:[(0,t.jsx)(S.ServerIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0"}),(0,t.jsx)("code",{className:"text-xs text-gray-500 font-mono truncate",children:e.url})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 mt-1.5 text-xs text-gray-400",children:[(0,t.jsxs)("span",{children:["Transport: ",(0,t.jsx)("span",{className:"text-gray-600",children:e.transport??"sse"})]}),(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)("span",{children:["Submitted by: ",(0,t.jsx)("span",{className:"text-gray-600",children:e.submitted_by??"—"})]}),(0,t.jsx)("span",{children:"·"}),(0,t.jsx)("span",{children: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)})]}),"rejected"===a&&e.review_notes&&(0,t.jsxs)("p",{className:"text-xs text-red-600 mt-1.5",children:["Rejection reason: ",e.review_notes]})]}),0===i.length&&"rejected"!==a&&(0,t.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:["active"!==a&&(0,t.jsx)("button",{type:"button",onClick:s,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,t.jsx)("button",{type:"button",onClick:r,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===i.length&&"rejected"===a&&(0,t.jsx)("div",{className:"flex items-center gap-2 shrink-0",children:(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-500 hover:bg-green-600 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Re-approve"})})]})}),i.length>0&&(0,t.jsxs)("div",{className:"border-t border-gray-200",children:[(0,t.jsxs)("div",{className:`flex items-center gap-3 px-4 py-3 ${d?"bg-green-50 border-b border-green-100":"bg-red-50 border-b border-red-100"}`,children:[(0,t.jsx)("div",{className:`w-8 h-8 rounded-full flex items-center justify-center shrink-0 ${d?"bg-green-500":"bg-red-500"}`,children:d?(0,t.jsx)(k.CheckIcon,{className:"h-4 w-4 text-white"}):(0,t.jsx)(C.XIcon,{className:"h-4 w-4 text-white"})}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:`text-sm font-semibold leading-tight ${d?"text-green-800":"text-red-800"}`,children:d?"All checks passed":`${c} check${1!==c?"s":""} failed`}),(0,t.jsxs)("div",{className:"text-xs text-gray-500 mt-0.5",children:[o," passing, ",c," failing"]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:["active"!==a&&"rejected"!==a&&(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-600 hover:bg-green-700 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Approve"}),"rejected"===a&&(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-600 hover:bg-green-700 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Re-approve"}),"rejected"!==a&&(0,t.jsx)("button",{type:"button",onClick:r,className:"text-xs border border-red-300 text-red-600 hover:bg-red-50 bg-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Reject"})]})]}),(0,t.jsx)("div",{className:"divide-y divide-gray-100",children:i.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-3 px-4 py-2.5",children:[(0,t.jsx)("div",{className:`w-5 h-5 rounded-full flex items-center justify-center shrink-0 ${e.passed?"bg-green-100":"bg-red-100"}`,children:e.passed?(0,t.jsx)(k.CheckIcon,{className:"h-3 w-3 text-green-600"}):(0,t.jsx)(C.XIcon,{className:"h-3 w-3 text-red-600"})}),(0,t.jsx)("span",{className:`text-sm flex-1 ${e.passed?"text-gray-700":"text-gray-800"}`,children:e.label}),(0,t.jsx)("span",{className:`text-xs ${e.passed?"text-green-600":"text-red-500"}`,children:e.passed?"Passes":"Missing"})]},e.key))})]})]})}function H({accessToken:e}){let[s,r]=(0,p.useState)({total:0,pending_review:0,active:0,rejected:0,items:[]}),[l,a]=(0,p.useState)(""),[n,i]=(0,p.useState)("all"),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(!0),[m,h]=(0,p.useState)(null),[x,g]=(0,p.useState)([]),[f,j]=(0,p.useState)(!1),v=(0,p.useCallback)(async()=>{if(!e)return void u(!1);u(!0),h(null);try{let[t,s]=await Promise.all([(0,b.fetchMCPSubmissions)(e),(0,b.getGeneralSettingsCall)(e).catch(e=>(console.warn("MCPSubmissionsTab: failed to load general settings, compliance rules will be empty:",e),null))]);if(r(t),s?.data&&Array.isArray(s.data)){let e=s.data.find(e=>e.field_name===F);e&&Array.isArray(e.field_value)&&g(e.field_value)}}catch(e){h(e instanceof Error?e.message:"Failed to load submissions")}finally{u(!1)}},[e]);(0,p.useEffect)(()=>{v()},[v]);let y=async()=>{if(e){j(!0);try{await (0,b.updateConfigFieldSetting)(e,F,x),N.default.success("Submission rules saved")}catch{N.default.fromBackend("Failed to save submission rules")}finally{j(!1)}}},_=s.items.filter(e=>{if("all"!==n&&e.approval_status!==n)return!1;if(l.trim()){let t=l.toLowerCase(),s=(e.alias??e.server_name??e.server_id??"").toLowerCase(),r=(e.url??"").toLowerCase();return s.includes(t)||r.includes(t)}return!0});async function k(t,s){if(e)try{await (0,b.approveMCPServer)(e,t),await v(),N.default.success(`MCP server "${s}" approved`)}catch{N.default.fromBackend("Failed to approve MCP server")}finally{c(null)}}async function C(t,s,r){if(e)try{await (0,b.rejectMCPServer)(e,t,r),await v(),N.default.success(`MCP server "${s}" rejected`)}catch{N.default.fromBackend("Failed to reject MCP server")}finally{c(null)}}return(0,t.jsxs)("div",{className:"p-6",children:[(0,t.jsx)(U,{requiredFields:x,onChange:g,onSave:y,isSaving:f}),(0,t.jsxs)("div",{className:"grid grid-cols-4 gap-4 mb-6",children:[(0,t.jsx)(L,{label:"Total Submitted",value:s.total,color:"text-gray-900"}),(0,t.jsx)(L,{label:"Pending Review",value:s.pending_review,color:"text-yellow-600"}),(0,t.jsx)(L,{label:"Active",value:s.active,color:"text-green-600"}),(0,t.jsx)(L,{label:"Rejected",value:s.rejected,color:"text-red-600"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-5",children:[(0,t.jsxs)("div",{className:"relative flex-1 max-w-xs",children:[(0,t.jsx)(w.SearchIcon,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400"}),(0,t.jsx)("input",{type:"text",placeholder:"Search MCP servers...",value:l,onChange:e=>a(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,t.jsxs)("select",{value:n,onChange:e=>i(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,t.jsx)("option",{value:"all",children:"All Status"}),(0,t.jsx)("option",{value:"pending_review",children:"Pending Review"}),(0,t.jsx)("option",{value:"active",children:"Active"}),(0,t.jsx)("option",{value:"rejected",children:"Rejected"})]})]}),(0,t.jsxs)("div",{className:"space-y-3",children:[d&&(0,t.jsx)("div",{className:"text-center py-12 text-gray-500 text-sm",children:"Loading submissions…"}),m&&(0,t.jsx)("div",{className:"text-center py-12 text-red-600 text-sm",children:m}),!d&&!m&&0===_.length&&(0,t.jsx)("div",{className:"text-center py-12 text-gray-400 text-sm",children:"No MCP server submissions match your filters."}),!d&&!m&&_.map(e=>(0,t.jsx)(z,{server:e,requiredFields:x,onApprove:()=>c({serverId:e.server_id,serverName:e.alias??e.server_name??e.server_id,action:"approve"}),onReject:()=>c({serverId:e.server_id,serverName:e.alias??e.server_name??e.server_id,action:"reject",isCurrentlyActive:"active"===e.approval_status})},e.server_id))]}),o&&(0,t.jsx)(R,{action:o.action,serverName:o.serverName,isCurrentlyActive:o.isCurrentlyActive,onConfirm:e=>"approve"===o.action?k(o.serverId,o.serverName):C(o.serverId,o.serverName,e),onCancel:()=>c(null)})]})}var D=e.i(994388),V=e.i(599724),B=e.i(629569),q=e.i(212931),$=e.i(808613),W=e.i(311451),K=e.i(998573),G=e.i(482725),Y=e.i(988297),J=e.i(332102),Q=e.i(699857);e.i(707701);var Z=e.i(807235),X=e.i(174886);let ee=(0,r.default)("link-2",[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]]);var et=e.i(541071),es=e.i(788699),er=e.i(727612),el=e.i(494862);e.i(622826);var ea=e.i(200208),en=e.i(399536),ei=e.i(997422),eo=e.i(755146),ec=e.i(115504),ed=e.i(500330);function eu(e,t){return e?`${e}-${t}`:t}function em(e){return`${(0,b.getProxyBaseUrl)()}/toolset/${e}/mcp`}function eh({toolset:e,isAdmin:s,onEditClick:r,onDeleteClick:l}){return(0,t.jsxs)(eo.DropdownMenu,{children:[(0,t.jsx)(eo.DropdownMenuTrigger,{"aria-label":"Open toolset actions","data-testid":`toolset-actions-${e.toolset_id}`,className:(0,ec.cn)((0,i.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,t.jsx)(et.MoreHorizontal,{className:"size-4"})}),(0,t.jsxs)(eo.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-copy-url",onClick:()=>void(0,ed.copyToClipboard)(em(e.toolset_name),"Endpoint URL copied"),children:[(0,t.jsx)(ee,{}),"Copy endpoint URL"]}),(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-copy-id",onClick:()=>void(0,ed.copyToClipboard)(e.toolset_id,"Toolset ID copied"),children:[(0,t.jsx)(X.Copy,{}),"Copy toolset ID"]}),s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eo.DropdownMenuSeparator,{}),(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-edit",onClick:()=>r(e),children:[(0,t.jsx)(es.Pencil,{}),"Edit"]}),(0,t.jsxs)(eo.DropdownMenuItem,{variant:"destructive","data-testid":"toolset-action-delete",onClick:()=>l(e.toolset_id),children:[(0,t.jsx)(er.Trash2,{}),"Delete"]})]})]})]})}function ex({serverId:e,serverName:s,accessToken:r,selectedTools:l,onToggle:a}){let[n,i]=(0,p.useState)([]),[o,c]=(0,p.useState)(!1),[d,u]=(0,p.useState)(!1),m=new Set(l.filter(t=>t.server_id===e).map(e=>e.tool_name)),h=(0,p.useCallback)(async()=>{if(r&&!(n.length>0)){c(!0);try{let t=await (0,b.listMCPTools)(r,e),s=Array.isArray(t)?t:t?.tools??[];i(s.map(e=>({name:e.name??e.tool_name??e,description:e.description??""})))}catch{i([])}finally{c(!1)}}},[r,e,n.length]);return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,t.jsxs)("button",{type:"button",className:"w-full flex items-center justify-between px-4 py-3 bg-gray-50 hover:bg-gray-100 transition-colors",onClick:()=>{d||h(),u(!d)},children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-blue-500 shrink-0"}),s,m.size>0&&(0,t.jsxs)("span",{className:"ml-1 text-xs text-purple-600 font-semibold",children:[m.size," selected"]})]}),(0,t.jsx)("span",{className:"text-gray-400 text-xs",children:d?"▲":"▼"})]}),d&&(0,t.jsx)("div",{className:"p-2",children:o?(0,t.jsx)("div",{className:"flex justify-center py-3",children:(0,t.jsx)(G.Spin,{size:"small"})}):0===n.length?(0,t.jsx)("p",{className:"text-xs text-gray-400 px-2 py-2",children:"No tools found for this server."}):(0,t.jsx)("div",{className:"flex flex-col gap-1",children:n.map(s=>{let r=m.has(s.name);return(0,t.jsxs)("button",{type:"button",onClick:()=>a({server_id:e,tool_name:s.name}),className:`flex items-start justify-between px-3 py-2 rounded-lg text-left transition-colors ${r?"bg-purple-50 border border-purple-300":"bg-white border border-gray-100 hover:bg-gray-50"}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("p",{className:`text-sm font-medium leading-tight ${r?"text-purple-800":"text-gray-800"}`,children:s.name}),s.description&&(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-0.5 leading-tight line-clamp-2",children:s.description})]}),r&&(0,t.jsx)("span",{className:"text-purple-500 text-xs font-semibold ml-2 shrink-0 mt-0.5",children:"✓"})]},s.name)})})})]})}function ep({open:e,onClose:s,onSave:r,accessToken:l,initialToolset:a}){let[n]=$.Form.useForm(),[i,o]=(0,p.useState)(a?.tools||[]),[c,d]=(0,p.useState)(!1),[u,m]=(0,p.useState)(""),{data:h=[]}=(0,f.useMCPServers)(),x=p.default.useMemo(()=>new Map(h.map(e=>[e.server_id,e.alias||e.server_name||e.server_id])),[h]);p.default.useEffect(()=>{e&&(n.setFieldsValue({toolset_name:a?.toolset_name||"",description:a?.description||""}),o(a?.tools||[]),m(""))},[e,a]);let g=e=>{o(t=>t.some(t=>t.server_id===e.server_id&&t.tool_name===e.tool_name)?t.filter(t=>t.server_id!==e.server_id||t.tool_name!==e.tool_name):[...t,e])},j=async()=>{let e=await n.validateFields();d(!0);try{await r(e.toolset_name,e.description,i),s()}finally{d(!1)}},v=h.filter(e=>{let t=u.toLowerCase();return!t||(e.alias||"").toLowerCase().includes(t)||(e.server_name||"").toLowerCase().includes(t)});return(0,t.jsxs)(q.Modal,{open:e,onCancel:s,title:a?"Edit Toolset":"New Toolset",width:960,footer:null,forceRender:!0,children:[(0,t.jsx)($.Form,{form:n,layout:"vertical",className:"mt-2",children:(0,t.jsxs)("div",{className:"flex gap-4 mb-4",children:[(0,t.jsx)($.Form.Item,{label:"Toolset Name",name:"toolset_name",rules:[{required:!0,message:"Please enter a toolset name"}],className:"flex-1 mb-0",children:(0,t.jsx)(W.Input,{placeholder:"e.g. github-linear-tools"})}),(0,t.jsx)($.Form.Item,{label:"Description",name:"description",className:"flex-1 mb-0",children:(0,t.jsx)(W.Input,{placeholder:"Optional description"})})]})}),(0,t.jsxs)("div",{className:"flex gap-4 mt-2",style:{minHeight:360},children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:"flex items-center justify-between mb-2",children:(0,t.jsx)(V.Text,{className:"text-sm font-semibold text-gray-700",children:"Available Tools"})}),(0,t.jsx)(W.Input,{placeholder:"Search MCP servers...",value:u,onChange:e=>m(e.target.value),className:"mb-2",allowClear:!0}),(0,t.jsx)("div",{className:"space-y-2 overflow-y-auto",style:{maxHeight:300},children:0===v.length?(0,t.jsx)(V.Text,{className:"text-gray-400 text-sm",children:0===h.length?"No MCP servers configured":"No servers match your search"}):v.map(e=>(0,t.jsx)(ex,{serverId:e.server_id,serverName:e.alias||e.server_name||e.server_id,accessToken:l,selectedTools:i,onToggle:g},e.server_id))})]}),(0,t.jsx)("div",{className:"w-px bg-gray-200 shrink-0"}),(0,t.jsxs)("div",{className:"w-72 shrink-0",children:[(0,t.jsxs)(V.Text,{className:"text-sm font-semibold text-gray-700 mb-2 block",children:["Your Toolset ",(0,t.jsxs)("span",{className:"text-xs font-normal text-gray-400",children:["(",i.length," tools)"]})]}),(0,t.jsx)("div",{className:"space-y-1 overflow-y-auto",style:{maxHeight:340},children:0===i.length?(0,t.jsx)(V.Text,{className:"text-gray-400 text-sm",children:"No tools added yet"}):i.map((e,s)=>(0,t.jsxs)("button",{type:"button",onClick:()=>g(e),className:"w-full flex items-center justify-between px-3 py-1.5 rounded-lg border border-purple-200 bg-purple-50 hover:bg-red-50 hover:border-red-200 group transition-colors",children:[(0,t.jsxs)("div",{className:"min-w-0 text-left",children:[(0,t.jsx)("span",{className:"text-xs font-medium text-purple-800 group-hover:text-red-600 truncate block",children:eu(x.get(e.server_id),e.tool_name)}),(0,t.jsxs)("span",{className:"text-[10px] text-purple-400 truncate block",children:[e.server_id.slice(0,8),"…"]})]}),(0,t.jsx)("span",{className:"ml-2 text-purple-300 group-hover:text-red-400 text-xs shrink-0",children:"✕"})]},s))})]})]}),(0,t.jsxs)("div",{className:"flex justify-end gap-2 mt-4 pt-4 border-t border-gray-200",children:[(0,t.jsx)(D.Button,{variant:"secondary",onClick:s,children:"Cancel"}),(0,t.jsx)(D.Button,{onClick:j,loading:c,children:a?"Save Changes":"Create Toolset"})]})]})}function eg(){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)(J.Inbox,{className:"size-5 text-muted-foreground"})}),(0,t.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No toolsets yet"}),(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:"Create a toolset to give keys and teams a curated set of MCP tools."})]})}function ef(){let[e,s]=(0,p.useState)(!1),r=(0,b.getProxyBaseUrl)(),l=`{ - "mcpServers": { - "my-toolset": { - "url": "${r}/toolset//mcp", - "headers": { "x-litellm-api-key": "Bearer " } - } - } -}`,a=async()=>{try{await navigator.clipboard.writeText(l),s(!0),setTimeout(()=>s(!1),1500)}catch{}};return(0,t.jsxs)("div",{className:"mb-6 rounded-lg border border-gray-200 bg-gray-50 px-5 py-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-gray-700 mb-1",children:"How toolsets work"}),(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-3",children:["Create a toolset, assign it to a key via"," ",(0,t.jsx)("span",{className:"font-medium text-gray-700",children:"API Keys → Edit Key → MCP Servers"}),", then point your MCP client at the toolset URL. The client only sees the tools you picked."]}),(0,t.jsx)("div",{className:"text-xs text-gray-400 mb-1",children:"Claude Code / Cursor config"}),(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("pre",{className:"bg-white border border-gray-200 rounded-sm px-4 py-3 text-xs font-mono text-gray-700 overflow-x-auto leading-relaxed pr-14",children:l}),(0,t.jsx)("button",{type:"button",onClick:a,className:"absolute top-2 right-2 px-2 py-1 text-xs rounded-sm border bg-white hover:bg-gray-50 text-gray-400 hover:text-gray-600 border-gray-200 transition-colors",children:e?"✓":"copy"})]})]})}function ej({accessToken:e,userRole:s}){let r=(0,j.useQueryClient)(),{data:l=[],isLoading:a}=(0,Q.useMCPToolsets)(),{data:n=[]}=(0,f.useMCPServers)(),[i,o]=(0,p.useState)(!1),[c,d]=(0,p.useState)(null),[u,m]=(0,p.useState)(null),[h,x]=(0,p.useState)(!1),g="Admin"===s||"proxy_admin"===s,v=async(t,s,l)=>{e&&(await (0,b.createMCPToolset)(e,{toolset_name:t,description:s,tools:l}),K.message.success("Toolset created"),r.invalidateQueries({queryKey:["mcpToolsets"]}))},y=async(t,s,l)=>{e&&c&&(await (0,b.updateMCPToolset)(e,{toolset_id:c.toolset_id,toolset_name:t,description:s,tools:l}),K.message.success("Toolset updated"),r.invalidateQueries({queryKey:["mcpToolsets"]}),d(null))},_=async()=>{if(e&&u){x(!0);try{await (0,b.deleteMCPToolset)(e,u),K.message.success("Toolset deleted"),r.invalidateQueries({queryKey:["mcpToolsets"]}),m(null)}finally{x(!1)}}},N=p.default.useMemo(()=>new Map(n.map(e=>[e.server_id,e.alias||e.server_name||e.server_id])),[n]),[w,k]=(0,p.useState)([]),C=p.default.useMemo(()=>(({isAdmin:e,serverPrefixById:s,onEditClick:r,onDeleteClick:l})=>[{id:"toolset_id",accessorKey:"toolset_id",meta:{title:"Toolset ID"},header:"Toolset ID",size:140,enableSorting:!1,cell:({row:e})=>(0,t.jsx)(en.IdCell,{value:e.original.toolset_id})},{id:"toolset_name",accessorKey:"toolset_name",meta:{title:"Name"},header:({column:e})=>(0,t.jsx)(el.DataTableSortHeader,{column:e,title:"Name"}),size:260,enableSorting:!0,sortingFn:"alphanumeric",cell:({row:s})=>(0,t.jsx)(ei.IdentityCell,{title:s.original.toolset_name,subtitle:em(s.original.toolset_name),className:"max-w-80",onClick:e?()=>r(s.original):void 0})},{id:"description",accessorKey:"description",meta:{title:"Description"},header:"Description",size:200,enableSorting:!1,cell:({row:e})=>(0,t.jsx)("span",{className:"block max-w-72 truncate text-sm text-muted-foreground",title:e.original.description,children:e.original.description||"—"})},{id:"tools",meta:{title:"Tools",skeleton:"chips"},header:"Tools",size:260,enableSorting:!1,cell:({row:e})=>{let r=e.original.tools;return(0,t.jsxs)("div",{className:"flex max-w-xs flex-wrap gap-1",children:[r.slice(0,4).map(e=>(0,t.jsx)("span",{className:"inline-flex items-center rounded-md bg-muted px-1.5 py-0.5 text-xs",children:eu(s.get(e.server_id),e.tool_name)},`${e.server_id}-${e.tool_name}`)),r.length>4&&(0,t.jsxs)("span",{className:"self-center text-xs text-muted-foreground",children:["+",r.length-4," more"]})]})}},{id:"created_at",accessorKey:"created_at",meta:{title:"Created"},header:({column:e})=>(0,t.jsx)(el.DataTableSortHeader,{column:e,title:"Created"}),size:120,enableSorting:!0,cell:({row:e})=>(0,t.jsx)(ea.DateCell,{value:e.original.created_at,precision:"date"})},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,t.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:s})=>(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(eh,{toolset:s.original,isAdmin:e,onEditClick:r,onDeleteClick:l})})}])({isAdmin:g,serverPrefixById:N,onEditClick:d,onDeleteClick:m}),[g,N]);return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(B.Title,{children:"MCP Toolsets"}),(0,t.jsx)(V.Text,{className:"text-gray-500 text-sm",children:"Curated collections of tools from one or more MCP servers. Assign toolsets to keys and teams via the MCP permissions dropdown."})]}),g&&(0,t.jsx)(D.Button,{icon:Y.PlusIcon,onClick:()=>o(!0),children:"New Toolset"})]}),(0,t.jsx)(ef,{}),(0,t.jsx)(Z.DataTable,{data:l,columns:C,getRowId:(e,t)=>e.toolset_id||String(t),sortingMode:"client",sorting:w,onSortingChange:k,isLoading:a,loadingMessage:"Loading toolsets…",noDataMessage:(0,t.jsx)(eg,{}),size:"compact"}),(0,t.jsx)(ep,{open:i,onClose:()=>o(!1),onSave:v,accessToken:e}),c&&(0,t.jsx)(ep,{open:!!c,onClose:()=>d(null),onSave:y,accessToken:e,initialToolset:c}),(0,t.jsx)(q.Modal,{open:!!u,onCancel:()=>m(null),onOk:_,okText:"Delete",okButtonProps:{danger:!0,loading:h},title:"Delete Toolset",children:(0,t.jsx)("p",{children:"Are you sure you want to delete this toolset? Keys and teams using it will lose access to the scoped tools."})})]})}var ev=e.i(592968),eb=e.i(199133),ey=e.i(28651),e_=e.i(790848),eN=e.i(362024),ew=e.i(827252),ek=e.i(779241),eC=e.i(909119),eT=e.i(292335);let eS=[{value:"client_secret_basic",label:"Client Secret Basic"},{value:"client_secret_post",label:"Client Secret Post"}],eA=({isEditing:e=!1})=>(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Token Endpoint Auth Method (optional)",(0,t.jsx)(ev.Tooltip,{title:"How the proxy authenticates to the upstream OAuth token endpoint. Client Secret Basic sends the client credentials in an HTTP Basic Authorization header; leave blank to use the default, Client Secret Post, which sends them in the request body.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","token_endpoint_auth_method"],children:(0,t.jsx)(eb.Select,{allowClear:!0,placeholder:e?"Leave blank to keep existing (default Client Secret Post)":"Default (Client Secret Post)",className:"rounded-lg",size:"large",options:eS})}),eI="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",eO=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),eP=()=>(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Resource Indicator (optional)",tooltip:"RFC 8707 resource indicator sent to the authorization server so it mints a token audienced for this MCP server. Leave blank to send nothing, which is the default and what most providers expect. Use 'auto' to send this server's own URL. Set an exact identifier when the authorization server expects a specific one. Some providers reject this parameter and take the audience from scopes instead; if you see AADSTS901002, leave it blank. If you see invalid_target, the authorization server needs it set."}),name:["credentials","upstream_resource"],children:(0,t.jsx)(ek.TextInput,{placeholder:"auto, or https://mcp.example.com/mcp",className:eI})}),eM=({isM2M:e,isEditing:s=!1,oauthFlow:r,initialFlowType:l,docsUrl:a})=>{let n=s?" (leave blank to keep existing)":"",i=e=>s?[]:[{required:!0,message:e}];return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"OAuth Flow Type",tooltip:"Choose how the proxy authenticates with this MCP server. M2M is for server-to-server communication using client credentials. Interactive (PKCE) is for user-facing flows that require browser-based authorization."}),name:"oauth_flow_type",...l?{initialValue:l}:{},children:(0,t.jsxs)(eb.Select,{placeholder:"Select OAuth flow",className:"rounded-lg",size:"large",children:[(0,t.jsx)(eb.Select.Option,{value:eT.OAUTH_FLOW.M2M,children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"font-medium",children:"Machine-to-Machine (M2M)"}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-2",children:"server-to-server, no user interaction"})]})}),(0,t.jsx)(eb.Select.Option,{value:eT.OAUTH_FLOW.INTERACTIVE,children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"font-medium",children:"Interactive (PKCE)"}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-2",children:"browser-based user authorization"})]})})]})}),e?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Client ID",tooltip:"OAuth2 client ID for the client_credentials grant."}),name:["credentials","client_id"],rules:i("Client ID is required for M2M OAuth"),children:(0,t.jsx)(ek.TextInput,{type:"password",placeholder:`Enter OAuth client ID${n}`,className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Client Secret",tooltip:"OAuth2 client secret for the client_credentials grant."}),name:["credentials","client_secret"],rules:i("Client Secret is required for M2M OAuth"),children:(0,t.jsx)(ek.TextInput,{type:"password",placeholder:`Enter OAuth client secret${n}`,className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Token URL",tooltip:"Token endpoint URL for the client_credentials grant."}),name:"token_url",rules:i("Token URL is required for M2M OAuth"),children:(0,t.jsx)(ek.TextInput,{placeholder:"https://auth.example.com/oauth/token",className:eI})}),(0,t.jsx)(eA,{isEditing:s}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Scopes (optional)",tooltip:"Optional scopes to request with the client_credentials grant."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})}),(0,t.jsx)(eP,{})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"flex items-center justify-between w-full",children:[(0,t.jsx)(eO,{label:"Client ID (optional)",tooltip:"Provide only if your MCP server cannot handle dynamic client registration."}),a&&(0,t.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-blue-500 hover:text-blue-700 ml-2 font-normal",onClick:e=>e.stopPropagation(),children:"Create OAuth App →"})]}),name:["credentials","client_id"],children:(0,t.jsx)(ek.TextInput,{type:"password",placeholder:`Enter client ID${n}`,className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Client Secret (optional)",tooltip:"Provide only if your MCP server cannot handle dynamic client registration."}),name:["credentials","client_secret"],children:(0,t.jsx)(ek.TextInput,{type:"password",placeholder:`Enter client secret${n}`,className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Scopes (optional)",tooltip:"Optional scopes requested during token exchange. Separate multiple scopes with enter or commas."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})}),(0,t.jsx)(eP,{}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Issuer (optional)",tooltip:"OAuth 2.0 authorization server issuer (RFC 8414). Leave empty to discover endpoints from the upstream resource; set it to pin the trust anchor, which makes this issuer's document the only endpoint source (RFC 8414 §3.3), overriding the Authorization/Token/Registration URLs above and failing closed if its metadata cannot be fetched."}),name:"issuer",children:(0,t.jsx)(ek.TextInput,{placeholder:"https://issuer.example.com",className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Authorization URL (optional)",tooltip:"Optional override for the authorization endpoint."}),name:"authorization_url",children:(0,t.jsx)(ek.TextInput,{placeholder:"https://example.com/oauth/authorize",className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Token URL (optional)",tooltip:"Optional override for the token endpoint."}),name:"token_url",children:(0,t.jsx)(ek.TextInput,{placeholder:"https://example.com/oauth/token",className:eI})}),(0,t.jsx)(eA,{isEditing:s}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Registration URL (optional)",tooltip:"Optional override for the dynamic client registration endpoint."}),name:"registration_url",children:(0,t.jsx)(ek.TextInput,{placeholder:"https://example.com/oauth/register",className:eI})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Token Validation Rules (optional)",tooltip:'JSON object of key-value rules checked against the OAuth token response before storing. Supports dot-notation for nested fields (e.g. {"organization": "my-org", "team.id": "123"}). Tokens that fail validation are rejected with HTTP 403.'}),name:"token_validation_json",rules:[{validator:(e,t)=>{if(!t||""===t.trim())return Promise.resolve();try{return JSON.parse(t),Promise.resolve()}catch{return Promise.reject(Error("Must be valid JSON"))}}}],children:(0,t.jsx)(W.Input.TextArea,{placeholder:'{\n "organization": "my-org",\n "team.id": "123"\n}',rows:4,className:"font-mono text-sm rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eO,{label:"Token Storage TTL (seconds, optional)",tooltip:"How long to cache each user's OAuth access token in Redis before evicting it (never longer than the token's own expires_in). Leave blank to derive the TTL from the token's expires_in, or fall back to the 12-hour default."}),name:"token_storage_ttl_seconds",children:(0,t.jsx)(ey.InputNumber,{min:1,placeholder:"e.g. 3600",className:"w-full rounded-lg",style:{width:"100%"}})}),r&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-gray-300 p-4 space-y-2",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Use OAuth to fetch a fresh access token and temporarily save it in the session as the authentication value."}),(0,t.jsx)(D.Button,{variant:"secondary",onClick:r.startOAuthFlow,disabled:"authorizing"===r.status||"exchanging"===r.status,children:"authorizing"===r.status?"Waiting for authorization...":"exchanging"===r.status?"Exchanging authorization code...":"Authorize & Fetch Token"}),r.error&&(0,t.jsx)("p",{className:"text-sm text-red-500",children:r.error}),"success"===r.status&&r.tokenResponse?.access_token&&(0,t.jsxs)("p",{className:"text-sm text-green-600",children:["Token fetched. Expires in ",r.tokenResponse.expires_in??"?"," seconds."]})]})]})]})};var eF=e.i(89128),eE=e.i(439573);function eL({authType:e}){return e!==eT.AUTH_TYPE.TRUE_PASSTHROUGH?null:(0,t.jsxs)(eE.Alert,{className:"mb-4",children:[(0,t.jsx)(eF.TriangleAlert,{}),(0,t.jsx)(eE.AlertTitle,{children:"True Passthrough disables LiteLLM authentication for this server"}),(0,t.jsx)(eE.AlertDescription,{children:"Anyone who can reach the gateway can call this server without a LiteLLM key. The caller's Authorization header is forwarded to the upstream verbatim, per-key and per-team rate limits and spend tracking do not apply, and the upstream is fully responsible for authenticating callers. Choose OAuth Delegate instead if callers should still authenticate to LiteLLM."})]})}var eR=e.i(464571),eU=e.i(536916);function ez({authType:e,initialChecked:s}){return(0,eT.isClientForwardedTokenMode)(e)?(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Gateway-hosted sign-in (DCR bridge)",(0,t.jsx)(ev.Tooltip,{title:"Lets OAuth-only clients like Claude Desktop register and sign in through the gateway. Turn off to relay the upstream server's own OAuth metadata instead (for clients pre-registered with the upstream IdP).",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"dcr_bridge",valuePropName:"checked",initialValue:s,children:(0,t.jsx)(e_.Switch,{})}):null}function eH({authType:e,oauthFlow:s,dcrBridgeInitialChecked:r,isEditing:l=!1,savedAuthType:a,removeStoredApp:n=!1,onRemoveStoredAppChange:i,appMayNotMatchUpstream:o=!1}){if(!(0,eT.isClientForwardedTokenMode)(e))return null;let c={authorizing:"Waiting for authorization...",exchanging:"Exchanging authorization code..."}[s.status]??"Authorize & Fetch Tools (browser-only)",d=l&&(0,eT.credentialAuthClass)(a)===(0,eT.credentialAuthClass)(e);return(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-gray-300 p-4 space-y-2 mb-4",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Callers bring their own upstream token for this auth type, so LiteLLM never stores tokens. To preview tools and configure the tool allowlist, authorize against the upstream here: the token stays in this browser session only and is never saved to LiteLLM. An OAuth app configured below IS saved with the server, so internal users who authorize from the Tools page go through it."}),o&&(0,t.jsx)("p",{className:"text-sm text-amber-600",children:"You changed the upstream URL or endpoints; the OAuth app entered here was registered for the previous upstream and may not be valid. Update the client ID, or clear it to use dynamic client registration."}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"OAuth Client ID (optional)"}),name:["credentials","client_id"],extra:d?"Set this to make everyone authorize through a specific app; required for upstreams without dynamic client registration (e.g. a pre-registered Slack app).":"Switching the auth type discards the previously saved app; enter a client ID here or leave blank to use dynamic client registration.",children:(0,t.jsx)(W.Input.Password,{placeholder:d?"Leave blank to keep the currently saved app (if any)":"Leave blank to use dynamic client registration",disabled:n,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"OAuth Client Secret (optional)"}),name:["credentials","client_secret"],children:(0,t.jsx)(W.Input.Password,{placeholder:d?"Leave blank to keep the currently saved secret (if any)":"Leave blank for public clients / PKCE",disabled:n,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(ez,{authType:e,initialChecked:r}),l&&i&&(0,t.jsx)(eU.Checkbox,{checked:n,onChange:e=>i(e.target.checked),children:(0,t.jsx)("span",{className:"text-sm text-gray-700",children:"Remove the saved OAuth app on save (the server goes back to dynamic client registration)"})}),(0,t.jsx)(eR.Button,{onClick:s.startOAuthFlow,disabled:"authorizing"===s.status||"exchanging"===s.status,children:c}),s.error&&(0,t.jsx)("p",{className:"text-sm text-red-500",children:s.error}),"success"===s.status&&s.tokenResponse?.access_token&&(0,t.jsx)("p",{className:"text-sm text-green-600",children:"Token held for this browser session. Tools can now be previewed and configured; the token was not saved to LiteLLM."})]})}let eD="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",eV=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),eB=({isEditing:e=!1})=>{let s=e?" (leave blank to keep existing)":"";return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Profile",tooltip:"Token-exchange wire dialect. RFC 8693 is the standard token-exchange grant. Microsoft Entra OBO uses Entra's On-Behalf-Of dialect (the RFC 7523 jwt-bearer grant with requested_token_use=on_behalf_of) and carries the target resource in a scope like api:///.default."}),name:"token_exchange_profile",...e?{}:{initialValue:"rfc8693"},children:(0,t.jsxs)(eb.Select,{className:"rounded-lg",size:"large",children:[(0,t.jsx)(eb.Select.Option,{value:"rfc8693",children:(0,t.jsx)("span",{className:"font-medium",children:"RFC 8693 (standard)"})}),(0,t.jsx)(eb.Select.Option,{value:"entra_obo",children:(0,t.jsx)("span",{className:"font-medium",children:"Microsoft Entra OBO"})})]})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Token Exchange Endpoint (optional)",tooltip:"RFC 8693 token endpoint. The proxy exchanges the user's incoming token here for a scoped token used to call the upstream MCP server. Leave blank to auto-discover it from the upstream's protected-resource metadata (RFC 9728 then RFC 8414)."}),name:"token_exchange_endpoint",children:(0,t.jsx)(W.Input,{placeholder:"https://idp.example.com/oauth2/token",className:eD})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Client ID",tooltip:"OAuth2 client ID used to authenticate to the token exchange endpoint."}),name:["credentials","client_id"],rules:[{required:!e,message:"Client ID is required for token exchange"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client ID${s}`,className:eD})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Client Secret",tooltip:"OAuth2 client secret used to authenticate to the token exchange endpoint."}),name:["credentials","client_secret"],rules:[{required:!e,message:"Client Secret is required for token exchange"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client secret${s}`,className:eD})}),(0,t.jsx)($.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.token_exchange_profile!==t.token_exchange_profile,children:({getFieldValue:e})=>{let s="entra_obo"===e("token_exchange_profile");return(0,t.jsxs)(t.Fragment,{children:[!s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Audience (optional)",tooltip:"Target audience for the exchanged token (RFC 8693 audience). Identifies the upstream MCP server the token is for."}),name:"audience",children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com",className:eD})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:"Subject Token Type (optional)",tooltip:"Type of the user's incoming token (RFC 8693 subject_token_type). Defaults to urn:ietf:params:oauth:token-type:access_token."}),name:"subject_token_type",children:(0,t.jsx)(W.Input,{placeholder:"urn:ietf:params:oauth:token-type:access_token",className:eD})})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(eV,{label:s?"Scopes":"Scopes (optional)",tooltip:s?"Microsoft Entra OBO carries the target resource in the scope, so at least one is required (e.g. api:///.default).":"Optional scopes to request during the token exchange."}),name:["credentials","scopes"],rules:s?[{required:!0,message:"Microsoft Entra OBO requires a scope, e.g. api:///.default"}]:[],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:s?"api:///.default":"Add scopes",className:"rounded-lg",size:"large"})})]})}})]})},eq="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",e$=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),eW=({isEditing:e=!1})=>{let s=e?" (leave blank to keep existing)":"";return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Org Token Endpoint (leg 1)",tooltip:"Your IdP org authorization server's token endpoint. LiteLLM exchanges the user's identity assertion here for an ID-JAG assertion (RFC 8693 with requested_token_type=urn:ietf:params:oauth:token-type:id-jag)."}),name:"token_exchange_endpoint",rules:[{required:!e,message:"The org token endpoint is required for ID-JAG"}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-org.okta.com/oauth2/v1/token",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Resource Token Endpoint (leg 2)",tooltip:"The upstream resource authorization server's token endpoint. LiteLLM posts the ID-JAG assertion here as an RFC 7523 jwt-bearer grant to get the access token the MCP server accepts."}),name:["credentials","id_jag_resource_token_endpoint"],rules:[{required:!e,message:"The resource token endpoint is required for ID-JAG"}],children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com/oauth2/token",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client ID",tooltip:"OAuth2 client ID LiteLLM authenticates as on both legs."}),name:["credentials","client_id"],rules:[{required:!e,message:"Client ID is required for ID-JAG"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client ID${s}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client Secret",tooltip:"Authenticates LiteLLM as the OAuth client via client_secret_post. Leave blank when using a private key instead; a private key takes precedence over this secret."}),name:["credentials","client_secret"],dependencies:[["credentials","client_private_key"]],rules:[({getFieldValue:t})=>({validator:(s,r)=>e||r||t(["credentials","client_private_key"])?Promise.resolve():Promise.reject(Error("Provide either a client secret or a client private key"))})],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client secret${s}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client Private Key (PEM)",tooltip:"PEM private key signing the RFC 7523 private_key_jwt client assertion. Okta Cross App Access normally requires this. When set it takes precedence over the client secret."}),name:["credentials","client_private_key"],children:(0,t.jsx)(W.Input.TextArea,{rows:3,placeholder:`-----BEGIN PRIVATE KEY-----${s}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Private Key ID (optional)",tooltip:"The kid advertised in the client assertion JWT header, so the IdP can select the right registered key."}),name:["credentials","client_private_key_id"],children:(0,t.jsx)(W.Input,{placeholder:"my-signing-key-1",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client Assertion Signing Algorithm (optional)",tooltip:"Algorithm signing the client assertion JWT. Defaults to RS256."}),name:["credentials","client_assertion_signing_alg"],children:(0,t.jsx)(W.Input,{placeholder:"RS256",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Audience (optional)",tooltip:"RFC 8693 audience sent on leg 1, identifying the upstream the ID-JAG assertion is minted for."}),name:"audience",children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Resource Indicator (optional)",tooltip:"RFC 8707 resource indicator sent on leg 1. Separate from Audience, which is the RFC 8693 parameter."}),name:["credentials","id_jag_resource"],children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com/mcp",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Subject Token Type (optional)",tooltip:"Type of the identity assertion exchanged on leg 1. Defaults to urn:ietf:params:oauth:token-type:id_token."}),name:"subject_token_type",children:(0,t.jsx)(W.Input,{placeholder:"urn:ietf:params:oauth:token-type:id_token",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Scopes (optional)",tooltip:"Scopes requested on leg 1 of the exchange."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})})]})};var eK=e.i(952571),eG=e.i(849550),eG=eG,eY=e.i(195116),eJ=e.i(515288),eQ=e.i(204258);let eZ=({value:e,placeholder:s,disabled:r,className:l,onChange:a})=>{let[n,i]=(0,p.useState)(null),c=n??(null==e?"":e.toFixed(4));return(0,t.jsxs)(o.InputGroup,{className:l,children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(o.InputGroupText,{children:"$"})}),(0,t.jsx)(o.InputGroupInput,{type:"text",inputMode:"decimal",placeholder:s,disabled:r,value:c,onFocus:()=>i(null==e?"":String(e)),onBlur:()=>i(null),onChange:e=>{var t;let s;return i(t=e.target.value),s=Number(t),void a(""===t.trim()||Number.isNaN(s)?null:s)}})]})},eX=({value:e={},onChange:s,tools:r=[],disabled:l=!1})=>(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsx)(eJ.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center gap-2",children:[(0,t.jsx)(eG.default,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Cost Configuration"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(eK.Info,{className:"size-4 text-muted-foreground","aria-label":"About cost configuration"})}),(0,t.jsx)(u.TooltipContent,{children:"Configure costs for this MCP server's tool calls. Set a default rate and per-tool overrides."})]})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("label",{className:"mb-2 block text-sm font-medium",children:["Default Cost per Query ($)",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(eK.Info,{className:"ml-1 inline size-4 text-muted-foreground","aria-label":"About the default cost"})}),(0,t.jsx)(u.TooltipContent,{children:"Default cost charged for each tool call to this server."})]})]}),(0,t.jsx)(eZ,{value:e.default_cost_per_query,placeholder:"0.0000",disabled:l,className:"w-50",onChange:t=>{let r={...e,default_cost_per_query:t};s?.(r)}}),(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:"Set a default cost for all tool calls to this server"})]}),r.length>0&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("label",{className:"block text-sm font-medium",children:["Tool-Specific Costs ($)",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(eK.Info,{className:"ml-1 inline size-4 text-muted-foreground","aria-label":"About per-tool costs"})}),(0,t.jsx)(u.TooltipContent,{children:"Override the default cost for specific tools. Leave blank to use the default rate."})]})]}),(0,t.jsxs)(eQ.Collapsible,{className:"rounded-lg border border-border",children:[(0,t.jsx)(eQ.CollapsibleTrigger,{render:(0,t.jsxs)("button",{type:"button",className:"flex w-full items-center gap-2 p-3 text-left",children:[(0,t.jsx)(eY.Wrench,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("span",{className:"font-medium",children:"Available Tools"}),(0,t.jsx)(n.Badge,{variant:"secondary",children:r.length})]})}),(0,t.jsx)(eQ.CollapsibleContent,{children:(0,t.jsx)("div",{className:"max-h-64 space-y-3 overflow-y-auto p-3",children:r.map((r,a)=>(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted p-3",children:[(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:r.name}),r.description&&(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:r.description})]}),(0,t.jsx)("div",{className:"ml-4",children:(0,t.jsx)(eZ,{value:e.tool_name_to_cost_per_query?.[r.name],placeholder:"Use default",disabled:l,className:"w-40",onChange:t=>{var l;let a;return l=r.name,a={...e,tool_name_to_cost_per_query:{...e.tool_name_to_cost_per_query,[l]:t}},void s?.(a)}})})]},a))})})]})]})]}),(e.default_cost_per_query||e.tool_name_to_cost_per_query&&Object.keys(e.tool_name_to_cost_per_query).length>0)&&(0,t.jsxs)("div",{className:"mt-6 rounded-lg border border-border bg-muted p-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Cost Summary:"}),(0,t.jsxs)("div",{className:"mt-2 space-y-1",children:[e.default_cost_per_query&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• Default cost: $",e.default_cost_per_query.toFixed(4)," per query"]}),e.tool_name_to_cost_per_query&&Object.entries(e.tool_name_to_cost_per_query).map(([e,s])=>null!=s&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• ",e,": $",s.toFixed(4)," per query"]},e))]})]})]})})});var e0=e.i(101048),e2=e.i(707621),e1=e.i(16715);let e4=({formValues:e,tools:s,isLoadingTools:r,toolsError:l,toolsErrorStatus:a=null,toolsErrorStackTrace:n,canFetchTools:o,fetchTools:c})=>{let d=403===a;return o||e.url||e.spec_path?(0,t.jsx)(eJ.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(e0.CircleCheck,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Connection Status"})]}),!o&&(e.url||e.spec_path)&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(eY.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"Complete required fields to test connection"}),(0,t.jsx)("p",{className:"text-sm",children:"Fill in URL, Transport, and Authentication to test MCP server connection"})]}),o&&(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:r?"Testing connection to MCP server...":s.length>0?"Connection successful":l?d?"Ready to submit":"Connection failed":"Ready to test connection"}),(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Server: ",e.url||e.spec_path]})]}),r&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm",children:"Connecting..."})]}),!r&&!l&&s.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(e0.CircleCheck,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Connected"})]}),l&&!d&&(0,t.jsxs)("div",{className:"flex items-center gap-1 text-destructive",children:[(0,t.jsx)(e2.CircleAlert,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Failed"})]})]}),r&&(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 py-6",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm",children:"Testing connection and loading tools..."})]}),l&&d&&(0,t.jsxs)(eE.Alert,{children:[(0,t.jsx)(eK.Info,{}),(0,t.jsx)(eE.AlertTitle,{children:"Tool preview unavailable"}),(0,t.jsx)(eE.AlertDescription,{children:l})]}),l&&!d&&(0,t.jsxs)(eE.Alert,{variant:"destructive",children:[(0,t.jsx)(e2.CircleAlert,{}),(0,t.jsx)(eE.AlertTitle,{children:"Connection Failed"}),(0,t.jsxs)(eE.AlertDescription,{children:[(0,t.jsx)("div",{children:l}),n&&(0,t.jsxs)(eQ.Collapsible,{className:"mt-3",children:[(0,t.jsx)(eQ.CollapsibleTrigger,{render:(0,t.jsx)(i.Button,{variant:"link",size:"sm",className:"h-auto p-0",children:"Stack Trace"})}),(0,t.jsx)(eQ.CollapsibleContent,{children:(0,t.jsx)("pre",{className:"mt-2 max-h-100 overflow-auto rounded-sm bg-muted p-2 font-mono text-xs break-words whitespace-pre-wrap",children:n})})]})]}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",onClick:c,children:[(0,t.jsx)(e1.RefreshCw,{}),"Retry"]})})]}),!r&&0===s.length&&!l&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center",children:[(0,t.jsx)(e0.CircleCheck,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Connection successful!"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"No tools found for this MCP server"})]})]})]})}):null};var e5=e.i(257428),e3=e.i(793479),e6=e.i(624687),e7=e.i(531516);let e8=e=>{try{let t=e.indexOf("/mcp/");if(-1===t)return{token:null,baseUrl:e};let s=e.split("/mcp/");if(2!==s.length)return{token:null,baseUrl:e};let r=s[0]+"/mcp/",l=s[1];if(!l)return{token:null,baseUrl:e};return{token:l,baseUrl:r}}catch(t){return console.error("Error parsing MCP URL:",t),{token:null,baseUrl:e}}},e9=e=>{let{token:t}=e8(e);return{maskedUrl:(e=>{let{token:t,baseUrl:s}=e8(e);return t?s+"...":e})(e),hasToken:!!t}},te=e=>e?/^https?:\/\/[^\s/$.?#].[^\s]*$/i.test(e)?Promise.resolve():Promise.reject("Please enter a valid URL (e.g., http://service-name.domain:1234/path or https://example.com)"):Promise.resolve(),tt=e=>e&&(e.includes("-")||e.includes(" "))?Promise.reject("Cannot contain '-' (hyphen) or spaces. Please use '_' (underscore) instead."):Promise.resolve(),ts=/^[a-zA-Z0-9_-]+$/,tr=e=>{if(!Array.isArray(e))return[];let t=new Set,s=[];for(let r of e){if(!r||"object"!=typeof r)continue;let e=String(r.name??"").trim();if(!e||t.has(e)||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))continue;let l="user"===r.scope?"user":"global";s.push({name:e,value:"user"===l?"":String(r.value??""),scope:l,description:r.description||void 0}),t.add(e)}return s},tl=e=>{if(!e)return{};if("string"==typeof e){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}return{}}return e},ta=({tool:e,isEnabled:s,isEditExpanded:r,toolNameToDisplayName:l,toolNameToDescription:a,onToggle:o,onToggleExpand:c,onDisplayNameChange:d,onDescriptionChange:u})=>{let m=l[e.name]||"",h=""!==m&&!ts.test(m);return(0,t.jsxs)("div",{className:(0,ec.cn)("rounded-lg border transition-colors",s?"border-primary/40 bg-accent":"border-border bg-muted"),children:[(0,t.jsx)("div",{className:"cursor-pointer p-4",onClick:()=>o(e.name),children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)(e5.Checkbox,{checked:s,onCheckedChange:()=>o(e.name)}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:l[e.name]||e.name}),(0,t.jsx)(n.Badge,{variant:s?"secondary":"outline",children:s?"Enabled":"Disabled"}),l[e.name]&&(0,t.jsx)(n.Badge,{variant:"secondary",children:"Custom name"})]}),(a[e.name]||e.description)&&(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:a[e.name]||e.description}),(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:s?"✓ Users can call this tool":"✗ Users cannot call this tool"})]}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm",onClick:t=>c(e.name,t),title:"Edit display name and description",children:(0,t.jsx)(es.Pencil,{})})]})}),r&&(0,t.jsxs)("div",{className:"space-y-3 rounded-b-lg border-t border-border bg-muted px-4 pt-3 pb-4",onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-1 block text-xs font-medium",children:"Display Name"}),(0,t.jsx)(e3.Input,{placeholder:e.name,value:l[e.name]||"",onChange:t=>d(e.name,t.target.value),"aria-invalid":h||void 0}),h?(0,t.jsx)("p",{className:"mt-1 block text-xs text-destructive",children:"Only letters, digits, underscores, and hyphens are allowed (no spaces)."}):(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:"Override how this tool's name appears to users. Leave blank to use original."})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-1 block text-xs font-medium",children:"Description"}),(0,t.jsx)(e6.Textarea,{className:"field-sizing-fixed",placeholder:e.description||"No description",value:a[e.name]||"",onChange:t=>u(e.name,t.target.value),rows:2}),(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:"Override the tool description shown to users. Leave blank to use original."})]})]})]})},tn=({accessToken:e,formValues:s,allowedTools:r,existingAllowedTools:l,onAllowedToolsChange:c,toolNameToDisplayName:d,toolNameToDescription:u,onToolNameToDisplayNameChange:h,onToolNameToDescriptionChange:x,hasToolAllowlistInteraction:g=!1,onToolAllowlistInteraction:f,keyTools:j,externalTools:v,externalIsLoading:b,externalError:y,externalErrorStatus:_=null,externalCanFetch:N,isEditMode:w=!1})=>{let k=(0,p.useRef)([]),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)("crud"),I=(0,p.useRef)(!1),O=(0,p.useRef)(""),[P,M]=(0,p.useState)(new Set),F=403===_,E=v??[],L=b??!1,R=y??null,U=N??!1,z=(0,p.useMemo)(()=>{if(!j||0===j.length||0===E.length)return[];let e=new Set,t=[];for(let s of j){let r=s.name.split("_").map(e=>e.toLowerCase()).filter(e=>e.length>1);if(0===r.length)continue;let l=e=>e.toLowerCase().replace(/[-_/]/g," "),a=E.find(t=>{if(e.has(t.name))return!1;let s=l(t.name);return r.every(e=>s.includes(e))});if(!a){let t=r.find(e=>e.length>3)??r[r.length-1];a=E.find(s=>!e.has(s.name)&&l(s.name).includes(t))}a&&(t.push(a),e.add(a.name))}return t},[j,E]),H=(0,p.useMemo)(()=>new Set(z.map(e=>e.name)),[z]),D=(0,p.useMemo)(()=>E.filter(e=>{let t=C.toLowerCase();return e.name.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t)}),[E,C]),V=(0,p.useMemo)(()=>D.filter(e=>H.has(e.name)),[D,H]),B=(0,p.useMemo)(()=>D.filter(e=>!H.has(e.name)),[D,H]);(0,p.useEffect)(()=>{let e=E.map(e=>e.name).sort().join(","),t=k.current.map(e=>e.name).sort().join(","),s=z.map(e=>e.name).sort().join(",");if(s!==O.current&&(O.current=s,""!==s&&(I.current=!1)),E.length>0&&e!==t){let e=E.map(e=>e.name);I.current?c(r.filter(t=>e.includes(t))):(I.current=!0,null!==l?c(l.filter(t=>e.includes(t))):w?c(g?r.filter(t=>e.includes(t)):[]):z.length>0?c(z.map(e=>e.name).filter(t=>e.includes(t))):c(e))}k.current=E},[E,r,l,c,z,g,w]);let q=w&&null===l&&0===r.length&&!g,$=(0,p.useMemo)(()=>q?E.map(e=>e.name):r,[r,q,E]),W=(0,p.useMemo)(()=>new Set($),[$]),K=e=>{f?.(),c(e)},G=e=>{W.has(e)?K($.filter(t=>t!==e)):K([...$,e])},Y=(e,t)=>{t.stopPropagation(),M(t=>{let s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},J=(e,t)=>{let s={...d};t?s[e]=t:delete s[e],h(s)},Q=(e,t)=>{let s={...u};t?s[e]=t:delete s[e],x(s)};return U||s.url||s.spec_path?(0,t.jsx)(eJ.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eY.Wrench,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Tool Configuration"}),E.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",children:E.length})]}),E.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(i.Button,{size:"sm",variant:"crud"===S?"default":"outline",onClick:()=>A("crud"),children:"Risk Groups"}),(0,t.jsx)(i.Button,{size:"sm",variant:"flat"===S?"default":"outline",onClick:()=>A("flat"),children:"Flat List"})]})]}),(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-3",children:(0,t.jsxs)("p",{className:"text-sm",children:[(0,t.jsx)("strong",{children:"Select which tools users can call:"})," Only checked tools will be available for users to invoke. Unchecked tools will be blocked from execution."]})}),L&&(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 py-6",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm",children:"Loading tools from spec..."})]}),R&&!L&&F&&(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-4",children:(0,t.jsx)("p",{className:"text-sm",children:R})}),R&&!L&&!F&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-destructive/40 bg-destructive/5 py-6 text-center",children:[(0,t.jsx)(eY.Wrench,{className:"mx-auto mb-2 size-6 text-destructive"}),(0,t.jsx)("p",{className:"text-sm font-medium text-destructive",children:"Unable to load tools"}),(0,t.jsx)("p",{className:"text-sm text-destructive",children:R})]}),!L&&!R&&0===E.length&&U&&(j&&j.length>0?(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-4 text-center text-muted-foreground",children:[(0,t.jsx)(eY.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"No tools loaded from spec"}),(0,t.jsxs)("p",{className:"mt-1 block text-sm",children:["Expected tools: ",j.map(e=>e.name).join(", ")]})]}):(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(eY.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"No tools available for configuration"}),(0,t.jsx)("p",{className:"text-sm",children:"Connect to an MCP server with tools to configure them"})]})),!U&&(s.url||s.spec_path)&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(eY.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"Complete required fields to configure tools"}),(0,t.jsx)("p",{className:"text-sm",children:"Fill in URL, Transport, and Authentication to load available tools"})]}),!L&&!R&&E.length>0&&(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-muted p-3",children:[(0,t.jsx)(e0.CircleCheck,{className:"size-4"}),(0,t.jsxs)("p",{className:"text-sm font-medium",children:[$.length," of ",E.length," ",1===E.length?"tool":"tools"," enabled for user access"]})]}),(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search tools by name or description...",value:C,onChange:e=>T(e.target.value)})]}),"crud"===S&&(0,t.jsx)(e7.default,{tools:E,searchFilter:C,value:q?void 0:r,onChange:K}),"flat"===S&&(0,t.jsx)(t.Fragment,{children:0===D.length?(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(a.Search,{className:"mx-auto mb-2 size-6"}),(0,t.jsxs)("p",{className:"text-sm",children:['No tools found matching "',C,'"']})]}):(0,t.jsxs)("div",{className:"space-y-2",children:[V.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-1",children:[(0,t.jsx)("p",{className:"text-xs font-semibold tracking-wide text-muted-foreground uppercase",children:"Suggested tools"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{let e=z.map(e=>e.name).filter(e=>!W.has(e));0!==e.length&&K([...$,...e])},children:"Enable all"}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{K($.filter(e=>!H.has(e)))},children:"Disable all"})]})]}),V.map(e=>(0,t.jsx)(ta,{tool:e,isEnabled:W.has(e.name),isEditExpanded:P.has(e.name),toolNameToDisplayName:d,toolNameToDescription:u,onToggle:G,onToggleExpand:Y,onDisplayNameChange:J,onDescriptionChange:Q},e.name))]}),B.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-1 pt-2",children:[(0,t.jsx)("p",{className:"text-xs font-semibold tracking-wide text-muted-foreground uppercase",children:V.length>0?"All tools":"Tools"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{let e=E.filter(e=>!H.has(e.name)).map(e=>e.name).filter(e=>!W.has(e));0!==e.length&&K([...$,...e])},children:"Enable all"}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{K($.filter(e=>H.has(e)))},children:"Disable all"})]})]}),B.map(e=>(0,t.jsx)(ta,{tool:e,isEnabled:W.has(e.name),isEditExpanded:P.has(e.name),toolNameToDisplayName:d,toolNameToDescription:u,onToggle:G,onToggleExpand:Y,onDisplayNameChange:J,onDescriptionChange:Q},e.name))]})]})})]})]})}):null},ti=({isVisible:e,required:s=!0})=>e?(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Stdio Configuration (JSON)",(0,t.jsx)(ev.Tooltip,{title:"Paste your stdio MCP server configuration in JSON format. You can use the full mcpServers structure from config.yaml or just the inner server configuration.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"stdio_config",rules:[...s?[{required:!0,message:"Please enter stdio configuration"}]:[],{validator:(e,t)=>{if(!t)return Promise.resolve();try{return JSON.parse(t),Promise.resolve()}catch{return Promise.reject("Please enter valid JSON")}}}],children:(0,t.jsx)(W.Input.TextArea,{placeholder:`{ - "mcpServers": { - "circleci-mcp-server": { - "command": "npx", - "args": ["-y", "@circleci/mcp-server-circleci"], - "env": { - "CIRCLECI_TOKEN": "your-circleci-token", - "CIRCLECI_BASE_URL": "https://circleci.com" - } - } - } -}`,rows:12,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500 font-mono text-sm"})}):null;var to=e.i(560445),tc=e.i(770914),td=e.i(564897),tu=e.i(646563);let{Panel:tm}=eN.Collapse,th=({availableAccessGroups:e,mcpServer:s,searchValue:r,setSearchValue:l,getAccessGroupOptions:a})=>{let n=$.Form.useFormInstance(),i=$.Form.useWatch("auth_type",n),o=i===eT.AUTH_TYPE.OAUTH2,c=i===eT.AUTH_TYPE.NONE||null==i,d=$.Form.useWatch("extra_headers",n),u=Array.isArray(d)&&d.some(e=>"string"==typeof e&&"authorization"===e.toLowerCase()),m=c&&u,h=$.Form.useWatch("delegate_auth_to_upstream",n),x=$.Form.useWatch("available_on_public_internet",n),g=o&&!0===h&&!1===x;return(0,p.useEffect)(()=>{if(s){if(s.static_headers){let e=Object.entries(s.static_headers).map(([e,t])=>({header:e,value:null!=t?String(t):""}));n.setFieldValue("static_headers",e)}Array.isArray(s.env_vars)&&s.env_vars.length>0&&n.setFieldValue("env_vars",s.env_vars.map(e=>({name:e.name,value:e.value??"",scope:e.scope??"global",description:e.description??""}))),"boolean"==typeof s.allow_all_keys&&n.setFieldValue("allow_all_keys",s.allow_all_keys),"boolean"==typeof s.available_on_public_internet&&n.setFieldValue("available_on_public_internet",s.available_on_public_internet),"boolean"==typeof s.delegate_auth_to_upstream&&n.setFieldValue("delegate_auth_to_upstream",s.delegate_auth_to_upstream),"boolean"==typeof s.oauth_passthrough&&n.setFieldValue("oauth_passthrough",s.oauth_passthrough)}else n.setFieldValue("allow_all_keys",!1),n.setFieldValue("available_on_public_internet",!0),n.setFieldValue("delegate_auth_to_upstream",!1),n.setFieldValue("oauth_passthrough",!1)},[s,n]),(0,p.useEffect)(()=>{o||n.setFieldValue("delegate_auth_to_upstream",!1)},[o,n]),(0,p.useEffect)(()=>{m||n.setFieldValue("oauth_passthrough",!1)},[m,n]),(0,t.jsx)(eN.Collapse,{className:"bg-gray-50 border border-gray-200 rounded-lg",expandIconPosition:"end",ghost:!1,children:(0,t.jsx)(tm,{header:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900",children:"Permission Management / Access Control"})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 ml-4",children:"Configure access permissions and security settings (Optional)"})]}),className:"border-0",forceRender:!0,children:(0,t.jsxs)("div",{className:"space-y-6 pt-4",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Allow All LiteLLM Keys",(0,t.jsx)(ev.Tooltip,{title:"When enabled, every API key can access this MCP server.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:'Enable if this server should be "public" to all keys.'})]}),(0,t.jsx)($.Form.Item,{name:"allow_all_keys",valuePropName:"checked",initialValue:s?.allow_all_keys??!1,className:"mb-0",children:(0,t.jsx)(e_.Switch,{})})]}),(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Internal network only",(0,t.jsx)(ev.Tooltip,{title:"When on, only requests from within your internal network are accepted. Turn off to allow external clients (other clusters, ChatGPT, etc). API key authentication is always required regardless of this setting.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Turn on to restrict access to callers within your internal network only."})]}),(0,t.jsx)($.Form.Item,{name:"available_on_public_internet",valuePropName:"checked",getValueProps:e=>({checked:!e}),getValueFromEvent:e=>!e,initialValue:!0,className:"mb-0",children:(0,t.jsx)(e_.Switch,{})})]}),o&&(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Delegate auth to upstream (PKCE passthrough)",(0,t.jsx)(ev.Tooltip,{title:"When on, LiteLLM skips its own API key/SSO check for this server and lets the client complete PKCE directly with the upstream MCP server. Only honored when Auth Type is oauth2. No spend tracking or per-key rate limiting will run on this route.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Bypass LiteLLM auth so clients authenticate directly with the upstream OAuth MCP server."})]}),(0,t.jsx)($.Form.Item,{name:"delegate_auth_to_upstream",valuePropName:"checked",initialValue:s?.delegate_auth_to_upstream??!1,className:"mb-0",children:(0,t.jsx)(e_.Switch,{})})]}),m&&(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OAuth pass-through",(0,t.jsx)(ev.Tooltip,{title:"When on, this server is treated as an OAuth pass-through: the gateway proxies the upstream /.well-known/oauth-protected-resource metadata, emits spec-compliant 401 challenges when no bearer is supplied, and propagates upstream 401/403 responses. Only honored when Auth Type is None and 'Authorization' is in Extra Headers.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Forward upstream OAuth discovery and 401 challenges so clients negotiate OAuth directly with the upstream MCP server."})]}),(0,t.jsx)($.Form.Item,{name:"oauth_passthrough",valuePropName:"checked",initialValue:s?.oauth_passthrough??!1,className:"mb-0",children:(0,t.jsx)(e_.Switch,{})})]}),g&&(0,t.jsx)(to.Alert,{type:"warning",showIcon:!0,className:"mb-2",message:"Internal server with upstream OAuth delegation",description:"This MCP server is configured as internal-only but delegates auth to upstream. Anonymous users will be able to reach the upstream OAuth2 /authorize flow without a LiteLLM session. Ensure your upstream provider and network enforce access controls."}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["MCP Access Groups",(0,t.jsx)(ev.Tooltip,{title:"Specify access groups for this MCP server. Users must be in at least one of these groups to access the server.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"mcp_access_groups",className:"mb-4",children:(0,t.jsx)(eb.Select,{mode:"tags",showSearch:!0,placeholder:"Select existing groups or type to create new ones",optionFilterProp:"value",filterOption:(e,t)=>(t?.value??"").toLowerCase().includes(e.toLowerCase()),onSearch:e=>l(e),tokenSeparators:[","],options:a(),maxTagCount:"responsive",allowClear:!0})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Extra Headers",(0,t.jsx)(ev.Tooltip,{title:"Forward custom headers from incoming requests to this MCP server (e.g., Authorization, X-Custom-Header, User-Agent)",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})}),s?.extra_headers&&s.extra_headers.length>0&&(0,t.jsxs)("span",{className:"ml-2 text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded-full",children:[s.extra_headers.length," configured"]})]}),name:"extra_headers",children:(0,t.jsx)(eb.Select,{mode:"tags",placeholder:s?.extra_headers&&s.extra_headers.length>0?`Currently: ${s.extra_headers.join(", ")}`:"Enter header names (e.g., Authorization, X-Custom-Header)",className:"rounded-lg",size:"large",tokenSeparators:[","],allowClear:!0})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Static Headers",(0,t.jsx)(ev.Tooltip,{title:"Send these key-value headers with every request to this MCP server.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),required:!1,children:(0,t.jsx)($.Form.List,{name:"static_headers",children:(e,{add:s,remove:r})=>(0,t.jsxs)("div",{className:"space-y-3",children:[e.map(({key:e,name:s,...l})=>(0,t.jsxs)(tc.Space,{className:"flex w-full",align:"baseline",size:"middle",children:[(0,t.jsx)($.Form.Item,{...l,name:[s,"header"],className:"flex-1",rules:[{required:!0,message:"Header name is required"}],children:(0,t.jsx)(W.Input,{size:"large",allowClear:!0,className:"rounded-lg",placeholder:"Header name (e.g., X-API-Key)"})}),(0,t.jsx)($.Form.Item,{...l,name:[s,"value"],className:"flex-1",rules:[{required:!0,message:"Header value is required"}],children:(0,t.jsx)(W.Input,{size:"large",allowClear:!0,className:"rounded-lg",placeholder:"Header value"})}),(0,t.jsx)(td.MinusCircleOutlined,{onClick:()=>r(s),className:"text-gray-500 hover:text-red-500 cursor-pointer"})]},e)),(0,t.jsx)(eR.Button,{type:"dashed",onClick:()=>s(),icon:(0,t.jsx)(tu.PlusOutlined,{}),block:!0,children:"Add Static Header"})]})})})]})},"permissions")})},tx=({accessToken:e,selectedName:s,onSelect:r})=>{let[l,a]=(0,p.useState)([]),[n,i]=(0,p.useState)(!1),[o,c]=(0,p.useState)(new Set);return((0,p.useEffect)(()=>{e&&(i(!0),(0,b.fetchOpenAPIRegistry)(e).then(e=>a(e.apis??[])).catch(()=>a([])).finally(()=>i(!1)))},[e]),n)?(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium",children:"Popular APIs"}),(0,t.jsx)("div",{className:"flex justify-center py-6",children:(0,t.jsx)(m.UiLoadingSpinner,{className:"size-5 text-muted-foreground"})})]}):0===l.length?null:(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("span",{className:"mb-2 block text-sm font-medium",children:"Popular APIs"}),(0,t.jsx)("div",{className:"grid grid-cols-5 gap-2",children:l.map(e=>{let l=s===e.name,a=o.has(e.name);return(0,t.jsxs)("button",{type:"button",title:e.description,onClick:()=>r(e),className:(0,ec.cn)("flex cursor-pointer flex-col items-center gap-1.5 rounded-lg border p-3 transition-all",l?"border-primary bg-accent shadow-xs":"border-border hover:bg-accent"),children:[a?(0,t.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-full bg-muted text-sm font-bold text-muted-foreground",children:e.title.charAt(0)}):(0,t.jsx)("img",{src:e.icon_url,alt:e.title,className:"h-7 w-7 object-contain",onError:()=>{var t;return t=e.name,void c(e=>new Set(e).add(t))}}),(0,t.jsx)("span",{className:"text-center text-xs leading-tight font-medium text-muted-foreground",children:e.title})]},e.name)})}),(0,t.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Select an API to pre-fill the spec URL and OAuth 2.0 settings, or enter your own spec URL below."})]})},tp=({form:e,accessToken:s,onValuesChange:r,onKeyToolsChange:l,onLogoUrlChange:a,onOAuthDocsUrlChange:n})=>{let[i,o]=(0,p.useState)(null);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tx,{accessToken:s,selectedName:i,onSelect:t=>{o(t.name),l?.(t.key_tools??[]),a?.(t.icon_url||void 0);let s={spec_path:t.spec_url};t.oauth?(s.auth_type=eT.AUTH_TYPE.OAUTH2,s.oauth_flow_type=eT.OAUTH_FLOW.INTERACTIVE,s.authorization_url=t.oauth.authorization_url,s.token_url=t.oauth.token_url,e.setFieldsValue(s),n?.(t.oauth.docs_url??null)):(e.resetFields(["auth_type","authorization_url","token_url"]),e.setFieldsValue(s),n?.(null)),r(s)}}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OpenAPI Spec URL",(0,t.jsx)(ev.Tooltip,{title:"URL to an OpenAPI specification (JSON or YAML). MCP tools will be automatically generated from the API endpoints defined in the spec.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"spec_path",rules:[{required:!0,message:"Please enter an OpenAPI spec URL"}],children:(0,t.jsx)(W.Input,{placeholder:"https://petstore3.swagger.io/api/v3/openapi.json",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",onChange:()=>{o(null),l?.([]),n?.(null)}})})]})};var tg=e.i(221345),tf=e.i(174553);let tj={src:e.i(703330).default,width:16,height:16,blurWidth:0,blurHeight:0},tv={src:e.i(924056).default,width:24,height:24,blurWidth:0,blurHeight:0},tb={src:e.i(806471).default,width:24,height:24,blurWidth:0,blurHeight:0},ty={src:e.i(67456).default,width:24,height:24,blurWidth:0,blurHeight:0},t_={src:e.i(459465).default,width:24,height:24,blurWidth:0,blurHeight:0},tN={src:e.i(283873).default,width:24,height:24,blurWidth:0,blurHeight:0},tw={src:e.i(88313).default,width:24,height:24,blurWidth:0,blurHeight:0},tk={src:e.i(243999).default,width:24,height:24,blurWidth:0,blurHeight:0},tC={src:e.i(798962).default,width:24,height:24,blurWidth:0,blurHeight:0},tT={src:e.i(762217).default,width:24,height:24,blurWidth:0,blurHeight:0},tS={src:e.i(758618).default,width:24,height:24,blurWidth:0,blurHeight:0},tA={src:e.i(333191).default,width:24,height:24,blurWidth:0,blurHeight:0},tI={src:e.i(675865).default,width:24,height:24,blurWidth:0,blurHeight:0};var tO=e.i(9774);let tP={src:e.i(301873).default,width:24,height:24,blurWidth:0,blurHeight:0};var tM=e.i(284629),tF=e.i(247044);let tE={src:e.i(72982).default,width:24,height:24,blurWidth:0,blurHeight:0};var tL=e.i(336712);let tR={src:e.i(521442).default,width:24,height:24,blurWidth:0,blurHeight:0},tU="/ui/assets/logos/",tz=[{name:"GitHub",url:`${tU}github.svg`,src:tj.src},{name:"Slack",url:`${tU}slack.svg`,src:tv.src},{name:"Notion",url:`${tU}notion.svg`,src:tb.src},{name:"Linear",url:`${tU}linear.svg`,src:ty.src},{name:"Jira",url:`${tU}jira.svg`,src:t_.src},{name:"Figma",url:`${tU}figma.svg`,src:tN.src},{name:"Gmail",url:`${tU}gmail.svg`,src:tw.src},{name:"Google Drive",url:`${tU}google_drive.svg`,src:tk.src},{name:"Stripe",url:`${tU}stripe.svg`,src:tC.src},{name:"Shopify",url:`${tU}shopify.svg`,src:tT.src},{name:"Salesforce",url:`${tU}salesforce.svg`,src:tS.src},{name:"HubSpot",url:`${tU}hubspot.svg`,src:tA.src},{name:"Twilio",url:`${tU}twilio.svg`,src:tI.src},{name:"Cloudflare",url:`${tU}cloudflare.svg`,src:tO.default.src},{name:"Sentry",url:`${tU}sentry.svg`,src:tP.src},{name:"PostgreSQL",url:`${tU}postgresql.svg`,src:tM.default.src},{name:"Snowflake",url:`${tU}snowflake.svg`,src:tF.default.src},{name:"Zapier",url:`${tU}zapier.svg`,src:tE.src},{name:"Google",url:`${tU}google.svg`,src:tL.default.src},{name:"GitLab",url:`${tU}gitlab.svg`,src:tR.src}],tH=({value:e,onChange:s})=>{let r=tz.find(t=>t.url===e);return(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium",children:"Logo"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(eK.Info,{className:"size-4 cursor-help text-muted-foreground","aria-label":"About the logo"})}),(0,t.jsx)(u.TooltipContent,{children:"Select a well-known logo or paste a URL to any image. The logo is shown on the admin and chat pages."})]})]}),e&&(0,t.jsxs)("div",{className:"mb-3 flex items-center gap-3 rounded-lg border border-border bg-muted p-3",children:[(0,t.jsx)(tf.Logo,{src:r?.src??e,label:"Selected",className:"h-10 w-10 rounded-sm object-contain"}),(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)("div",{className:"truncate text-xs text-muted-foreground",children:e})}),(0,t.jsx)("button",{type:"button",onClick:()=>s?.(void 0),className:"cursor-pointer border-none bg-transparent text-xs text-muted-foreground hover:text-destructive",children:"✕"})]}),(0,t.jsx)("div",{className:"mb-3 grid grid-cols-10 gap-1.5",children:tz.map(r=>{let l=e===r.url;return(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=r.url,void s?.(e===t?void 0:t)},className:(0,ec.cn)("flex size-10 cursor-pointer items-center justify-center rounded-lg border p-2 transition-all",l?"border-primary bg-accent shadow-xs":"border-border hover:bg-accent"),children:(0,t.jsx)("img",{src:r.src,alt:r.name,className:"h-5 w-5 object-contain"})})}),(0,t.jsx)(u.TooltipContent,{children:r.name})]},r.name)})}),(0,t.jsxs)(o.InputGroup,{children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(tg.Link,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Or paste a custom logo URL...",value:e&&!r?e:"",onChange:e=>{let t=e.target.value.trim();s?.(t||void 0)}})]})]})})};var tD=e.i(898586);let{Text:tV}=tD.Typography,tB=[{value:"global",label:"Instance"},{value:"user",label:"Per-user"}],tq=({name:e,restField:s})=>"user"===$.Form.useWatch(["env_vars",e,"scope"])?(0,t.jsx)($.Form.Item,{...s,name:[e,"description"],className:"mb-0",children:(0,t.jsx)(W.Input,{addonBefore:(0,t.jsx)(ev.Tooltip,{title:"Per-user variables have no shared value. This text is only a hint shown to each user when they fill in their own value.",children:(0,t.jsxs)("span",{className:"text-xs text-gray-500 cursor-help whitespace-nowrap",children:[(0,t.jsx)(ew.InfoCircleOutlined,{className:"mr-1"}),"Hint"]})}),placeholder:"e.g. Your DB username",styles:{input:{color:"#9ca3af"}}})}):(0,t.jsx)($.Form.Item,{...s,name:[e,"value"],className:"mb-0",children:(0,t.jsx)(W.Input,{placeholder:"e.g. postgresql",className:"rounded-md font-mono"})}),t$=()=>(0,t.jsxs)("div",{className:"rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,t.jsx)(tV,{strong:!0,className:"text-sm",children:"Variables"}),(0,t.jsx)(ev.Tooltip,{title:(0,t.jsxs)(t.Fragment,{children:["Define variables you can interpolate in Static Headers or Authentication using"," ",(0,t.jsx)("code",{children:"${VAR_NAME}"}),". ",(0,t.jsx)("br",{}),(0,t.jsx)("b",{children:"Instance"}),": admin-defined value used for every user.",(0,t.jsx)("br",{}),(0,t.jsx)("b",{children:"Per-user"}),": each user supplies their own value (e.g. personal credentials) via the MCP Gateway dashboard."]}),children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsxs)(tV,{className:"text-xs text-gray-600 block mb-3",children:["Reference these in Static Headers or Authentication as ",(0,t.jsx)("code",{children:"${VAR_NAME}"}),". For example:"," ",(0,t.jsx)("code",{className:"bg-white px-1 rounded-sm border border-gray-200",children:"${DB_PROTOCOL}://${CORP_USERNAME}:${CORP_PASSWORD}@${DB_HOSTNAME}"})]}),(0,t.jsx)($.Form.List,{name:"env_vars",children:(e,{add:s,remove:r})=>(0,t.jsxs)("div",{className:"space-y-2",children:[e.length>0&&(0,t.jsxs)("div",{className:"flex gap-3 px-1 text-xs font-medium text-gray-500 uppercase tracking-wide",children:[(0,t.jsx)("div",{style:{flex:1},children:"Variable Name"}),(0,t.jsx)("div",{style:{flex:1},children:"Value / Description"}),(0,t.jsx)("div",{style:{width:160},children:"Scope"}),(0,t.jsx)("div",{style:{width:24}})]}),e.map(({key:e,name:s,...l})=>(0,t.jsxs)("div",{className:"flex gap-3 items-start",children:[(0,t.jsx)($.Form.Item,{...l,name:[s,"name"],className:"mb-0",style:{flex:1},rules:[{required:!0,message:"Variable name is required"},{pattern:/^[A-Za-z_][A-Za-z0-9_]*$/,message:"Use letters, digits, underscores; cannot start with a digit."}],children:(0,t.jsx)(W.Input,{placeholder:"e.g. DB_PROTOCOL",className:"rounded-md font-mono"})}),(0,t.jsx)("div",{style:{flex:1},children:(0,t.jsx)(tq,{name:s,restField:l})}),(0,t.jsx)($.Form.Item,{...l,name:[s,"scope"],className:"mb-0",initialValue:"global",style:{width:160},children:(0,t.jsx)(eb.Select,{options:tB})}),(0,t.jsx)("div",{style:{width:24,height:32},className:"flex items-center justify-center",children:(0,t.jsx)(td.MinusCircleOutlined,{onClick:()=>r(s),className:"text-gray-500 hover:text-red-500 cursor-pointer"})})]},e)),(0,t.jsx)(eR.Button,{type:"dashed",onClick:()=>s({scope:"global"}),icon:(0,t.jsx)(tu.PlusOutlined,{}),block:!0,children:"Add Variable"})]})})]});var tW=e.i(122520),tK=e.i(165615),tG=e.i(434166);let tY=({accessToken:e,getCredentials:t,getTemporaryPayload:s,onTokenReceived:r,onBeforeRedirect:l,flowSource:a})=>{let[n,i]=(0,p.useState)("idle"),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(null),m=(0,p.useRef)(!1),h=(0,p.useRef)(0),x="litellm-mcp-oauth-flow-state",g="litellm-mcp-oauth-result",f="litellm-mcp-oauth-return-url",j=(e,t)=>{(0,tG.setSecureItem)(e,t)},v=e=>{try{return(0,tG.getSecureItem)(e)}catch(t){return console.warn(`Failed to get storage item ${e}`,t),null}},y=()=>{try{window.sessionStorage.removeItem(x),window.sessionStorage.removeItem(g),window.sessionStorage.removeItem(f),window.localStorage.removeItem(x),window.localStorage.removeItem(g),window.localStorage.removeItem(f)}catch(e){console.warn("Failed to clear OAuth storage",e)}},_=()=>{let e,t,s;return s=((t=(e=window.location.pathname||"").indexOf("/ui"))>=0?e.slice(0,t+3):"").replace(/\/+$/,""),`${window.location.origin}${s}/mcp/oauth/callback`},w=(0,p.useCallback)(async()=>{let r=t()||{};if(!e){c("Missing admin token"),N.default.error("Access token missing. Please re-authenticate and try again.");return}let n=s();if(!n||!n.url||!n.transport){let e="Please complete server URL and transport before starting OAuth.";c(e),N.default.error(e);return}try{i("authorizing"),c(null);let t=await (0,b.cacheTemporaryMcpServer)(e,n),s=t?.server_id?.trim();if(!s)throw Error("Temporary MCP server identifier missing. Please retry.");let o={};if(!n.credentials?.client_id){let t=await (0,b.registerMcpOAuthClient)(e,s,{client_name:n.alias||n.server_name||s,grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:n.credentials&&n.credentials.client_secret?"client_secret_post":"none",redirect_uris:[_()]});o={clientId:t?.client_id,clientSecret:t?.client_secret}}let d=(0,tK.generateCodeVerifier)(),u=await (0,tK.generateCodeChallenge)(d),m=crypto.randomUUID(),h=o.clientId||r.client_id,p=Array.isArray(r.scopes)?r.scopes.filter(e=>e&&e.trim().length>0).join(" "):void 0,g=(0,b.buildMcpOAuthAuthorizeUrl)({serverId:s,clientId:h,redirectUri:_(),state:m,codeChallenge:u,scope:p}),v={state:m,codeVerifier:d,clientId:h,clientSecret:o.clientSecret||r.client_secret,serverId:s,redirectUri:_(),flowSource:a};if(l)try{l()}catch(e){console.error("Failed to prepare for OAuth redirect",e)}try{j(x,JSON.stringify(v)),j(f,window.location.href)}catch(e){throw Error("Unable to access browser storage for OAuth. Please enable storage and retry.")}window.location.href=g}catch(t){console.error("Failed to start OAuth flow",t),i("error");let e=(0,tW.extractErrorMessage)(t);c(e),N.default.error(e)}},[e,t,s,l]),k=(0,p.useCallback)(async()=>{if(m.current)return;let t=null,s=null;try{let e=v(g);if(!e)return;let r=v(x);if(!r)return;m.current=!0,t=JSON.parse(e),s=JSON.parse(r)}catch(e){y(),m.current=!1,c("Failed to resume OAuth flow. Please retry."),i("error"),N.default.error("Failed to resume OAuth flow. Please retry.");return}if(!t||s?.flowSource!==a){m.current=!1;return}try{window.sessionStorage.removeItem(g),window.localStorage.removeItem(g)}catch(e){}let l=h.current;try{if(!s||!s.state||!s.codeVerifier||!s.serverId)throw Error("OAuth session state was lost. This can happen if you have strict browser privacy settings. Please try again and ensure cookies/storage is enabled.");if(!t.state||t.state!==s.state)throw Error("OAuth state mismatch. Please retry.");if(t.error)throw Error(t.error_description||t.error);if(!t.code)throw Error("Authorization code missing in callback.");i("exchanging");let a=await (0,b.exchangeMcpOAuthToken)({serverId:s.serverId,code:t.code,clientId:s.clientId,clientSecret:s.clientSecret,codeVerifier:s.codeVerifier,redirectUri:s.redirectUri,accessToken:e});if(l!==h.current)return;r(a,{clientId:s.clientId,clientSecret:s.clientSecret}),u(a),i("success"),c(null),N.default.success("OAuth token retrieved successfully")}catch(t){if(l!==h.current)return;let e=(0,tW.extractErrorMessage)(t);c(e),i("error"),N.default.error(e)}finally{l===h.current&&(y(),setTimeout(()=>{m.current=!1},1e3))}},[r]);return(0,p.useEffect)(()=>{k()},[k]),{startOAuthFlow:w,status:n,error:o,tokenResponse:d,reset:(0,p.useCallback)(()=>{h.current+=1,i("idle"),c(null),u(null),m.current=!1},[])}},tJ={src:e.i(756788).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAkklEQVR42lWOOwrEIBRF3XJWkJBAUiRlAtZauAt3oGhp5wIsLATF38wbMh/mFsq7B8576PGJ914pFUK4R3R/zrnrutZ1ZYzlnN8A2vM8p2ma53kYBkopMBRjJIRABWAcx33fj+MAISqlWGuXZQEPMHillL33l6rWyjnHGG/bJoSA9rccorUGZ2vt7ypISskY8wVPejadvQjN/QQAAAAASUVORK5CYII="}.src,tQ=[eT.AUTH_TYPE.API_KEY,eT.AUTH_TYPE.BEARER_TOKEN,eT.AUTH_TYPE.TOKEN,eT.AUTH_TYPE.BASIC],tZ=[...tQ,eT.AUTH_TYPE.OAUTH2,eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,eT.AUTH_TYPE.OAUTH2_ID_JAG,eT.AUTH_TYPE.AWS_SIGV4,eT.AUTH_TYPE.TRUE_PASSTHROUGH,eT.AUTH_TYPE.OAUTH_DELEGATE],tX="litellm-mcp-oauth-create-state",t0=e=>Array.isArray(e)?e.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{},t2=({userID:e,userRole:r,accessToken:l,onCreateSuccess:a,isModalVisible:n,setModalVisible:i,availableAccessGroups:o,prefillData:c,onBackToDiscovery:d})=>{let[u]=$.Form.useForm(),[m,h]=(0,p.useState)(!1),[x,g]=(0,p.useState)({}),[f,j]=(0,p.useState)({}),[v,y]=(0,p.useState)(null),[_,w]=(0,p.useState)(!1),[k,C]=(0,p.useState)([]),[T,S]=(0,p.useState)(!1),[A,I]=(0,p.useState)({}),[O,P]=(0,p.useState)({}),[M,F]=(0,p.useState)(""),[E,L]=(0,p.useState)([]),[R,U]=(0,p.useState)(""),[z,H]=(0,p.useState)(null),[V,B]=(0,p.useState)(void 0),[K,G]=(0,p.useState)(null),[Y,J]=(0,p.useState)(void 0),Q=p.default.useRef(null),[Z,X]=(0,p.useState)(!1),{tools:ee,isLoadingTools:et,toolsError:es,toolsErrorStatus:er,toolsErrorStackTrace:el,canFetchTools:ea,fetchTools:en,clearTools:ei}=(({accessToken:e,oauthAccessToken:t,formValues:s,enabled:r=!0})=>{let[l,a]=(0,p.useState)([]),[n,i]=(0,p.useState)(!1),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(null),[m,h]=(0,p.useState)(null),[x,g]=(0,p.useState)(!1),f=s.auth_type===eT.AUTH_TYPE.OAUTH2&&s.oauth_flow_type===eT.OAUTH_FLOW.M2M,j=(0,eT.isClientForwardedTokenMode)(s.auth_type),v=s.auth_type===eT.AUTH_TYPE.OAUTH2&&!f||j,y=s.transport===eT.TRANSPORT.OPENAPI,_=y?!!s.spec_path:!!s.url,N=y?!!(_&&e):!!(_&&s.transport&&s.auth_type&&e&&(!v||t)),w=JSON.stringify(s.static_headers??{}),k=JSON.stringify(s.credentials??{}),C=async()=>{if(e&&(s.url||s.spec_path)&&(!v||t||y)){i(!0),c(null),u(null);try{let r=Array.isArray(s.static_headers)?s.static_headers.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=t?.value!=null?String(t.value):""),e},{}):!Array.isArray(s.static_headers)&&s.static_headers&&"object"==typeof s.static_headers?Object.entries(s.static_headers).reduce((e,[t,s])=>(t&&(e[t]=null!=s?String(s):""),e),{}):{},l=s.credentials&&"object"==typeof s.credentials?Object.entries(s.credentials).reduce((e,[t,s])=>{if(null==s||""===s)return e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{}):void 0,n=s.transport===eT.TRANSPORT.OPENAPI?"http":s.transport,i={server_id:s.server_id||"",server_name:s.server_name||"",url:s.url,spec_path:s.spec_path,transport:n,auth_type:s.auth_type,authorization_url:s.authorization_url,token_url:s.token_url,registration_url:s.registration_url,mcp_info:s.mcp_info,static_headers:r};l&&Object.keys(l).length>0&&(i.credentials=l);let o=await (0,b.testMCPToolsListRequest)(e,i,t);if(o.tools&&!o.error)a(o.tools),c(null),u(null),h(null),o.tools.length>0&&!x&&g(!0);else{let e=o.message||"Failed to retrieve tools list";c(e),u("number"==typeof o.status?o.status:null),h(403===o.status?null:o.stack_trace||null),a([]),g(!1)}}catch(e){console.error("Tools fetch error:",e),c(e instanceof Error?e.message:String(e)),u(null),h(null),a([]),g(!1)}finally{i(!1)}}},T=(0,p.useCallback)(()=>{a([]),c(null),u(null),h(null),g(!1)},[]);return(0,p.useEffect)(()=>{r&&(N?C():T())},[s.url,s.spec_path,s.transport,s.auth_type,e,r,t,N,w,k]),{tools:l,isLoadingTools:n,toolsError:o,toolsErrorStatus:d,toolsErrorStackTrace:m,hasShownSuccessMessage:x,canFetchTools:N,fetchTools:C,clearTools:T}})({accessToken:l,oauthAccessToken:z,formValues:f,enabled:!0}),eo=f.auth_type,ec=!!eo&&tQ.includes(eo),ed=eo===eT.AUTH_TYPE.OAUTH2,eu=eo===eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,em=eo===eT.AUTH_TYPE.OAUTH2_ID_JAG,eh=eo===eT.AUTH_TYPE.AWS_SIGV4,ex=ed&&f.oauth_flow_type===eT.OAUTH_FLOW.M2M,{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej,reset:eS}=tY({accessToken:l,getCredentials:()=>({...u.getFieldValue("credentials")??{},...Q.current??{}}),getTemporaryPayload:()=>{let e=u.getFieldsValue(!0),t=e.transport||M,s=e.url||(t===eT.TRANSPORT.OPENAPI?e.spec_path:void 0);if(!s||!t)return null;let r=t0(e.static_headers);return{server_id:void 0,server_name:e.server_name,alias:e.alias,description:e.description,url:s,transport:t===eT.TRANSPORT.OPENAPI?"http":t,auth_type:(0,eT.isClientForwardedTokenMode)(e.auth_type)?e.auth_type:eT.AUTH_TYPE.OAUTH2,credentials:(0,eT.isClientForwardedTokenMode)(e.auth_type)?(0,eT.preservedAdminCredentials)(e.credentials):{...e.credentials??{},...Q.current??{}},issuer:e.issuer,authorization_url:e.authorization_url,token_url:e.token_url,registration_url:e.registration_url,mcp_access_groups:e.mcp_access_groups,static_headers:r,command:e.command,args:e.args,env:e.env}},onTokenReceived:(e,t)=>{if(H(e?.access_token??null),!e?.access_token)return;if((0,eT.isClientForwardedTokenMode)(u.getFieldValue("auth_type"))){J((0,eT.getOAuthAuthorizationIdentity)(u.getFieldsValue(!0))),N.default.success("Token held for this browser session. Tools can now be previewed and configured; the token is not saved to LiteLLM.");return}Q.current=t?.clientId?{client_id:t.clientId,...t.clientSecret&&{client_secret:t.clientSecret}}:null;let s=u.getFieldValue("credentials")??{},r={...(0,eT.preservedAdminCredentials)(s)??{},...void 0!==s.scopes&&{scopes:s.scopes},access_token:e.access_token,...e.refresh_token&&{refresh_token:e.refresh_token},...e.expires_in&&{expires_in:e.expires_in},...e.scope&&{scope:e.scope}};u.setFieldValue("credentials",r),J((0,eT.getOAuthAuthorizationIdentity)(u.getFieldsValue(!0))),N.default.success("OAuth authorization successful! Please click 'Create MCP Server' to save the configuration.")},onBeforeRedirect:()=>{try{let e=u.getFieldsValue(!0);(0,tG.setSecureItem)(tX,JSON.stringify({modalVisible:n,formValues:e,transportType:M,costConfig:x,allowedTools:k,hasToolAllowlistInteraction:T,searchValue:R,aliasManuallyEdited:_,logoUrl:V,authorizedIdentity:Y}))}catch(e){console.warn("Failed to persist MCP create state",e)}},flowSource:"create"}),eA=(e={})=>{H(null),ei(),eS(),J(void 0),Q.current=null;let t=(0,eT.preservedAdminCredentials)(u.getFieldValue("credentials"));u.resetFields([...eT.CLEARED_ON_INVALIDATION]),t&&u.setFieldsValue({credentials:t});let s=Object.fromEntries(eT.CLEARED_ON_INVALIDATION.filter(t=>t in e).map(t=>[t,e[t]]));Object.keys(s).length>0&&u.setFieldsValue(s)};p.default.useEffect(()=>{let e=(0,tG.getSecureItem)(tX);if(e)try{let t=JSON.parse(e);t.modalVisible&&i(!0);let s=t.formValues?.transport||t.transportType||"";if(s&&F(s),t.formValues){let e={...t.formValues,credentials:(0,eT.withoutMintedTokenCredentials)(t.formValues.credentials)};y({values:e,transport:s})}"string"==typeof t.authorizedIdentity&&J(t.authorizedIdentity),t.costConfig&&g(t.costConfig),t.allowedTools&&C(t.allowedTools),"boolean"==typeof t.hasToolAllowlistInteraction&&S(t.hasToolAllowlistInteraction),t.searchValue&&U(t.searchValue),"boolean"==typeof t.aliasManuallyEdited&&w(t.aliasManuallyEdited),t.logoUrl&&B(t.logoUrl)}catch(e){console.error("Failed to restore MCP create state",e)}finally{window.sessionStorage.removeItem(tX)}},[u,i]),p.default.useEffect(()=>{v&&(M||v.transport,(!v.transport||M)&&(u.setFieldsValue(v.values),j(v.values),y(null)))},[v,u,M]),p.default.useEffect(()=>{if(!n||!c)return;let e=(c.name||"").replace(/[^a-zA-Z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),t=c.transport||"";F(t);let s={server_name:e,alias:e,description:c.description||"",transport:t};if("stdio"===t){let e={};if(c.command&&(e.command=c.command),c.args&&c.args.length>0&&(e.args=c.args),c.env_vars&&c.env_vars.length>0){let t={};for(let e of c.env_vars)t[e.name]=e.description?`<${e.description}>`:"";e.env=t}Object.keys(e).length>0&&(s.stdio_config=JSON.stringify(e,null,2))}else c.url&&(s.url=c.url);u.setFieldsValue(s),j(s),w(!1)},[n,c,u]);let eI=async t=>{let s=Object.entries(A).find(([,e])=>e&&!ts.test(e));if(s)return void N.default.fromBackend(`Tool display name "${s[1]}" is invalid. Only letters, digits, underscores, and hyphens are allowed (no spaces).`);h(!0);try{let{static_headers:s,env_vars:r,stdio_config:n,credentials:o,allow_all_keys:c,available_on_public_internet:d,delegate_auth_to_upstream:m,oauth_passthrough:p,dcr_bridge:f,token_validation_json:j,...v}=t,y=v.mcp_access_groups,_=t0(s),I=tr(r),P=o&&"object"==typeof o?Object.entries(o).reduce((e,[t,s])=>{if(null==s||""===s)return e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{}):void 0,F={};if(n&&"stdio"===M)try{let e=JSON.parse(n),t=e;if(e.mcpServers&&"object"==typeof e.mcpServers){let s=Object.keys(e.mcpServers);if(s.length>0){let r=s[0];t=e.mcpServers[r],v.server_name||(v.server_name=r.replace(/-/g,"_"))}}F={command:t.command,args:t.args,env:t.env}}catch(e){N.default.fromBackend("Invalid JSON in stdio configuration");return}v.transport===eT.TRANSPORT.OPENAPI&&(v.transport="http");let E=null;if(j&&""!==j.trim())try{E=JSON.parse(j)}catch{N.default.fromBackend("Invalid JSON in Token Validation Rules"),h(!1);return}let L={...v,...F,stdio_config:void 0,mcp_info:{server_name:v.server_name||v.url,description:v.description,logo_url:V||void 0,mcp_server_cost_info:Object.keys(x).length>0?x:null,tool_allowlist_enforced:T||k.length>0},mcp_access_groups:y,alias:v.alias,allowed_tools:k,tool_name_to_display_name:A,tool_name_to_description:O,allow_all_keys:!!c,available_on_public_internet:!!d,delegate_auth_to_upstream:!!m,oauth_passthrough:!!p,dcr_bridge:!!(0,eT.isClientForwardedTokenMode)(v.auth_type)&&!!(f??!0),...v.auth_type===eT.AUTH_TYPE.OAUTH2?{oauth2_flow:t.oauth_flow_type===eT.OAUTH_FLOW.M2M?eT.MCP_OAUTH2_FLOW_M2M:eT.MCP_OAUTH2_FLOW_INTERACTIVE}:{},static_headers:_,env_vars:I,...null!==E&&{token_validation:E}},R=v.auth_type&&tZ.includes(v.auth_type),U=(0,eT.isClientForwardedTokenMode)(v.auth_type)?(0,eT.preservedAdminCredentials)(P):P;if(R&&U&&Object.keys(U).length>0&&(L.credentials=U),v.auth_type===eT.AUTH_TYPE.OAUTH2&&Q.current&&(L.credentials={...L.credentials??{},...Q.current}),null!=l){let s=eF?await (0,b.createMCPServer)(l,L):await (0,b.registerMCPServer)(l,L);if(ej?.access_token&&s?.server_id){let r=(0,eT.getMcpOAuthMode)({auth_type:v.auth_type,oauth2_flow:t.oauth_flow_type===eT.OAUTH_FLOW.M2M?eT.MCP_OAUTH2_FLOW_M2M:null,delegate_auth_to_upstream:!!m});if("authorization_code"===r){let e=ej.scope,t={access_token:ej.access_token,refresh_token:ej.refresh_token,expires_in:ej.expires_in,scopes:"string"==typeof e&&e?e.split(" "):void 0};await (0,b.storeMCPOAuthUserCredential)(l,s.server_id,t)}else{let t={access_token:ej.access_token,expires_in:ej.expires_in,refresh_token:ej.refresh_token,token_type:ej.token_type};(0,eC.setToken)(s.server_id,t,e)}}N.default.success(eF?"MCP Server created successfully":{message:"MCP Server submitted for admin review",description:"Once an admin approves it, the server will appear in your MCP Servers list."}),u.resetFields(),g({}),ei(),C([]),S(!1),w(!1),B(void 0),i(!1),a(s)}}catch(t){let e=t instanceof Error?t.message:String(t);N.default.fromBackend(eF?`Error creating MCP Server: ${e}`:`Error submitting MCP Server: ${e}`)}finally{h(!1)}},eO=()=>{u.resetFields(),g({}),ei(),C([]),S(!1),w(!1),B(void 0),J(void 0),Q.current=null,X(!1),i(!1)};p.default.useEffect(()=>{if(!_&&f.server_name){let e=f.server_name.replace(/\s+/g,"_");u.setFieldsValue({alias:e}),j(t=>({...t,alias:e}))}},[f.server_name]);let eP=p.default.useRef(n);p.default.useEffect(()=>{let e=eP.current;eP.current=n,!n&&e&&(u.resetFields(),j({}),H(null),ei(),eS(),J(void 0),Q.current=null,X(!1))},[n,u,ei,eS]);let eF=(0,s.isAdminRole)(r),eE=(e,t)=>{if("credentials"in e)X(!1);else{let t=["url","spec_path","issuer","authorization_url","token_url","registration_url"].some(t=>t in e),s=void 0!==(0,eT.preservedDeclaredAppCredentials)(u.getFieldValue("credentials"));t&&s&&X(!0)}if((0,eT.isHeldOAuthTokenStale)(u.getFieldsValue(!0),Y)){eA(e),j(u.getFieldsValue(!0));return}j(t)};return(0,t.jsx)(q.Modal,{title:(0,t.jsxs)("div",{className:"flex items-center pb-4 border-b border-gray-100",style:{gap:12},children:[d&&(0,t.jsx)("button",{onClick:d,className:"text-sm text-blue-600 hover:text-blue-800 cursor-pointer bg-transparent border-none",style:{flexShrink:0},children:"←"}),(0,t.jsx)("img",{src:tJ,alt:"MCP Logo",className:"w-8 h-8 object-contain",style:{height:"20px",width:"20px",objectFit:"contain"}}),(0,t.jsx)("h2",{className:"text-xl font-semibold text-gray-900",children:eF?"Add New MCP Server":"Submit MCP Server for Review"})]}),open:n,width:1e3,onCancel:eO,footer:null,forceRender:!0,className:"top-8",styles:{body:{padding:"24px"},header:{padding:"24px 24px 0 24px",border:"none"}},children:(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsxs)($.Form,{form:u,onFinish:eI,onValuesChange:eE,layout:"vertical",className:"space-y-6",children:[!eF&&(0,t.jsx)("div",{className:"rounded-md bg-blue-50 border border-blue-200 px-4 py-3 text-sm text-blue-800",children:"Your submission will be sent for admin review. Once approved, the server will appear in your MCP Servers list. The request must be made with a team-scoped API key."}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-6",children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["MCP Server Name",(0,t.jsx)(ev.Tooltip,{title:"Best practice: Use a descriptive name that indicates the server's purpose (e.g., 'GitHub_MCP', 'Email_Service'). Cannot contain spaces or hyphens; use underscores instead. Names must comply with SEP-986 and will be rejected if invalid (https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool-names).",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"server_name",rules:[{required:!1,message:"Please enter a server name"},{validator:(e,t)=>tt(t)}],children:(0,t.jsx)(ek.TextInput,{placeholder:"e.g., GitHub_MCP, Zapier_MCP, etc.",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Alias",(0,t.jsx)(ev.Tooltip,{title:"A short, unique identifier for this server. Defaults to the server name if not provided. Cannot contain spaces or hyphens; use underscores instead.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"alias",rules:[{required:!1},{validator:(e,t)=>tt(t)}],children:(0,t.jsx)(ek.TextInput,{placeholder:"e.g., GitHub_MCP, Zapier_MCP, etc.",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",onChange:()=>w(!0)})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Description"}),name:"description",rules:[{required:!1,message:"Please enter a server description"}],children:(0,t.jsx)(ek.TextInput,{placeholder:"Brief description of what this server does",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(tH,{value:V,onChange:B}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"GitHub / Source URL"}),name:"source_url",children:(0,t.jsx)(ek.TextInput,{placeholder:"https://github.com/org/mcp-server",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Transport Type"}),name:"transport",rules:[{required:!0,message:"Please select a transport type"}],children:(0,t.jsxs)(eb.Select,{placeholder:"Select transport",className:"rounded-lg",size:"large",onChange:e=>{F(e);let t="stdio"===e?{url:void 0,spec_path:void 0,auth_type:void 0,credentials:void 0}:e===eT.TRANSPORT.OPENAPI?{url:void 0,command:void 0,args:void 0,env:void 0}:{spec_path:void 0,command:void 0,args:void 0,env:void 0};u.setFieldsValue(t),(0,eT.isHeldOAuthTokenStale)(u.getFieldsValue(!0),Y)&&eA(),j(u.getFieldsValue(!0))},value:M,children:[(0,t.jsx)(eb.Select.Option,{value:"http",children:"Streamable HTTP (Recommended)"}),(0,t.jsx)(eb.Select.Option,{value:"sse",children:"Server-Sent Events (SSE)"}),(0,t.jsx)(eb.Select.Option,{value:"stdio",children:"Standard Input/Output (stdio)"}),(0,t.jsx)(eb.Select.Option,{value:eT.TRANSPORT.OPENAPI,children:"OpenAPI Spec"})]})}),("http"===M||"sse"===M)&&(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"MCP Server URL"}),name:"url",rules:[{required:!0,message:"Please enter a server URL"},{validator:(e,t)=>te(t)}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-mcp-server.com",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),M===eT.TRANSPORT.OPENAPI&&(0,t.jsx)(tp,{form:u,accessToken:n?l:null,onValuesChange:e=>eE(e,{...u.getFieldsValue(!0),...e}),onKeyToolsChange:L,onLogoUrlChange:B,onOAuthDocsUrlChange:G}),M===eT.TRANSPORT.OPENAPI&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center gap-2",children:["BYOK (Bring Your Own Key)",(0,t.jsx)(ev.Tooltip,{title:"When enabled, each user provides their own API key for this service. Keys are stored per-user and never shared.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"is_byok",valuePropName:"checked",children:(0,t.jsx)(e_.Switch,{})}),(0,t.jsx)($.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.is_byok!==t.is_byok||e.auth_type!==t.auth_type,children:({getFieldValue:e})=>e("is_byok")?(0,t.jsxs)(t.Fragment,{children:[e("auth_type")&&"none"!==e("auth_type")&&(0,t.jsxs)("div",{className:"mb-4 p-3 bg-blue-50 rounded-lg text-sm text-blue-700 flex items-start gap-2",children:[(0,t.jsx)(ew.InfoCircleOutlined,{className:"mt-0.5 shrink-0"}),(0,t.jsxs)("span",{children:["User keys will be sent as:"," ",(0,t.jsxs)("code",{className:"font-mono bg-blue-100 px-1 rounded-sm",children:["bearer_token"===e("auth_type")&&"Authorization: Bearer {key}","token"===e("auth_type")&&"Authorization: token {key}","api_key"===e("auth_type")&&"x-api-key: {key}","basic"===e("auth_type")&&"Authorization: Basic {key}","authorization"===e("auth_type")&&"Authorization: {key}"]}),!e("auth_type")&&"Set Authentication Type below to specify the format."]})]}),!e("auth_type")&&(0,t.jsxs)("div",{className:"mb-4 p-3 bg-yellow-50 rounded-lg text-sm text-yellow-700 flex items-start gap-2",children:[(0,t.jsx)(ew.InfoCircleOutlined,{className:"mt-0.5 shrink-0"}),(0,t.jsxs)("span",{children:["Set the ",(0,t.jsx)("strong",{children:"Authentication Type"})," below to specify how user keys are sent (e.g., Bearer Token, API Key header)."]})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Access Description",(0,t.jsx)(ev.Tooltip,{title:"List of permissions shown to users in the connection modal (e.g. 'Create and manage Jira issues')",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"byok_description",children:(0,t.jsx)(eb.Select,{mode:"tags",placeholder:"Add access description items (press Enter after each)",className:"w-full",tokenSeparators:[","]})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["API Key Help URL",(0,t.jsx)(ev.Tooltip,{title:"Optional link shown to users to help them find their API key",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"byok_api_key_help_url",children:(0,t.jsx)(W.Input,{placeholder:"https://docs.example.com/api-keys"})})]}):null})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Max Concurrent Requests (optional)",(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tool calls LiteLLM will run against this server at the same time. Additional calls wait for a free slot. Leave blank for no limit.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"max_concurrent_requests",children:(0,t.jsx)(ey.InputNumber,{min:1,precision:0,placeholder:"e.g. 10",style:{width:"100%"},className:"rounded-lg"})}),"stdio"!==M&&""!==M&&(0,t.jsx)(eN.Collapse,{defaultActiveKey:["auth"],className:"mb-4",items:[{key:"auth",label:(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-700",children:"Authentication"}),children:(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{name:"auth_type",rules:[{required:!0,message:"Please select an auth type"}],children:(0,t.jsxs)(eb.Select,{placeholder:"Select auth type",className:"rounded-lg",size:"large",virtual:!1,children:[(0,t.jsx)(eb.Select.Option,{value:"none",children:"None"}),(0,t.jsx)(eb.Select.Option,{value:"api_key",children:"API Key"}),(0,t.jsx)(eb.Select.Option,{value:"bearer_token",children:"Bearer Token"}),(0,t.jsx)(eb.Select.Option,{value:"token",children:"Token"}),(0,t.jsx)(eb.Select.Option,{value:"basic",children:"Basic Auth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2",children:"OAuth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_token_exchange",children:"OAuth Token Exchange (OBO)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_id_jag",children:"ID-JAG (Okta Cross App Access)"}),(0,t.jsx)(eb.Select.Option,{value:"aws_sigv4",children:"AWS SigV4 (Bedrock AgentCore MCPs)"}),(0,t.jsx)(eb.Select.Option,{value:"true_passthrough",children:"True Passthrough (no LiteLLM auth)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth_delegate",children:"OAuth Delegate (client-supplied upstream token)"})]})}),(0,t.jsx)(eL,{authType:eo}),(0,t.jsx)(eH,{authType:eo,dcrBridgeInitialChecked:!0,oauthFlow:{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej},appMayNotMatchUpstream:Z}),ec&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Authentication Value",(0,t.jsx)(ev.Tooltip,{title:"Token, password, or header value to send with each request for the selected auth type.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","auth_value"],rules:[{validator:(e,t)=>t&&"string"==typeof t&&""===t.trim()?Promise.reject(Error("Authentication value cannot be empty whitespace")):Promise.resolve()}],children:(0,t.jsx)(ek.TextInput,{type:"password",placeholder:"Enter token or secret",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),ed&&(0,t.jsx)(eM,{isM2M:ex,initialFlowType:eT.OAUTH_FLOW.INTERACTIVE,docsUrl:K,oauthFlow:{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej}}),eu&&(0,t.jsx)(eB,{}),em&&(0,t.jsx)(eW,{})]})}]}),"stdio"!==M&&""!==M&&eh&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-2",children:["For MCP servers hosted on AWS Bedrock AgentCore."," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/mcp_aws_sigv4",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700",children:"View docs →"})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Region",(0,t.jsx)(ev.Tooltip,{title:"AWS region for SigV4 signing (e.g., us-east-1)",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_region_name"],rules:[{required:!0,message:"AWS region is required for SigV4 auth"}],children:(0,t.jsx)(W.Input,{placeholder:"us-east-1",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Service Name",(0,t.jsx)(ev.Tooltip,{title:"AWS service name for SigV4 signing. Defaults to 'bedrock-agentcore'.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_service_name"],children:(0,t.jsx)(W.Input,{placeholder:"bedrock-agentcore",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Access Key ID",(0,t.jsx)(ev.Tooltip,{title:"Optional. If not provided, falls back to the boto3 credential chain (IAM role, env vars, etc.).",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_access_key_id"],dependencies:[["credentials","aws_secret_access_key"]],rules:[({getFieldValue:e})=>({validator:(t,s)=>e(["credentials","aws_secret_access_key"])&&!s?Promise.reject(Error("Access Key ID is required when Secret Access Key is provided")):Promise.resolve()})],children:(0,t.jsx)(W.Input.Password,{placeholder:"AKIA... (optional — uses IAM role if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Secret Access Key",(0,t.jsx)(ev.Tooltip,{title:"Optional. Required if AWS Access Key ID is provided.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_secret_access_key"],dependencies:[["credentials","aws_access_key_id"]],rules:[({getFieldValue:e})=>({validator:(t,s)=>e(["credentials","aws_access_key_id"])&&!s?Promise.reject(Error("Secret Access Key is required when Access Key ID is provided")):Promise.resolve()})],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter secret key (optional — uses IAM role if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Token",(0,t.jsx)(ev.Tooltip,{title:"Optional. Only needed for temporary STS credentials.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_token"],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter session token (optional)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Role ARN",(0,t.jsx)(ev.Tooltip,{title:"Optional. IAM role ARN to assume via STS before signing. If set, LiteLLM calls sts:AssumeRole to get temporary credentials. Uses ambient credentials (IAM role, env vars) as the source identity unless explicit keys are also provided.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_role_name"],children:(0,t.jsx)(W.Input,{placeholder:"arn:aws:iam::123456789012:role/MyRole (optional)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Name",(0,t.jsx)(ev.Tooltip,{title:"Optional. Session name for the AssumeRole call — appears in CloudTrail logs. Auto-generated if omitted.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_name"],children:(0,t.jsx)(W.Input,{placeholder:"litellm-prod (optional, auto-generated if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})]}),(0,t.jsx)(ti,{isVisible:"stdio"===M})]}),(0,t.jsx)("div",{className:"mt-8",children:(0,t.jsx)(t$,{})}),(0,t.jsx)("div",{className:"mt-8",children:(0,t.jsx)(th,{availableAccessGroups:o,mcpServer:null,searchValue:R,setSearchValue:U,getAccessGroupOptions:()=>{let e=o.map(e=>({value:e,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:e})]})}));return R&&!o.some(e=>e.toLowerCase().includes(R.toLowerCase()))&&e.push({value:R,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:R}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-1",children:"create new group"})]})}),e}})}),(0,t.jsx)("div",{className:"mt-8 pt-6 border-t border-gray-200",children:(0,t.jsx)(e4,{formValues:f,tools:ee,isLoadingTools:et,toolsError:es,toolsErrorStatus:er,toolsErrorStackTrace:el,canFetchTools:ea,fetchTools:en})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(tn,{accessToken:l,formValues:f,allowedTools:k,existingAllowedTools:null,onAllowedToolsChange:C,hasToolAllowlistInteraction:T,onToolAllowlistInteraction:()=>S(!0),toolNameToDisplayName:A,toolNameToDescription:O,onToolNameToDisplayNameChange:I,onToolNameToDescriptionChange:P,keyTools:E,externalTools:ee,externalIsLoading:et,externalError:es,externalErrorStatus:er,externalCanFetch:ea})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(eX,{value:x,onChange:g,tools:ee.filter(e=>k.includes(e.name)),disabled:!1})}),(0,t.jsxs)("div",{className:"flex items-center justify-end space-x-3 pt-6 border-t border-gray-100",children:[(0,t.jsx)(D.Button,{variant:"secondary",onClick:eO,children:"Cancel"}),(0,t.jsx)(D.Button,{variant:"primary",loading:m,children:m?"Creating...":"Add MCP Server"})]})]})})})};var t1=e.i(175712),t4=e.i(404206),t5=e.i(723731),t3=e.i(653824),t6=e.i(881073),t7=e.i(197647),t8=e.i(118366),t9=e.i(758472),se=e.i(868054);let st=(0,r.default)("globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);var ss=e.i(634831),sr=e.i(438100);let sl=(0,r.default)("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),{Title:sa,Text:sn}=tD.Typography,{Panel:si}=eN.Collapse,so=({icon:e,title:s,description:r,children:l,serverName:a,accessGroups:n=["dev-group"]})=>{let[i,o]=(0,p.useState)(!1);return(0,t.jsxs)(t1.Card,{className:"border border-gray-200",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)("span",{className:"p-2 rounded-lg bg-gray-50",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)(sa,{level:5,className:"mb-0",children:s}),(0,t.jsx)(sn,{className:"text-gray-600",children:r})]})]}),a&&("Implementation Example"===s||"Configuration"===s)&&(0,t.jsxs)($.Form.Item,{className:"mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,t.jsx)(e_.Switch,{size:"small",checked:i,onChange:o}),(0,t.jsxs)(sn,{className:"text-sm",children:["Limit tools to specific MCP servers or MCP groups by passing the ",(0,t.jsx)("code",{children:"x-mcp-servers"})," header"]})]}),i&&(0,t.jsx)(to.Alert,{className:"mt-2",type:"info",showIcon:!0,message:"Two Options",description:(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{children:"Option 1:"})," Get a specific server: ",(0,t.jsxs)("code",{children:['"',a.replace(/\s+/g,"_"),'"']})]}),(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{children:"Option 2:"})," Get a group of MCPs: ",(0,t.jsx)("code",{children:'"dev-group"'})]}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-gray-600",children:["You can also mix both: ",(0,t.jsx)("code",{children:'"Server1,dev-group"'})]})]})})]}),p.default.Children.map(l,e=>{if(p.default.isValidElement(e)&&e.props.hasOwnProperty("code")&&e.props.hasOwnProperty("copyKey")){let t=e.props.code;if(t&&t.includes('"headers":'))return p.default.cloneElement(e,{code:t.replace(/"headers":\s*{[^}]*}/,`"headers": ${JSON.stringify((()=>{let e={"x-litellm-api-key":"Bearer YOUR_LITELLM_API_KEY"};if(i&&a){let t=[a.replace(/\s+/g,"_"),...n].join(",");e["x-mcp-servers"]=t}return e})(),null,8)}`)})}return e})]})},sc=({currentServerAccessGroups:e=[]})=>{let s=(0,b.getProxyBaseUrl)(),[r,l]=(0,p.useState)({}),[a,n]=(0,p.useState)({openai:[],litellm:[],cursor:[],http:[]}),[i]=(0,p.useState)("Zapier_MCP"),o=async(e,t)=>{await (0,ed.copyToClipboard)(e)&&(l(e=>({...e,[t]:!0})),setTimeout(()=>{l(e=>({...e,[t]:!1}))},2e3))},c=({code:e,copyKey:s,title:l,className:a=""})=>(0,t.jsxs)("div",{className:"relative group",children:[l&&(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,t.jsx)(t9.Code,{size:16,className:"text-blue-600"}),(0,t.jsx)(sn,{strong:!0,className:"text-gray-700",children:l})]}),(0,t.jsxs)(t1.Card,{className:`bg-gray-50 border border-gray-200 relative ${a}`,children:[(0,t.jsx)(eR.Button,{type:"text",size:"small",icon:r[s]?(0,t.jsx)(k.CheckIcon,{size:12}):(0,t.jsx)(t8.CopyIcon,{size:12}),onClick:()=>o(e,s),className:`absolute top-2 right-2 z-10 transition-all duration-200 ${r[s]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`}),(0,t.jsx)("pre",{className:"text-sm overflow-x-auto pr-10 text-gray-800 font-mono leading-relaxed",children:e})]})]}),d=({step:e,title:s,children:r})=>(0,t.jsxs)("div",{className:"flex gap-4",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("div",{className:"w-8 h-8 bg-blue-600 text-white rounded-full flex items-center justify-center text-sm font-semibold",children:e})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)(sn,{strong:!0,className:"text-gray-800 block mb-2",children:s}),r]})]});return(0,t.jsx)("div",{children:(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(B.Title,{className:"text-3xl font-bold text-gray-900 mb-3",children:"Connect to your MCP client"}),(0,t.jsx)(V.Text,{className:"text-lg text-gray-600",children:"Use tools directly from any MCP client with LiteLLM MCP. Enable your AI assistant to perform real-world tasks through a simple, secure connection."})]}),(0,t.jsxs)(t3.TabGroup,{className:"w-full",children:[(0,t.jsx)(t6.TabList,{className:"flex justify-start mt-8 mb-6",children:(0,t.jsxs)("div",{className:"flex bg-gray-100 p-1 rounded-lg",children:[(0,t.jsx)(t7.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(t9.Code,{size:18}),"OpenAI API"]})}),(0,t.jsx)(t7.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(sl,{size:18}),"LiteLLM Proxy"]})}),(0,t.jsx)(t7.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(se.Terminal,{size:18}),"Cursor"]})}),(0,t.jsx)(t7.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(st,{size:18}),"Streamable HTTP"]})})]})}),(0,t.jsxs)(t5.TabPanels,{children:[(0,t.jsx)(t4.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-blue-50 to-indigo-50 p-6 rounded-lg border border-blue-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(t9.Code,{className:"text-blue-600",size:24}),(0,t.jsx)(sa,{level:4,className:"mb-0 text-blue-900",children:"OpenAI Responses API Integration"})]}),(0,t.jsx)(sn,{className:"text-blue-700",children:"Connect OpenAI Responses API to your LiteLLM MCP server for seamless tool integration"})]}),(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(so,{icon:(0,t.jsx)(sr.KeyIcon,{className:"text-blue-600",size:16}),title:"API Key Setup",description:"Configure your OpenAI API key for authentication",children:(0,t.jsxs)(tc.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsxs)(sn,{children:["Get your API key from the"," ",(0,t.jsxs)("a",{href:"https://platform.openai.com/api-keys",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-700 inline-flex items-center gap-1",children:["OpenAI platform ",(0,t.jsx)(ss.ExternalLinkIcon,{size:12})]})]})}),(0,t.jsx)(c,{title:"Environment Variable",code:'export OPENAI_API_KEY="sk-..."',copyKey:"openai-env"})]})}),(0,t.jsx)(so,{icon:(0,t.jsx)(S.ServerIcon,{className:"text-blue-600",size:16}),title:"MCP Server Information",description:"Connection details for your LiteLLM MCP server",children:(0,t.jsx)(c,{title:"Server URL",code:`${s}/mcp`,copyKey:"openai-server-url"})}),(0,t.jsx)(so,{icon:(0,t.jsx)(t9.Code,{className:"text-blue-600",size:16}),title:"Implementation Example",description:"Complete cURL example for using the Responses API",serverName:"Zapier Gmail",accessGroups:["dev-group"],children:(0,t.jsx)(c,{code:`curl --location 'https://api.openai.com/v1/responses' \\ ---header 'Content-Type: application/json' \\ ---header "Authorization: Bearer $OPENAI_API_KEY" \\ ---data '{ - "model": "gpt-4.1", - "tools": [ - { - "type": "mcp", - "server_label": "litellm", - "server_url": "${s}/mcp", - "require_approval": "never", - "headers": { - "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY", - "x-mcp-servers": "Zapier_MCP,dev-group" - } - } - ], - "input": "Run available tools", - "tool_choice": "required" -}'`,copyKey:"openai-curl",className:"text-xs"})})]})]}),{})}),(0,t.jsx)(t4.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-emerald-50 to-green-50 p-6 rounded-lg border border-emerald-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(sl,{className:"text-emerald-600",size:24}),(0,t.jsx)(sa,{level:4,className:"mb-0 text-emerald-900",children:"LiteLLM Proxy API Integration"})]}),(0,t.jsx)(sn,{className:"text-emerald-700",children:"Connect to LiteLLM Proxy Responses API for seamless tool integration with multiple model providers"})]}),(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(so,{icon:(0,t.jsx)(sr.KeyIcon,{className:"text-emerald-600",size:16}),title:"Virtual Key Setup",description:"Configure your LiteLLM Proxy Virtual Key for authentication",children:(0,t.jsxs)(tc.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsx)(sn,{children:"Get your Virtual Key from your LiteLLM Proxy dashboard or contact your administrator"})}),(0,t.jsx)(c,{title:"Environment Variable",code:'export LITELLM_API_KEY="sk-..."',copyKey:"litellm-env"})]})}),(0,t.jsx)(so,{icon:(0,t.jsx)(S.ServerIcon,{className:"text-emerald-600",size:16}),title:"MCP Server Information",description:"Connection details for your LiteLLM MCP server",children:(0,t.jsx)(c,{title:"Server URL",code:`${s}/mcp`,copyKey:"litellm-server-url"})}),(0,t.jsx)(so,{icon:(0,t.jsx)(t9.Code,{className:"text-emerald-600",size:16}),title:"Implementation Example",description:"Complete cURL example for using the LiteLLM Proxy Responses API",serverName:i,accessGroups:["dev-group"],children:(0,t.jsx)(c,{code:`curl --location '${s}/v1/responses' \\ ---header 'Content-Type: application/json' \\ ---header "Authorization: Bearer $LITELLM_VIRTUAL_KEY" \\ ---data '{ - "model": "gpt-4", - "tools": [ - { - "type": "mcp", - "server_label": "litellm", - "server_url": "litellm_proxy", - "require_approval": "never", - "headers": { - "x-litellm-api-key": "Bearer YOUR_LITELLM_VIRTUAL_KEY", - "x-mcp-servers": "Zapier_MCP,dev-group" - } - } - ], - "input": "Run available tools", - "tool_choice": "required" -}'`,copyKey:"litellm-curl",className:"text-xs"})})]})]}),{})}),(0,t.jsx)(t4.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-purple-50 to-blue-50 p-6 rounded-lg border border-purple-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(se.Terminal,{className:"text-purple-600",size:24}),(0,t.jsx)(sa,{level:4,className:"mb-0 text-purple-900",children:"Cursor IDE Integration"})]}),(0,t.jsx)(sn,{className:"text-purple-700",children:"Use tools directly from Cursor IDE with LiteLLM MCP. Enable your AI assistant to perform real-world tasks without leaving your coding environment."})]}),(0,t.jsxs)(t1.Card,{className:"border border-gray-200",children:[(0,t.jsx)(sa,{level:5,className:"mb-4 text-gray-800",children:"Setup Instructions"}),(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(d,{step:1,title:"Open Cursor Settings",children:(0,t.jsxs)(sn,{className:"text-gray-600",children:["Use the keyboard shortcut ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"⇧+⌘+J"})," (Mac) or"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Ctrl+Shift+J"})," (Windows/Linux)"]})}),(0,t.jsx)(d,{step:2,title:"Navigate to MCP Tools",children:(0,t.jsx)(sn,{className:"text-gray-600",children:'Go to the "MCP Tools" tab and click "New MCP Server"'})}),(0,t.jsxs)(d,{step:3,title:"Add Configuration",children:[(0,t.jsxs)(sn,{className:"text-gray-600 mb-3",children:["Copy the JSON configuration below and paste it into Cursor, then save with"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Cmd+S"})," or"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Ctrl+S"})]}),(0,t.jsx)(so,{icon:(0,t.jsx)(t9.Code,{className:"text-purple-600",size:16}),title:"Configuration",description:"Cursor MCP configuration",serverName:"Zapier Gmail",accessGroups:["dev-group"],children:(0,t.jsx)(c,{code:`{ - "mcpServers": { - "Zapier_MCP": { - "url": "${s}/mcp", - "headers": { - "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY", - "x-mcp-servers": "Zapier_MCP,dev-group" - } - } - } -}`,copyKey:"cursor-config",className:"text-xs"})})]})]})]})]}),{})}),(0,t.jsx)(t4.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tc.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-green-50 to-teal-50 p-6 rounded-lg border border-green-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(st,{className:"text-green-600",size:24}),(0,t.jsx)(sa,{level:4,className:"mb-0 text-green-900",children:"Streamable HTTP Transport"})]}),(0,t.jsx)(sn,{className:"text-green-700",children:"Connect to LiteLLM MCP using HTTP transport. Compatible with any MCP client that supports HTTP streaming."})]}),(0,t.jsx)(so,{icon:(0,t.jsx)(st,{className:"text-green-600",size:16}),title:"Universal MCP Connection",description:"Use this URL with any MCP client that supports HTTP transport",children:(0,t.jsxs)(tc.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsx)(sn,{children:"Each MCP client supports different transports. Refer to your client documentation to determine the appropriate transport method."})}),(0,t.jsx)(c,{title:"Server URL",code:`${s}/mcp`,copyKey:"http-server-url"}),(0,t.jsx)(c,{title:"Headers Configuration",code:JSON.stringify({"x-litellm-api-key":"Bearer YOUR_LITELLM_API_KEY"},null,2),copyKey:"http-headers"}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(eR.Button,{type:"link",className:"p-0 h-auto text-blue-600 hover:text-blue-700",href:"https://modelcontextprotocol.io/docs/concepts/transports",icon:(0,t.jsx)(ss.ExternalLinkIcon,{size:14}),children:"Learn more about MCP transports"})})]})})]}),{})})]})]})]})})};var sd=e.i(643531),su=e.i(373488),su=su;let sm={healthy:{dot:"bg-green-500"},unhealthy:{dot:"bg-red-500"},unknown:{dot:"bg-gray-300"}},sh=e=>e.stopPropagation(),sx=({status:e,isLoadingHealth:s,isRechecking:r,onRecheck:l,lastCheck:a,error:i,dotClass:o})=>s||r?(0,t.jsxs)(n.Badge,{variant:"outline",className:"text-muted-foreground",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground"}),"Checking"]}):(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",className:l?"cursor-pointer hover:opacity-80":"cursor-default",onClick:l?e=>{e.stopPropagation(),l()}:void 0,children:[(0,t.jsx)("span",{className:(0,ec.cn)("h-1.5 w-1.5 rounded-full",o)}),e.charAt(0).toUpperCase()+e.slice(1)]})}),(0,t.jsxs)(u.TooltipContent,{side:"top",className:"max-w-xs",children:[(0,t.jsxs)("div",{className:"mb-1 font-semibold",children:["Health: ",e]}),a&&(0,t.jsxs)("div",{className:"mb-1 text-xs",children:["Last check: ",new Date(a).toLocaleString()]}),i&&(0,t.jsxs)("div",{className:"text-xs",children:[(0,t.jsx)("div",{className:"mb-1 font-medium",children:"Error"}),(0,t.jsx)("div",{className:"wrap-break-word",children:i})]}),!a&&!i&&(0,t.jsx)("div",{className:"text-xs",children:"No health data"}),l&&(0,t.jsx)("div",{className:"mt-1 text-xs",children:"Click to recheck"})]})]}),sp=({connected:e,onConnect:s})=>e?(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsx)("span",{className:"text-muted-foreground",children:"BYOK credential"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)(sd.Check,{})," Connected"]}),s&&(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:e=>{sh(e),s()},children:"Update"})]})]}):(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsx)("span",{className:"text-muted-foreground",children:"BYOK credential"}),s?(0,t.jsx)(i.Button,{size:"sm",onClick:e=>{sh(e),s()},children:"Connect"}):(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})]}),sg=({server:e,missingUserFields:s,isLoadingHealth:r,isRechecking:l,onClick:a,onRecheckHealth:o,onByokConnect:c,onOpenFillFields:d,onDelete:m})=>{let h=e.alias||e.server_name||"",x=e.server_name||h||e.server_id,p=e.mcp_info?.logo_url??void 0,g=e.transport||"http",f=e.spec_path&&"stdio"!==g?"openapi":g,j=e.auth_type||"none",v=e.auth_type===eT.AUTH_TYPE.OAUTH2&&!e.oauth2_flow&&!e.delegate_auth_to_upstream,b=e.status||"unknown",y=sm[b]??sm.unknown,_=e.available_on_public_internet,N=(e.mcp_access_groups??[]).filter(e=>"string"==typeof e),w=s??[],k=w.length>0,C=k?"border-2 border-destructive/40 bg-destructive/5 hover:border-destructive/60 hover:shadow-md":"border border-border bg-card hover:shadow-md",T=e.url||"",{maskedUrl:S}=T?e9(T):{maskedUrl:""},A="",I="";"stdio"===g?I=A=[e.command,...e.args??[]].filter(e=>"string"==typeof e&&e.length>0).join(" "):e.spec_path?(A=e.spec_path,I=e.spec_path):T&&(A=S,I=T);let O=!!o||!!m;return(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),a())},className:(0,ec.cn)("group relative flex h-full cursor-pointer flex-col gap-3 rounded-lg p-4 transition-all duration-150 focus:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",C),children:[(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[p?(0,t.jsx)(tf.Logo,{src:p,label:x,className:"h-10 w-10 shrink-0 rounded-sm object-contain"}):(0,t.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-sm bg-muted font-semibold text-muted-foreground",children:(x||"?").slice(0,2).toUpperCase()}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"block w-full truncate text-left font-semibold",title:x,children:x}),(0,t.jsxs)("div",{className:"mt-0.5 flex items-center gap-2 text-xs text-muted-foreground",children:[h&&(0,t.jsx)("span",{className:"truncate",children:h}),h&&(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("span",{className:"font-mono text-primary",children:e.server_id.slice(0,7)})}),(0,t.jsx)(u.TooltipContent,{children:e.server_id})]})]})]}),O&&(0,t.jsxs)(eo.DropdownMenu,{children:[(0,t.jsx)(eo.DropdownMenuTrigger,{render:(0,t.jsx)("button",{type:"button",onClick:sh,onKeyDown:sh,"aria-label":"Server actions",className:"-mr-1 -mt-1 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",children:(0,t.jsx)(su.default,{className:"size-5"})})}),(0,t.jsxs)(eo.DropdownMenuContent,{align:"end",children:[o&&(0,t.jsxs)(eo.DropdownMenuItem,{disabled:l,onClick:e=>{sh(e),o()},children:[(0,t.jsx)(sl,{}),"Test Connection"]}),o&&m&&(0,t.jsx)(eo.DropdownMenuSeparator,{}),m&&(0,t.jsxs)(eo.DropdownMenuItem,{variant:"destructive",onClick:e=>{sh(e),m()},children:[(0,t.jsx)(er.Trash2,{}),"Delete"]})]})]})]}),A?(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("p",{className:"truncate font-mono text-xs text-muted-foreground",children:A})}),(0,t.jsx)(u.TooltipContent,{children:I})]}):(0,t.jsx)("div",{className:"h-[18px]","aria-hidden":!0}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,t.jsx)(sx,{status:b,isLoadingHealth:r,isRechecking:l,onRecheck:o,lastCheck:e.last_health_check,error:e.health_check_error,dotClass:y.dot}),(0,t.jsx)(n.Badge,{variant:"outline",children:f.toUpperCase()}),(0,t.jsx)(n.Badge,{variant:"outline",children:j}),v&&(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)(e2.CircleAlert,{}),"OAuth flow not set"]})}),(0,t.jsx)(u.TooltipContent,{children:"This OAuth server has no flow set (Machine-to-Machine vs Interactive). Open it and choose an OAuth Flow Type so LiteLLM authenticates it as you intend."})]}),(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:(0,ec.cn)("h-1.5 w-1.5 rounded-full",_?"bg-green-500":"bg-orange-500")}),_?"Public":"Internal"]}),N.slice(0,2).map(e=>(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(n.Badge,{variant:"outline",className:"max-w-[120px] truncate",children:e})}),(0,t.jsx)(u.TooltipContent,{children:e})]},e)),N.length>2&&(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",children:["+",N.length-2]})}),(0,t.jsx)(u.TooltipContent,{children:N.slice(2).join(", ")})]})]}),(e.is_byok||k)&&(0,t.jsxs)("div",{className:"mt-auto flex flex-col gap-2",children:[e.is_byok&&(0,t.jsx)(sp,{connected:!!e.has_user_credential,onConnect:c}),k&&(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)("span",{className:"inline-flex items-center gap-1 font-semibold text-destructive",children:[(0,t.jsx)(e2.CircleAlert,{className:"size-3.5"}),w.length," user field",1===w.length?"":"s"," missing"]})}),(0,t.jsxs)(u.TooltipContent,{children:[(0,t.jsx)("div",{className:"mb-1 font-semibold",children:"Missing user fields:"}),(0,t.jsx)("ul",{className:"ml-3",children:w.map(e=>(0,t.jsxs)("li",{children:["• ",e]},e))})]})]}),d&&(0,t.jsx)(i.Button,{variant:"destructive",size:"sm",onClick:e=>{sh(e),d()},children:"Set"})]})]})]})})};var sf=e.i(871689),sj=e.i(286536),sv=e.i(77705),sb=e.i(954616),sy=e.i(555987);function s_(e){if(!e)return[];if(Array.isArray(e))return e.map(e=>sN(e)).filter(e=>void 0!==e);let t=sN(e);return void 0===t?[]:[t]}function sN(e,t){if(!e)return;let s=void 0!==t?t:e.default;if("object"===e.type){let t="object"!=typeof s||null===s||Array.isArray(s)?{}:{...s};return e.properties&&Object.entries(e.properties).forEach(([e,s])=>{t[e]=sN(s,t[e])}),t}if("array"===e.type){if(Array.isArray(s)){let t=e.items;if(!t)return s;if(0===s.length){let e=s_(t);return e.length?e:s}return Array.isArray(t)?s.map((e,s)=>sN(t[s]??t[t.length-1],e)):s.map(e=>sN(t,e))}return void 0!==s?s:s_(e.items)}if(void 0!==s)return s;switch(e.type){case"integer":case"number":return 0;case"boolean":return!1;default:return""}}let sw=e=>{let t=sN(e);if("object"===e.type||"array"===e.type){let s="array"===e.type?[]:{};return JSON.stringify(t??s,null,2)}return t};function sk({tool:e,onSubmit:s,isLoading:r,result:l,error:a,onClose:n}){let[i]=$.Form.useForm(),[o,c]=p.default.useState("formatted"),[d,u]=p.default.useState(null),[m,h]=p.default.useState(null),x=p.default.useMemo(()=>"string"==typeof e.inputSchema?{type:"object",properties:{input:{type:"string",description:"Input for this tool"}},required:["input"]}:e.inputSchema,[e.inputSchema]),g=p.default.useMemo(()=>x.properties&&x.properties.params&&"object"===x.properties.params.type&&x.properties.params.properties?{type:"object",properties:x.properties.params.properties,required:x.properties.params.required||[]}:x,[x]);p.default.useEffect(()=>{if(i.resetFields(),!g.properties)return;let e={};Object.entries(g.properties).forEach(([t,s])=>{e[t]=sw(s)}),i.setFieldsValue(e)},[i,g,e]),p.default.useEffect(()=>{d&&(l||a)&&h(Date.now()-d)},[l,a,d]);let f=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 s=document.execCommand("copy");if(document.body.removeChild(t),!s)throw Error("execCommand failed");return!0}}catch(e){return console.error("Copy failed:",e),!1}},j=async()=>{await f(JSON.stringify(l,null,2))?N.default.success("Result copied to clipboard"):N.default.fromBackend("Failed to copy result")},v=async()=>{await f(e.name)?N.default.success("Tool name copied to clipboard"):N.default.fromBackend("Failed to copy tool name")};return(0,t.jsxs)("div",{className:"space-y-4 h-full",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between pb-3 border-b border-gray-200",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-3",children:[e.mcp_info.logo_url&&(0,t.jsx)("img",{src:(0,sy.resolveLogoSrc)(e.mcp_info.logo_url),alt:`${e.mcp_info.server_name} logo`,className:"w-6 h-6 object-contain"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-gray-900",children:"Test Tool:"}),(0,t.jsxs)("div",{className:"group inline-flex items-center space-x-1 bg-slate-50 hover:bg-slate-100 px-3 py-1 rounded-md cursor-pointer transition-colors border border-slate-200",onClick:v,title:"Click to copy tool name",children:[(0,t.jsx)("span",{className:"font-mono text-slate-700 font-medium text-sm",children:e.name}),(0,t.jsx)("svg",{className:"w-3 h-3 text-slate-400 group-hover:text-slate-600 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})})]})]}),(0,t.jsx)("p",{className:"text-xs text-gray-600",children:e.description}),(0,t.jsxs)("p",{className:"text-xs text-gray-500",children:["Provider: ",e.mcp_info.server_name]})]})]}),(0,t.jsx)(D.Button,{onClick:n,variant:"light",size:"sm",className:"text-gray-500 hover:text-gray-700",children:(0,t.jsx)("svg",{className:"w-4 h-4",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.jsxs)("div",{className:"grid grid-cols-2 gap-4 h-full",children:[(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-4 py-2",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Input Parameters"}),(0,t.jsx)(ev.Tooltip,{title:"Configure the input parameters for this tool call",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-600"})})]})}),(0,t.jsx)("div",{className:"p-4",children:(0,t.jsxs)($.Form,{form:i,onFinish:e=>{u(Date.now()),h(null);let t={};Object.entries(e).forEach(([e,s])=>{let r=g.properties?.[e],l="string"==typeof s?s.trim():s;if(r&&null!=l&&""!==l)switch(r.type){case"boolean":t[e]="true"===l||!0===l;break;case"number":case"integer":{let s=Number(l);t[e]=Number.isNaN(s)?l:"integer"===r.type?Math.trunc(s):s;break}case"object":case"array":try{let s="string"==typeof l?JSON.parse(l):l,a="object"===r.type&&null!==s&&"object"==typeof s&&!Array.isArray(s),n="array"===r.type&&Array.isArray(s);"object"===r.type&&a||"array"===r.type&&n?t[e]=s:t[e]=l}catch(s){t[e]=l}break;case"string":t[e]=String(l);break;default:t[e]=l}else null!=l&&""!==l&&(t[e]=l)}),s(x.properties&&x.properties.params&&"object"===x.properties.params.type&&x.properties.params.properties?{params:t}:t)},layout:"vertical",className:"space-y-3",children:["string"==typeof e.inputSchema?(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Input ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]}),name:"input",rules:[{required:!0,message:"Please enter input for this tool"}],className:"mb-3",children:(0,t.jsx)(ek.TextInput,{placeholder:"Enter input for this tool",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})}):void 0===g.properties?(0,t.jsx)("div",{className:"text-center py-6 bg-gray-50 rounded-lg border border-gray-200",children:(0,t.jsxs)("div",{className:"max-w-sm mx-auto",children:[(0,t.jsx)("h4",{className:"text-sm font-medium text-gray-900 mb-1",children:"No Parameters Required"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"This tool can be called without any input parameters."})]})}):(0,t.jsx)("div",{className:"space-y-3",children:Object.entries(g.properties).map(([s,r])=>{let l=sw(r),a=`${e.name}-${s}`;return(0,t.jsxs)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[s," ",g.required?.includes(s)&&(0,t.jsx)("span",{className:"text-red-500",children:"*"}),r.description&&(0,t.jsx)(ev.Tooltip,{title:r.description,children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-gray-400 hover:text-gray-600"})})]}),name:s,initialValue:l,rules:[{required:g.required?.includes(s),message:`Please enter ${s}`},..."object"===r.type||"array"===r.type?[{validator:(e,t)=>{if((null==t||""===t)&&!g.required?.includes(s))return Promise.resolve();try{let e="string"==typeof t?JSON.parse(t):t,s="object"===r.type&&null!==e&&"object"==typeof e&&!Array.isArray(e),l="array"===r.type&&Array.isArray(e);if("object"===r.type&&s||"array"===r.type&&l)return Promise.resolve();return Promise.reject(Error("object"===r.type?"Please enter a JSON object":"Please enter a JSON array"))}catch(e){return Promise.reject(Error("Invalid JSON"))}}}]:[]],className:"mb-3",children:["string"===r.type&&r.enum&&(0,t.jsxs)("select",{className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm transition-colors",defaultValue:l??"",children:[!g.required?.includes(s)&&(0,t.jsxs)("option",{value:"",children:["Select ",s]}),r.enum.map(e=>(0,t.jsx)("option",{value:e,children:e},e))]}),"string"===r.type&&!r.enum&&(0,t.jsx)(ek.TextInput,{placeholder:r.description||`Enter ${s}`,defaultValue:l??"",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"}),("number"===r.type||"integer"===r.type)&&(0,t.jsx)("input",{type:"number",step:"integer"===r.type?1:"any",placeholder:r.description||`Enter ${s}`,defaultValue:l??0,className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm transition-colors"}),"boolean"===r.type&&(0,t.jsxs)(eb.Select,{placeholder:`Select ${s}`,allowClear:!g.required?.includes(s),className:"w-full",children:[(0,t.jsx)(eb.Select.Option,{value:!0,children:"True"}),(0,t.jsx)(eb.Select.Option,{value:!1,children:"False"})]}),("object"===r.type||"array"===r.type)&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("textarea",{rows:"object"===r.type?6:4,placeholder:r.description||("object"===r.type?`Enter JSON object for ${s}`:`Enter JSON array for ${s}`),defaultValue:l??("object"===r.type?"{}":"[]"),spellCheck:!1,"data-testid":`textarea-${s}`,className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm font-mono"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"object"===r.type?"Provide a valid JSON object.":"Provide a valid JSON array."})]})]},a)})}),(0,t.jsx)("div",{className:"pt-3 border-t border-gray-100",children:(0,t.jsx)(D.Button,{type:"button",onClick:()=>i.submit(),disabled:r,variant:"primary",className:"w-full",loading:r,children:r?"Calling Tool...":l||a?"Call Again":"Call Tool"})})]})})]}),(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-4 py-2",children:(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Tool Result"})}),(0,t.jsx)("div",{className:"p-4",children:l||a||r?(0,t.jsxs)("div",{className:"space-y-3",children:[l&&!r&&!a&&(0,t.jsx)("div",{className:"p-2 bg-green-50 border border-green-200 rounded-lg",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("svg",{className:"h-4 w-4 text-green-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})}),(0,t.jsx)("h4",{className:"text-xs font-medium text-green-900",children:"Tool executed successfully"}),null!==m&&(0,t.jsxs)("span",{className:"text-xs text-green-600 ml-1",children:["• ",(m/1e3).toFixed(2),"s"]})]}),(0,t.jsxs)("div",{className:"flex items-center space-x-1",children:[(0,t.jsxs)("div",{className:"flex bg-white rounded-sm border border-green-300 p-0.5",children:[(0,t.jsx)("button",{onClick:()=>c("formatted"),className:`px-2 py-1 text-xs font-medium rounded transition-colors ${"formatted"===o?"bg-green-100 text-green-800":"text-green-600 hover:text-green-800"}`,children:"Formatted"}),(0,t.jsx)("button",{onClick:()=>c("json"),className:`px-2 py-1 text-xs font-medium rounded transition-colors ${"json"===o?"bg-green-100 text-green-800":"text-green-600 hover:text-green-800"}`,children:"JSON"})]}),(0,t.jsx)("button",{onClick:j,className:"p-1 hover:bg-green-100 rounded-sm text-green-700",title:"Copy response",children:(0,t.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,t.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})})]})]})}),(0,t.jsxs)("div",{className:"max-h-96 overflow-y-auto",children:[r&&(0,t.jsxs)("div",{className:"flex flex-col justify-center items-center h-48 text-gray-500",children:[(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("div",{className:"animate-spin rounded-full h-8 w-8 border-2 border-gray-200"}),(0,t.jsx)("div",{className:"animate-spin rounded-full h-8 w-8 border-2 border-blue-600 border-t-transparent absolute top-0"})]}),(0,t.jsx)("p",{className:"text-sm font-medium mt-3",children:"Calling tool..."}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"Please wait while we process your request"})]}),a&&(0,t.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-lg p-3",children:(0,t.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("svg",{className:"h-4 w-4 text-red-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,t.jsx)("h4",{className:"text-xs font-medium text-red-900",children:"Tool Call Failed"}),null!==m&&(0,t.jsxs)("span",{className:"text-xs text-red-600",children:["• ",(m/1e3).toFixed(2),"s"]})]}),(0,t.jsx)("div",{className:"bg-white border border-red-200 rounded-sm p-2 max-h-48 overflow-y-auto",children:(0,t.jsx)("pre",{className:"text-xs whitespace-pre-wrap text-red-700 font-mono",children:a.message})})]})]})}),l&&!r&&!a&&(0,t.jsx)("div",{className:"space-y-3",children:"formatted"===o?l.map((e,s)=>(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:["text"===e.type&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Text Response"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsx)("div",{className:"bg-white rounded-sm border border-gray-200 max-h-64 overflow-y-auto",children:(0,t.jsx)("div",{className:"p-3 space-y-2",children:e.text.split("\n\n").map((e,s)=>{if(""===e.trim())return null;if(e.startsWith("##")){let r=e.replace(/^#+\s/,"");return(0,t.jsx)("div",{className:"border-b border-gray-200 pb-1 mb-2",children:(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:r})},s)}let r=/(https?:\/\/[^\s\)]+)/g;if(r.test(e)){let l=e.split(r);return(0,t.jsx)("div",{className:"bg-blue-50 border border-blue-200 rounded-sm p-2",children:(0,t.jsx)("div",{className:"text-xs text-gray-700 leading-relaxed whitespace-pre-wrap",children:l.map((e,s)=>r.test(e)?(0,t.jsx)("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 underline break-all",children:e},s):e)})},s)}return e.includes("Score:")?(0,t.jsx)("div",{className:"bg-green-50 border-l-4 border-green-400 p-2 rounded-r",children:(0,t.jsx)("p",{className:"text-xs text-green-800 font-medium whitespace-pre-wrap",children:e})},s):(0,t.jsx)("div",{className:"bg-gray-50 rounded-sm p-2 border border-gray-200",children:(0,t.jsx)("div",{className:"text-xs text-gray-700 leading-relaxed whitespace-pre-wrap font-mono",children:e})},s)}).filter(Boolean)})})})]}),"image"===e.type&&e.url&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Image Response"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsx)("div",{className:"bg-gray-50 rounded-sm p-3 border border-gray-200",children:(0,t.jsx)("img",{src:e.url,alt:"Tool result",className:"max-w-full h-auto rounded-sm shadow-xs"})})})]}),"embedded_resource"===e.type&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Embedded Resource"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2 p-3 bg-blue-50 border border-blue-200 rounded-sm",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("svg",{className:"h-5 w-5 text-blue-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("p",{className:"text-xs font-medium text-blue-900",children:["Resource Type: ",e.resource_type]}),e.url&&(0,t.jsxs)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center text-xs text-blue-600 hover:text-blue-800 hover:underline mt-1 transition-colors",children:["View Resource",(0,t.jsxs)("svg",{className:"ml-1 h-3 w-3",fill:"currentColor",viewBox:"0 0 20 20",children:[(0,t.jsx)("path",{d:"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z"}),(0,t.jsx)("path",{d:"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z"})]})]})]})]})})]})]},s)):(0,t.jsx)("div",{className:"bg-white rounded-sm border border-gray-200",children:(0,t.jsx)("div",{className:"p-3 overflow-auto max-h-80 bg-gray-50",children:(0,t.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap break-all text-gray-800",children:JSON.stringify(l,null,2)})})})})]})]}):(0,t.jsx)("div",{className:"flex flex-col justify-center items-center h-48 text-gray-500",children:(0,t.jsxs)("div",{className:"text-center max-w-sm",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsx)("svg",{className:"mx-auto h-12 w-12 text-gray-300",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1,d:"M13 10V3L4 14h7v7l9-11h-7z"})})}),(0,t.jsx)("h4",{className:"text-sm font-medium text-gray-900 mb-1",children:"Ready to Call Tool"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 leading-relaxed",children:'Configure the input parameters and click "Call Tool" to see the results here.'})]})})})]})]})]})}function sC(e){return e.toLowerCase().trim().replace(/[^a-z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function sT(e,t){let s=e?sC(e):"";return{[s?`x-mcp-${s}-authorization`:"x-mcp-auth"]:`Bearer ${t}`}}var sS=e.i(779129);let sA="litellm-tools-mcp-oauth-flow-state",sI="litellm-tools-mcp-oauth-result";var sO=e.i(280024),sP=e.i(531245),sM=e.i(181692),sM=sM,sF=e.i(319023);let sE=({serverId:e,accessToken:s,auth_type:r,oauth2_flow:l,delegate_auth_to_upstream:c,dcr_bridge:d,userRole:u,userID:h,serverAlias:x,extraHeaders:f})=>{let[j,v]=(0,p.useState)(null),[y,_]=(0,p.useState)(null),[w,k]=(0,p.useState)(null),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)({}),[I,O]=(0,p.useState)(!1),P=(0,eT.getMcpOAuthMode)({auth_type:r,oauth2_flow:l,delegate_auth_to_upstream:c}),M="passthrough"===P||(0,eT.isClientForwardedTokenMode)(r),F="authorization_code"===P,[E,L]=(0,p.useState)(()=>M&&(0,eC.isTokenValid)(e,h)?(0,eC.getToken)(e,h)?.access_token??null:null);(0,p.useEffect)(()=>{M?L((0,eC.isTokenValid)(e,h)?(0,eC.getToken)(e,h)?.access_token??null:null):L(null)},[e,h,M]);let{startOAuthFlow:R,status:U,error:z}=(({accessToken:e,serverId:t,serverAlias:s,userId:r,scopes:l,clientId:a,gatewayMintsClient:n,onSuccess:i})=>{let[o,c]=(0,p.useState)("idle"),[d,u]=(0,p.useState)(null),m=(0,p.useRef)(!1),h=(0,p.useRef)(i);h.current=i;let x=(0,p.useCallback)(async()=>{try{let r;c("authorizing"),u(null);let i=a??void 0,o=(0,sS.buildCallbackUrl)();if(!i&&!n)try{let l=await (0,b.registerMcpOAuthClient)(e,t,{client_name:s||t,grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",redirect_uris:[o]});i=l?.client_id,r=l?.client_secret}catch(e){}let d=(0,tK.generateCodeVerifier)(),m=await (0,tK.generateCodeChallenge)(d),h=crypto.randomUUID(),x=l?.filter(e=>e.trim()).join(" "),p=(0,b.buildMcpOAuthAuthorizeUrl)({serverId:t,clientId:i,redirectUri:o,state:h,codeChallenge:m,scope:x}),g={state:h,codeVerifier:d,serverId:t,redirectUri:o,clientId:i,clientSecret:r,scopes:l};(0,tG.setSecureItem)(sA,JSON.stringify(g)),(0,tG.setSecureItem)("litellm-mcp-oauth-return-url",window.location.href),window.location.href=p}catch(t){let e=(0,tW.extractErrorMessage)(t);u(e),c("error"),N.default.error(e)}},[e,t,s,l,a,n]),g=(0,p.useCallback)(async()=>{if(m.current)return;let s=(0,tG.getSecureItem)(sI);if(!s)return;let l=(0,tG.getSecureItem)(sA);if(!l)return;let a=null;try{if((a=JSON.parse(l)).serverId&&a.serverId!==t)return}catch(e){}m.current=!0,(0,sS.clearStorage)(sI);let n=null,i=null;try{n=JSON.parse(s),i=a}catch(e){u("Failed to resume OAuth flow. Please retry."),c("error"),m.current=!1,(0,sS.clearStorage)(sA);return}try{if(!i?.state||!i.codeVerifier||!i.serverId)throw Error("OAuth session state was lost. Please retry.");if(!n?.state||n.state!==i.state)throw Error("OAuth state mismatch. Please retry.");if(n.error)throw Error(n.error_description||n.error);if(!n.code)throw Error("Authorization code missing in callback.");c("exchanging");let t=await (0,b.exchangeMcpOAuthToken)({serverId:i.serverId,code:n.code,clientId:i.clientId,clientSecret:i.clientSecret,codeVerifier:i.codeVerifier,redirectUri:i.redirectUri,accessToken:e});(0,eC.setToken)(i.serverId,{access_token:t.access_token,expires_in:t.expires_in,refresh_token:t.refresh_token,token_type:t.token_type},r),c("success"),u(null),N.default.success("Connected successfully"),h.current(t.access_token)}catch(t){let e=(0,tW.extractErrorMessage)(t);u(e),c("error"),N.default.error(e)}finally{(0,sS.clearStorage)(sA),setTimeout(()=>{m.current=!1},1e3)}},[e,t,r]);return(0,p.useEffect)(()=>{g()},[g]),{startOAuthFlow:x,status:o,error:d}})({accessToken:s??"",serverId:e,serverAlias:x,userId:h,gatewayMintsClient:(0,eT.gatewayMintsClientFor)({auth_type:r,dcr_bridge:d}),onSuccess:L}),{data:H,isLoading:D,isError:V,refetch:B}=(0,g.useQuery)({queryKey:["mcpOauthUserCredStatus",e,h],queryFn:()=>(0,b.getMCPOAuthUserCredentialStatus)(s??"",e),enabled:!!s&&F,staleTime:3e4}),q=!!H?.has_credential,$=F&&!D&&(V||!!H&&!q),W=F&&D,K=f&&f.length>0,G=()=>{let e={};if(M&&E&&Object.assign(e,sT(x,E)),x&&K){let t=sC(x);t&&Object.entries(S).forEach(([s,r])=>{r&&r.trim()&&(e[`x-mcp-${t}-${s.toLowerCase()}`]=r)})}return Object.keys(e).length>0?e:void 0},{data:Y,isLoading:J,error:Q,refetch:Z}=(0,g.useQuery)({queryKey:["mcpTools",e,S,E],queryFn:async()=>{if(!s)throw Error("Access Token required");let t=await (0,b.listMCPTools)(s,e,G());if(t?.error){let s=t.status;401===s&&(0,eC.removeToken)(e,h);let r=Error(t.message||t.error||"Failed to fetch MCP tools");throw r.status=s,r.statusText=t.statusText,r.details=t.details,r}return t},enabled:!!s&&(M?null!==E:!F||q),staleTime:3e4,retry:(e,t)=>t?.status!==401&&t?.response?.status!==401&&e<2}),X=(0,p.useCallback)(()=>{B(),Z()},[B,Z]),{startOAuthFlow:ee,status:et,error:es}=(0,sO.useUserMcpOAuthFlow)({accessToken:s??"",serverId:e,serverAlias:x,onSuccess:X}),er=(0,p.useCallback)(()=>{try{(0,tG.setSecureItem)(sS.TOOLS_OAUTH_UI_STATE_KEY,JSON.stringify({serverId:e}))}catch(e){}ee()},[e,ee]);(0,p.useEffect)(()=>{401===(Q?.status??Q?.response?.status)&&((0,eC.removeToken)(e,h),L(null))},[Q,e,h]);let{mutate:el,isPending:ea}=(0,sb.useMutation)({mutationFn:async t=>{if(!s)throw Error("Access Token required");try{return await (0,b.callMCPTool)(s,e,t.tool.name,t.arguments,{customHeaders:G()})}catch(e){throw e}},onSuccess:e=>{_(e.content),k(null)},onError:t=>{k(t),_(null),(t?.status===401||t?.response?.status===401)&&((0,eC.removeToken)(e,h),L(null))}}),en=Y?.tools||[],ei=F&&(Q?.status??Q?.response?.status)===401,eo=M&&!E||$||ei,ed=J||W,eu=en.filter(e=>{let t=C.toLowerCase();return e.name.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t)||e.mcp_info.server_name&&e.mcp_info.server_name.toLowerCase().includes(t)});return(0,t.jsx)("div",{className:"w-full p-4",children:(0,t.jsx)(eJ.Card,{className:"w-full overflow-hidden rounded-xl shadow-md",children:(0,t.jsxs)("div",{className:"grid h-auto w-full grid-cols-4 gap-4",children:[(0,t.jsxs)("div",{className:"col-span-1 flex flex-col bg-muted p-4",children:[(0,t.jsx)("h2",{className:"mt-2 mb-6 text-xl font-semibold",children:"MCP Tools"}),(0,t.jsxs)("div",{className:"flex flex-col flex-1",children:[K&&(0,t.jsxs)("div",{className:"mb-4 rounded-lg border border-border bg-card p-3",children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(sM.default,{className:"mr-2 size-4 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Additional Headers"})]}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>O(!I),children:I?"Hide":"Configure"})]}),!I&&0===Object.keys(S).length&&(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:'This server requires additional headers. Click "Configure" to provide values.'}),I&&(0,t.jsxs)("div",{className:"mt-3 space-y-2",children:[f?.map(e=>(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"mb-1 block text-xs font-medium",children:e}),(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(sM.default,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:`Enter ${e}`,value:S[e]||"",onChange:t=>{A({...S,[e]:t.target.value})}})]})]},e)),(0,t.jsx)(i.Button,{size:"sm",onClick:()=>{Z(),O(!1)},disabled:Object.values(S).every(e=>!e||!e.trim()),className:"mt-2 w-full",children:"Load Tools"})]}),!I&&Object.keys(S).length>0&&(0,t.jsx)("div",{className:"mt-2",children:(0,t.jsxs)("p",{className:"flex items-center text-xs text-muted-foreground",children:[(0,t.jsx)("span",{className:"mr-2 inline-block size-2 rounded-full bg-green-500"}),Object.keys(S).length," header(s) configured"]})})]}),(0,t.jsxs)("div",{className:"flex flex-col flex-1 min-h-0",children:[(0,t.jsxs)("p",{className:"mb-3 flex items-center text-sm font-medium",children:[(0,t.jsx)(eY.Wrench,{className:"mr-2 size-4"})," Available Tools",en.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",className:"ml-2",children:en.length})]}),M&&!E&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(sF.Lock,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"Authentication required"}),(0,t.jsx)("p",{className:"mb-3 text-xs text-muted-foreground",children:"Authenticate to view available tools"}),(0,t.jsx)(i.Button,{size:"sm",onClick:R,disabled:!s||"authorizing"===U||"exchanging"===U,children:"Authorize"}),z&&(0,t.jsx)("p",{className:"mt-2 text-xs text-destructive",children:z})]}),($||ei)&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(sF.Lock,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"Authentication required"}),(0,t.jsx)("p",{className:"mb-3 text-xs text-muted-foreground",children:"Authenticate with the upstream provider to view available tools"}),(0,t.jsx)(i.Button,{size:"sm",onClick:er,disabled:!s||"authorizing"===et||"exchanging"===et,children:"Authorize"}),es&&(0,t.jsx)("p",{className:"mt-2 text-xs text-destructive",children:es})]}),eo?null:(0,t.jsxs)(t.Fragment,{children:[en.length>0&&(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search tools...",value:C,onChange:e=>T(e.target.value)})]})}),ed&&(0,t.jsxs)("div",{className:"flex flex-col items-center justify-center rounded-lg border border-border bg-card py-8",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"mb-3 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-xs font-medium",children:"Loading tools..."})]}),(Y?.error||Q)&&!ed&&!en.length&&(0,t.jsx)("div",{className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-xs text-destructive",children:(0,t.jsxs)("p",{className:"font-medium",children:["Error: ",Y?.message||Q?.message]})}),!ed&&!Y?.error&&!Q&&(!en||0===en.length)&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)("div",{className:"mx-auto mb-2 flex size-8 items-center justify-center rounded-full bg-muted",children:(0,t.jsx)("svg",{className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 8.172V5L8 4z"})})}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"No tools available"}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"No tools found for this server"})]}),!ed&&!Y?.error&&en.length>0&&(0,t.jsx)(t.Fragment,{children:0===eu.length?(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(a.Search,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"No tools found"}),(0,t.jsxs)("p",{className:"text-xs text-muted-foreground",children:['No tools match "',C,'"']})]}):(0,t.jsx)("div",{className:"mcp-tools-scrollable max-h-100 min-h-0 flex-1 space-y-2 overflow-y-auto",children:eu.map(e=>(0,t.jsxs)("div",{className:(0,ec.cn)("cursor-pointer rounded-lg border p-3 transition-all hover:shadow-xs",j?.name===e.name?"border-primary bg-accent ring-1 ring-ring":"border-border bg-card"),onClick:()=>{v(e),_(null),k(null)},children:[(0,t.jsxs)("div",{className:"flex items-start space-x-2",children:[e.mcp_info.logo_url&&(0,t.jsx)("img",{src:(0,sy.resolveLogoSrc)(e.mcp_info.logo_url),alt:`${e.mcp_info.server_name} logo`,className:"w-4 h-4 object-contain shrink-0 mt-0.5"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("h4",{className:"truncate font-mono text-xs font-medium",children:e.name}),(0,t.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:e.mcp_info.server_name}),(0,t.jsx)("p",{className:"mt-1 line-clamp-2 text-xs leading-relaxed text-muted-foreground",children:e.description})]})]}),j?.name===e.name&&(0,t.jsx)("div",{className:"mt-2 border-t border-border pt-2",children:(0,t.jsxs)("div",{className:"flex items-center text-xs font-medium text-primary",children:[(0,t.jsx)("svg",{className:"w-3 h-3 mr-1",fill:"currentColor",viewBox:"0 0 20 20",children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"})}),"Selected"]})})]},e.name))})})]})]})]})]}),(0,t.jsxs)("div",{className:"col-span-3 flex flex-col",children:[(0,t.jsx)("div",{className:"flex items-center justify-between border-b border-border p-4",children:(0,t.jsx)("h2",{className:"mb-0 text-xl font-semibold",children:"Tool Testing Playground"})}),(0,t.jsx)("div",{className:"flex-1 overflow-auto p-4",children:j?(0,t.jsx)("div",{className:"h-full",children:(0,t.jsx)(sk,{tool:j,onSubmit:e=>{el({tool:j,arguments:e})},result:y,error:w,isLoading:ea,onClose:()=>v(null)})}):(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center text-muted-foreground",children:[(0,t.jsx)(sP.Bot,{className:"mb-4 size-12"}),(0,t.jsx)("p",{className:"mb-2 text-lg font-medium",children:"Select a Tool to Test"}),(0,t.jsx)("p",{className:"max-w-md text-center text-sm",children:"Choose a tool from the left sidebar to start testing its functionality with custom inputs."})]})})]})]})})})},sL=[eT.AUTH_TYPE.API_KEY,eT.AUTH_TYPE.BEARER_TOKEN,eT.AUTH_TYPE.TOKEN,eT.AUTH_TYPE.BASIC],sR=[...sL,eT.AUTH_TYPE.OAUTH2,eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,eT.AUTH_TYPE.OAUTH2_ID_JAG,eT.AUTH_TYPE.AWS_SIGV4,eT.AUTH_TYPE.TRUE_PASSTHROUGH,eT.AUTH_TYPE.OAUTH_DELEGATE],sU="litellm-mcp-oauth-edit-state",sz=({mcpServer:e,accessToken:s,userID:r,onCancel:l,onSuccess:a,availableAccessGroups:n})=>{let[i]=$.Form.useForm(),[o,c]=(0,p.useState)({}),[d,u]=(0,p.useState)([]),[m,h]=(0,p.useState)(!1),[x,g]=(0,p.useState)(null),[f,j]=(0,p.useState)(""),[v,y]=(0,p.useState)(!1),[_,w]=(0,p.useState)(!1),[k,C]=(0,p.useState)(!1),[T,S]=(0,p.useState)([]),[A,I]=(0,p.useState)(!1),[O,P]=(0,p.useState)({}),[M,F]=(0,p.useState)({}),[E,L]=(0,p.useState)(null),[R,U]=(0,p.useState)(e.mcp_info?.logo_url||void 0),z=$.Form.useWatch("auth_type",i),H=$.Form.useWatch("transport",i),V="stdio"===H,B=H===eT.TRANSPORT.OPENAPI,q=!!z&&sL.includes(z),K=z===eT.AUTH_TYPE.OAUTH2,G=z===eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,Y=z===eT.AUTH_TYPE.OAUTH2_ID_JAG,J=z===eT.AUTH_TYPE.AWS_SIGV4,Q=$.Form.useWatch("oauth_flow_type",i),Z=K&&Q===eT.OAUTH_FLOW.M2M,X=$.Form.useWatch("delegate_auth_to_upstream",i)??!!e.delegate_auth_to_upstream,ee=$.Form.useWatch("url",i),et=$.Form.useWatch("spec_path",i),es=$.Form.useWatch("server_name",i),er=$.Form.useWatch("auth_type",i),el=$.Form.useWatch("static_headers",i),ea=$.Form.useWatch("credentials",i),en=$.Form.useWatch("issuer",i),ei=$.Form.useWatch("authorization_url",i),eo=$.Form.useWatch("token_url",i),ec=$.Form.useWatch("registration_url",i),ed=!!e.mcp_info?.tool_allowlist_enforced||(e.allowed_tools?.length??0)>0,eu=ed?e.allowed_tools??[]:null,em=()=>i.getFieldValue("auth_type")??e.auth_type,eh=p.default.useRef(void 0),{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef,reset:ej}=tY({accessToken:s,getCredentials:()=>i.getFieldValue("credentials"),getTemporaryPayload:()=>{let t=i.getFieldsValue(!0),s=t.url||e.url,r=t.transport||e.transport;if(!s||!r)return null;let l=Array.isArray(t.static_headers)?t.static_headers.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{};return{server_id:e.server_id,server_name:t.server_name||e.server_name||e.alias,alias:t.alias||e.alias,description:t.description||e.description,url:s,transport:r,auth_type:(0,eT.isClientForwardedTokenMode)(t.auth_type)?t.auth_type:eT.AUTH_TYPE.OAUTH2,credentials:(0,eT.isClientForwardedTokenMode)(t.auth_type)?(0,eT.preservedAdminCredentials)(t.credentials):t.credentials,mcp_access_groups:t.mcp_access_groups||e.mcp_access_groups,static_headers:l,command:t.command,args:t.args,env:t.env}},onTokenReceived:t=>{if(!t?.access_token)return;if(eh.current=(0,eT.getOAuthAuthorizationIdentity)(i.getFieldsValue(!0)),(0,eT.isClientForwardedTokenMode)(em())){let s={access_token:t.access_token,expires_in:t.expires_in,refresh_token:t.refresh_token,token_type:t.token_type};(0,eC.setToken)(e.server_id,s,r),N.default.success("Token held for this browser session. Tools can now be loaded and configured; the token is not saved to LiteLLM.");return}let s=i.getFieldValue("credentials")??{},l={...(0,eT.preservedAdminCredentials)(s)??{},...void 0!==s.scopes&&{scopes:s.scopes},access_token:t.access_token,...t.refresh_token&&{refresh_token:t.refresh_token},...t.expires_in&&{expires_in:t.expires_in},...t.scope&&{scope:t.scope}};i.setFieldValue("credentials",l),eh.current=(0,eT.getOAuthAuthorizationIdentity)(i.getFieldsValue(!0)),N.default.success("OAuth authorization successful! Please click 'Update MCP Server' to save the credentials.")},onBeforeRedirect:()=>{try{let t=i.getFieldsValue(!0);(0,tG.setSecureItem)(sU,JSON.stringify({serverId:e.server_id,formValues:t,costConfig:o,allowedTools:T,hasToolAllowlistInteraction:A,searchValue:f,aliasManuallyEdited:v}))}catch(e){console.warn("Failed to persist MCP edit state",e)}},flowSource:"edit"}),e_=p.default.useMemo(()=>e.static_headers?Object.entries(e.static_headers).map(([e,t])=>({header:e,value:null!=t?String(t):""})):[],[e.static_headers]),eN=p.default.useMemo(()=>Array.isArray(e.env_vars)?e.env_vars.map(e=>({name:e.name,value:e.value??"",scope:"user"===e.scope?"user":"global",description:e.description??""})):[],[e.env_vars]),ek=p.default.useMemo(()=>{let t=e.env??void 0;if(!t||0===Object.keys(t).length)return"";try{return JSON.stringify(t,null,2)}catch{return""}},[e.env]),eS=p.default.useMemo(()=>e.spec_path&&"stdio"!==e.transport?eT.TRANSPORT.OPENAPI:e.transport,[e]),eA=p.default.useMemo(()=>({...e,transport:eS,static_headers:e_,env_vars:eN,extra_headers:e.extra_headers||[],oauth_flow_type:(0,eT.oauth2FlowToFormValue)(e.oauth2_flow),dcr_bridge:!!e.dcr_bridge,token_validation_json:e.token_validation?JSON.stringify(e.token_validation,null,2):void 0}),[e,eS,e_,eN,ek]),eI=p.default.useRef(null);(0,p.useEffect)(()=>{e.server_id&&eI.current!==e.server_id&&(eI.current=e.server_id,i.setFieldsValue(eA),C(!1),w(!1))},[e.server_id,eA,i]),(0,p.useEffect)(()=>{e.mcp_info?.mcp_server_cost_info&&c(e.mcp_info.mcp_server_cost_info)},[e]),(0,p.useEffect)(()=>{I(!1)},[e.server_id]),(0,p.useEffect)(()=>{ed&&S(e.allowed_tools??[]),P(tl(e.tool_name_to_display_name)),F(tl(e.tool_name_to_description))},[e,ed]),(0,p.useEffect)(()=>{let t=(0,tG.getSecureItem)(sU);if(t)try{let s=JSON.parse(t);if(!s||s.serverId!==e.server_id)return;if(s.formValues){let t=(0,eT.withoutMintedTokenCredentials)({...e.credentials??{},...s.formValues.credentials??{}}),r={...e,...s.formValues,credentials:t};L(r)}s.costConfig&&c(s.costConfig),s.allowedTools&&S(s.allowedTools),"boolean"==typeof s.hasToolAllowlistInteraction&&I(s.hasToolAllowlistInteraction),s.searchValue&&j(s.searchValue),"boolean"==typeof s.aliasManuallyEdited&&y(s.aliasManuallyEdited)}catch(e){console.error("Failed to restore MCP edit state",e)}finally{window.sessionStorage.removeItem(sU)}},[i,e]),(0,p.useEffect)(()=>{if(!E)return;let t=E.transport||e.transport;t&&t!==i.getFieldValue("transport")?i.setFieldsValue({transport:t}):(i.setFieldsValue(E),L(null))},[E,i,e.transport,H]),(0,p.useEffect)(()=>{if(e.mcp_access_groups){let t=e.mcp_access_groups.map(e=>"string"==typeof e?e:e.name||String(e));i.setFieldValue("mcp_access_groups",t)}},[e]),(0,p.useEffect)(()=>{e.server_id&&""!==e.server_id.trim()&&eF()},[e,s,r,ef?.access_token]);let eO=(t={})=>{eh.current=void 0,e.server_id&&(0,eC.removeToken)(e.server_id,r),u([]),ej();let s=(0,eT.preservedAdminCredentials)(i.getFieldValue("credentials"));i.resetFields([...eT.CLEARED_ON_INVALIDATION]),s&&i.setFieldsValue({credentials:s});let l=Object.fromEntries(eT.CLEARED_ON_INVALIDATION.filter(e=>e in t).map(e=>[e,t[e]]));Object.keys(l).length>0&&i.setFieldsValue(l)},eP=async(t,r)=>{let l=t||r||em()!==eT.AUTH_TYPE.OAUTH2?void 0:ef?.access_token;if(!l)return!1;h(!0),g(null);try{let t=i.getFieldsValue(!0),r=t.transport||e.transport,a={server_id:e.server_id,server_name:t.server_name||e.server_name||e.alias,url:t.url||e.url,spec_path:t.spec_path||e.spec_path,transport:r===eT.TRANSPORT.OPENAPI?eT.TRANSPORT.HTTP:r,auth_type:eT.AUTH_TYPE.OAUTH2,oauth2_flow:eT.MCP_OAUTH2_FLOW_INTERACTIVE,issuer:t.issuer,authorization_url:t.authorization_url,token_url:t.token_url,registration_url:t.registration_url},n=await (0,b.testMCPToolsListRequest)(s,a,l);n.tools&&!n.error?u(n.tools):(u([]),g(n.message||"Failed to load tools"))}catch(e){u([]),g(e instanceof Error?e.message:"Failed to load tools")}finally{h(!1)}return!0},eF=async()=>{let t;if(!s||!e.server_id)return;let l="passthrough"===(0,eT.getMcpOAuthMode)({auth_type:e.auth_type,oauth2_flow:e.oauth2_flow,delegate_auth_to_upstream:e.delegate_auth_to_upstream}),a=(0,eT.isClientForwardedTokenMode)(em());if(!await eP(l,a)){if(l||a){let s=ef?.access_token??((0,eC.isTokenValid)(e.server_id,r)?(0,eC.getToken)(e.server_id,r)?.access_token??null:null);if(!s){u([]),g(a?"Authorize with the upstream (browser-only, in the Authentication section) to load and configure this server's tools.":"Authenticate with this server in the Tools tab to load and configure its tools.");return}t=sT(e.alias,s)}h(!0),g(null);try{let r=await (0,b.listMCPTools)(s,e.server_id,t,!0);r.tools&&!r.error?u(r.tools):(u([]),g(r.message||"Failed to load tools"))}catch(e){u([]),g(e instanceof Error?e.message:"Failed to load tools")}finally{h(!1)}}},eE=async t=>{if(!s)return;let l=Object.entries(O).find(([,e])=>e&&!ts.test(e));if(l)return void N.default.fromBackend(`Tool display name "${l[1]}" is invalid. Only letters, digits, underscores, and hyphens are allowed (no spaces).`);try{let l,n,{static_headers:i,env_vars:c,credentials:d,stdio_config:u,env_json:m,command:h,args:x,allow_all_keys:p,available_on_public_internet:g,delegate_auth_to_upstream:f,oauth_passthrough:j,dcr_bridge:v,token_validation_json:y,...w}=t,k=(w.mcp_access_groups||[]).map(e=>"string"==typeof e?e:e.name||String(e)),S=Array.isArray(i)?i.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{},I=tr(c),P=d&&"object"==typeof d?Object.entries(d).reduce((e,[t,s])=>{if(null==s||""===s)return""===s&&eT.ADMIN_CONFIG_CREDENTIAL_KEYS.includes(t)&&(e[t]=null),e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{}):void 0,F={};if("stdio"===w.transport)if(u)try{let e=JSON.parse(u),t=e;if(e?.mcpServers&&"object"==typeof e.mcpServers){let s=Object.keys(e.mcpServers);s.length>0&&(t=e.mcpServers[s[0]])}let s=Array.isArray(t?.args)?t.args.map(e=>String(e)).filter(e=>""!==e.trim()):[],r=t?.env&&"object"==typeof t.env&&!Array.isArray(t.env)?Object.entries(t.env).reduce((e,[t,s])=>(null==t||""===String(t).trim()||(e[String(t)]=null==s?"":String(s)),e),{}):{};if(!(F={command:t?.command?String(t.command):void 0,args:s,env:r}).command)return void N.default.fromBackend("Stdio configuration must include a command")}catch{N.default.fromBackend("Invalid JSON in stdio configuration");return}else{let e={};if(m)try{let t=JSON.parse(m);t&&"object"==typeof t&&!Array.isArray(t)&&(e=Object.entries(t).reduce((e,[t,s])=>(null==t||""===String(t).trim()||(e[String(t)]=null==s?"":String(s)),e),{}))}catch{N.default.fromBackend("Invalid JSON in stdio env configuration");return}let t=Array.isArray(x)?x.map(e=>String(e)).filter(e=>""!==e.trim()):[],s=h?String(h).trim():"";if(!s)return void N.default.fromBackend("Stdio transport requires a command");F={command:s,args:t,env:e}}w.transport===eT.TRANSPORT.OPENAPI&&(w.transport="http");let E=null;if(y&&""!==y.trim())try{E=JSON.parse(y)}catch{N.default.fromBackend("Invalid JSON in Token Validation Rules");return}let L=w.server_name||w.url||e.server_name||e.url||w.alias||e.alias||"unknown",U=ed||A||T.length>0,z={...w,...F,stdio_config:void 0,env_json:void 0,...e.auth_type===eT.AUTH_TYPE.OAUTH2&&w.auth_type!==eT.AUTH_TYPE.OAUTH2?{issuer:null,authorization_url:null,token_url:null,registration_url:null}:{},...e.auth_type===eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE&&w.auth_type!==eT.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE?{token_exchange_endpoint:null,audience:null,subject_token_type:null,token_exchange_profile:null}:{},server_id:e.server_id,mcp_info:{...e.mcp_info??{},server_name:L,description:w.description,logo_url:R||void 0,mcp_server_cost_info:Object.keys(o).length>0?o:null,tool_allowlist_enforced:U},mcp_access_groups:k,alias:w.alias,extra_headers:w.extra_headers||[],...U?{allowed_tools:T}:{},tool_name_to_display_name:Object.keys(O).length>0?O:null,tool_name_to_description:Object.keys(M).length>0?M:null,disallowed_tools:w.disallowed_tools||[],static_headers:S,env_vars:I,allow_all_keys:!!(p??e.allow_all_keys),available_on_public_internet:!!(g??e.available_on_public_internet),delegate_auth_to_upstream:w.auth_type===eT.AUTH_TYPE.OAUTH2&&!!(f??e.delegate_auth_to_upstream),oauth_passthrough:(l=w.auth_type===eT.AUTH_TYPE.NONE||null==w.auth_type,n=(Array.isArray(w.extra_headers)?w.extra_headers:[]).some(e=>"string"==typeof e&&"authorization"===e.toLowerCase()),!!l&&!!n&&!!(j??e.oauth_passthrough)),dcr_bridge:!!(0,eT.isClientForwardedTokenMode)(w.auth_type)&&!!(v??e.dcr_bridge),...w.auth_type===eT.AUTH_TYPE.OAUTH2&&w.oauth_flow_type?{oauth2_flow:w.oauth_flow_type===eT.OAUTH_FLOW.M2M?eT.MCP_OAUTH2_FLOW_M2M:eT.MCP_OAUTH2_FLOW_INTERACTIVE}:{},...null!==E||e.token_validation?{token_validation:E}:{}},H=w.auth_type&&sR.includes(w.auth_type),D=(0,eT.isClientForwardedTokenMode)(w.auth_type)?(0,eT.preservedAdminCredentials)(P):P;H&&D&&Object.keys(D).length>0&&(z.credentials=D),_&&(0,eT.isClientForwardedTokenMode)(w.auth_type)&&(z.credentials={client_id:null,client_secret:null});let V=await (0,b.updateMCPServer)(s,z);if(ef?.access_token){let t=(0,eT.getMcpOAuthMode)({auth_type:w.auth_type,oauth2_flow:Z?eT.MCP_OAUTH2_FLOW_M2M:null,delegate_auth_to_upstream:!!(f??e.delegate_auth_to_upstream)});try{if("authorization_code"===t){let t=ef.scope,r={access_token:ef.access_token,refresh_token:ef.refresh_token,expires_in:ef.expires_in,scopes:"string"==typeof t&&t?t.split(" "):void 0};await (0,b.storeMCPOAuthUserCredential)(s,e.server_id,r)}else if("passthrough"===t||(0,eT.isClientForwardedTokenMode)(w.auth_type)){let t={access_token:ef.access_token,expires_in:ef.expires_in,refresh_token:ef.refresh_token,token_type:ef.token_type};(0,eC.setToken)(e.server_id,t,r)}}catch(t){let e=t instanceof Error?t.message:"";N.default.fromBackend("MCP Server updated, but failed to persist OAuth token"+(e?`: ${e}`:""));return}}N.default.success("MCP Server updated successfully"),C(!1),a(V)}catch(e){N.default.fromBackend("Failed to update MCP Server"+(e?.message?`: ${e.message}`:""))}};return(0,t.jsxs)(t3.TabGroup,{children:[(0,t.jsxs)(t6.TabList,{className:"grid w-full grid-cols-2",children:[(0,t.jsx)(t7.Tab,{children:"Server Configuration"}),(0,t.jsx)(t7.Tab,{children:"Cost Configuration"})]}),(0,t.jsxs)(t5.TabPanels,{className:"mt-6",children:[(0,t.jsx)(t4.TabPanel,{children:(0,t.jsxs)($.Form,{form:i,onFinish:eE,onValuesChange:e=>{if("credentials"in e)C(!1);else{let t=["url","spec_path","issuer","authorization_url","token_url","registration_url"].some(t=>t in e),s=void 0!==(0,eT.preservedDeclaredAppCredentials)(i.getFieldValue("credentials"));t&&s&&C(!0)}(0,eT.isHeldOAuthTokenStale)(i.getFieldsValue(!0),eh.current)&&eO(e)},initialValues:eA,layout:"vertical",children:[(0,t.jsx)($.Form.Item,{label:"MCP Server Name",name:"server_name",rules:[{validator:(e,t)=>tt(t)}],children:(0,t.jsx)(W.Input,{className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Alias",name:"alias",rules:[{validator:(e,t)=>tt(t)}],children:(0,t.jsx)(W.Input,{onChange:()=>y(!0),className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Description",name:"description",children:(0,t.jsx)(W.Input,{className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(tH,{value:R,onChange:U}),(0,t.jsx)($.Form.Item,{label:"Transport Type",name:"transport",rules:[{required:!0}],children:(0,t.jsxs)(eb.Select,{onChange:e=>{"stdio"===e?i.setFieldsValue({url:void 0,spec_path:void 0,auth_type:void 0,credentials:void 0,issuer:void 0,authorization_url:void 0,token_url:void 0,registration_url:void 0}):e===eT.TRANSPORT.OPENAPI?i.setFieldsValue({url:void 0,command:void 0,args:void 0,env_json:void 0,stdio_config:void 0}):i.setFieldsValue({spec_path:void 0,command:void 0,args:void 0,env_json:void 0,stdio_config:void 0}),(0,eT.isHeldOAuthTokenStale)(i.getFieldsValue(!0),eh.current)&&eO()},children:[(0,t.jsx)(eb.Select.Option,{value:"http",children:"Streamable HTTP (Recommended)"}),(0,t.jsx)(eb.Select.Option,{value:"sse",children:"Server-Sent Events (SSE)"}),(0,t.jsx)(eb.Select.Option,{value:"stdio",children:"Standard Input/Output (stdio)"}),(0,t.jsx)(eb.Select.Option,{value:eT.TRANSPORT.OPENAPI,children:"OpenAPI Spec"})]})}),!V&&!B&&(0,t.jsx)($.Form.Item,{label:"MCP Server URL",name:"url",rules:[{required:!0,message:"Please enter a server URL"},{validator:(e,t)=>te(t)}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-mcp-server.com",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),B&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OpenAPI Spec URL",(0,t.jsx)(ev.Tooltip,{title:"URL to an OpenAPI specification (JSON or YAML). MCP tools will be automatically generated from the API endpoints defined in the spec.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"spec_path",rules:[{required:!0,message:"Please enter an OpenAPI spec URL"}],children:(0,t.jsx)(W.Input,{placeholder:"https://petstore3.swagger.io/api/v3/openapi.json",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Max Concurrent Requests (optional)",(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tool calls LiteLLM will run against this server at the same time. Additional calls wait for a free slot. Leave blank for no limit.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"max_concurrent_requests",children:(0,t.jsx)(ey.InputNumber,{min:1,precision:0,placeholder:"e.g. 10",style:{width:"100%"},className:"rounded-lg"})}),!V&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:"Authentication",name:"auth_type",rules:[{required:!0}],children:(0,t.jsxs)(eb.Select,{virtual:!1,children:[(0,t.jsx)(eb.Select.Option,{value:"none",children:"None"}),(0,t.jsx)(eb.Select.Option,{value:"api_key",children:"API Key"}),(0,t.jsx)(eb.Select.Option,{value:"bearer_token",children:"Bearer Token"}),(0,t.jsx)(eb.Select.Option,{value:"token",children:"Token"}),(0,t.jsx)(eb.Select.Option,{value:"basic",children:"Basic Auth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2",children:"OAuth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_token_exchange",children:"OAuth Token Exchange (OBO)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_id_jag",children:"ID-JAG (Okta Cross App Access)"}),(0,t.jsx)(eb.Select.Option,{value:"aws_sigv4",children:"AWS SigV4 (Bedrock AgentCore MCPs)"}),(0,t.jsx)(eb.Select.Option,{value:"true_passthrough",children:"True Passthrough (no LiteLLM auth)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth_delegate",children:"OAuth Delegate (client-supplied upstream token)"})]})}),(0,t.jsx)(eL,{authType:z}),(0,t.jsx)(eH,{authType:z,oauthFlow:{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef},isEditing:!0,savedAuthType:e.auth_type,removeStoredApp:_,onRemoveStoredAppChange:w,appMayNotMatchUpstream:k})]}),V&&(0,t.jsxs)("div",{className:"rounded-lg border border-gray-200 p-4 space-y-4",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Configure the stdio transport used to launch the MCP server process. You can either fill in the fields below or paste a JSON configuration."}),(0,t.jsx)($.Form.Item,{label:"Command",name:"command",rules:[{required:!0,message:"Please enter a command for stdio transport"}],children:(0,t.jsx)(W.Input,{placeholder:"e.g., npx",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Args",name:"args",children:(0,t.jsx)(eb.Select,{mode:"tags",size:"large",tokenSeparators:[","],placeholder:"Add args (press enter or comma)",className:"rounded-lg"})}),(0,t.jsx)($.Form.Item,{label:"Environment (JSON object)",name:"env_json",rules:[{validator:(e,t)=>{if(!t)return Promise.resolve();try{let e=JSON.parse(t);if(e&&"object"==typeof e&&!Array.isArray(e))return Promise.resolve();return Promise.reject(Error("Env must be a JSON object"))}catch{return Promise.reject(Error("Please enter valid JSON"))}}}],children:(0,t.jsx)(W.Input.TextArea,{rows:6,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500 font-mono text-sm",placeholder:`{ - "KEY": "value" -}`})}),(0,t.jsx)(ti,{isVisible:!0,required:!1})]}),!V&&q&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Authentication Value",(0,t.jsx)(ev.Tooltip,{title:"Token, password, or header value to send with each request for the selected auth type.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","auth_value"],rules:[{validator:(e,t)=>t&&"string"==typeof t&&""===t.trim()?Promise.reject(Error("Authentication value cannot be empty")):Promise.resolve()}],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter token or secret (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),!V&&K&&(0,t.jsxs)(t.Fragment,{children:[!Q&&!X&&(0,t.jsx)(to.Alert,{type:"warning",showIcon:!0,className:"mb-4 rounded-lg",message:"This server has no OAuth flow set",description:"Choose Machine-to-Machine (M2M) or Interactive (PKCE) so LiteLLM authenticates it the way you intend, then save. Until it is set, LiteLLM falls back to interactive per-user auth and treats a machine-to-machine credential shape conservatively."}),(0,t.jsx)(eM,{isM2M:Z,isEditing:!0,oauthFlow:{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef}})]}),!V&&G&&(0,t.jsx)(eB,{isEditing:!0}),!V&&Y&&(0,t.jsx)(eW,{isEditing:!0}),!V&&J&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-2",children:["For MCP servers hosted on AWS Bedrock AgentCore."," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/mcp_aws_sigv4",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700",children:"View docs →"})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Region",(0,t.jsx)(ev.Tooltip,{title:"AWS region for SigV4 signing (e.g., us-east-1)",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_region_name"],rules:[],children:(0,t.jsx)(W.Input,{placeholder:"us-east-1 (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Service Name",(0,t.jsx)(ev.Tooltip,{title:"AWS service name for SigV4 signing. Defaults to 'bedrock-agentcore'.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_service_name"],children:(0,t.jsx)(W.Input,{placeholder:"bedrock-agentcore (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Access Key ID",(0,t.jsx)(ev.Tooltip,{title:"Optional. If not provided, falls back to the boto3 credential chain (IAM role, env vars, etc.).",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_access_key_id"],rules:[],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Secret Access Key",(0,t.jsx)(ev.Tooltip,{title:"Optional. Required if AWS Access Key ID is provided.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_secret_access_key"],rules:[],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Token",(0,t.jsx)(ev.Tooltip,{title:"Optional. Only needed for temporary STS credentials.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_token"],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Role ARN",(0,t.jsx)(ev.Tooltip,{title:"Optional. IAM role ARN to assume via STS before signing. If set, LiteLLM calls sts:AssumeRole to get temporary credentials.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_role_name"],children:(0,t.jsx)(W.Input,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Name",(0,t.jsx)(ev.Tooltip,{title:"Optional. Session name for the AssumeRole call — appears in CloudTrail logs. Auto-generated if omitted.",children:(0,t.jsx)(ew.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_name"],children:(0,t.jsx)(W.Input,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})]}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(t$,{})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(th,{availableAccessGroups:n,mcpServer:e,searchValue:f,setSearchValue:j,getAccessGroupOptions:()=>{let e=n.map(e=>({value:e,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:e})]})}));return f&&!n.some(e=>e.toLowerCase().includes(f.toLowerCase()))&&e.push({value:f,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:f}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-1",children:"create new group"})]})}),e}})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(tn,{accessToken:s,formValues:{server_id:e.server_id,server_name:es??e.server_name,url:ee??e.url,spec_path:et??e.spec_path,transport:H??e.transport,auth_type:er??e.auth_type,mcp_info:e.mcp_info,oauth_flow_type:Q??(0,eT.oauth2FlowToFormValue)(e.oauth2_flow)??eT.OAUTH_FLOW.INTERACTIVE,static_headers:el??e.static_headers,credentials:ea,issuer:en??e.issuer,authorization_url:ei??e.authorization_url,token_url:eo??e.token_url,registration_url:ec??e.registration_url},allowedTools:T,existingAllowedTools:eu,hasToolAllowlistInteraction:A,isEditMode:!0,onAllowedToolsChange:S,onToolAllowlistInteraction:()=>I(!0),toolNameToDisplayName:O,toolNameToDescription:M,onToolNameToDisplayNameChange:P,onToolNameToDescriptionChange:F,externalTools:d,externalIsLoading:m,externalError:x,externalCanFetch:!0})}),(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(eR.Button,{onClick:l,children:"Cancel"}),(0,t.jsx)(D.Button,{type:"submit",children:"Save Changes"})]})]})}),(0,t.jsx)(t4.TabPanel,{children:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(eX,{value:o,onChange:c,tools:d,disabled:m}),(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(eR.Button,{onClick:l,children:"Cancel"}),(0,t.jsx)(D.Button,{onClick:()=>i.submit(),children:"Save Changes"})]})]})})]})]})},sH=({costConfig:e})=>{let s=e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null,r=e?.tool_name_to_cost_per_query&&Object.keys(e.tool_name_to_cost_per_query).length>0;return s||r?(0,t.jsx)("div",{className:"mt-6 border-t border-border pt-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[s&&e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Default Cost per Query"}),(0,t.jsxs)("div",{className:"font-mono text-sm",children:["$",e.default_cost_per_query.toFixed(4)]})]}),r&&e?.tool_name_to_cost_per_query&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Tool-Specific Costs"}),(0,t.jsx)("div",{className:"mt-2 space-y-2",children:Object.entries(e.tool_name_to_cost_per_query).map(([e,s])=>null!=s&&(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted p-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:e}),(0,t.jsxs)("p",{className:"font-mono text-sm",children:["$",s.toFixed(4)," per query"]})]},e))})]}),(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-border bg-muted p-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Cost Summary:"}),(0,t.jsxs)("div",{className:"mt-2 space-y-1",children:[s&&e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• Default cost: $",e.default_cost_per_query.toFixed(4)," per query"]}),r&&e?.tool_name_to_cost_per_query&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• ",Object.keys(e.tool_name_to_cost_per_query).length," tool(s) with custom pricing"]})]})]})]})}):(0,t.jsx)("div",{className:"mt-6 border-t border-border pt-6",children:(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-4",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"No cost configuration set for this server. Tool calls will be charged at $0.00 per tool call."})})})})},sD=({mcpServer:e,onBack:s,isEditing:r,isProxyAdmin:l,accessToken:a,userRole:o,userID:c,availableAccessGroups:u,initialTabIndex:m=0})=>{let h=function(e,t){if(!e)return!1;let s=(0,tG.getSecureItem)(sU);if(!s)return!1;try{return JSON.parse(s)?.serverId===t}catch{return!1}}(l,e.server_id),[x,g]=(0,p.useState)(r||h),[f,j]=(0,p.useState)(!1),[v,b]=(0,p.useState)({}),[y,_]=(0,p.useState)(h?2:m),N=e.url??"",{maskedUrl:w,hasToken:C}=N?e9(N):{maskedUrl:"—",hasToken:!1},T=(e,t)=>e?C?t?e:w:e:"—",S=async(e,t)=>{await (0,ed.copyToClipboard)(e)&&(b(e=>({...e,[t]:!0})),setTimeout(()=>{b(e=>({...e,[t]:!1}))},2e3))},A=e=>(0,t.jsx)(n.Badge,{variant:"outline",children:e.toUpperCase()}),I=e=>(0,t.jsx)(n.Badge,{variant:"outline",children:e});return(0,t.jsxs)("div",{className:"max-w-full p-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsxs)(i.Button,{variant:"ghost",className:"mb-4",onClick:s,children:[(0,t.jsx)(sf.ArrowLeft,{}),"Back to All Servers"]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold",children:e.server_name||e.alias||"Unnamed Server"}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":"Copy server name",onClick:()=>S(e.server_name||e.alias,"mcp-server_name"),children:v["mcp-server_name"]?(0,t.jsx)(k.CheckIcon,{size:12}):(0,t.jsx)(t8.CopyIcon,{size:12})}),e.alias&&e.server_name&&e.alias!==e.server_name&&(0,t.jsx)(n.Badge,{variant:"secondary",className:"ml-2 font-mono",children:e.alias})]}),(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-1.5",children:[(0,t.jsx)("p",{className:"font-mono text-xs text-muted-foreground",children:e.server_id}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":"Copy server id",onClick:()=>S(e.server_id,"mcp-server-id"),children:v["mcp-server-id"]?(0,t.jsx)(k.CheckIcon,{size:10}):(0,t.jsx)(t8.CopyIcon,{size:10})})]}),e.description&&(0,t.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:e.description})]}),(0,t.jsxs)(d.Tabs,{value:String(y),onValueChange:e=>_(Number(e)),children:[(0,t.jsxs)(d.TabsList,{className:"mb-4",children:[(0,t.jsx)(d.TabsTrigger,{value:"0",className:"flex-none",children:"Overview"}),(0,t.jsx)(d.TabsTrigger,{value:"1",className:"flex-none",children:"MCP Tools"}),l&&(0,t.jsx)(d.TabsTrigger,{value:"2",className:"flex-none",children:"Settings"})]}),(0,t.jsxs)(d.TabsContent,{value:"0",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[(0,t.jsxs)(eJ.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Transport"}),(0,t.jsx)("div",{className:"mt-3",children:A((0,eT.handleTransport)(e.transport??void 0,e.spec_path??void 0))})]}),(0,t.jsxs)(eJ.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Authentication"}),(0,t.jsx)("div",{className:"mt-3",children:I((0,eT.handleAuth)(e.auth_type??void 0))})]}),(0,t.jsxs)(eJ.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Host URL"}),(0,t.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,t.jsx)("p",{className:"overflow-wrap-anywhere font-mono text-sm break-all",children:T(e.url,f)}),C&&l&&(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":f?"Hide full URL":"Show full URL",onClick:()=>j(!f),children:f?(0,t.jsx)(sv.EyeOff,{}):(0,t.jsx)(sj.Eye,{})})]})]})]}),(0,t.jsxs)(eJ.Card,{className:"mt-4 p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Cost Configuration"}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(sH,{costConfig:e.mcp_info?.mcp_server_cost_info})})]})]}),(0,t.jsx)(d.TabsContent,{value:"1",children:(0,t.jsx)(sE,{serverId:e.server_id,accessToken:a,auth_type:e.auth_type,oauth2_flow:e.oauth2_flow,delegate_auth_to_upstream:e.delegate_auth_to_upstream,dcr_bridge:e.dcr_bridge,tokenUrl:e.token_url,userRole:o,userID:c,serverAlias:e.alias,extraHeaders:e.extra_headers})}),(0,t.jsx)(d.TabsContent,{value:"2",children:(0,t.jsxs)(eJ.Card,{className:"p-6",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsx)("h2",{className:"text-lg font-medium",children:"MCP Server Settings"}),x?null:(0,t.jsx)(i.Button,{variant:"outline",onClick:()=>g(!0),children:"Edit Settings"})]}),x?(0,t.jsx)(sz,{mcpServer:e,accessToken:a,userID:c,onCancel:()=>g(!1),onSuccess:e=>{g(!1),s()},availableAccessGroups:u}):(0,t.jsxs)("div",{className:"divide-y divide-border",children:[(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Server Name"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.server_name||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Alias"}),(0,t.jsx)("div",{className:"col-span-2 font-mono text-sm",children:e.alias||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Description"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.description||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"URL"}),(0,t.jsxs)("div",{className:"col-span-2 flex items-center gap-2 font-mono text-sm break-all",children:[T(e.url,f),C&&(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":f?"Hide full URL":"Show full URL",onClick:()=>j(!f),children:f?(0,t.jsx)(sv.EyeOff,{}):(0,t.jsx)(sj.Eye,{})})]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Transport"}),(0,t.jsx)("div",{className:"col-span-2",children:A((0,eT.handleTransport)(e.transport,e.spec_path))})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Authentication"}),(0,t.jsx)("div",{className:"col-span-2",children:I((0,eT.handleAuth)(e.auth_type))})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Extra Headers"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.extra_headers&&e.extra_headers.length>0?e.extra_headers.join(", "):(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Allow All Keys"}),(0,t.jsx)("div",{className:"col-span-2",children:e.allow_all_keys?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Network Access"}),(0,t.jsx)("div",{className:"col-span-2",children:e.available_on_public_internet?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Public"]}):(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-orange-500"}),"Internal only"]})})]}),"oauth2"===(0,eT.handleAuth)(e.auth_type)&&(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Delegate Auth to Upstream"}),(0,t.jsx)("div",{className:"col-span-2",children:e.delegate_auth_to_upstream?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled (PKCE passthrough)"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),"oauth2"!==(0,eT.handleAuth)(e.auth_type)&&Array.isArray(e.extra_headers)&&e.extra_headers.some(e=>"string"==typeof e&&"authorization"===e.toLowerCase())&&(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"OAuth Pass-through"}),(0,t.jsx)("div",{className:"col-span-2",children:e.oauth_passthrough?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Access Groups"}),(0,t.jsx)("div",{className:"col-span-2",children:e.mcp_access_groups&&e.mcp_access_groups.length>0?(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.mcp_access_groups.map((e,s)=>(0,t.jsx)(n.Badge,{variant:"secondary",children:"string"==typeof e?e:e?.name??""},s))}):(0,t.jsx)("span",{className:"text-sm text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Allowed Tools"}),(0,t.jsx)("div",{className:"col-span-2",children:e.allowed_tools&&e.allowed_tools.length>0?(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.allowed_tools.map((e,s)=>(0,t.jsx)(n.Badge,{variant:"secondary",className:"font-mono",children:e},s))}):(0,t.jsx)(n.Badge,{variant:"outline",children:"All tools enabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Cost"}),(0,t.jsx)("div",{className:"col-span-2",children:(0,t.jsx)(sH,{costConfig:e.mcp_info?.mcp_server_cost_info})})]})]})]})})]})]})},sV=(0,v.createQueryKeys)("mcpSemanticFilterSettings"),sB=(0,v.createQueryKeys)("mcpSemanticFilterSettings");var sq=e.i(178654),s$=e.i(621192),sW=e.i(981339),sK=e.i(850627),sG=e.i(750113),sY=e.i(245704),sJ=e.i(987432),sQ=e.i(695411),sZ=e.i(875475),sZ=sZ,sX=e.i(992619);function s0({accessToken:e,testQuery:s,setTestQuery:r,testModel:l,setTestModel:a,isTesting:n,onTest:o,filterEnabled:c,testResult:u,testError:m,curlCommand:h}){let x=s&&l&&c,p=n||!x;return(0,t.jsxs)(eJ.Card,{className:"mb-4",children:[(0,t.jsx)(eJ.CardHeader,{children:(0,t.jsx)(eJ.CardTitle,{children:"Test Configuration"})}),(0,t.jsx)(eJ.CardContent,{children:(0,t.jsxs)(d.Tabs,{defaultValue:"test",children:[(0,t.jsxs)(d.TabsList,{children:[(0,t.jsx)(d.TabsTrigger,{value:"test",className:"flex-none",children:"Test"}),(0,t.jsx)(d.TabsTrigger,{value:"api",className:"flex-none",children:"API Usage"})]}),(0,t.jsx)(d.TabsContent,{value:"test",children:(0,t.jsxs)("div",{className:"flex w-full flex-col gap-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2 flex items-center gap-1.5 font-medium",children:[(0,t.jsx)(sZ.default,{className:"size-4"})," Test Query"]}),(0,t.jsx)(e6.Textarea,{className:"field-sizing-fixed",placeholder:"Enter a test query to see which tools would be selected...",value:s,onChange:e=>r(e.target.value),rows:4,disabled:n})]}),(0,t.jsx)("div",{children:(0,t.jsx)(sX.default,{accessToken:e||"",value:l,onChange:a,disabled:n,showLabel:!0,labelText:"Select Model"})}),(0,t.jsxs)(i.Button,{className:"w-full",onClick:o,disabled:p,children:[(0,t.jsx)(sZ.default,{}),"Test Filter"]}),!c&&(0,t.jsxs)(eE.Alert,{children:[(0,t.jsx)(eK.Info,{}),(0,t.jsx)(eE.AlertTitle,{children:"Semantic filtering is disabled"}),(0,t.jsx)(eE.AlertDescription,{children:"Enable semantic filtering and save settings to test the filter."})]}),m&&(0,t.jsxs)(eE.Alert,{variant:"destructive",className:"mb-4",children:[(0,t.jsx)(e2.CircleAlert,{}),(0,t.jsx)(eE.AlertTitle,{children:"Semantic filtering did not run"}),(0,t.jsx)(eE.AlertDescription,{children:m})]}),u&&(0,t.jsxs)("div",{children:[(0,t.jsx)("h5",{className:"mb-2 text-base font-medium",children:"Results"}),(0,t.jsxs)(eE.Alert,{className:"mb-4",children:[(0,t.jsx)(eK.Info,{}),(0,t.jsxs)(eE.AlertTitle,{children:[u.selectedTools," of ",u.totalTools," tools selected"]}),(0,t.jsxs)(eE.AlertDescription,{children:[u.totalTools-u.selectedTools," tools filtered out"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-2 block font-medium",children:"Selected Tools:"}),(0,t.jsx)("ul",{className:"m-0 list-disc pl-5",children:u.tools.map((e,s)=>(0,t.jsx)("li",{className:"mb-1",children:(0,t.jsx)("span",{children:e})},s))}),u.selectedTools>u.tools.length&&(0,t.jsxs)("p",{className:"mt-2 block text-sm text-muted-foreground",children:["+",u.selectedTools-u.tools.length," more selected tools not shown"]})]})]})]})}),(0,t.jsx)(d.TabsContent,{value:"api",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,t.jsx)(t9.Code,{className:"size-4"}),(0,t.jsx)("p",{className:"font-medium",children:"API Usage"})]}),(0,t.jsx)("p",{className:"mb-2 block text-sm text-muted-foreground",children:"Use this curl command to test the semantic filter with your current configuration."}),(0,t.jsx)("p",{className:"mb-2 block font-medium",children:"Response headers to check:"}),(0,t.jsxs)("ul",{className:"mt-0 mr-0 mb-3 ml-0 list-disc pl-5",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("span",{children:"x-litellm-semantic-filter: shows total tools → selected tools"}),(0,t.jsx)("span",{className:"block text-sm text-muted-foreground",children:"Example: 10→3"})]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("span",{children:"x-litellm-semantic-filter-tools: CSV of selected tool names"}),(0,t.jsx)("span",{className:"block text-sm text-muted-foreground",children:"Example: wikipedia-fetch,github-search,slack-post"})]})]}),(0,t.jsx)("pre",{className:"m-0 overflow-auto rounded-sm bg-muted p-3 text-xs",children:h})]})})]})})]})}let s2=async({accessToken:e,testModel:t,testQuery:s,setIsTesting:r,setTestResult:l,setTestError:a})=>{if(!s||!t||!e)return void N.default.error("Please enter a query and select a model");r(!0),l(null),a(null);try{let{headers:r}=await (0,b.testMCPSemanticFilter)(e,t,s),a=(e=>{if(!e.filter)return null;let[t,s]=e.filter.split("->").map(Number);return{totalTools:t,selectedTools:s,tools:e.tools?e.tools.split(",").map(e=>e.trim()):[]}})(r);if(!a)return void N.default.warning("Semantic filter is not enabled or no tools were filtered");l(a),N.default.success("Semantic filter test completed successfully")}catch(e){console.error("Test failed:",e),a(e instanceof Error&&e.message?e.message:"Failed to test semantic filter"),N.default.error("Failed to test semantic filter")}finally{r(!1)}};function s1({accessToken:e}){var s;let r,{data:l,isLoading:a,isError:n,error:i}=(()=>{let{accessToken:e}=(0,y.default)();return(0,g.useQuery)({queryKey:sV.list({}),queryFn:async()=>await (0,b.getMCPSemanticFilterSettings)(e),enabled:!!e,staleTime:36e5,gcTime:36e5})})(),{mutate:o,isPending:c,error:d}=(s=e||"",r=(0,j.useQueryClient)(),(0,sb.useMutation)({mutationFn:async e=>{if(!s)throw Error("Access token is required");return(0,b.updateMCPSemanticFilterSettings)(s,e)},onSuccess:()=>{r.invalidateQueries({queryKey:sB.all})}})),[u]=$.Form.useForm(),[m,h]=(0,p.useState)(!1),[x,f]=(0,p.useState)(!1),[v,_]=(0,p.useState)([]),[w,k]=(0,p.useState)(!0),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)("gpt-4o"),[I,O]=(0,p.useState)(null),[P,M]=(0,p.useState)(null),[F,E]=(0,p.useState)(!1),L=l?.field_schema,R=l?.values??{};(0,p.useEffect)(()=>{(async()=>{if(e)try{k(!0);let t=(await (0,sQ.fetchAvailableModels)(e)).filter(e=>"embedding"===e.mode);_(t)}catch(e){console.error("Error fetching embedding models:",e)}finally{k(!1)}})()},[e]),(0,p.useEffect)(()=>{R&&(u.setFieldsValue({enabled:R.enabled??!1,embedding_model:R.embedding_model??"text-embedding-3-small",top_k:R.top_k??10,similarity_threshold:R.similarity_threshold??.3}),f(!1))},[R,u]);let U=async()=>{try{let e=await u.validateFields();o(e,{onSuccess:()=>{f(!1),h(!0),setTimeout(()=>h(!1),3e3),N.default.success("Settings updated successfully. Changes will be applied across all pods within 10 seconds.")},onError:e=>{N.default.fromBackend(e)}})}catch(e){console.error("Form validation failed:",e)}},z=async()=>{e&&await s2({accessToken:e,testModel:S,testQuery:C,setIsTesting:E,setTestResult:O,setTestError:M})};return e?(0,t.jsx)("div",{style:{width:"100%"},children:a?(0,t.jsx)(sW.Skeleton,{active:!0}):n?(0,t.jsx)(to.Alert,{type:"error",message:"Could not load MCP Semantic Filter settings",description:i instanceof Error?i.message:void 0,style:{marginBottom:24}}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(to.Alert,{type:"info",message:"Semantic Tool Filtering",description:"Filter MCP tools semantically based on query relevance. This reduces context window size and improves tool selection accuracy. Click 'Save Settings' to apply changes across all pods (takes effect within 10 seconds).",showIcon:!0,style:{marginBottom:24}}),m&&(0,t.jsx)(to.Alert,{type:"success",message:"Settings saved successfully",icon:(0,t.jsx)(sY.CheckCircleOutlined,{}),showIcon:!0,closable:!0,style:{marginBottom:16}}),d&&(0,t.jsx)(to.Alert,{type:"error",message:"Could not update settings",description:d instanceof Error?d.message:void 0,style:{marginBottom:16}}),(0,t.jsxs)(s$.Row,{gutter:24,children:[(0,t.jsx)(sq.Col,{xs:24,lg:12,children:(0,t.jsxs)($.Form,{form:u,layout:"vertical",disabled:c,onValuesChange:()=>{f(!0)},children:[(0,t.jsxs)(t1.Card,{style:{marginBottom:16},children:[(0,t.jsx)($.Form.Item,{name:"enabled",label:(0,t.jsxs)(tc.Space,{children:[(0,t.jsx)(tD.Typography.Text,{strong:!0,children:"Enable Semantic Filtering"}),(0,t.jsx)(ev.Tooltip,{title:"When enabled, only the most relevant MCP tools will be included in requests based on semantic similarity",children:(0,t.jsx)(sG.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),valuePropName:"checked",children:(0,t.jsx)(e_.Switch,{disabled:c})}),(0,t.jsx)(tD.Typography.Text,{type:"secondary",style:{display:"block",marginTop:-16,marginBottom:16},children:L?.properties?.enabled?.description})]}),(0,t.jsxs)(t1.Card,{title:"Configuration",style:{marginBottom:16},children:[(0,t.jsx)($.Form.Item,{name:"embedding_model",label:(0,t.jsxs)(tc.Space,{children:[(0,t.jsx)(tD.Typography.Text,{strong:!0,children:"Embedding Model"}),(0,t.jsx)(ev.Tooltip,{title:"The model used to generate embeddings for semantic matching",children:(0,t.jsx)(sG.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(eb.Select,{options:v.map(e=>({label:e.model_group,value:e.model_group})),placeholder:w?"Loading models...":"Select embedding model",showSearch:!0,disabled:c||w,loading:w,notFoundContent:w?"Loading...":"No embedding models available"})}),(0,t.jsx)($.Form.Item,{name:"top_k",label:(0,t.jsxs)(tc.Space,{children:[(0,t.jsx)(tD.Typography.Text,{strong:!0,children:"Top K Results"}),(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tools to return after filtering",children:(0,t.jsx)(sG.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(ey.InputNumber,{min:1,max:100,style:{width:"100%"},disabled:c})}),(0,t.jsx)($.Form.Item,{name:"similarity_threshold",label:(0,t.jsxs)(tc.Space,{children:[(0,t.jsx)(tD.Typography.Text,{strong:!0,children:"Similarity Threshold"}),(0,t.jsx)(ev.Tooltip,{title:"Minimum similarity score (0-1) for a tool to be included",children:(0,t.jsx)(sG.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(sK.Slider,{min:0,max:1,step:.05,marks:{0:"0.0",.3:"0.3",.5:"0.5",.7:"0.7",1:"1.0"},disabled:c})})]}),(0,t.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:8},children:(0,t.jsx)(eR.Button,{type:"primary",icon:(0,t.jsx)(sJ.SaveOutlined,{}),onClick:U,loading:c,disabled:!x,children:"Save Settings"})})]})}),(0,t.jsx)(sq.Col,{xs:24,lg:12,children:(0,t.jsx)(s0,{accessToken:e,testQuery:C,setTestQuery:T,testModel:S,setTestModel:A,isTesting:F,onTest:z,filterEnabled:!!R.enabled,testResult:I,testError:P,curlCommand:`curl --location 'http://localhost:4000/v1/responses' \\ ---header 'Content-Type: application/json' \\ ---header 'Authorization: Bearer sk-1234' \\ ---data '{ - "model": "${S}", - "input": [ - { - "role": "user", - "content": "${C||"Your query here"}", - "type": "message" - } - ], - "tools": [ - { - "type": "mcp", - "server_url": "litellm_proxy", - "require_approval": "never" - } - ], - "tool_choice": "required" -}'`})})]})]})}):(0,t.jsx)("div",{className:"p-6 text-center text-gray-500",children:"Please log in to configure semantic filter settings."})}var s4=e.i(251854),s4=s4,s5=e.i(107233),s3=e.i(37727),s6=e.i(541202);let s7=({accessToken:e})=>{let s,[r,l]=(0,p.useState)(!0),[a,o]=(0,p.useState)(!1),[c,d]=(0,p.useState)([]),[u,h]=(0,p.useState)(null),[x,g]=(0,p.useState)("");(0,p.useEffect)(()=>{f(),j()},[e]);let f=async()=>{if(e){l(!0);try{for(let t of(await (0,b.getGeneralSettingsCall)(e)))"mcp_internal_ip_ranges"===t.field_name&&t.field_value&&d(t.field_value)}catch(e){console.error("Failed to load MCP network settings:",e)}finally{l(!1)}}},j=async()=>{if(!e)return;let t=await (0,b.fetchMCPClientIp)(e);t&&h(t)},v=async()=>{if(e){o(!0);try{c.length>0?await (0,b.updateConfigFieldSetting)(e,"mcp_internal_ip_ranges",c):await (0,b.deleteConfigFieldSetting)(e,"mcp_internal_ip_ranges")}catch(e){console.error("Failed to save MCP network settings:",e)}finally{o(!1)}}},y=()=>{let e=x.split(",").map(e=>e.trim()).filter(e=>""!==e&&!c.includes(e));e.length>0&&d([...c,...e]),g("")};if(r)return(0,t.jsx)("div",{className:"flex justify-center py-12",children:(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"})});let _=u?4!==(s=u.split(".")).length?u+"/32":`${s[0]}.${s[1]}.${s[2]}.0/24`:null;return(0,t.jsxs)("div",{className:"space-y-6 p-4",children:[(0,t.jsx)(s6.DeprecationBanner,{featureName:"MCP Network Settings and the internal-network-only flag"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-lg font-semibold",children:"Private IP Ranges"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:'Define which IP ranges are part of your private network. Callers from these IPs can see all MCP servers. Callers from any other IP can only see servers marked "Available on Public Internet".'})]}),(0,t.jsxs)(eJ.Card,{className:"p-6",children:[u&&(0,t.jsxs)("div",{className:"mb-4 rounded-lg bg-muted p-3",children:[(0,t.jsxs)("p",{className:"text-sm",children:["Your current IP: ",(0,t.jsx)("span",{className:"font-mono font-medium",children:u})]}),_&&!c.includes(_)&&(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm",children:"Suggested range: "}),(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",className:"font-mono",onClick:()=>{!c.includes(_)&&d([...c,_])},children:[(0,t.jsx)(s5.Plus,{}),_]})]})]}),(0,t.jsx)("div",{className:"mb-2 flex items-center",children:(0,t.jsx)("p",{className:"text-sm font-medium",children:"Your Private Network Ranges"})}),c.length>0&&(0,t.jsx)("div",{className:"mb-2 flex flex-wrap gap-1.5",children:c.map(e=>(0,t.jsxs)(n.Badge,{variant:"secondary",className:"font-mono",children:[e,(0,t.jsx)("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>d(c.filter(t=>t!==e)),className:"ml-1 cursor-pointer",children:(0,t.jsx)(s3.X,{className:"size-3"})})]},e))}),(0,t.jsx)(e3.Input,{value:x,placeholder:"Leave empty to use defaults: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8",onChange:e=>g(e.target.value),onBlur:y,onKeyDown:e=>{("Enter"===e.key||","===e.key)&&(e.preventDefault(),y())}}),(0,t.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Enter CIDR ranges (e.g., 10.0.0.0/8). When empty, standard private IP ranges are used."})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsxs)(i.Button,{onClick:v,disabled:a,children:[(0,t.jsx)(s4.default,{}),"Save"]})})]})};var s8=e.i(776639),s9=e.i(302747);let re=["bg-blue-500","bg-emerald-500","bg-amber-500","bg-red-500","bg-violet-500","bg-pink-500","bg-cyan-500","bg-lime-500"],rt=({isVisible:e,onClose:s,onSelectServer:r,onCustomServer:l,accessToken:n})=>{let[c,d]=(0,p.useState)([]),[u,m]=(0,p.useState)([]),[h,x]=(0,p.useState)(!1),[g,f]=(0,p.useState)(null),[j,v]=(0,p.useState)(""),[y,_]=(0,p.useState)("All");(0,p.useEffect)(()=>{e&&n&&(x(!0),f(null),(0,b.fetchDiscoverableMCPServers)(n).then(e=>{d(e.servers||[]),m(e.categories||[])}).catch(e=>{f(e.message||"Failed to load MCP servers")}).finally(()=>{x(!1)}))},[e,n]),(0,p.useEffect)(()=>{e&&(v(""),_("All"))},[e]);let N=(0,p.useMemo)(()=>{let e=c;if("All"!==y&&(e=e.filter(e=>e.category===y)),j.trim()){let t=j.toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.title.toLowerCase().includes(t)||e.description.toLowerCase().includes(t))}return e},[c,y,j]),w=(0,p.useMemo)(()=>{let e={};for(let t of N){let s=t.category||"Other";e[s]||(e[s]=[]),e[s].push(t)}return e},[N]);return(0,t.jsx)(s8.Dialog,{open:e,onOpenChange:e=>!e&&s(),children:(0,t.jsxs)(s8.DialogContent,{className:"sm:max-w-[1000px]",children:[(0,t.jsx)(s8.DialogHeader,{children:(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-border pb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-3",children:[(0,t.jsx)("img",{src:(0,sy.resolveLogoSrc)(tJ),alt:"MCP Logo",className:"mr-2 size-5 object-contain"}),(0,t.jsx)(s8.DialogTitle,{className:"text-xl font-semibold",children:"Add MCP Server"})]}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",className:"mr-8",onClick:l,children:"+ Custom Server"})]})}),(0,t.jsxs)("div",{className:"max-h-[70vh] overflow-y-auto",children:[(0,t.jsx)("div",{className:"mb-3 flex flex-wrap gap-1.5",children:["All",...u].map(e=>{let s=y===e;return(0,t.jsx)(i.Button,{size:"sm",variant:s?"default":"outline",onClick:()=>_(e),children:e},e)})}),(0,t.jsxs)(o.InputGroup,{className:"mb-4 w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search servers...",value:j,onChange:e=>v(e.target.value)})]}),h&&(0,t.jsx)("div",{className:"flex flex-col gap-1",children:Array.from({length:8}).map((e,s)=>(0,t.jsx)(s9.Skeleton,{className:"h-9 rounded-md"},s))}),g&&(0,t.jsx)("div",{className:"py-8 text-center text-muted-foreground",children:(0,t.jsxs)("p",{className:"text-sm",children:["Failed to load servers: ",g]})}),!h&&!g&&0===N.length&&(0,t.jsx)("div",{className:"py-8 text-center text-muted-foreground",children:(0,t.jsxs)("p",{className:"text-sm",children:["No servers found."," ",(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:l,children:"Add a custom server"})]})}),!h&&!g&&Object.entries(w).map(([e,s])=>(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("div",{className:"mb-1 border-b border-border py-1.5 text-[11px] font-medium tracking-wider text-muted-foreground uppercase",children:e}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-4",children:s.map(e=>{var s;let l,a,n=(l=(s=e.title||e.name).charAt(0).toUpperCase(),a=s.split("").reduce((e,t)=>e+t.charCodeAt(0),0)%re.length,{initial:l,backgroundClass:re[a]});return(0,t.jsxs)("div",{onClick:()=>r(e),className:"flex cursor-pointer items-center rounded-md px-2.5 py-2 transition-colors hover:bg-accent",children:[e.icon_url?(0,t.jsx)("img",{src:(0,sy.resolveLogoSrc)(e.icon_url),alt:e.title,className:"mr-3 size-5 shrink-0 object-contain",onError:e=>{let t=e.currentTarget;t.style.display="none";let s=t.nextElementSibling;s&&(s.style.display="flex")}}):null,(0,t.jsx)("div",{className:(0,ec.cn)("mr-3 size-5 shrink-0 items-center justify-center rounded-sm text-[11px] font-semibold text-white",n.backgroundClass,e.icon_url?"hidden":"flex"),children:n.initial}),(0,t.jsx)("span",{className:"flex-1 truncate text-sm",children:e.title||e.name}),(0,t.jsx)("span",{className:"ml-2 shrink-0 text-sm text-muted-foreground",children:"›"})]},e.name)})})]},e))]})]})})};var rs=e.i(611052),rr=e.i(262218);let{Text:rl,Title:ra}=tD.Typography,rn=({server:e,open:s,accessToken:r,onClose:l,onSaved:a})=>{let[n]=$.Form.useForm(),{data:i,isLoading:o,isError:c}=(0,g.useQuery)({queryKey:["mcpUserEnvVars",e?.server_id],queryFn:()=>(0,b.getMCPUserEnvVars)(r,e.server_id),enabled:s&&!!e&&!!r}),d=(0,sb.useMutation)({mutationFn:t=>(0,b.storeMCPUserEnvVars)(r,e.server_id,t),onSuccess:e=>{N.default.success("Credentials saved"),a?.(e),l()},onError:e=>{N.default.fromBackend(`Failed to save env vars: ${e instanceof Error?e.message:String(e)}`)}}),u=e?.server_name||e?.alias||e?.server_id||"MCP Server",m=i?.required??[],h=d.isPending;return(0,t.jsx)(q.Modal,{open:s,onCancel:l,footer:null,width:520,destroyOnHidden:!0,afterOpenChange:e=>{e&&n.resetFields()},title:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(ra,{level:5,style:{margin:0},children:"Set your credentials"}),(0,t.jsx)(rr.Tag,{color:"blue",children:"Per-user"})]}),(0,t.jsx)(rl,{type:"secondary",className:"text-xs",children:u})]}),children:(0,t.jsx)("div",{className:"space-y-4 mt-2",children:o?(0,t.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,t.jsx)(G.Spin,{})}):c?(0,t.jsx)(to.Alert,{type:"error",showIcon:!0,message:"Failed to load env vars"}):0===m.length?(0,t.jsx)(to.Alert,{type:"info",showIcon:!0,message:"No per-user fields configured for this server."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(rl,{className:"text-sm text-gray-600 block",children:"These values are private to you. Your admin configured this MCP server to require these per-user credentials. Saved values are never shown back; leave an already-set field blank to keep it, or enter a value to set or change it."}),(0,t.jsxs)($.Form,{form:n,layout:"vertical",onFinish:t=>{if(!e||!r)return;let s={};for(let[e,r]of Object.entries(t))s[e]=(r??"").trim();d.mutate(s)},disabled:h,children:[m.map(e=>(0,t.jsx)($.Form.Item,{name:e.name,label:(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"font-mono text-sm font-semibold",children:e.name}),e.is_set&&(0,t.jsx)(rr.Tag,{color:"green",children:"Set"})]}),extra:e.description||void 0,rules:e.is_set?void 0:[{required:!0,message:`${e.name} is required`}],children:(0,t.jsx)(W.Input.Password,{placeholder:e.is_set?"Enter a new value to overwrite":e.description||`Enter your ${e.name}`,visibilityToggle:!0})},e.name)),(0,t.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-2 border-t border-gray-100",children:[(0,t.jsx)(eR.Button,{onClick:l,disabled:h,children:"Cancel"}),(0,t.jsx)(eR.Button,{type:"primary",htmlType:"submit",loading:h,children:"Save Credentials"})]})]})]})})})},ri=[{value:"created_desc",label:"Recently created"},{value:"updated_desc",label:"Recently updated"},{value:"name_asc",label:"Name (A→Z)"},{value:"health",label:"Health (unhealthy first)"}],ro={unhealthy:0,unknown:1,healthy:2},rc=()=>{try{let e=(0,tG.getSecureItem)(sS.TOOLS_OAUTH_UI_STATE_KEY);if(!e)return null;return JSON.parse(e)?.serverId??null}catch{return null}},rd=({accessToken:e,userRole:r,userID:v})=>{let{data:w,isLoading:k,refetch:C}=(0,f.useMCPServers)(),{data:T,isLoading:S,recheckServerHealth:A,recheckingServerIds:I}=(()=>{let{accessToken:e}=(0,y.default)(),t=(0,j.useQueryClient)(),[s,r]=(0,p.useState)(new Set),l=(0,g.useQuery)({queryKey:_.lists(),queryFn:async()=>await (0,b.fetchMCPServerHealth)(e),enabled:!!e,refetchInterval:3e4}),a=(0,p.useCallback)(async s=>{if(e){r(e=>new Set(e).add(s));try{let r=await (0,b.fetchMCPServerHealth)(e,[s]);t.setQueriesData({queryKey:_.lists()},e=>e?e.map(e=>r.find(t=>t.server_id===e.server_id)??e):r)}finally{r(e=>{let t=new Set(e);return t.delete(s),t})}}},[e,t]);return{...l,recheckServerHealth:a,recheckingServerIds:s}})(),O=(0,p.useMemo)(()=>{if(!w)return[];if(!T)return w;let e=new Map(T.map(e=>[e.server_id,e.status]));return w.map(t=>{let s=e.get(t.server_id);return{...t,status:s||t.status}})},[w,T]),[P,M]=(0,p.useState)(null),[F,E]=(0,p.useState)(!1),[L,R]=(0,p.useState)(rc),[U,z]=(0,p.useState)(L),[D,V]=(0,p.useState)(!1),[B,q]=(0,p.useState)("all"),[$,W]=(0,p.useState)("all"),[K,G]=(0,p.useState)([]),[Y,J]=(0,p.useState)(!1),[Q,Z]=(0,p.useState)(!1),[X,ee]=(0,p.useState)(null),[et,es]=(0,p.useState)(!1),[er,el]=(0,p.useState)(null),[ea,en]=(0,p.useState)(null),[ei,eo]=(0,p.useState)(()=>new URLSearchParams(window.location.search).get("fill_env_vars")),[ec,ed]=(0,p.useState)(""),[eu,em]=(0,p.useState)("created_desc"),eh="Internal User"===r,{data:ex,refetch:ep}=(0,g.useQuery)({queryKey:["mcpUserEnvVarStatus"],queryFn:()=>(0,b.listMCPUserEnvVarStatus)(e),enabled:!!e}),eg=(0,p.useMemo)(()=>{let e={};for(let t of ex??[])e[t.server_id]=(t.required??[]).filter(e=>!e.is_set).map(e=>e.name);return e},[ex]);(0,p.useEffect)(()=>{if(!ei)return;let e=new URLSearchParams(window.location.search);if(!e.has("fill_env_vars"))return;e.delete("fill_env_vars");let t=e.toString(),s=window.location.pathname+(t?`?${t}`:"")+window.location.hash;window.history.replaceState({},"",s)},[ei]);let ef=(0,p.useMemo)(()=>ei?O.find(e=>e.server_id===ei)??null:null,[ei,O]),ev=ea??ef;(0,p.useEffect)(()=>{try{let e=(0,tG.getSecureItem)("litellm-mcp-oauth-edit-state");if(!e)return;let t=JSON.parse(e);t?.serverId&&(z(t.serverId),V(!0))}catch(e){console.error("Failed to restore MCP edit view state",e)}},[]),(0,p.useEffect)(()=>{try{window.sessionStorage.removeItem(sS.TOOLS_OAUTH_UI_STATE_KEY)}catch{}},[]);let eb=p.default.useMemo(()=>{if(!O)return[];let e=new Set,t=[];return O.forEach(s=>{s.teams&&s.teams.forEach(s=>{let r=s.team_id;e.has(r)||(e.add(r),t.push(s))})}),t},[O]),ey=p.default.useMemo(()=>({all:eh?"All Available Servers":"All Servers",personal:"Personal",...Object.fromEntries(eb.map(e=>[e.team_id,e.team_alias||e.team_id]))}),[eh,eb]),e_=p.default.useMemo(()=>O?Array.from(new Set(O.flatMap(e=>e.mcp_access_groups).filter(e=>null!=e))):[],[O]),eN=p.default.useMemo(()=>({all:"All Access Groups",...Object.fromEntries(e_.map(e=>[e,e]))}),[e_]),ew=(0,p.useCallback)((e,t)=>{if(!O)return G([]);let s=O;"personal"===e?G([]):("all"!==e&&(s=s.filter(t=>t.teams?.some(t=>t.team_id===e))),"all"!==t&&(s=s.filter(e=>e.mcp_access_groups?.some(e=>"string"==typeof e?e===t:e&&e.name===t))),G([...s].sort((e,t)=>e.created_at||t.created_at?e.created_at?t.created_at?new Date(t.created_at).getTime()-new Date(e.created_at).getTime():-1:1:0)))},[O]);(0,p.useEffect)(()=>{ew(B,$)},[O,B,$,ew]);let ek=(0,p.useMemo)(()=>{let e=ec.trim().toLowerCase();return[...e?K.filter(t=>{let s=(t.server_name||"").toLowerCase(),r=(t.alias||"").toLowerCase(),l=(t.url||"").toLowerCase(),a=t.server_id.toLowerCase();return s.includes(e)||r.includes(e)||l.includes(e)||a.includes(e)}):K].sort((e,t)=>((e,t,s)=>{switch(s){case"name_asc":{let s=(e.server_name||e.alias||e.server_id).toLowerCase(),r=(t.server_name||t.alias||t.server_id).toLowerCase();return s.localeCompare(r)}case"updated_desc":{let s=e.updated_at?new Date(e.updated_at).getTime():0;return(t.updated_at?new Date(t.updated_at).getTime():0)-s}case"health":{let s=ro[e.status??"unknown"]??1,r=ro[t.status??"unknown"]??1;if(s!==r)return s-r;let l=e.created_at?new Date(e.created_at).getTime():0;return(t.created_at?new Date(t.created_at).getTime():0)-l}default:{let s=e.created_at?new Date(e.created_at).getTime():0;return(t.created_at?new Date(t.created_at).getTime():0)-s}}})(e,t,eu))},[K,ec,eu]),eC=async()=>{if(null!=P&&null!=e)try{es(!0),await (0,b.deleteMCPServer)(e,P),N.default.success("Deleted MCP Server successfully"),U===P&&(V(!1),z(null)),C()}catch(e){console.error("Error deleting the mcp server:",e)}finally{es(!1),E(!1),M(null)}},eT=P?(w||[]).find(e=>e.server_id===P):null,eS=p.default.useMemo(()=>K.find(e=>e.server_id===U)||{server_id:"",server_name:"",alias:"",url:"",transport:"",auth_type:"",created_at:"",created_by:"",updated_at:"",updated_by:""},[K,U]),eA=p.default.useCallback(()=>{V(!1),z(null),R(null),C()},[C]);return e&&r&&v?(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{className:"h-full w-full p-6",children:[(0,t.jsx)(h.AlertDialog,{open:F,onOpenChange:e=>!e&&void(E(!1),M(null)),children:(0,t.jsxs)(h.AlertDialogContent,{children:[(0,t.jsx)(h.AlertDialogHeader,{children:(0,t.jsx)(h.AlertDialogTitle,{children:"Delete MCP Server?"})}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"This action is permanent and cannot be undone. All associated configurations will be removed."}),eT&&(0,t.jsxs)("dl",{className:"mt-3 space-y-1 rounded-lg border border-border bg-muted p-4",children:[eT.server_name&&(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"Name"}),(0,t.jsx)("dd",{className:"text-sm font-semibold",children:eT.server_name})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"ID"}),(0,t.jsx)("dd",{className:"font-mono text-xs",children:eT.server_id})]}),eT.url&&(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"URL"}),(0,t.jsx)("dd",{className:"font-mono text-xs break-all",children:eT.url})]})]})]}),(0,t.jsxs)(h.AlertDialogFooter,{children:[(0,t.jsx)(h.AlertDialogCancel,{disabled:et,children:"Cancel"}),(0,t.jsx)(i.Button,{variant:"destructive",disabled:et,onClick:eC,children:et?"Deleting...":"Delete"})]})]})}),(0,t.jsx)(t2,{userRole:r,userID:v,accessToken:e,onCreateSuccess:e=>{G(t=>[...t,e]),J(!1),C()},isModalVisible:Y,setModalVisible:J,availableAccessGroups:e_,prefillData:X,onBackToDiscovery:()=>{J(!1),ee(null),Z(!0)}}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold",children:"MCP Servers"}),K.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",children:K.length})]}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Configure and manage your MCP servers"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.isAdminRole)(r)&&(0,t.jsx)(i.Button,{className:"shrink-0",onClick:()=>Z(!0),children:"+ Add New MCP Server"}),!(0,s.isAdminRole)(r)&&(0,t.jsx)(i.Button,{className:"shrink-0",onClick:()=>{ee(null),J(!0)},variant:"secondary",children:"+ Submit MCP Server"})]})]}),(0,t.jsx)(rt,{isVisible:Q,onClose:()=>Z(!1),onSelectServer:e=>{ee(e),Z(!1),J(!0)},onCustomServer:()=>{ee(null),Z(!1),J(!0)},accessToken:e}),(0,t.jsxs)(d.Tabs,{defaultValue:"servers",className:"mt-2 w-full",children:[(0,t.jsxs)(d.TabsList,{variant:"line",className:"h-auto w-full justify-start rounded-none border-b p-0",children:[(0,t.jsx)(d.TabsTrigger,{value:"servers",className:"flex-none rounded-none px-4 py-2",children:"All Servers"}),(0,t.jsx)(d.TabsTrigger,{value:"toolsets",className:"flex-none rounded-none px-4 py-2",children:"Toolsets"}),(0,t.jsx)(d.TabsTrigger,{value:"connect",className:"flex-none rounded-none px-4 py-2",children:"Connect"}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsTrigger,{value:"semantic-filter",className:"flex-none rounded-none px-4 py-2",children:"Semantic Filter"}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsTrigger,{value:"network-settings",className:"flex-none rounded-none px-4 py-2",children:"Network Settings"}),(0,s.isAdminRole)(r)&&(0,t.jsxs)(d.TabsTrigger,{value:"submitted",className:"flex-none gap-2 rounded-none px-4 py-2",children:["Submitted MCPs ",(0,t.jsx)(x.default,{})]})]}),(0,t.jsx)(d.TabsContent,{value:"servers",children:U?(0,t.jsx)(sD,{mcpServer:eS,onBack:eA,isProxyAdmin:(0,s.isAdminRole)(r),isEditing:D,accessToken:e,userID:v,userRole:r,availableAccessGroups:e_,initialTabIndex:+(U===L)},U):(0,t.jsxs)("div",{className:"w-full h-full",children:[(0,t.jsx)("div",{className:"w-full",children:(0,t.jsx)("div",{className:"flex flex-col space-y-4",children:(0,t.jsxs)("div",{className:"flex items-center gap-6 rounded-lg border border-border bg-card px-4 py-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium whitespace-nowrap text-muted-foreground",children:"Team"}),(0,t.jsxs)(c.Select,{items:ey,value:B,onValueChange:e=>{var t;q(t=e??"all"),ew(t,$)},children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsxs)(c.SelectContent,{children:[(0,t.jsx)(c.SelectItem,{value:"all",children:eh?"All Available Servers":"All Servers"}),(0,t.jsx)(c.SelectItem,{value:"personal",children:"Personal"}),eb.map(e=>(0,t.jsx)(c.SelectItem,{value:e.team_id,children:e.team_alias||e.team_id},e.team_id))]})]})]}),(0,t.jsx)("div",{className:"h-6 w-px bg-border"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("p",{className:"flex items-center text-sm font-medium whitespace-nowrap text-muted-foreground",children:["Access Group",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(l,{className:"ml-1 size-3.5 text-muted-foreground","aria-label":"About access groups"})}),(0,t.jsx)(u.TooltipContent,{children:"An MCP Access Group is a set of users or teams that have permission to access specific MCP servers. Use access groups to control and organize who can connect to which servers."})]})]}),(0,t.jsxs)(c.Select,{items:eN,value:$,onValueChange:e=>{var t;W(t=e??"all"),ew(B,t)},children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsxs)(c.SelectContent,{children:[(0,t.jsx)(c.SelectItem,{value:"all",children:"All Access Groups"}),e_.map(e=>(0,t.jsx)(c.SelectItem,{value:e,children:e},e))]})]})]})]})})}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3",children:[(0,t.jsxs)(o.InputGroup,{className:"max-w-80",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search by name, alias, URL, or ID",value:ec,onChange:e=>ed(e.target.value)})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium whitespace-nowrap text-muted-foreground",children:"Sort"}),(0,t.jsxs)(c.Select,{items:ri,value:eu,onValueChange:e=>em(e??"created_desc"),children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsx)(c.SelectContent,{children:ri.map(e=>(0,t.jsx)(c.SelectItem,{value:e.value,children:e.label},e.value))})]})]}),(0,t.jsxs)("div",{className:"ml-auto text-xs text-muted-foreground",children:[ek.length," of ",K.length," servers"]})]}),(0,t.jsx)("div",{className:"mt-4 w-full",children:k?(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-card p-12",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading MCP servers..."})]}):0===ek.length?(0,t.jsx)("div",{className:"rounded-lg border border-dashed border-border bg-card p-12 text-center",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:0===K.length?"No MCP servers configured. Click '+ Add New MCP Server' to get started.":"No servers match the current filters or search."})}):(0,t.jsx)("div",{"data-testid":"mcp-servers-grid",className:"grid auto-rows-fr grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",children:ek.map(e=>(0,t.jsx)(sg,{server:e,missingUserFields:eg[e.server_id],isLoadingHealth:S,isRechecking:I?.has(e.server_id),onClick:()=>{z(e.server_id),V(!0)},onRecheckHealth:A?()=>A(e.server_id):void 0,onByokConnect:e.is_byok?()=>el(e):void 0,onOpenFillFields:()=>en(e),onDelete:(0,s.isAdminRole)(r)?()=>{M(e.server_id),E(!0)}:void 0},e.server_id))})})]})}),(0,t.jsx)(d.TabsContent,{value:"toolsets",children:(0,t.jsx)(ej,{accessToken:e,userRole:r})}),(0,t.jsx)(d.TabsContent,{value:"connect",children:(0,t.jsx)(sc,{})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"semantic-filter",children:(0,t.jsx)(s1,{accessToken:e})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"network-settings",children:(0,t.jsx)(s7,{accessToken:e})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"submitted",children:(0,t.jsx)(H,{accessToken:e})})]}),er&&(0,t.jsx)(rs.ByokCredentialModal,{server:er,open:!!er,onClose:()=>el(null),onSuccess:e=>{C(),el(null)}}),(0,t.jsx)(rn,{server:ev,open:!!ev,accessToken:e,onClose:()=>{en(null),eo(null)},onSaved:()=>{ep()}})]})}):(0,t.jsx)("div",{className:"p-6 text-center text-gray-500",children:"Missing required authentication parameters."})};e.s(["default",0,function(){let{accessToken:e,userRole:s,userId:r}=(0,y.default)();return(0,t.jsx)(rd,{accessToken:e,userRole:s,userID:r})}],366321)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0aoel7yrv88fp.js b/litellm/proxy/_experimental/out/_next/static/chunks/0aoel7yrv88fp.js new file mode 100644 index 00000000000..cfd92da4592 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0aoel7yrv88fp.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,742531,e=>{"use strict";function t(e,t){let n=String(e);if("string"!=typeof t)throw TypeError("Expected character");let i=0,r=n.indexOf(t);for(;-1!==r;)i++,r=n.indexOf(t,r+t.length);return i}var n=e.i(420061),i=e.i(997803),r=e.i(733644),o=e.i(457579);let l="phrasing",a=["autolink","link","image","label"];function c(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function u(e){this.config.enter.autolinkProtocol.call(this,e)}function s(e){this.config.exit.autolinkProtocol.call(this,e)}function f(e){this.config.exit.data.call(this,e);let t=this.stack[this.stack.length-1];(0,n.ok)("link"===t.type),t.url="http://"+this.sliceSerialize(e)}function h(e){this.config.exit.autolinkEmail.call(this,e)}function p(e){this.exit(e)}function d(e){!function(e,t,n){let i=(0,o.convert)((n||{}).ignore||[]),l=function(e){let t=[];if(!Array.isArray(e))throw TypeError("Expected find and replace tuple or list of tuples");let n=!e[0]||Array.isArray(e[0])?e:[e],i=-1;for(;++i0?{type:"text",value:a}:void 0),!1===a?i.lastIndex=n+1:(o!==n&&s.push({type:"text",value:e.value.slice(o,n)}),Array.isArray(a)?s.push(...a):a&&s.push(a),o=n+f[0].length,u=!0),!i.global)break;f=i.exec(e.value)}return u?(o?\]}]+$/.exec(e);if(!n)return[e,void 0];e=e.slice(0,n.index);let i=n[0],r=i.indexOf(")"),o=t(e,"("),l=t(e,")");for(;-1!==r&&o>l;)e+=i.slice(0,r+1),r=(i=i.slice(r+1)).indexOf(")"),l++;return[e,i]}(i+r);if(!c[0])return!1;let u={type:"link",title:null,url:a+n+c[0],children:[{type:"text",value:n+c[0]}]};return c[1]?[u,{type:"text",value:c[1]}]:u}function m(e,t,n,i){return!(!k(i,!0)||/[-\d_]$/.test(n))&&{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function k(e,t){let n=e.input.charCodeAt(e.index-1);return(0===e.index||(0,i.unicodeWhitespace)(n)||(0,i.unicodePunctuation)(n))&&(!t||47!==n)}var b=e.i(431745);function x(){this.buffer()}function y(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function v(){this.buffer()}function w(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function C(e){let t=this.resume(),i=this.stack[this.stack.length-1];(0,n.ok)("footnoteReference"===i.type),i.identifier=(0,b.normalizeIdentifier)(this.sliceSerialize(e)).toLowerCase(),i.label=t}function S(e){this.exit(e)}function L(e){let t=this.resume(),i=this.stack[this.stack.length-1];(0,n.ok)("footnoteDefinition"===i.type),i.identifier=(0,b.normalizeIdentifier)(this.sliceSerialize(e)).toLowerCase(),i.label=t}function D(e){this.exit(e)}function F(e,t,n,i){let r=n.createTracker(i),o=r.move("[^"),l=n.enter("footnoteReference"),a=n.enter("reference");return o+=r.move(n.safe(n.associationId(e),{after:"]",before:o})),a(),l(),o+=r.move("]")}function A(e,t,n){return 0===t?e:O(e,t,n)}function O(e,t,n){return(n?"":" ")+e}F.peek=function(){return"["};let E=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];function M(e){this.enter({type:"delete",children:[]},e)}function z(e){this.exit(e)}function T(e,t,n,i){let r=n.createTracker(i),o=n.enter("strikethrough"),l=r.move("~~");return l+=n.containerPhrasing(e,{...r.current(),before:l,after:"~"}),l+=r.move("~~"),o(),l}function j(e){return e.length}function R(e){let t="string"==typeof e?e.codePointAt(0):0;return 67===t||99===t?99:76===t||108===t?108:114*(82===t||114===t)}T.peek=function(){return"~"};var I=e.i(682523);e.i(784801);e.i(900065);function P(e,t,n){let i=e.value||"",r="`",o=-1;for(;RegExp("(^|[^`])"+r+"([^`]|$)").test(i);)r+="`";for(/[^ \r\n]/.test(i)&&(/^[ \r\n]/.test(i)&&/[ \r\n]$/.test(i)||/^`|`$/.test(i))&&(i=" "+i+" ");++o-1?t.start:1)+(!1===n.options.incrementListMarker?0:t.children.indexOf(e))+o);let l=o.length+1;("tab"===r||"mixed"===r&&(t&&"list"===t.type&&t.spread||e.spread))&&(l=4*Math.ceil(l/4));let a=n.createTracker(i);a.move(o+" ".repeat(l-o.length)),a.shift(l);let c=n.enter("listItem"),u=n.indentLines(n.containerFlow(e,a.current()),function(e,t,n){return t?(n?"":" ".repeat(l))+e:(n?o:o+" ".repeat(l-o.length))+e});return c(),u};function W(e){let t=e._align;(0,n.ok)(t,"expected `_align` on table"),this.enter({type:"table",align:t.map(function(e){return"none"===e?null:e}),children:[]},e),this.data.inTable=!0}function H(e){this.exit(e),this.data.inTable=void 0}function B(e){this.enter({type:"tableRow",children:[]},e)}function $(e){this.exit(e)}function q(e){this.enter({type:"tableCell",children:[]},e)}function V(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,U));let i=this.stack[this.stack.length-1];(0,n.ok)("inlineCode"===i.type),i.value=t,this.exit(e)}function U(e,t){return"|"===t?t:e}function K(e){let t=this.stack[this.stack.length-2];(0,n.ok)("listItem"===t.type),t.checked="taskListCheckValueChecked"===e.type}function Z(e){let t=this.stack[this.stack.length-2];if(t&&"listItem"===t.type&&"boolean"==typeof t.checked){let e=this.stack[this.stack.length-1];(0,n.ok)("paragraph"===e.type);let i=e.children[0];if(i&&"text"===i.type){let n,r=t.children,o=-1;for(;++o0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}er[43]=ei,er[45]=ei,er[46]=ei,er[95]=ei,er[72]=[ei,en],er[104]=[ei,en],er[87]=[ei,et],er[119]=[ei,et];var ef=e.i(653161),eh=e.i(204108);let ep={tokenize:function(e,t,n){let i=this;return(0,eh.factorySpace)(e,function(e){let r=i.events[i.events.length-1];return r&&"gfmFootnoteDefinitionIndent"===r[1].type&&4===r[2].sliceSerialize(r[1],!0).length?t(e):n(e)},"gfmFootnoteDefinitionIndent",5)},partial:!0};function ed(e,t,n){let i,r=this,o=r.events.length,l=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]);for(;o--;){let e=r.events[o][1];if("labelImage"===e.type){i=e;break}if("gfmFootnoteCall"===e.type||"labelLink"===e.type||"label"===e.type||"image"===e.type||"link"===e.type)break}return function(o){if(!i||!i._balanced)return n(o);let a=(0,b.normalizeIdentifier)(r.sliceSerialize({start:i.end,end:r.now()}));return 94===a.codePointAt(0)&&l.includes(a.slice(1))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(o),e.exit("gfmFootnoteCallLabelMarker"),t(o)):n(o)}}function eg(e,t){let n=e.length;for(;n--;)if("labelImage"===e[n][1].type&&"enter"===e[n][0]){e[n][1];break}e[n+1][1].type="data",e[n+3][1].type="gfmFootnoteCallLabelMarker";let i={type:"gfmFootnoteCall",start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},r={type:"gfmFootnoteCallMarker",start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};r.end.column++,r.end.offset++,r.end._bufferIndex++;let o={type:"gfmFootnoteCallString",start:Object.assign({},r.end),end:Object.assign({},e[e.length-1][1].start)},l={type:"chunkString",contentType:"string",start:Object.assign({},o.start),end:Object.assign({},o.end)},a=[e[n+1],e[n+2],["enter",i,t],e[n+3],e[n+4],["enter",r,t],["exit",r,t],["enter",o,t],["enter",l,t],["exit",l,t],["exit",o,t],e[e.length-2],e[e.length-1],["exit",i,t]];return e.splice(n,e.length-n+1,...a),e}function em(e,t,n){let r,o=this,l=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]),a=0;return function(t){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(t),e.exit("gfmFootnoteCallLabelMarker"),c};function c(t){return 94!==t?n(t):(e.enter("gfmFootnoteCallMarker"),e.consume(t),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",u)}function u(c){if(a>999||93===c&&!r||null===c||91===c||(0,i.markdownLineEndingOrSpace)(c))return n(c);if(93===c){e.exit("chunkString");let i=e.exit("gfmFootnoteCallString");return l.includes((0,b.normalizeIdentifier)(o.sliceSerialize(i)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(c),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):n(c)}return(0,i.markdownLineEndingOrSpace)(c)||(r=!0),a++,e.consume(c),92===c?s:u}function s(t){return 91===t||92===t||93===t?(e.consume(t),a++,u):u(t)}}function ek(e,t,n){let r,o,l=this,a=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]),c=0;return function(t){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(t),e.exit("gfmFootnoteDefinitionLabelMarker"),u};function u(t){return 94===t?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(t),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",s):n(t)}function s(t){if(c>999||93===t&&!o||null===t||91===t||(0,i.markdownLineEndingOrSpace)(t))return n(t);if(93===t){e.exit("chunkString");let n=e.exit("gfmFootnoteDefinitionLabelString");return r=(0,b.normalizeIdentifier)(l.sliceSerialize(n)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(t),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),h}return(0,i.markdownLineEndingOrSpace)(t)||(o=!0),c++,e.consume(t),92===t?f:s}function f(t){return 91===t||92===t||93===t?(e.consume(t),c++,s):s(t)}function h(t){return 58===t?(e.enter("definitionMarker"),e.consume(t),e.exit("definitionMarker"),a.includes(r)||a.push(r),(0,eh.factorySpace)(e,p,"gfmFootnoteDefinitionWhitespace")):n(t)}function p(e){return t(e)}}function eb(e,t,n){return e.check(ef.blankLine,t,e.attempt(ep,t,n))}function ex(e){e.exit("gfmFootnoteDefinition")}var ey=e.i(938402),ev=e.i(810291);class ew{constructor(){this.map=[]}add(e,t,n){!function(e,t,n,i){let r=0;if(0!==n||0!==i.length){for(;r0;)t-=1,n.push(e.slice(this.map[t][0]+this.map[t][1]),this.map[t][2]),e.length=this.map[t][0];n.push(e.slice()),e.length=0;let i=n.pop();for(;i;){for(let t of i)e.push(t);i=n.pop()}this.map.length=0}}function eC(e,t,n){let r,o=this,l=0,a=0;return function(e){let t=o.events.length-1;for(;t>-1;){let e=o.events[t][1].type;if("lineEnding"===e||"linePrefix"===e)t--;else break}let i=t>-1?o.events[t][1].type:null,r="tableHead"===i||"tableRow"===i?x:c;return r===x&&o.parser.lazy[o.now().line]?n(e):r(e)};function c(t){var n;return e.enter("tableHead"),e.enter("tableRow"),124===(n=t)||(r=!0,a+=1),u(n)}function u(t){return null===t?n(t):(0,i.markdownLineEnding)(t)?a>1?(a=0,o.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),h):n(t):(0,i.markdownSpace)(t)?(0,eh.factorySpace)(e,u,"whitespace")(t):(a+=1,r&&(r=!1,l+=1),124===t)?(e.enter("tableCellDivider"),e.consume(t),e.exit("tableCellDivider"),r=!0,u):(e.enter("data"),s(t))}function s(t){return null===t||124===t||(0,i.markdownLineEndingOrSpace)(t)?(e.exit("data"),u(t)):(e.consume(t),92===t?f:s)}function f(t){return 92===t||124===t?(e.consume(t),s):s(t)}function h(t){return(o.interrupt=!1,o.parser.lazy[o.now().line])?n(t):(e.enter("tableDelimiterRow"),r=!1,(0,i.markdownSpace)(t))?(0,eh.factorySpace)(e,p,"linePrefix",o.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(t):p(t)}function p(t){return 45===t||58===t?g(t):124===t?(r=!0,e.enter("tableCellDivider"),e.consume(t),e.exit("tableCellDivider"),d):n(t)}function d(t){return(0,i.markdownSpace)(t)?(0,eh.factorySpace)(e,g,"whitespace")(t):g(t)}function g(t){return 58===t?(a+=1,r=!0,e.enter("tableDelimiterMarker"),e.consume(t),e.exit("tableDelimiterMarker"),m):45===t?(a+=1,m(t)):null===t||(0,i.markdownLineEnding)(t)?b(t):n(t)}function m(t){return 45===t?(e.enter("tableDelimiterFiller"),function t(n){return 45===n?(e.consume(n),t):58===n?(r=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(n),e.exit("tableDelimiterMarker"),k):(e.exit("tableDelimiterFiller"),k(n))}(t)):n(t)}function k(t){return(0,i.markdownSpace)(t)?(0,eh.factorySpace)(e,b,"whitespace")(t):b(t)}function b(o){if(124===o)return p(o);if(null===o||(0,i.markdownLineEnding)(o))return r&&l===a?(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(o)):n(o);return n(o)}function x(t){return e.enter("tableRow"),y(t)}function y(n){return 124===n?(e.enter("tableCellDivider"),e.consume(n),e.exit("tableCellDivider"),y):null===n||(0,i.markdownLineEnding)(n)?(e.exit("tableRow"),t(n)):(0,i.markdownSpace)(n)?(0,eh.factorySpace)(e,y,"whitespace")(n):(e.enter("data"),v(n))}function v(t){return null===t||124===t||(0,i.markdownLineEndingOrSpace)(t)?(e.exit("data"),y(t)):(e.consume(t),92===t?w:v)}function w(t){return 92===t||124===t?(e.consume(t),v):v(t)}}function eS(e,t){let n,i,r,o=-1,l=!0,a=0,c=[0,0,0,0],u=[0,0,0,0],s=!1,f=0,h=new ew;for(;++on[2]+1){let t=n[2]+1,i=n[3]-n[2]-1;e.add(t,i,[])}}e.add(n[3]+1,0,[["exit",l,t]])}return void 0!==r&&(o.end=Object.assign({},eF(t.events,r)),e.add(r,0,[["exit",o,t]]),o=void 0),o}function eD(e,t,n,i,r){let o=[],l=eF(t.events,n);r&&(r.end=Object.assign({},l),o.push(["exit",r,t])),i.end=Object.assign({},l),o.push(["exit",i,t]),e.add(n+1,0,o)}function eF(e,t){let n=e[t],i="enter"===n[0]?"start":"end";return n[1][i]}let eA={name:"tasklistCheck",tokenize:function(e,t,n){let r=this;return function(t){return null===r.previous&&r._gfmTasklistFirstContentOfListItem?(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(t),e.exit("taskListCheckMarker"),o):n(t)};function o(t){return(0,i.markdownLineEndingOrSpace)(t)?(e.enter("taskListCheckValueUnchecked"),e.consume(t),e.exit("taskListCheckValueUnchecked"),l):88===t||120===t?(e.enter("taskListCheckValueChecked"),e.consume(t),e.exit("taskListCheckValueChecked"),l):n(t)}function l(t){return 93===t?(e.enter("taskListCheckMarker"),e.consume(t),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),a):n(t)}function a(r){return(0,i.markdownLineEnding)(r)?t(r):(0,i.markdownSpace)(r)?e.check({tokenize:eO},t,n)(r):n(r)}}};function eO(e,t,n){return(0,eh.factorySpace)(e,function(e){return null===e?n(e):t(e)},"whitespace")}let eE={};e.s(["default",0,function(e){var t;let n,i,r,o=e||eE,g=this.data(),m=g.micromarkExtensions||(g.micromarkExtensions=[]),k=g.fromMarkdownExtensions||(g.fromMarkdownExtensions=[]),b=g.toMarkdownExtensions||(g.toMarkdownExtensions=[]);m.push((t=o,(0,Q.combineExtensions)([{text:er},{document:{91:{name:"gfmFootnoteDefinition",tokenize:ek,continuation:{tokenize:eb},exit:ex}},text:{91:{name:"gfmFootnoteCall",tokenize:em},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:ed,resolveTo:eg}}},(n=(t||{}).singleTilde,i={name:"strikethrough",tokenize:function(e,t,i){let r=this.previous,o=this.events,l=0;return function(a){return 126===r&&"characterEscape"!==o[o.length-1][1].type?i(a):(e.enter("strikethroughSequenceTemporary"),function o(a){let c=(0,I.classifyCharacter)(r);if(126===a)return l>1?i(a):(e.consume(a),l++,o);if(l<2&&!n)return i(a);let u=e.exit("strikethroughSequenceTemporary"),s=(0,I.classifyCharacter)(a);return u._open=!s||2===s&&!!c,u._close=!c||2===c&&!!s,t(a)}(a))}},resolveAll:function(e,t){let n=-1;for(;++n0&&(o.shift(4),l+=o.move((r?"\n":" ")+n.indentLines(n.containerFlow(e,o.current()),r?O:A))),a(),l},footnoteReference:F},unsafe:[{character:"[",inConstruct:["label","phrasing","reference"]}]}),{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:E}],handlers:{delete:T}},function(e){let t=e||{},n=t.tableCellPadding,i=t.tablePipeAlign,r=t.stringLength,o=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:"\n",inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:function(e,t,n){let i=P(e,t,n);return n.stack.includes("tableCell")&&(i=i.replace(/\|/g,"\\$&")),i},table:function(e,t,n,i){return a(function(e,t,n){let i=e.children,r=-1,o=[],l=t.enter("table");for(;++ru&&(u=e[s].length);++oc[o])&&(c[o]=e)}t.push(l)}l[s]=t,a[s]=i}let h=-1;if("object"==typeof i&&"length"in i)for(;++hc[h]&&(c[h]=r),d[h]=r),p[h]=l}l.splice(1,0,p),a.splice(1,0,d),s=-1;let g=[];for(;++s{"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],246349),e.s(["ChevronRight",0,t],463059)},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])},563113,887719,e=>{"use strict";var t=e.i(271645),r=e.i(864517),i=e.i(244009),n=e.i(408850),a=e.i(87414);let o=function(...e){let t={};return e.forEach(e=>{e&&Object.keys(e).forEach(r=>{void 0!==e[r]&&(t[r]=e[r])})}),t};function l(e){let{closable:r,closeIcon:i}=e||{};return t.default.useMemo(()=>{if(!r&&(!1===r||!1===i||null===i))return!1;if(void 0===r&&void 0===i)return null;let e={closeIcon:"boolean"!=typeof i&&null!==i?i:void 0};return r&&"object"==typeof r&&(e=Object.assign(Object.assign({},e),r)),e},[r,i])}e.s(["default",0,o],887719);let s={};e.s(["pickClosable",0,function(e){if(!e)return;let{closable:t,closeIcon:r}=e;return{closable:t,closeIcon:r}},"useClosable",0,(e,u,c=s)=>{let d=l(e),f=l(u),[p]=(0,n.useLocale)("global",a.default.global),m="boolean"!=typeof d&&!!(null==d?void 0:d.disabled),v=t.default.useMemo(()=>Object.assign({closeIcon:t.default.createElement(r.default,null)},c),[c]),g=t.default.useMemo(()=>!1!==d&&(d?o(v,f,d):!1!==f&&(f?o(v,f):!!v.closable&&v)),[d,f,v]);return t.default.useMemo(()=>{var e,r;if(!1===g)return[!1,null,m,{}];let{closeIconRender:n}=v,{closeIcon:a}=g,o=a,l=(0,i.default)(g,!0);return null!=o&&(n&&(o=n(a)),o=t.default.isValidElement(o)?t.default.cloneElement(o,Object.assign(Object.assign(Object.assign({},o.props),{"aria-label":null!=(r=null==(e=o.props)?void 0:e["aria-label"])?r:p.close}),l)):t.default.createElement("span",Object.assign({"aria-label":p.close},l),o)),[!0,o,m,l]},[m,p.close,g,v])}],563113)},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)},621482,e=>{"use strict";var t=e.i(869230),r=e.i(992571),i=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:i}=e,n=super.createResult(e,t),{isFetching:a,isRefetching:o,isError:l,isRefetchError:s}=n,u=i.fetchMeta?.fetchMore?.direction,c=l&&"forward"===u,d=a&&"forward"===u,f=l&&"backward"===u,p=a&&"backward"===u;return{...n,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:(0,r.hasNextPage)(t,i.data),hasPreviousPage:(0,r.hasPreviousPage)(t,i.data),isFetchNextPageError:c,isFetchingNextPage:d,isFetchPreviousPageError:f,isFetchingPreviousPage:p,isRefetchError:s&&!c&&!f,isRefetching:o&&!d&&!p}}},n=e.i(469637);e.s(["useInfiniteQuery",0,function(e,t){return(0,n.useBaseQuery)(e,i,t)}],621482)},487486,e=>{"use strict";var t=e.i(843476),r=e.i(271645),i=e.i(552245),n=e.i(115504);let a=(0,n.cva)({base:"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3",variants:{variant:{default:"bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",outline:"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",ghost:"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",link:"text-primary underline-offset-4 [a&]:hover:underline"}},defaultVariants:{variant:"default"}}),o=r.forwardRef(({className:e,variant:r="default",render:o,...l},s)=>{var u;return u={render:o??(0,t.jsx)("span",{}),ref:s,props:{"data-slot":"badge","data-variant":r,className:(0,n.cn)(a({variant:r}),e),...l}},(0,i.useRenderElement)(u.defaultTagName??"div",u,u)});o.displayName="Badge",e.s(["Badge",0,o],487486)},757337,e=>{"use strict";var t=e.i(146376),r=e.i(788015);e.s(["useRegisteredLabelId",0,function(e,i){let n=(0,r.useBaseUiId)(e);return(0,t.useIsoLayoutEffect)(()=>(i(n),()=>{i(void 0)}),[n,i]),n}])},989257,e=>{"use strict";e.s(["stringifyLocale",0,function e(t){return Array.isArray(t)?t.map(t=>e(t)).join(","):null==t?"":String(t)}])},944835,e=>{"use strict";var t=e.i(843476);e.s([],876013),e.i(876013),e.i(247167);var r=e.i(271645),i=e.i(502077),n=e.i(733332);let a=r.createContext(void 0);function o(){let e=r.useContext(a);if(void 0===e)throw Error((0,n.default)(38));return e}var l=e.i(989257);let s=new Map;function u(e,t,r){return null==e?"":(function(e,t){let r=JSON.stringify({locale:(0,l.stringifyLocale)(e),options:t}),i=s.get(r);if(i)return i;let n=new Intl.NumberFormat(e,t);return s.set(r,n),n})(t,r).format(e)}var c=e.i(201675),d=e.i(552245);let f=r.forwardRef(function(e,n){let{format:o,getAriaValueText:l,locale:s,max:f=100,min:p=0,value:m,render:v,className:g,children:b,style:h,...y}=e,[x,E]=r.useState(),O=(m-p)*100/(f-p),w=(0,c.clamp)(Number.isNaN(O)?0:O,0,100),C=(0,c.clamp)(Number.isNaN(m)?p:m,p,f),N=o?u(m,s,o):u(w/100,s,{style:"percent"}),R=N;l&&(R=l(N,m));let I={"aria-labelledby":x,"aria-valuemax":f,"aria-valuemin":p,"aria-valuenow":C,"aria-valuetext":R,role:"meter",children:(0,t.jsxs)(r.Fragment,{children:[b,(0,t.jsx)("span",{role:"presentation",style:i.visuallyHidden,children:"x"})]})},S=r.useMemo(()=>({formattedValue:N,max:f,min:p,percentageValue:w,setLabelId:E,value:m}),[N,f,p,w,E,m]),P=(0,d.useRenderElement)("div",e,{ref:n,props:[I,y]});return(0,t.jsx)(a.Provider,{value:S,children:P})}),p=r.forwardRef(function(e,t){let{render:r,className:i,style:n,...a}=e;return(0,d.useRenderElement)("div",e,{ref:t,props:a})}),m=r.forwardRef(function(e,t){let{render:r,className:i,style:n,...a}=e,{percentageValue:l}=o();return(0,d.useRenderElement)("div",e,{ref:t,props:[{style:{insetInlineStart:0,height:"inherit",width:`${l}%`}},a]})}),v=r.forwardRef(function(e,t){let{className:r,render:i,children:n,style:a,...l}=e,{value:s,formattedValue:u}=o();return(0,d.useRenderElement)("span",e,{ref:t,props:[{"aria-hidden":!0,children:"function"==typeof n?n(u,s):u},l]})});var g=e.i(757337);let b=r.forwardRef(function(e,t){let{render:r,className:i,style:n,id:a,...l}=e,{setLabelId:s}=o(),u=(0,g.useRegisteredLabelId)(a,s);return(0,d.useRenderElement)("span",e,{ref:t,props:[{id:u,role:"presentation"},l]})});e.s(["Indicator",0,m,"Label",0,b,"Root",0,f,"Track",0,p,"Value",0,v],6256);var h=e.i(6256),h=h,y=e.i(115504);let x=(0,y.cva)({base:"h-full rounded-full transition-[width] duration-300",variants:{tone:{default:"bg-primary",warning:"bg-amber-500",over:"bg-destructive"}},defaultVariants:{tone:"default"}}),E=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(h.Root,{ref:i,"data-slot":"meter",className:(0,y.cn)("flex w-full flex-col gap-1.5",e),...r}));E.displayName="Meter";let O=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(h.Label,{ref:i,"data-slot":"meter-label",className:(0,y.cn)("text-xs text-muted-foreground",e),...r}));O.displayName="MeterLabel",r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(h.Value,{ref:i,"data-slot":"meter-value",className:(0,y.cn)("text-xs font-medium tabular-nums",e),...r})).displayName="MeterValue";let w=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(h.Track,{ref:i,"data-slot":"meter-track",className:(0,y.cn)("h-1.5 w-full overflow-hidden rounded-full bg-muted",e),...r}));w.displayName="MeterTrack";let C=r.forwardRef(({className:e,tone:r,...i},n)=>(0,t.jsx)(h.Indicator,{ref:n,"data-slot":"meter-indicator",className:(0,y.cn)(x({tone:r,className:e})),...i}));C.displayName="MeterIndicator",e.s(["Meter",0,E,"MeterIndicator",0,C,"MeterLabel",0,O,"MeterTrack",0,w],944835)},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)},872855,e=>{"use strict";var t=e.i(271645);let r=t.createContext(void 0);e.s(["useDirection",0,function(){let e=t.useContext(r);return e?.direction??"ltr"}])},73364,e=>{"use strict";var t=e.i(343084),r=e.i(229315);e.s(["getCssDimensions",0,function(e){let i=(0,r.getComputedStyle)(e),n=parseFloat(i.width)||0,a=parseFloat(i.height)||0,o=(0,r.isHTMLElement)(e),l=o?e.offsetWidth:n,s=o?e.offsetHeight:a;return((0,t.round)(n)!==l||(0,t.round)(a)!==s)&&(n=l,a=s),{width:n,height:a}}])},172410,e=>{"use strict";var t=e.i(271645);let r=t.createContext(void 0),i={disableStyleElements:!1};e.s(["useCSPContext",0,function(){return t.useContext(r)??i}])},951437,e=>{"use strict";var t=e.i(271645);e.s(["useControlled",0,function({controlled:e,default:r,name:i,state:n="value"}){let{current:a}=t.useRef(void 0!==e),[o,l]=t.useState(r),s=t.useCallback(e=>{a||l(e)},[]);return[a?e:o,s]}])},652225,e=>{"use strict";var t=e.i(271645),r=e.i(552245);let i=t.forwardRef(function(e,t){let{className:i,render:n,orientation:a="horizontal",style:o,...l}=e;return(0,r.useRenderElement)("div",e,{state:{orientation:a},ref:t,props:[{role:"separator","aria-orientation":a},l]})});e.s(["Separator",0,i])},60837,e=>{"use strict";var t=e.i(843476);let r="base-ui-disable-scrollbar";e.s(["styleDisableScrollbar",0,{className:r,getElement:e=>(0,t.jsx)("style",{nonce:e,href:r,precedence:"base-ui:low",children:`.${r}{scrollbar-width:none}.${r}::-webkit-scrollbar{display:none}`})}])},550896,e=>{"use strict";var t=e.i(201675);e.s(["SCROLL_EDGE_TOLERANCE_PX",0,1,"getMaxScrollOffset",0,function(e,t){return Math.max(0,e-t)},"normalizeScrollOffset",0,function(e,r){if(r<=0)return 0;let i=(0,t.clamp)(e,0,r),n=r-i,a=i<=1,o=n<=1;return a&&o?i<=n?0:r:a?0:o?r:i}])},33383,e=>{"use strict";var t=e.i(271645),r=e.i(108868),i=e.i(145484),n=e.i(146376);e.s(["useAnchoredPopupScrollLock",0,function(e,a,o,l){let[s,u]=t.useState(!1);(0,n.useIsoLayoutEffect)(()=>{if(!e||!a||null==o)return void u(!1);let t=(0,r.ownerDocument)(o).documentElement.clientWidth,i=o.offsetWidth;u(t>0&&i>0&&i>=t-20)},[e,a,o]),(0,i.useScrollLock)(e&&(!a||s),l)}])},96533,e=>{"use strict";var t=e.i(733332),r=e.i(271645);let i=r.createContext(void 0);e.s(["useToolbarRootContext",0,function(e){let n=r.useContext(i);if(void 0===n&&!e)throw Error((0,t.default)(69));return n}])},469690,875812,381104,e=>{"use strict";e.i(247167);var t,r=e.i(733332),i=e.i(271645),n=e.i(956789);let a=((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),o={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},l={valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},s={disabled:!1,...l};e.s(["DEFAULT_FIELD_ROOT_STATE",0,s,"DEFAULT_FIELD_STATE_ATTRIBUTES",0,l,"DEFAULT_VALIDITY_STATE",0,o,"fieldValidityMapping",0,{valid:e=>null===e?null:e?{[a.valid]:""}:{[a.invalid]:""}}],875812);let u={invalid:void 0,name:void 0,validityData:{state:o,errors:[],error:"",value:"",initialValue:null},setValidityData:n.NOOP,disabled:void 0,touched:l.touched,setTouched:n.NOOP,dirty:l.dirty,setDirty:n.NOOP,filled:l.filled,setFilled:n.NOOP,focused:l.focused,setFocused:n.NOOP,validate:()=>null,validationMode:"onSubmit",validationDebounceTime:0,shouldValidateOnChange:()=>!1,state:s,markedDirtyRef:{current:!1},registerFieldControl:n.NOOP,validation:{getValidationProps:(e,t=n.EMPTY_OBJECT)=>t,inputRef:{current:null},registerInput:n.NOOP,commit:async()=>{},change:n.NOOP}},c=i.createContext(u);function d(e=!0){let t=i.useContext(c);if(t.setValidityData===n.NOOP&&!e)throw Error((0,r.default)(28));return t}e.s(["DEFAULT_FIELD_ROOT_CONTEXT",0,u,"FieldRootContext",0,c,"useFieldRootContext",0,d],469690);var f=e.i(146376);e.s(["useRegisterFieldControl",0,function(e,t,r,n,a=!0,o){let{registerFieldControl:l}=d(),s=i.useRef(null);s.current||(s.current=Symbol()),(0,f.useIsoLayoutEffect)(()=>{let i=s.current;if(i&&a)return l(i,{controlRef:e,getValue:n,id:t,name:o,value:r}),()=>{l(i,void 0)}},[e,a,n,t,o,l,r])}],381104)},884708,e=>{"use strict";var t=e.i(271645),r=e.i(956789);let i=t.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:r.NOOP,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});e.s(["useFormContext",0,function(){return t.useContext(i)}])},538489,247778,e=>{"use strict";var t=e.i(271645),r=e.i(146376),i=e.i(667865),n=e.i(921374),a=e.i(229315),o=e.i(956789),l=e.i(788015);e.i(247167);let s=t.createContext({controlId:void 0,registerControlId:o.NOOP,labelId:void 0,setLabelId:o.NOOP,messageIds:[],setMessageIds:o.NOOP,getDescriptionProps:e=>e});function u(){return t.useContext(s)}e.s(["useLabelableContext",0,u],247778),e.s(["useLabelableId",0,function(e={}){let{id:s,implicit:c=!1,controlRef:d}=e,{controlId:f,registerControlId:p}=u(),m=(0,l.useBaseUiId)(s),v=c?f:void 0,g=(0,n.useRefWithInit)(()=>Symbol("labelable-control")),b=t.useRef(!1),h=t.useRef(null!=s),y=(0,i.useStableCallback)(()=>{b.current&&p!==o.NOOP&&(b.current=!1,p(g.current,void 0))});return(0,r.useIsoLayoutEffect)(()=>{let e;if(p!==o.NOOP){if(c){let t=d?.current;e=(0,a.isElement)(t)&&null!=t.closest("label")?s??null:v??m}else if(null!=s)h.current=!0,e=s;else{if(!h.current)return void y();e=m}if(void 0===e)return void y();b.current=!0,p(g.current,e)}},[s,d,v,p,c,m,g,y]),t.useEffect(()=>y,[y]),f??m}],538489)},555436,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],54943),e.s(["Search",0,t],555436)},643531,e=>{"use strict";var t=e.i(678745);e.s(["Check",()=>t.default])},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])},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])},664659,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDown",()=>t.default])},346570,e=>{"use strict";var t=e.i(271645),r=e.i(174080),i=e.i(647554),n=e.i(383976),a=e.i(675606),o=e.i(56434);e.s(["useTriggerFocusGuards",0,function(e,l){let s=t.useRef(null);return{preFocusGuardRef:s,handlePreFocusGuardFocus:function(t){r.flushSync(()=>{e.setOpen(!1,(0,a.createChangeEventDetails)(o.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let i=(0,n.getTabbableBeforeElement)(s.current);i?.focus()},handleFocusTargetFocus:function(t){let s=e.select("positionerElement");if(s&&(0,n.isOutsideEvent)(t,s))e.context.beforeContentFocusGuardRef.current?.focus();else{r.flushSync(()=>{e.setOpen(!1,(0,a.createChangeEventDetails)(o.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let u=(0,n.getTabbableAfterElement)(e.context.triggerFocusTargetRef.current||l.current);for(;null!==u&&(0,i.contains)(s,u);){let e=u;if((u=(0,n.getNextTabbable)(u))===e)break}u?.focus()}}}}])},31421,e=>{"use strict";var t=e.i(271645),r=e.i(146376),i=e.i(788015);e.s(["useAriaLabelledBy",0,function(e,n,a,o=!0,l){let[s,u]=t.useState(),c=(0,i.useBaseUiId)(l?`${l}-label`:void 0),d=e??n??s;return(0,r.useIsoLayoutEffect)(()=>{let t=e||n||!o?void 0:function(e,t){let r=function(e){if(!e)return;let t=e.parentElement;if(t&&"LABEL"===t.tagName)return t;let r=e.id;if(r){let t=e.nextElementSibling;if(t&&t.htmlFor===r)return t}let i=e.labels;return i&&i[0]}(e);if(r)return!r.id&&t&&(r.id=t),r.id||void 0}(a.current,c);s!==t&&u(t)}),d}])},464571,e=>{"use strict";var t=e.i(920228);e.s(["Button",()=>t.default])},560445,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(201072),i=e.i(726289),n=e.i(864517),a=e.i(562901),o=e.i(779573),l=e.i(343794),s=e.i(361275),u=e.i(244009),c=e.i(611935),d=e.i(763731),f=e.i(242064);e.i(296059);var p=e.i(915654),m=e.i(183293),v=e.i(246422);let g=(e,t,r,i,n)=>({background:e,border:`${(0,p.unit)(i.lineWidth)} ${i.lineType} ${t}`,[`${n}-icon`]:{color:r}}),b=(0,v.genStyleHooks)("Alert",e=>[(e=>{let{componentCls:t,motionDurationSlow:r,marginXS:i,marginSM:n,fontSize:a,fontSizeLG:o,lineHeight:l,borderRadiusLG:s,motionEaseInOutCirc:u,withDescriptionIconSize:c,colorText:d,colorTextHeading:f,withDescriptionPadding:p,defaultPadding:v}=e;return{[t]:Object.assign(Object.assign({},(0,m.resetComponent)(e)),{position:"relative",display:"flex",alignItems:"center",padding:v,wordWrap:"break-word",borderRadius:s,[`&${t}-rtl`]:{direction:"rtl"},[`${t}-content`]:{flex:1,minWidth:0},[`${t}-icon`]:{marginInlineEnd:i,lineHeight:0},"&-description":{display:"none",fontSize:a,lineHeight:l},"&-message":{color:f},[`&${t}-motion-leave`]:{overflow:"hidden",opacity:1,transition:`max-height ${r} ${u}, opacity ${r} ${u}, + padding-top ${r} ${u}, padding-bottom ${r} ${u}, + margin-bottom ${r} ${u}`},[`&${t}-motion-leave-active`]:{maxHeight:0,marginBottom:"0 !important",paddingTop:0,paddingBottom:0,opacity:0}}),[`${t}-with-description`]:{alignItems:"flex-start",padding:p,[`${t}-icon`]:{marginInlineEnd:n,fontSize:c,lineHeight:0},[`${t}-message`]:{display:"block",marginBottom:i,color:f,fontSize:o},[`${t}-description`]:{display:"block",color:d}},[`${t}-banner`]:{marginBottom:0,border:"0 !important",borderRadius:0}}})(e),(e=>{let{componentCls:t,colorSuccess:r,colorSuccessBorder:i,colorSuccessBg:n,colorWarning:a,colorWarningBorder:o,colorWarningBg:l,colorError:s,colorErrorBorder:u,colorErrorBg:c,colorInfo:d,colorInfoBorder:f,colorInfoBg:p}=e;return{[t]:{"&-success":g(n,i,r,e,t),"&-info":g(p,f,d,e,t),"&-warning":g(l,o,a,e,t),"&-error":Object.assign(Object.assign({},g(c,u,s,e,t)),{[`${t}-description > pre`]:{margin:0,padding:0}})}}})(e),(e=>{let{componentCls:t,iconCls:r,motionDurationMid:i,marginXS:n,fontSizeIcon:a,colorIcon:o,colorIconHover:l}=e;return{[t]:{"&-action":{marginInlineStart:n},[`${t}-close-icon`]:{marginInlineStart:n,padding:0,overflow:"hidden",fontSize:a,lineHeight:(0,p.unit)(a),backgroundColor:"transparent",border:"none",outline:"none",cursor:"pointer",[`${r}-close`]:{color:o,transition:`color ${i}`,"&:hover":{color:l}}},"&-close-text":{color:o,transition:`color ${i}`,"&:hover":{color:l}}}}})(e)],e=>({withDescriptionIconSize:e.fontSizeHeading3,defaultPadding:`${e.paddingContentVerticalSM}px 12px`,withDescriptionPadding:`${e.paddingMD}px ${e.paddingContentHorizontalLG}px`}));var h=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 y={success:r.default,info:o.default,error:i.default,warning:a.default},x=e=>{let{icon:r,prefixCls:i,type:n}=e,a=y[n]||null;return r?(0,d.replaceElement)(r,t.createElement("span",{className:`${i}-icon`},r),()=>({className:(0,l.default)(`${i}-icon`,r.props.className)})):t.createElement(a,{className:`${i}-icon`})},E=e=>{let{isClosable:r,prefixCls:i,closeIcon:a,handleClose:o,ariaProps:l}=e,s=!0===a||void 0===a?t.createElement(n.default,null):a;return r?t.createElement("button",Object.assign({type:"button",onClick:o,className:`${i}-close-icon`,tabIndex:0},l),s):null},O=t.forwardRef((e,r)=>{let{description:i,prefixCls:n,message:a,banner:o,className:d,rootClassName:p,style:m,onMouseEnter:v,onMouseLeave:g,onClick:y,afterClose:O,showIcon:w,closable:C,closeText:N,closeIcon:R,action:I,id:S}=e,P=h(e,["description","prefixCls","message","banner","className","rootClassName","style","onMouseEnter","onMouseLeave","onClick","afterClose","showIcon","closable","closeText","closeIcon","action","id"]),[$,k]=t.useState(!1),M=t.useRef(null);t.useImperativeHandle(r,()=>({nativeElement:M.current}));let{getPrefixCls:T,direction:j,closable:L,closeIcon:D,className:F,style:A}=(0,f.useComponentConfig)("alert"),B=T("alert",n),[_,V,H]=b(B),U=t=>{var r;k(!0),null==(r=e.onClose)||r.call(e,t)},z=t.useMemo(()=>void 0!==e.type?e.type:o?"warning":"info",[e.type,o]),W=t.useMemo(()=>"object"==typeof C&&!!C.closeIcon||!!N||("boolean"==typeof C?C:!1!==R&&null!=R||!!L),[N,R,C,L]),G=!!o&&void 0===w||w,X=(0,l.default)(B,`${B}-${z}`,{[`${B}-with-description`]:!!i,[`${B}-no-icon`]:!G,[`${B}-banner`]:!!o,[`${B}-rtl`]:"rtl"===j},F,d,p,H,V),Q=(0,u.default)(P,{aria:!0,data:!0}),q=t.useMemo(()=>"object"==typeof C&&C.closeIcon?C.closeIcon:N||(void 0!==R?R:"object"==typeof L&&L.closeIcon?L.closeIcon:D),[R,C,L,N,D]),J=t.useMemo(()=>{let e=null!=C?C:L;if("object"==typeof e){let{closeIcon:t}=e;return h(e,["closeIcon"])}return{}},[C,L]);return _(t.createElement(s.default,{visible:!$,motionName:`${B}-motion`,motionAppear:!1,motionEnter:!1,onLeaveStart:e=>({maxHeight:e.offsetHeight}),onLeaveEnd:O},({className:r,style:n},o)=>t.createElement("div",Object.assign({id:S,ref:(0,c.composeRef)(M,o),"data-show":!$,className:(0,l.default)(X,r),style:Object.assign(Object.assign(Object.assign({},A),m),n),onMouseEnter:v,onMouseLeave:g,onClick:y,role:"alert"},Q),G?t.createElement(x,{description:i,icon:e.icon,prefixCls:B,type:z}):null,t.createElement("div",{className:`${B}-content`},a?t.createElement("div",{className:`${B}-message`},a):null,i?t.createElement("div",{className:`${B}-description`},i):null),I?t.createElement("div",{className:`${B}-action`},I):null,t.createElement(E,{isClosable:W,prefixCls:B,closeIcon:q,handleClose:U,ariaProps:J}))))});var w=e.i(278409),C=e.i(233848),N=e.i(487806),R=e.i(479671),I=e.i(480002),S=e.i(868917);let P=function(e){function r(){var e,t,i;return(0,w.default)(this,r),t=r,i=arguments,t=(0,N.default)(t),(e=(0,I.default)(this,(0,R.default)()?Reflect.construct(t,i||[],(0,N.default)(this).constructor):t.apply(this,i))).state={error:void 0,info:{componentStack:""}},e}return(0,S.default)(r,e),(0,C.default)(r,[{key:"componentDidCatch",value:function(e,t){this.setState({error:e,info:t})}},{key:"render",value:function(){let{message:e,description:r,id:i,children:n}=this.props,{error:a,info:o}=this.state,l=(null==o?void 0:o.componentStack)||null,s=void 0===e?(a||"").toString():e;return a?t.createElement(O,{id:i,type:"error",message:s,description:t.createElement("pre",{style:{fontSize:"0.9em",overflowX:"auto"}},void 0===r?l:r)}):n}}])}(t.Component);O.ErrorBoundary=P,e.s(["Alert",0,O],560445)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/26o1fp5v-765p.js b/litellm/proxy/_experimental/out/_next/static/chunks/0dhxm4s1uxvr1.js similarity index 71% rename from litellm/proxy/_experimental/out/_next/static/chunks/26o1fp5v-765p.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0dhxm4s1uxvr1.js index f17e192c8fc..4e05f91d5de 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/26o1fp5v-765p.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0dhxm4s1uxvr1.js @@ -1 +1 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,515288,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504);let n=a.forwardRef(({className:e,size:a="default",...n},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card","data-size":a,className:(0,r.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...n}));n.displayName="Card";let i=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-header",className:(0,r.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...a}));i.displayName="CardHeader";let o=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-title",className:(0,r.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...a}));o.displayName="CardTitle";let s=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-description",className:(0,r.cn)("text-sm text-muted-foreground",e),...a}));s.displayName="CardDescription";let l=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-action",className:(0,r.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...a}));l.displayName="CardAction";let u=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-content",className:(0,r.cn)("px-(--card-spacing)",e),...a}));u.displayName="CardContent";let d=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-footer",className:(0,r.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...a}));d.displayName="CardFooter",e.s(["Card",0,n,"CardAction",0,l,"CardContent",0,u,"CardDescription",0,s,"CardFooter",0,d,"CardHeader",0,i,"CardTitle",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,373488,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(["default",0,t],373488),e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),a=e.i(451512),r=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:n=0,side:i="bottom",sideOffset:o=4,className:s,...l}){return(0,t.jsx)(a.Menu.Portal,{children:(0,t.jsx)(a.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:n,side:i,sideOffset:o,children:(0,t.jsx)(a.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,r.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:n,variant:i="default",...o}){return(0,t.jsx)(a.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":n,"data-variant":i,className:(0,r.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),...o})},"DropdownMenuSeparator",0,function({className:e,...n}){return(0,t.jsx)(a.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,r.cn)("-mx-1 my-1 h-px bg-border",e),...n})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(a.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},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)},677572,370359,405934,e=>{"use strict";var t,a,r,n=e.i(843476);e.s([],559657),e.i(559657),e.i(247167);var i=e.i(271645),o=e.i(951437),s=e.i(146376),l=e.i(667865),u=e.i(552245),d=e.i(53687),c=e.i(733332);let f=i.createContext(void 0);function p(){let e=i.useContext(f);if(void 0===e)throw Error((0,c.default)(64));return e}let g=((t={}).activationDirection="data-activation-direction",t.orientation="data-orientation",t),h={tabActivationDirection:e=>({[g.activationDirection]:e})};var v=e.i(675606),b=e.i(56434);let m=i.forwardRef(function(e,t){let{className:a,defaultValue:r=0,onValueChange:c,orientation:p="horizontal",render:g,value:m,style:x,...R}=e,w=void 0!==e.defaultValue,C=i.useRef([]),[E,T]=i.useState(()=>new Map),[S,j]=(0,o.useControlled)({controlled:m,default:r,name:"Tabs",state:"value"}),k=void 0!==m,[I,D]=i.useState(()=>new Map),O=i.useRef(void 0),A=i.useCallback(e=>{if(void 0===e)return null;for(let[t,a]of I.entries())if(null!=a&&e===(a.value??a.index))return t;return null},[I]),[N,M]=i.useState(()=>({previousValue:S,tabActivationDirection:"none"})),{previousValue:L,tabActivationDirection:z}=N,P=z,_=!1;L!==S&&(P=y(L,S,p,I),_=null!=L&&null!=S&&null==A(S));let $=_?L:S,H=L!==$||z!==P;(0,s.useIsoLayoutEffect)(()=>{H&&M({previousValue:$,tabActivationDirection:P})},[$,H,P]);let W=(0,l.useStableCallback)((e,t)=>{t.activationDirection=y(S,e,p,I),c?.(e,t),t.isCanceled||j(e)}),q=(0,l.useStableCallback)((e,t)=>{c?.(e,(0,v.createChangeEventDetails)(t,void 0,void 0,{activationDirection:"none"}))}),U=(0,l.useStableCallback)((e,t)=>{T(a=>{if(a.get(e)===t)return a;let r=new Map(a);return r.set(e,t),r})}),B=(0,l.useStableCallback)((e,t)=>{T(a=>{if(!a.has(e)||a.get(e)!==t)return a;let r=new Map(a);return r.delete(e),r})}),K=i.useCallback(e=>E.get(e),[E]),F=i.useCallback(e=>{for(let t of I.values())if(e===t?.value)return t?.id},[I]),V=i.useMemo(()=>({getTabElementBySelectedValue:A,getTabIdByPanelValue:F,getTabPanelIdByValue:K,onValueChange:W,orientation:p,registerMountedTabPanel:U,setTabMap:D,unregisterMountedTabPanel:B,tabActivationDirection:P,value:S}),[A,F,K,W,p,U,D,B,P,S]),Y=i.useMemo(()=>{for(let e of I.values())if(null!=e&&e.value===S)return e},[I,S]),Q=i.useMemo(()=>{for(let e of I.values())if(null!=e&&!e.disabled)return e.value},[I]),J=i.useRef(!w),G=i.useRef(r),X=i.useRef(w),Z=i.useRef(!1);(0,s.useIsoLayoutEffect)(()=>{if(k)return;function e(e,t){j(e),M(t=>t.previousValue===e&&"none"===t.tabActivationDirection?t:{previousValue:e,tabActivationDirection:"none"}),q(e,t),J.current=!1}if(0===I.size){Z.current&&null!==S&&!O.current?.isConnected&&e(null,b.REASONS.missing);return}Z.current=!0,O.current=I.keys().next().value;let t=Y?.disabled,a=null==Y&&null!==S;if(t||S!==G.current||(X.current=!1),X.current&&t&&S===G.current)return;let r=J.current;if(t||a){let a=Q??null;if(S===a){J.current=!1;return}let n=b.REASONS.missing;r?n=b.REASONS.initial:t&&(n=b.REASONS.disabled),e(a,n);return}r&&null!=Y&&(q(S,b.REASONS.initial),J.current=!1)},[Q,k,q,Y,j,I,S]);let ee={orientation:p,tabActivationDirection:P},et=(0,u.useRenderElement)("div",e,{state:ee,ref:t,props:R,stateAttributesMapping:h});return(0,n.jsx)(f.Provider,{value:V,children:(0,n.jsx)(d.CompositeList,{elementsRef:C,children:et})})});function y(e,t,a,r){if(null==e||null==t)return"none";let n=null,i=null;for(let[a,o]of r.entries()){if(null==o)continue;let r=o.value??o.index;if(e===r&&(n=a),t===r&&(i=a),null!=n&&null!=i)break}if(null==n||null==i)return n!==i&&("number"==typeof e||"string"==typeof e)&&typeof e==typeof t?"horizontal"===a?t>e?"right":"left":t>e?"down":"up":"none";let o=n.getBoundingClientRect(),s=i.getBoundingClientRect();if("horizontal"===a){if(s.lefto.left)return"right"}else{if(s.topo.top)return"down"}return"none"}var x=e.i(108868),R=e.i(788015),w=e.i(540886);let C="data-composite-item-active";e.s(["ACTIVE_COMPOSITE_ITEM",0,C],370359);var E=e.i(395530);let T=i.createContext(void 0);function S(){let e=i.useContext(T);if(void 0===e)throw Error((0,c.default)(65));return e}var j=e.i(647554);let k=i.forwardRef(function(e,t){let{className:a,disabled:r=!1,render:n,value:o,id:l,nativeButton:d=!0,style:c,...f}=e,{value:g,getTabPanelIdByValue:m,orientation:y,tabActivationDirection:T}=p(),{activateOnFocus:k,highlightedTabIndex:I,onTabActivation:D,registerTabResizeObserverElement:O,setHighlightedTabIndex:A,tabsListElement:N}=S(),M=(0,R.useBaseUiId)(l),L=i.useMemo(()=>({disabled:r,id:M,value:o}),[r,M,o]),{compositeProps:z,compositeRef:P,index:_}=(0,E.useCompositeItem)({metadata:L}),$=o===g,H=i.useRef(!1),W=i.useRef(null);(0,s.useIsoLayoutEffect)(()=>{let e=W.current;if(e)return O(e)},[O]),(0,s.useIsoLayoutEffect)(()=>{if(H.current){H.current=!1;return}if($&&_>-1&&I!==_){if(null!=N){let e=(0,j.activeElement)((0,x.ownerDocument)(N));if(e&&(0,j.contains)(N,e))return}r||A(_)}},[$,_,I,A,r,N]);let{getButtonProps:q,buttonRef:U}=(0,w.useButton)({disabled:r,native:d,focusableWhenDisabled:!0}),B=m(o),K=i.useRef(!1),F=i.useRef(!1);return(0,u.useRenderElement)("button",e,{state:{disabled:r,active:$,orientation:y,tabActivationDirection:T},ref:[t,U,P,W],props:[z,{role:"tab","aria-controls":B,"aria-selected":$,id:M,onClick:function(e){$||r||D(o,(0,v.createChangeEventDetails)(b.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"}))},onFocus:function(e){$||(_>-1&&!r&&A(_),!r&&k&&(!K.current||K.current&&F.current)&&D(o,(0,v.createChangeEventDetails)(b.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"})))},onPointerDown:function(e){$||r||(K.current=!0,e.button&&0!==e.button||(F.current=!0,(0,x.ownerDocument)(e.currentTarget).addEventListener("pointerup",function(){K.current=!1,F.current=!1},{once:!0})))},[C]:$?"":void 0,onKeyDownCapture(){H.current=!0}},f,q],stateAttributesMapping:h})});var I=e.i(73364),D=e.i(802239),O=e.i(956789);function A(){return O.NOOP}function N(){return!1}function M(){return!0}let L=((a={}).activeTabLeft="--active-tab-left",a.activeTabRight="--active-tab-right",a.activeTabTop="--active-tab-top",a.activeTabBottom="--active-tab-bottom",a.activeTabWidth="--active-tab-width",a.activeTabHeight="--active-tab-height",a);var z=e.i(172410);let P={...h,activeTabPosition:()=>null,activeTabSize:()=>null},_=i.forwardRef(function(e,t){let{className:a,render:r,renderBeforeHydration:o=!1,style:s,...l}=e,{nonce:d}=(0,z.useCSPContext)(),{getTabElementBySelectedValue:c,orientation:f,tabActivationDirection:g,value:h}=p(),{tabsListElement:v,registerIndicatorUpdateListener:b}=S(),m=(0,D.useSyncExternalStore)(A,N,M),y=function(){let[,e]=i.useState({});return i.useCallback(()=>{e({})},[])}();i.useEffect(()=>b(y),[b,y]);let x=0,R=0,w=0,C=0,E=0,T=0,j=!1;if(null!=h&&null!=v){let e=c(h);if(null!=e){j=!0;let{width:t,height:a}=(0,I.getCssDimensions)(e),{width:r,height:n}=(0,I.getCssDimensions)(v),i=e.getBoundingClientRect(),o=v.getBoundingClientRect(),s=r>0?o.width/r:1,l=n>0?o.height/n:1;if(Math.abs(s)>Number.EPSILON&&Math.abs(l)>Number.EPSILON){let e=i.left-o.left,t=i.top-o.top;x=e/s+v.scrollLeft-v.clientLeft,w=t/l+v.scrollTop-v.clientTop}else x=e.offsetLeft,w=e.offsetTop;E=t,T=a,R=v.scrollWidth-x-E,C=v.scrollHeight-w-T}}let k=j?{left:x,right:R,top:w,bottom:C}:null,O=j?{width:E,height:T}:null,_=j?{[L.activeTabLeft]:`${x}px`,[L.activeTabRight]:`${R}px`,[L.activeTabTop]:`${w}px`,[L.activeTabBottom]:`${C}px`,[L.activeTabWidth]:`${E}px`,[L.activeTabHeight]:`${T}px`}:void 0,$=j&&E>0&&T>0,H=(0,u.useRenderElement)("span",e,{state:{orientation:f,activeTabPosition:k,activeTabSize:O,tabActivationDirection:g},ref:t,props:[{role:"presentation",style:_,hidden:!$},l,{suppressHydrationWarning:!0}],stateAttributesMapping:P});return null==h?null:(0,n.jsxs)(i.Fragment,{children:[H,m&&o&&(0,n.jsx)("script",{nonce:d,dangerouslySetInnerHTML:{__html:'!function(){const t=document.currentScript.previousElementSibling;if(!t)return;const e=t.closest(\'[role="tablist"]\');if(!e)return;const i=e.querySelector("[data-active]");if(!i)return;if(0===i.offsetWidth||0===e.offsetWidth)return;let o=0,n=0,h=0,l=0,r=0,f=0;function s(t){const e=getComputedStyle(t);let i=parseFloat(e.width)||0,o=parseFloat(e.height)||0;return(Math.round(i)!==t.offsetWidth||Math.round(o)!==t.offsetHeight)&&(i=t.offsetWidth,o=t.offsetHeight),{width:i,height:o}}if(null!=i&&null!=e){const{width:t,height:c}=s(i),{width:u,height:d}=s(e),a=i.getBoundingClientRect(),g=e.getBoundingClientRect(),p=u>0?g.width/u:1,b=d>0?g.height/d:1;if(Math.abs(p)>Number.EPSILON&&Math.abs(b)>Number.EPSILON){const t=a.left-g.left,i=a.top-g.top;o=t/p+e.scrollLeft-e.clientLeft,h=i/b+e.scrollTop-e.clientTop}else o=i.offsetLeft,h=i.offsetTop;r=t,f=c,n=e.scrollWidth-o-r,l=e.scrollHeight-h-f}function c(e,i){t.style.setProperty(`--active-tab-${e}`,`${i}px`)}c("left",o),c("right",n),c("top",h),c("bottom",l),c("width",r),c("height",f),r>0&&f>0&&t.removeAttribute("hidden")}();'},suppressHydrationWarning:!0})]})});var $=e.i(144394),H=e.i(209407),W=e.i(137584),q=e.i(223910),U=e.i(673553);let B=((r={}).index="data-index",r.activationDirection="data-activation-direction",r.orientation="data-orientation",r.hidden="data-hidden",r[r.startingStyle=H.TransitionStatusDataAttributes.startingStyle]="startingStyle",r[r.endingStyle=H.TransitionStatusDataAttributes.endingStyle]="endingStyle",r),K={...h,...H.transitionStatusMapping},F=i.forwardRef(function(e,t){let{className:a,value:r,render:n,keepMounted:o=!1,style:l,...d}=e,{value:c,getTabIdByPanelValue:f,orientation:g,tabActivationDirection:h,registerMountedTabPanel:v,unregisterMountedTabPanel:b}=p(),m=(0,R.useBaseUiId)(),y=i.useMemo(()=>({id:m,value:r}),[m,r]),{ref:x,index:w}=(0,U.useCompositeListItem)({metadata:y}),C=r===c,{mounted:E,transitionStatus:T,setMounted:S}=(0,q.useTransitionStatus)(C),j=!E,k=f(r),I=i.useRef(null),D=(0,u.useRenderElement)("div",e,{state:{hidden:j,orientation:g,tabActivationDirection:h,transitionStatus:T},ref:[t,x,I],props:[{"aria-labelledby":k,hidden:j,id:m,role:"tabpanel",tabIndex:C?0:-1,inert:(0,$.inertValue)(!C),[B.index]:w},d],stateAttributesMapping:K});return((0,W.useOpenChangeComplete)({open:C,ref:I,onComplete(){C||S(!1)}}),(0,s.useIsoLayoutEffect)(()=>{if((!j||o)&&null!=m)return v(r,m),()=>{b(r,m)}},[j,o,r,m,v,b]),o||E)?D:null});var V=e.i(590803),Y=e.i(828918),Q=e.i(673327),J=e.i(621082);let G=[];var X=e.i(838452),Z=e.i(872855);function ee(e){let{render:t,className:a,style:r,refs:o=O.EMPTY_ARRAY,props:c=O.EMPTY_ARRAY,state:f=O.EMPTY_OBJECT,stateAttributesMapping:p,highlightedIndex:g,onHighlightedIndexChange:h,orientation:v,grid:b,loopFocus:m,onLoop:y,enableHomeAndEndKeys:x,onMapChange:R,stopEventPropagation:w=!0,rootRef:E,disabledIndices:T,modifierKeys:S,highlightItemOnHover:k=!1,tag:I="div",...D}=e,{props:A,highlightedIndex:N,onHighlightedIndexChange:M,elementsRef:L,onMapChange:z,relayKeyboardEvent:P}=function(e){let{loopFocus:t=!0,orientation:a="both",grid:r,onLoop:n,direction:o,highlightedIndex:u,onHighlightedIndexChange:d,rootRef:c,enableHomeAndEndKeys:f=!1,stopEventPropagation:p=!1,disabledIndices:g,modifierKeys:h=G}=e,[v,b]=i.useState(0),m=null!=r,y=i.useRef(null),x=(0,Y.useMergedRefs)(y,c),R=i.useRef([]),w=i.useRef(!1),E=u??v,T=(0,l.useStableCallback)((e,t=!1)=>{if((d??b)(e),t){let t=R.current[e];(0,Q.scrollIntoViewIfNeeded)(y.current,t,o,a)}}),S=(0,l.useStableCallback)(e=>{if(0===e.size||w.current)return;w.current=!0;let t=Array.from(e.keys()),r=t.find(e=>e?.hasAttribute(C))??null,n=r?t.indexOf(r):-1;if(-1!==n)T(n);else if((0,J.isListIndexDisabled)(t,E,g)){let e=(0,J.findNonDisabledListIndex)(t,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(t,e)||T(e)}(0,Q.scrollIntoViewIfNeeded)(y.current,r,o,a)});(0,s.useIsoLayoutEffect)(()=>{if(null==g||null!=u||!w.current)return;let e=R.current;if((0,J.isListIndexDisabled)(e,E,g)){let t=(0,J.findNonDisabledListIndex)(e,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(e,t)||T(t)}},[g,u,E,R,T]);let k=(0,l.useStableCallback)((e,t,a)=>n?n(e,t,a,R):a),I=(0,l.useStableCallback)(e=>{let i=f?Q.COMPOSITE_KEYS:Q.ARROW_KEYS;if(!i.has(e.key)||function(e,t){for(let a of Q.MODIFIER_KEYS.values())if(!t.includes(a)&&e.getModifierState(a))return!0;return!1}(e,h)||!y.current)return;let s="rtl"===o,l=s?Q.ARROW_LEFT:Q.ARROW_RIGHT,u={horizontal:l,vertical:Q.ARROW_DOWN,both:l}[a],d=s?Q.ARROW_RIGHT:Q.ARROW_LEFT,c={horizontal:d,vertical:Q.ARROW_UP,both:d}[a],v=(0,j.getTarget)(e.nativeEvent);if(null!=v&&(0,Q.isNativeInput)(v)&&!(0,V.isElementDisabled)(v)){let t=v.selectionStart,a=v.selectionEnd,r=v.value??"";if(null==t||e.shiftKey||t!==a||e.key!==c&&t0)return}let b=E,x=(0,J.getMinListIndex)(R,g),w=(0,J.getMaxListIndex)(R,g);null!=r&&(b=r({disabledIndices:g,elementsRef:R,event:e,highlightedIndex:E,loopFocus:t,maxIndex:w,minIndex:x,onLoop:k,orientation:a,rtl:s}));let C={horizontal:[l],vertical:[Q.ARROW_DOWN],both:[l,Q.ARROW_DOWN]}[a],S={horizontal:[d],vertical:[Q.ARROW_UP],both:[d,Q.ARROW_UP]}[a],I=m?i:({horizontal:f?Q.HORIZONTAL_KEYS_WITH_EXTRA_KEYS:Q.HORIZONTAL_KEYS,vertical:f?Q.VERTICAL_KEYS_WITH_EXTRA_KEYS:Q.VERTICAL_KEYS,both:i})[a];f&&(e.key===Q.HOME?b=x:e.key===Q.END&&(b=w)),b===E&&(C.includes(e.key)||S.includes(e.key))&&(t&&b===w&&C.includes(e.key)?(b=x,n&&(b=n(e,E,b,R))):t&&b===x&&S.includes(e.key)?(b=w,n&&(b=n(e,E,b,R))):b=(0,J.findNonDisabledListIndex)(R.current,{startingIndex:b,decrement:S.includes(e.key),disabledIndices:g})),b===E||(0,J.isIndexOutOfListBounds)(R.current,b)||(p&&e.stopPropagation(),I.has(e.key)&&e.preventDefault(),T(b,!0),queueMicrotask(()=>{R.current[b]?.focus()}))});return{props:{ref:x,onFocus(e){let t=y.current,a=(0,j.getTarget)(e.nativeEvent);t&&null!=a&&(0,Q.isNativeInput)(a)&&a.setSelectionRange(0,a.value.length??0)},onKeyDown:I},highlightedIndex:E,onHighlightedIndexChange:T,elementsRef:R,disabledIndices:g,onMapChange:S,relayKeyboardEvent:I}}({grid:b,loopFocus:m,onLoop:y,orientation:v,highlightedIndex:g,onHighlightedIndexChange:h,rootRef:E,stopEventPropagation:w,enableHomeAndEndKeys:x,direction:(0,Z.useDirection)(),disabledIndices:T,modifierKeys:S}),_=(0,u.useRenderElement)(I,e,{state:f,ref:o,props:[A,...c,D],stateAttributesMapping:p}),$=i.useMemo(()=>({highlightedIndex:N,onHighlightedIndexChange:M,highlightItemOnHover:k,relayKeyboardEvent:P}),[N,M,k,P]);return(0,n.jsx)(X.CompositeRootContext.Provider,{value:$,children:(0,n.jsx)(d.CompositeList,{elementsRef:L,onMapChange:e=>{R?.(e),z(e)},children:_})})}e.s(["CompositeRoot",0,ee],405934);let et=i.forwardRef(function(e,t){let{activateOnFocus:a=!1,className:r,loopFocus:o=!0,render:u,style:d,...c}=e,{onValueChange:f,orientation:g,value:v,setTabMap:b,tabActivationDirection:m}=p(),[y,x]=i.useState(0),[R,w]=i.useState(null),C=i.useRef(new Set),E=i.useRef(new Set),S=i.useRef(null);(0,s.useIsoLayoutEffect)(()=>{if("u"{C.current.forEach(e=>{e()})});return S.current=e,R&&e.observe(R),E.current.forEach(t=>{e.observe(t)}),()=>{e.disconnect(),S.current=null}},[R]);let j=(0,l.useStableCallback)(e=>(C.current.add(e),()=>{C.current.delete(e)})),k=(0,l.useStableCallback)(e=>(E.current.add(e),S.current?.observe(e),()=>{E.current.delete(e),S.current?.unobserve(e)})),I=(0,l.useStableCallback)((e,t)=>{e!==v&&f(e,t)}),D=i.useMemo(()=>({activateOnFocus:a,highlightedTabIndex:y,registerIndicatorUpdateListener:j,registerTabResizeObserverElement:k,onTabActivation:I,setHighlightedTabIndex:x,tabsListElement:R}),[a,y,j,k,I,x,R]);return(0,n.jsx)(T.Provider,{value:D,children:(0,n.jsx)(ee,{render:u,className:r,style:d,state:{orientation:g,tabActivationDirection:m},refs:[t,w],props:[{"aria-orientation":"vertical"===g?"vertical":void 0,role:"tablist"},c],stateAttributesMapping:h,highlightedIndex:y,enableHomeAndEndKeys:!0,loopFocus:o,orientation:g,onHighlightedIndexChange:x,onMapChange:b,disabledIndices:O.EMPTY_ARRAY})})});e.s(["Indicator",0,_,"List",0,et,"Panel",0,F,"Root",0,m,"Tab",0,k],69281);var ea=e.i(69281),ea=ea,er=e.i(115504);let en=(0,er.cva)({base:"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-9 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});e.s(["Tabs",0,function({className:e,orientation:t="horizontal",...a}){return(0,n.jsx)(ea.Root,{"data-slot":"tabs","data-orientation":t,className:(0,er.cn)("group/tabs flex gap-2 data-horizontal:flex-col",e),...a})},"TabsContent",0,function({className:e,...t}){return(0,n.jsx)(ea.Panel,{"data-slot":"tabs-content",className:(0,er.cn)("flex-1 text-sm outline-none",e),...t})},"TabsList",0,function({className:e,variant:t="default",...a}){return(0,n.jsx)(ea.List,{"data-slot":"tabs-list","data-variant":t,className:(0,er.cn)(en({variant:t}),e),...a})},"TabsTrigger",0,function({className:e,...t}){return(0,n.jsx)(ea.Tab,{"data-slot":"tabs-trigger",className:(0,er.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",e),...t})}],677572)},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])},871689,e=>{"use strict";var t=e.i(180127);e.s(["ArrowLeft",()=>t.default])},776639,e=>{"use strict";var t=e.i(843476),a=e.i(353753),r=e.i(115504),n=e.i(519455),i=e.i(995926);function o({...e}){return(0,t.jsx)(a.Dialog.Portal,{"data-slot":"dialog-portal",...e})}function s({className:e,...n}){return(0,t.jsx)(a.Dialog.Backdrop,{"data-slot":"dialog-overlay",className:(0,r.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...n})}e.s(["Dialog",0,function({...e}){return(0,t.jsx)(a.Dialog.Root,{"data-slot":"dialog",...e})},"DialogContent",0,function({className:e,children:l,showCloseButton:u=!0,...d}){return(0,t.jsxs)(o,{children:[(0,t.jsx)(s,{}),(0,t.jsxs)(a.Dialog.Popup,{"data-slot":"dialog-content",className:(0,r.cn)("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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),...d,children:[l,u&&(0,t.jsxs)(a.Dialog.Close,{"data-slot":"dialog-close",render:(0,t.jsx)(n.Button,{variant:"ghost",className:"absolute top-4 right-4",size:"icon-sm"}),children:[(0,t.jsx)(i.XIcon,{}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})},"DialogDescription",0,function({className:e,...n}){return(0,t.jsx)(a.Dialog.Description,{"data-slot":"dialog-description",className:(0,r.cn)("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...n})},"DialogFooter",0,function({className:e,showCloseButton:i=!1,children:o,...s}){return(0,t.jsxs)("div",{"data-slot":"dialog-footer",className:(0,r.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...s,children:[o,i&&(0,t.jsx)(a.Dialog.Close,{render:(0,t.jsx)(n.Button,{variant:"outline"}),children:"Close"})]})},"DialogHeader",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"dialog-header",className:(0,r.cn)("flex flex-col gap-2",e),...a})},"DialogTitle",0,function({className:e,...n}){return(0,t.jsx)(a.Dialog.Title,{"data-slot":"dialog-title",className:(0,r.cn)("leading-none font-medium",e),...n})}])},768371,e=>{"use strict";let t,a;var r=e.i(247167);let n=/\{[^{}]+\}/g;function i(e,t,a){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${a?.allowReserved===!0?t:encodeURIComponent(t)}`}function o(e,t,a){if(!t||"object"!=typeof t)return"";let r=[],n={simple:",",label:".",matrix:";"}[a.style]||"&";if("deepObject"!==a.style&&!1===a.explode){for(let e in t)r.push(e,!0===a.allowReserved?t[e]:encodeURIComponent(t[e]));let n=r.join(",");switch(a.style){case"form":return`${e}=${n}`;case"label":return`.${n}`;case"matrix":return`;${e}=${n}`;default:return n}}for(let n in t){let o="deepObject"===a.style?`${e}[${n}]`:n;r.push(i(o,t[n],a))}let o=r.join(n);return"label"===a.style||"matrix"===a.style?`${n}${o}`:o}function s(e,t,a){if(!Array.isArray(t))return"";if(!1===a.explode){let r={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[a.style]||",",n=(!0===a.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(r);switch(a.style){case"simple":return n;case"label":return`.${n}`;case"matrix":return`;${e}=${n}`;default:return`${e}=${n}`}}let r={simple:",",label:".",matrix:";"}[a.style]||"&",n=[];for(let r of t)"simple"===a.style||"label"===a.style?n.push(!0===a.allowReserved?r:encodeURIComponent(r)):n.push(i(e,r,a));return"label"===a.style||"matrix"===a.style?`${r}${n.join(r)}`:n.join(r)}function l(e){return function(t){let a=[];if(t&&"object"==typeof t)for(let r in t){let n=t[r];if(null!=n){if(Array.isArray(n)){if(0===n.length)continue;a.push(s(r,n,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof n){a.push(o(r,n,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}a.push(i(r,n,e))}}return a.join("&")}}function u(e,t){let a=e;for(let r of e.match(n)??[]){let e=r.substring(1,r.length-1),n=!1,l="simple";if(e.endsWith("*")&&(n=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(l="label",e=e.substring(1)):e.startsWith(";")&&(l="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let u=t[e];if(Array.isArray(u)){a=a.replace(r,s(e,u,{style:l,explode:n}));continue}if("object"==typeof u){a=a.replace(r,o(e,u,{style:l,explode:n}));continue}if("matrix"===l){a=a.replace(r,`;${i(e,u)}`);continue}a=a.replace(r,"label"===l?`.${encodeURIComponent(u)}`:encodeURIComponent(u))}return a}function d(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function c(...e){let t=new Headers;for(let a of e)if(a&&"object"==typeof a)for(let[e,r]of a instanceof Headers?a.entries():Object.entries(a))if(null===r)t.delete(e);else if(Array.isArray(r))for(let a of r)t.append(e,a);else void 0!==r&&t.set(e,r);return t}function f(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var p=e.i(954616),g=e.i(621482),h=e.i(869230),v=e.i(469637),b=e.i(254440),m=e.i(266027),y=e.i(431703),x=e.i(97198);let R=async(e,t)=>new Request(t,{method:e.method,headers:e.headers,body:e.body?await e.arrayBuffer():void 0,mode:e.mode,credentials:e.credentials,cache:e.cache,redirect:e.redirect,referrer:e.referrer,referrerPolicy:e.referrerPolicy,integrity:e.integrity,keepalive:e.keepalive,signal:e.signal}),w=function(e){let{baseUrl:t="",Request:a=globalThis.Request,fetch:n=globalThis.fetch,querySerializer:i,bodySerializer:o,pathSerializer:s,headers:p,requestInitExt:g,...h}={...e};g="object"==typeof r.default&&Number.parseInt(r.default?.versions?.node?.substring(0,2))>=18&&r.default.versions.undici?g:void 0,t=f(t);let v=[];async function b(e,r){var b,m;let y,x,R,w,C,{baseUrl:E,fetch:T=n,Request:S=a,headers:j,params:k={},parseAs:I="json",querySerializer:D,bodySerializer:O=o??d,pathSerializer:A,body:N,middleware:M=[],...L}=r||{},z=t;E&&(z=f(E)??t);let P="function"==typeof i?i:l(i);D&&(P="function"==typeof D?D:l({..."object"==typeof i?i:{},...D}));let _=A||s||u,$=void 0===N?void 0:O(N,c(p,j,k.header)),H=c(void 0===$||$ instanceof FormData?{}:{"Content-Type":"application/json"},p,j,k.header),W=[...v,...M],q={redirect:"follow",...h,...L,body:$,headers:H},U=new S((b=e,m={baseUrl:z,params:k,querySerializer:P,pathSerializer:_},y=`${m.baseUrl}${b}`,m.params?.path&&(y=m.pathSerializer(y,m.params.path)),(x=m.querySerializer(m.params.query??{})).startsWith("?")&&(x=x.substring(1)),x&&(y+=`?${x}`),y),q);for(let e in L)e in U||(U[e]=L[e]);if(W.length){for(let t of(R=Math.random().toString(36).slice(2,11),w=Object.freeze({baseUrl:z,fetch:T,parseAs:I,querySerializer:P,bodySerializer:O,pathSerializer:_}),W))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let a=await t.onRequest({request:U,schemaPath:e,params:k,options:w,id:R});if(a)if(a instanceof S)U=a;else if(a instanceof Response){C=a;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!C){try{C=await T(U,g)}catch(a){let t=a;if(W.length)for(let a=W.length-1;a>=0;a--){let r=W[a];if(r&&"object"==typeof r&&"function"==typeof r.onError){let a=await r.onError({request:U,error:t,schemaPath:e,params:k,options:w,id:R});if(a){if(a instanceof Response){t=void 0,C=a;break}if(a instanceof Error){t=a;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(W.length)for(let t=W.length-1;t>=0;t--){let a=W[t];if(a&&"object"==typeof a&&"function"==typeof a.onResponse){let t=await a.onResponse({request:U,response:C,schemaPath:e,params:k,options:w,id:R});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");C=t}}}}let B=C.headers.get("Content-Length");if(204===C.status||"HEAD"===U.method||"0"===B&&!C.headers.get("Transfer-Encoding")?.includes("chunked"))return C.ok?{data:void 0,response:C}:{error:void 0,response:C};if(C.ok){let e=async()=>{if("stream"===I)return C.body;if("json"===I&&!B){let e=await C.text();return e?JSON.parse(e):void 0}return await C[I]()};return{data:await e(),response:C}}let K=await C.text();try{K=JSON.parse(K)}catch{}return{error:K,response:C}}return{request:(e,t,a)=>b(t,{...a,method:e.toUpperCase()}),GET:(e,t)=>b(e,{...t,method:"GET"}),PUT:(e,t)=>b(e,{...t,method:"PUT"}),POST:(e,t)=>b(e,{...t,method:"POST"}),DELETE:(e,t)=>b(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>b(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>b(e,{...t,method:"HEAD"}),PATCH:(e,t)=>b(e,{...t,method:"PATCH"}),TRACE:(e,t)=>b(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");v.push(t)}},eject(...e){for(let t of e){let e=v.indexOf(t);-1!==e&&v.splice(e,1)}}}}({baseUrl:globalThis.location?.origin??""});w.use({async onRequest({request:e}){let t=(0,x.getRequestBaseUrl)(),a=t?await R(e,((e,t)=>{let{pathname:a,search:r}=new URL(e);return`${t.replace(/\/+$/,"")}${a}${r}`})(e.url,t)):e,r=(0,x.getAuthToken)();return r&&a.headers.set((0,x.getAuthHeaderName)(),`Bearer ${r}`),a},async onResponse({response:e}){let t;if(e.ok)return e;let a=await e.clone().text(),r=a;try{r=JSON.parse(a),t=(0,y.deriveErrorMessage)(r)}catch{t=a||`HTTP ${e.status}`}throw(0,x.reportError)(t),new y.ApiError(t,e.status,r)}});let C=(t=async({queryKey:[e,t,a],signal:r})=>{let n=w[e.toUpperCase()],{data:i,error:o,response:s}=await n(t,{signal:r,...a});if(o)throw o;return 204===s.status||"0"===s.headers.get("Content-Length")?i??null:i},{queryOptions:a=(e,a,...[r,n])=>({queryKey:void 0===r?[e,a]:[e,a,r],queryFn:t,...n}),useQuery:(e,t,...[r,n,i])=>(0,m.useQuery)(a(e,t,r,n),i),useSuspenseQuery:(e,t,...[r,n,i])=>{var o;return o=a(e,t,r,n),(0,v.useBaseQuery)({...o,enabled:!0,suspense:!0,throwOnError:b.defaultThrowOnError,placeholderData:void 0},h.QueryObserver,i)},useInfiniteQuery:(e,t,r,n,i)=>{let{pageParamName:o="cursor",...s}=n,{queryKey:l}=a(e,t,r);return(0,g.useInfiniteQuery)({queryKey:l,queryFn:async({queryKey:[e,t,a],pageParam:r=0,signal:n})=>{let i=w[e.toUpperCase()],s={...a,signal:n,params:{...a?.params||{},query:{...a?.params?.query,[o]:r}}},{data:l,error:u}=await i(t,s);if(u)throw u;return l},...s},i)},useMutation:(e,t,a,r)=>(0,p.useMutation)({mutationKey:[e,t],mutationFn:async a=>{let r=w[e.toUpperCase()],{data:n,error:i}=await r(t,a);if(i)throw i;return n},...a},r)});e.s(["$api",0,C,"fetchClient",0,w],768371)},980187,e=>{"use strict";e.s(["createTeamAliasMap",0,e=>e?e.reduce((e,t)=>(e[t.team_id]=t.team_alias,e),{}):{},"resolveTeamAliasFromTeamID",0,(e,t)=>{let a=t.find(t=>t.team_id===e);return a?a.team_alias:null}])},367240,e=>{"use strict";let t=(0,e.i(475254).default)("rotate-ccw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);e.s(["RotateCcw",0,t],367240)},695420,e=>{"use strict";var t=e.i(271645);e.s(["useVisitedTabs",0,function(e){let[a,r]=(0,t.useState)(()=>new Set([e]));return{onTabChange:(0,t.useCallback)(e=>{r(t=>new Set(t).add(String(e)))},[]),hasVisited:(0,t.useCallback)(e=>a.has(e),[a])}}])}]); \ No newline at end of file +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,515288,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504);let n=a.forwardRef(({className:e,size:a="default",...n},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card","data-size":a,className:(0,r.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...n}));n.displayName="Card";let i=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-header",className:(0,r.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...a}));i.displayName="CardHeader";let o=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-title",className:(0,r.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...a}));o.displayName="CardTitle";let s=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-description",className:(0,r.cn)("text-sm text-muted-foreground",e),...a}));s.displayName="CardDescription";let l=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-action",className:(0,r.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...a}));l.displayName="CardAction";let u=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-content",className:(0,r.cn)("px-(--card-spacing)",e),...a}));u.displayName="CardContent";let d=a.forwardRef(({className:e,...a},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card-footer",className:(0,r.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...a}));d.displayName="CardFooter",e.s(["Card",0,n,"CardAction",0,l,"CardContent",0,u,"CardDescription",0,s,"CardFooter",0,d,"CardHeader",0,i,"CardTitle",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,373488,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(["default",0,t],373488),e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),a=e.i(451512),r=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:n=0,side:i="bottom",sideOffset:o=4,className:s,...l}){return(0,t.jsx)(a.Menu.Portal,{children:(0,t.jsx)(a.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:n,side:i,sideOffset:o,children:(0,t.jsx)(a.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,r.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:n,variant:i="default",...o}){return(0,t.jsx)(a.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":n,"data-variant":i,className:(0,r.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),...o})},"DropdownMenuSeparator",0,function({className:e,...n}){return(0,t.jsx)(a.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,r.cn)("-mx-1 my-1 h-px bg-border",e),...n})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(a.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},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)},677572,370359,405934,e=>{"use strict";var t,a,r,n=e.i(843476);e.s([],559657),e.i(559657),e.i(247167);var i=e.i(271645),o=e.i(951437),s=e.i(146376),l=e.i(667865),u=e.i(552245),d=e.i(53687),c=e.i(733332);let f=i.createContext(void 0);function p(){let e=i.useContext(f);if(void 0===e)throw Error((0,c.default)(64));return e}let g=((t={}).activationDirection="data-activation-direction",t.orientation="data-orientation",t),h={tabActivationDirection:e=>({[g.activationDirection]:e})};var v=e.i(675606),b=e.i(56434);let m=i.forwardRef(function(e,t){let{className:a,defaultValue:r=0,onValueChange:c,orientation:p="horizontal",render:g,value:m,style:x,...R}=e,w=void 0!==e.defaultValue,C=i.useRef([]),[E,T]=i.useState(()=>new Map),[S,j]=(0,o.useControlled)({controlled:m,default:r,name:"Tabs",state:"value"}),I=void 0!==m,[k,D]=i.useState(()=>new Map),O=i.useRef(void 0),A=i.useCallback(e=>{if(void 0===e)return null;for(let[t,a]of k.entries())if(null!=a&&e===(a.value??a.index))return t;return null},[k]),[N,M]=i.useState(()=>({previousValue:S,tabActivationDirection:"none"})),{previousValue:L,tabActivationDirection:z}=N,P=z,_=!1;L!==S&&(P=y(L,S,p,k),_=null!=L&&null!=S&&null==A(S));let H=_?L:S,$=L!==H||z!==P;(0,s.useIsoLayoutEffect)(()=>{$&&M({previousValue:H,tabActivationDirection:P})},[H,$,P]);let W=(0,l.useStableCallback)((e,t)=>{t.activationDirection=y(S,e,p,k),c?.(e,t),t.isCanceled||j(e)}),q=(0,l.useStableCallback)((e,t)=>{c?.(e,(0,v.createChangeEventDetails)(t,void 0,void 0,{activationDirection:"none"}))}),U=(0,l.useStableCallback)((e,t)=>{T(a=>{if(a.get(e)===t)return a;let r=new Map(a);return r.set(e,t),r})}),B=(0,l.useStableCallback)((e,t)=>{T(a=>{if(!a.has(e)||a.get(e)!==t)return a;let r=new Map(a);return r.delete(e),r})}),K=i.useCallback(e=>E.get(e),[E]),F=i.useCallback(e=>{for(let t of k.values())if(e===t?.value)return t?.id},[k]),V=i.useMemo(()=>({getTabElementBySelectedValue:A,getTabIdByPanelValue:F,getTabPanelIdByValue:K,onValueChange:W,orientation:p,registerMountedTabPanel:U,setTabMap:D,unregisterMountedTabPanel:B,tabActivationDirection:P,value:S}),[A,F,K,W,p,U,D,B,P,S]),Y=i.useMemo(()=>{for(let e of k.values())if(null!=e&&e.value===S)return e},[k,S]),Q=i.useMemo(()=>{for(let e of k.values())if(null!=e&&!e.disabled)return e.value},[k]),J=i.useRef(!w),G=i.useRef(r),X=i.useRef(w),Z=i.useRef(!1);(0,s.useIsoLayoutEffect)(()=>{if(I)return;function e(e,t){j(e),M(t=>t.previousValue===e&&"none"===t.tabActivationDirection?t:{previousValue:e,tabActivationDirection:"none"}),q(e,t),J.current=!1}if(0===k.size){Z.current&&null!==S&&!O.current?.isConnected&&e(null,b.REASONS.missing);return}Z.current=!0,O.current=k.keys().next().value;let t=Y?.disabled,a=null==Y&&null!==S;if(t||S!==G.current||(X.current=!1),X.current&&t&&S===G.current)return;let r=J.current;if(t||a){let a=Q??null;if(S===a){J.current=!1;return}let n=b.REASONS.missing;r?n=b.REASONS.initial:t&&(n=b.REASONS.disabled),e(a,n);return}r&&null!=Y&&(q(S,b.REASONS.initial),J.current=!1)},[Q,I,q,Y,j,k,S]);let ee={orientation:p,tabActivationDirection:P},et=(0,u.useRenderElement)("div",e,{state:ee,ref:t,props:R,stateAttributesMapping:h});return(0,n.jsx)(f.Provider,{value:V,children:(0,n.jsx)(d.CompositeList,{elementsRef:C,children:et})})});function y(e,t,a,r){if(null==e||null==t)return"none";let n=null,i=null;for(let[a,o]of r.entries()){if(null==o)continue;let r=o.value??o.index;if(e===r&&(n=a),t===r&&(i=a),null!=n&&null!=i)break}if(null==n||null==i)return n!==i&&("number"==typeof e||"string"==typeof e)&&typeof e==typeof t?"horizontal"===a?t>e?"right":"left":t>e?"down":"up":"none";let o=n.getBoundingClientRect(),s=i.getBoundingClientRect();if("horizontal"===a){if(s.lefto.left)return"right"}else{if(s.topo.top)return"down"}return"none"}var x=e.i(108868),R=e.i(788015),w=e.i(540886);let C="data-composite-item-active";e.s(["ACTIVE_COMPOSITE_ITEM",0,C],370359);var E=e.i(395530);let T=i.createContext(void 0);function S(){let e=i.useContext(T);if(void 0===e)throw Error((0,c.default)(65));return e}var j=e.i(647554);let I=i.forwardRef(function(e,t){let{className:a,disabled:r=!1,render:n,value:o,id:l,nativeButton:d=!0,style:c,...f}=e,{value:g,getTabPanelIdByValue:m,orientation:y,tabActivationDirection:T}=p(),{activateOnFocus:I,highlightedTabIndex:k,onTabActivation:D,registerTabResizeObserverElement:O,setHighlightedTabIndex:A,tabsListElement:N}=S(),M=(0,R.useBaseUiId)(l),L=i.useMemo(()=>({disabled:r,id:M,value:o}),[r,M,o]),{compositeProps:z,compositeRef:P,index:_}=(0,E.useCompositeItem)({metadata:L}),H=o===g,$=i.useRef(!1),W=i.useRef(null);(0,s.useIsoLayoutEffect)(()=>{let e=W.current;if(e)return O(e)},[O]),(0,s.useIsoLayoutEffect)(()=>{if($.current){$.current=!1;return}if(H&&_>-1&&k!==_){if(null!=N){let e=(0,j.activeElement)((0,x.ownerDocument)(N));if(e&&(0,j.contains)(N,e))return}r||A(_)}},[H,_,k,A,r,N]);let{getButtonProps:q,buttonRef:U}=(0,w.useButton)({disabled:r,native:d,focusableWhenDisabled:!0}),B=m(o),K=i.useRef(!1),F=i.useRef(!1);return(0,u.useRenderElement)("button",e,{state:{disabled:r,active:H,orientation:y,tabActivationDirection:T},ref:[t,U,P,W],props:[z,{role:"tab","aria-controls":B,"aria-selected":H,id:M,onClick:function(e){H||r||D(o,(0,v.createChangeEventDetails)(b.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"}))},onFocus:function(e){H||(_>-1&&!r&&A(_),!r&&I&&(!K.current||K.current&&F.current)&&D(o,(0,v.createChangeEventDetails)(b.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"})))},onPointerDown:function(e){H||r||(K.current=!0,e.button&&0!==e.button||(F.current=!0,(0,x.ownerDocument)(e.currentTarget).addEventListener("pointerup",function(){K.current=!1,F.current=!1},{once:!0})))},[C]:H?"":void 0,onKeyDownCapture(){$.current=!0}},f,q],stateAttributesMapping:h})});var k=e.i(73364),D=e.i(802239),O=e.i(956789);function A(){return O.NOOP}function N(){return!1}function M(){return!0}let L=((a={}).activeTabLeft="--active-tab-left",a.activeTabRight="--active-tab-right",a.activeTabTop="--active-tab-top",a.activeTabBottom="--active-tab-bottom",a.activeTabWidth="--active-tab-width",a.activeTabHeight="--active-tab-height",a);var z=e.i(172410);let P={...h,activeTabPosition:()=>null,activeTabSize:()=>null},_=i.forwardRef(function(e,t){let{className:a,render:r,renderBeforeHydration:o=!1,style:s,...l}=e,{nonce:d}=(0,z.useCSPContext)(),{getTabElementBySelectedValue:c,orientation:f,tabActivationDirection:g,value:h}=p(),{tabsListElement:v,registerIndicatorUpdateListener:b}=S(),m=(0,D.useSyncExternalStore)(A,N,M),y=function(){let[,e]=i.useState({});return i.useCallback(()=>{e({})},[])}();i.useEffect(()=>b(y),[b,y]);let x=0,R=0,w=0,C=0,E=0,T=0,j=!1;if(null!=h&&null!=v){let e=c(h);if(null!=e){j=!0;let{width:t,height:a}=(0,k.getCssDimensions)(e),{width:r,height:n}=(0,k.getCssDimensions)(v),i=e.getBoundingClientRect(),o=v.getBoundingClientRect(),s=r>0?o.width/r:1,l=n>0?o.height/n:1;if(Math.abs(s)>Number.EPSILON&&Math.abs(l)>Number.EPSILON){let e=i.left-o.left,t=i.top-o.top;x=e/s+v.scrollLeft-v.clientLeft,w=t/l+v.scrollTop-v.clientTop}else x=e.offsetLeft,w=e.offsetTop;E=t,T=a,R=v.scrollWidth-x-E,C=v.scrollHeight-w-T}}let I=j?{left:x,right:R,top:w,bottom:C}:null,O=j?{width:E,height:T}:null,_=j?{[L.activeTabLeft]:`${x}px`,[L.activeTabRight]:`${R}px`,[L.activeTabTop]:`${w}px`,[L.activeTabBottom]:`${C}px`,[L.activeTabWidth]:`${E}px`,[L.activeTabHeight]:`${T}px`}:void 0,H=j&&E>0&&T>0,$=(0,u.useRenderElement)("span",e,{state:{orientation:f,activeTabPosition:I,activeTabSize:O,tabActivationDirection:g},ref:t,props:[{role:"presentation",style:_,hidden:!H},l,{suppressHydrationWarning:!0}],stateAttributesMapping:P});return null==h?null:(0,n.jsxs)(i.Fragment,{children:[$,m&&o&&(0,n.jsx)("script",{nonce:d,dangerouslySetInnerHTML:{__html:'!function(){const t=document.currentScript.previousElementSibling;if(!t)return;const e=t.closest(\'[role="tablist"]\');if(!e)return;const i=e.querySelector("[data-active]");if(!i)return;if(0===i.offsetWidth||0===e.offsetWidth)return;let o=0,n=0,h=0,l=0,r=0,f=0;function s(t){const e=getComputedStyle(t);let i=parseFloat(e.width)||0,o=parseFloat(e.height)||0;return(Math.round(i)!==t.offsetWidth||Math.round(o)!==t.offsetHeight)&&(i=t.offsetWidth,o=t.offsetHeight),{width:i,height:o}}if(null!=i&&null!=e){const{width:t,height:c}=s(i),{width:u,height:d}=s(e),a=i.getBoundingClientRect(),g=e.getBoundingClientRect(),p=u>0?g.width/u:1,b=d>0?g.height/d:1;if(Math.abs(p)>Number.EPSILON&&Math.abs(b)>Number.EPSILON){const t=a.left-g.left,i=a.top-g.top;o=t/p+e.scrollLeft-e.clientLeft,h=i/b+e.scrollTop-e.clientTop}else o=i.offsetLeft,h=i.offsetTop;r=t,f=c,n=e.scrollWidth-o-r,l=e.scrollHeight-h-f}function c(e,i){t.style.setProperty(`--active-tab-${e}`,`${i}px`)}c("left",o),c("right",n),c("top",h),c("bottom",l),c("width",r),c("height",f),r>0&&f>0&&t.removeAttribute("hidden")}();'},suppressHydrationWarning:!0})]})});var H=e.i(144394),$=e.i(209407),W=e.i(137584),q=e.i(223910),U=e.i(673553);let B=((r={}).index="data-index",r.activationDirection="data-activation-direction",r.orientation="data-orientation",r.hidden="data-hidden",r[r.startingStyle=$.TransitionStatusDataAttributes.startingStyle]="startingStyle",r[r.endingStyle=$.TransitionStatusDataAttributes.endingStyle]="endingStyle",r),K={...h,...$.transitionStatusMapping},F=i.forwardRef(function(e,t){let{className:a,value:r,render:n,keepMounted:o=!1,style:l,...d}=e,{value:c,getTabIdByPanelValue:f,orientation:g,tabActivationDirection:h,registerMountedTabPanel:v,unregisterMountedTabPanel:b}=p(),m=(0,R.useBaseUiId)(),y=i.useMemo(()=>({id:m,value:r}),[m,r]),{ref:x,index:w}=(0,U.useCompositeListItem)({metadata:y}),C=r===c,{mounted:E,transitionStatus:T,setMounted:S}=(0,q.useTransitionStatus)(C),j=!E,I=f(r),k=i.useRef(null),D=(0,u.useRenderElement)("div",e,{state:{hidden:j,orientation:g,tabActivationDirection:h,transitionStatus:T},ref:[t,x,k],props:[{"aria-labelledby":I,hidden:j,id:m,role:"tabpanel",tabIndex:C?0:-1,inert:(0,H.inertValue)(!C),[B.index]:w},d],stateAttributesMapping:K});return((0,W.useOpenChangeComplete)({open:C,ref:k,onComplete(){C||S(!1)}}),(0,s.useIsoLayoutEffect)(()=>{if((!j||o)&&null!=m)return v(r,m),()=>{b(r,m)}},[j,o,r,m,v,b]),o||E)?D:null});var V=e.i(590803),Y=e.i(828918),Q=e.i(673327),J=e.i(621082);let G=[];var X=e.i(838452),Z=e.i(872855);function ee(e){let{render:t,className:a,style:r,refs:o=O.EMPTY_ARRAY,props:c=O.EMPTY_ARRAY,state:f=O.EMPTY_OBJECT,stateAttributesMapping:p,highlightedIndex:g,onHighlightedIndexChange:h,orientation:v,grid:b,loopFocus:m,onLoop:y,enableHomeAndEndKeys:x,onMapChange:R,stopEventPropagation:w=!0,rootRef:E,disabledIndices:T,modifierKeys:S,highlightItemOnHover:I=!1,tag:k="div",...D}=e,{props:A,highlightedIndex:N,onHighlightedIndexChange:M,elementsRef:L,onMapChange:z,relayKeyboardEvent:P}=function(e){let{loopFocus:t=!0,orientation:a="both",grid:r,onLoop:n,direction:o,highlightedIndex:u,onHighlightedIndexChange:d,rootRef:c,enableHomeAndEndKeys:f=!1,stopEventPropagation:p=!1,disabledIndices:g,modifierKeys:h=G}=e,[v,b]=i.useState(0),m=null!=r,y=i.useRef(null),x=(0,Y.useMergedRefs)(y,c),R=i.useRef([]),w=i.useRef(!1),E=u??v,T=(0,l.useStableCallback)((e,t=!1)=>{if((d??b)(e),t){let t=R.current[e];(0,Q.scrollIntoViewIfNeeded)(y.current,t,o,a)}}),S=(0,l.useStableCallback)(e=>{if(0===e.size||w.current)return;w.current=!0;let t=Array.from(e.keys()),r=t.find(e=>e?.hasAttribute(C))??null,n=r?t.indexOf(r):-1;if(-1!==n)T(n);else if((0,J.isListIndexDisabled)(t,E,g)){let e=(0,J.findNonDisabledListIndex)(t,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(t,e)||T(e)}(0,Q.scrollIntoViewIfNeeded)(y.current,r,o,a)});(0,s.useIsoLayoutEffect)(()=>{if(null==g||null!=u||!w.current)return;let e=R.current;if((0,J.isListIndexDisabled)(e,E,g)){let t=(0,J.findNonDisabledListIndex)(e,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(e,t)||T(t)}},[g,u,E,R,T]);let I=(0,l.useStableCallback)((e,t,a)=>n?n(e,t,a,R):a),k=(0,l.useStableCallback)(e=>{let i=f?Q.COMPOSITE_KEYS:Q.ARROW_KEYS;if(!i.has(e.key)||function(e,t){for(let a of Q.MODIFIER_KEYS.values())if(!t.includes(a)&&e.getModifierState(a))return!0;return!1}(e,h)||!y.current)return;let s="rtl"===o,l=s?Q.ARROW_LEFT:Q.ARROW_RIGHT,u={horizontal:l,vertical:Q.ARROW_DOWN,both:l}[a],d=s?Q.ARROW_RIGHT:Q.ARROW_LEFT,c={horizontal:d,vertical:Q.ARROW_UP,both:d}[a],v=(0,j.getTarget)(e.nativeEvent);if(null!=v&&(0,Q.isNativeInput)(v)&&!(0,V.isElementDisabled)(v)){let t=v.selectionStart,a=v.selectionEnd,r=v.value??"";if(null==t||e.shiftKey||t!==a||e.key!==c&&t0)return}let b=E,x=(0,J.getMinListIndex)(R,g),w=(0,J.getMaxListIndex)(R,g);null!=r&&(b=r({disabledIndices:g,elementsRef:R,event:e,highlightedIndex:E,loopFocus:t,maxIndex:w,minIndex:x,onLoop:I,orientation:a,rtl:s}));let C={horizontal:[l],vertical:[Q.ARROW_DOWN],both:[l,Q.ARROW_DOWN]}[a],S={horizontal:[d],vertical:[Q.ARROW_UP],both:[d,Q.ARROW_UP]}[a],k=m?i:({horizontal:f?Q.HORIZONTAL_KEYS_WITH_EXTRA_KEYS:Q.HORIZONTAL_KEYS,vertical:f?Q.VERTICAL_KEYS_WITH_EXTRA_KEYS:Q.VERTICAL_KEYS,both:i})[a];f&&(e.key===Q.HOME?b=x:e.key===Q.END&&(b=w)),b===E&&(C.includes(e.key)||S.includes(e.key))&&(t&&b===w&&C.includes(e.key)?(b=x,n&&(b=n(e,E,b,R))):t&&b===x&&S.includes(e.key)?(b=w,n&&(b=n(e,E,b,R))):b=(0,J.findNonDisabledListIndex)(R.current,{startingIndex:b,decrement:S.includes(e.key),disabledIndices:g})),b===E||(0,J.isIndexOutOfListBounds)(R.current,b)||(p&&e.stopPropagation(),k.has(e.key)&&e.preventDefault(),T(b,!0),queueMicrotask(()=>{R.current[b]?.focus()}))});return{props:{ref:x,onFocus(e){let t=y.current,a=(0,j.getTarget)(e.nativeEvent);t&&null!=a&&(0,Q.isNativeInput)(a)&&a.setSelectionRange(0,a.value.length??0)},onKeyDown:k},highlightedIndex:E,onHighlightedIndexChange:T,elementsRef:R,disabledIndices:g,onMapChange:S,relayKeyboardEvent:k}}({grid:b,loopFocus:m,onLoop:y,orientation:v,highlightedIndex:g,onHighlightedIndexChange:h,rootRef:E,stopEventPropagation:w,enableHomeAndEndKeys:x,direction:(0,Z.useDirection)(),disabledIndices:T,modifierKeys:S}),_=(0,u.useRenderElement)(k,e,{state:f,ref:o,props:[A,...c,D],stateAttributesMapping:p}),H=i.useMemo(()=>({highlightedIndex:N,onHighlightedIndexChange:M,highlightItemOnHover:I,relayKeyboardEvent:P}),[N,M,I,P]);return(0,n.jsx)(X.CompositeRootContext.Provider,{value:H,children:(0,n.jsx)(d.CompositeList,{elementsRef:L,onMapChange:e=>{R?.(e),z(e)},children:_})})}e.s(["CompositeRoot",0,ee],405934);let et=i.forwardRef(function(e,t){let{activateOnFocus:a=!1,className:r,loopFocus:o=!0,render:u,style:d,...c}=e,{onValueChange:f,orientation:g,value:v,setTabMap:b,tabActivationDirection:m}=p(),[y,x]=i.useState(0),[R,w]=i.useState(null),C=i.useRef(new Set),E=i.useRef(new Set),S=i.useRef(null);(0,s.useIsoLayoutEffect)(()=>{if("u"{C.current.forEach(e=>{e()})});return S.current=e,R&&e.observe(R),E.current.forEach(t=>{e.observe(t)}),()=>{e.disconnect(),S.current=null}},[R]);let j=(0,l.useStableCallback)(e=>(C.current.add(e),()=>{C.current.delete(e)})),I=(0,l.useStableCallback)(e=>(E.current.add(e),S.current?.observe(e),()=>{E.current.delete(e),S.current?.unobserve(e)})),k=(0,l.useStableCallback)((e,t)=>{e!==v&&f(e,t)}),D=i.useMemo(()=>({activateOnFocus:a,highlightedTabIndex:y,registerIndicatorUpdateListener:j,registerTabResizeObserverElement:I,onTabActivation:k,setHighlightedTabIndex:x,tabsListElement:R}),[a,y,j,I,k,x,R]);return(0,n.jsx)(T.Provider,{value:D,children:(0,n.jsx)(ee,{render:u,className:r,style:d,state:{orientation:g,tabActivationDirection:m},refs:[t,w],props:[{"aria-orientation":"vertical"===g?"vertical":void 0,role:"tablist"},c],stateAttributesMapping:h,highlightedIndex:y,enableHomeAndEndKeys:!0,loopFocus:o,orientation:g,onHighlightedIndexChange:x,onMapChange:b,disabledIndices:O.EMPTY_ARRAY})})});e.s(["Indicator",0,_,"List",0,et,"Panel",0,F,"Root",0,m,"Tab",0,I],69281);var ea=e.i(69281),ea=ea,er=e.i(115504);let en=(0,er.cva)({base:"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-9 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});e.s(["Tabs",0,function({className:e,orientation:t="horizontal",...a}){return(0,n.jsx)(ea.Root,{"data-slot":"tabs","data-orientation":t,className:(0,er.cn)("group/tabs flex gap-2 data-horizontal:flex-col",e),...a})},"TabsContent",0,function({className:e,...t}){return(0,n.jsx)(ea.Panel,{"data-slot":"tabs-content",className:(0,er.cn)("flex-1 text-sm outline-none",e),...t})},"TabsList",0,function({className:e,variant:t="default",...a}){return(0,n.jsx)(ea.List,{"data-slot":"tabs-list","data-variant":t,className:(0,er.cn)(en({variant:t}),e),...a})},"TabsTrigger",0,function({className:e,...t}){return(0,n.jsx)(ea.Tab,{"data-slot":"tabs-trigger",className:(0,er.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",e),...t})}],677572)},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])},871689,e=>{"use strict";var t=e.i(180127);e.s(["ArrowLeft",()=>t.default])},776639,e=>{"use strict";var t=e.i(843476),a=e.i(353753),r=e.i(115504),n=e.i(519455),i=e.i(995926);function o({...e}){return(0,t.jsx)(a.Dialog.Portal,{"data-slot":"dialog-portal",...e})}function s({className:e,...n}){return(0,t.jsx)(a.Dialog.Backdrop,{"data-slot":"dialog-overlay",className:(0,r.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...n})}e.s(["Dialog",0,function({...e}){return(0,t.jsx)(a.Dialog.Root,{"data-slot":"dialog",...e})},"DialogContent",0,function({className:e,children:l,showCloseButton:u=!0,...d}){return(0,t.jsxs)(o,{children:[(0,t.jsx)(s,{}),(0,t.jsxs)(a.Dialog.Popup,{"data-slot":"dialog-content",className:(0,r.cn)("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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),...d,children:[l,u&&(0,t.jsxs)(a.Dialog.Close,{"data-slot":"dialog-close",render:(0,t.jsx)(n.Button,{variant:"ghost",className:"absolute top-4 right-4",size:"icon-sm"}),children:[(0,t.jsx)(i.XIcon,{}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})},"DialogDescription",0,function({className:e,...n}){return(0,t.jsx)(a.Dialog.Description,{"data-slot":"dialog-description",className:(0,r.cn)("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...n})},"DialogFooter",0,function({className:e,showCloseButton:i=!1,children:o,...s}){return(0,t.jsxs)("div",{"data-slot":"dialog-footer",className:(0,r.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...s,children:[o,i&&(0,t.jsx)(a.Dialog.Close,{render:(0,t.jsx)(n.Button,{variant:"outline"}),children:"Close"})]})},"DialogHeader",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"dialog-header",className:(0,r.cn)("flex flex-col gap-2",e),...a})},"DialogTitle",0,function({className:e,...n}){return(0,t.jsx)(a.Dialog.Title,{"data-slot":"dialog-title",className:(0,r.cn)("leading-none font-medium",e),...n})}])},768371,e=>{"use strict";let t,a;var r=e.i(247167);let n=/\{[^{}]+\}/g;function i(e,t,a){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${a?.allowReserved===!0?t:encodeURIComponent(t)}`}function o(e,t,a){if(!t||"object"!=typeof t)return"";let r=[],n={simple:",",label:".",matrix:";"}[a.style]||"&";if("deepObject"!==a.style&&!1===a.explode){for(let e in t)r.push(e,!0===a.allowReserved?t[e]:encodeURIComponent(t[e]));let n=r.join(",");switch(a.style){case"form":return`${e}=${n}`;case"label":return`.${n}`;case"matrix":return`;${e}=${n}`;default:return n}}for(let n in t){let o="deepObject"===a.style?`${e}[${n}]`:n;r.push(i(o,t[n],a))}let o=r.join(n);return"label"===a.style||"matrix"===a.style?`${n}${o}`:o}function s(e,t,a){if(!Array.isArray(t))return"";if(!1===a.explode){let r={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[a.style]||",",n=(!0===a.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(r);switch(a.style){case"simple":return n;case"label":return`.${n}`;case"matrix":return`;${e}=${n}`;default:return`${e}=${n}`}}let r={simple:",",label:".",matrix:";"}[a.style]||"&",n=[];for(let r of t)"simple"===a.style||"label"===a.style?n.push(!0===a.allowReserved?r:encodeURIComponent(r)):n.push(i(e,r,a));return"label"===a.style||"matrix"===a.style?`${r}${n.join(r)}`:n.join(r)}function l(e){return function(t){let a=[];if(t&&"object"==typeof t)for(let r in t){let n=t[r];if(null!=n){if(Array.isArray(n)){if(0===n.length)continue;a.push(s(r,n,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof n){a.push(o(r,n,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}a.push(i(r,n,e))}}return a.join("&")}}function u(e,t){let a=e;for(let r of e.match(n)??[]){let e=r.substring(1,r.length-1),n=!1,l="simple";if(e.endsWith("*")&&(n=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(l="label",e=e.substring(1)):e.startsWith(";")&&(l="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let u=t[e];if(Array.isArray(u)){a=a.replace(r,s(e,u,{style:l,explode:n}));continue}if("object"==typeof u){a=a.replace(r,o(e,u,{style:l,explode:n}));continue}if("matrix"===l){a=a.replace(r,`;${i(e,u)}`);continue}a=a.replace(r,"label"===l?`.${encodeURIComponent(u)}`:encodeURIComponent(u))}return a}function d(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function c(...e){let t=new Headers;for(let a of e)if(a&&"object"==typeof a)for(let[e,r]of a instanceof Headers?a.entries():Object.entries(a))if(null===r)t.delete(e);else if(Array.isArray(r))for(let a of r)t.append(e,a);else void 0!==r&&t.set(e,r);return t}function f(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var p=e.i(954616),g=e.i(621482),h=e.i(869230),v=e.i(469637),b=e.i(254440),m=e.i(266027),y=e.i(431703),x=e.i(97198),R=e.i(950643);let w=function(e){let{baseUrl:t="",Request:a=globalThis.Request,fetch:n=globalThis.fetch,querySerializer:i,bodySerializer:o,pathSerializer:s,headers:p,requestInitExt:g,...h}={...e};g="object"==typeof r.default&&Number.parseInt(r.default?.versions?.node?.substring(0,2))>=18&&r.default.versions.undici?g:void 0,t=f(t);let v=[];async function b(e,r){var b,m;let y,x,R,w,C,{baseUrl:E,fetch:T=n,Request:S=a,headers:j,params:I={},parseAs:k="json",querySerializer:D,bodySerializer:O=o??d,pathSerializer:A,body:N,middleware:M=[],...L}=r||{},z=t;E&&(z=f(E)??t);let P="function"==typeof i?i:l(i);D&&(P="function"==typeof D?D:l({..."object"==typeof i?i:{},...D}));let _=A||s||u,H=void 0===N?void 0:O(N,c(p,j,I.header)),$=c(void 0===H||H instanceof FormData?{}:{"Content-Type":"application/json"},p,j,I.header),W=[...v,...M],q={redirect:"follow",...h,...L,body:H,headers:$},U=new S((b=e,m={baseUrl:z,params:I,querySerializer:P,pathSerializer:_},y=`${m.baseUrl}${b}`,m.params?.path&&(y=m.pathSerializer(y,m.params.path)),(x=m.querySerializer(m.params.query??{})).startsWith("?")&&(x=x.substring(1)),x&&(y+=`?${x}`),y),q);for(let e in L)e in U||(U[e]=L[e]);if(W.length){for(let t of(R=Math.random().toString(36).slice(2,11),w=Object.freeze({baseUrl:z,fetch:T,parseAs:k,querySerializer:P,bodySerializer:O,pathSerializer:_}),W))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let a=await t.onRequest({request:U,schemaPath:e,params:I,options:w,id:R});if(a)if(a instanceof S)U=a;else if(a instanceof Response){C=a;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!C){try{C=await T(U,g)}catch(a){let t=a;if(W.length)for(let a=W.length-1;a>=0;a--){let r=W[a];if(r&&"object"==typeof r&&"function"==typeof r.onError){let a=await r.onError({request:U,error:t,schemaPath:e,params:I,options:w,id:R});if(a){if(a instanceof Response){t=void 0,C=a;break}if(a instanceof Error){t=a;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(W.length)for(let t=W.length-1;t>=0;t--){let a=W[t];if(a&&"object"==typeof a&&"function"==typeof a.onResponse){let t=await a.onResponse({request:U,response:C,schemaPath:e,params:I,options:w,id:R});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");C=t}}}}let B=C.headers.get("Content-Length");if(204===C.status||"HEAD"===U.method||"0"===B&&!C.headers.get("Transfer-Encoding")?.includes("chunked"))return C.ok?{data:void 0,response:C}:{error:void 0,response:C};if(C.ok){let e=async()=>{if("stream"===k)return C.body;if("json"===k&&!B){let e=await C.text();return e?JSON.parse(e):void 0}return await C[k]()};return{data:await e(),response:C}}let K=await C.text();try{K=JSON.parse(K)}catch{}return{error:K,response:C}}return{request:(e,t,a)=>b(t,{...a,method:e.toUpperCase()}),GET:(e,t)=>b(e,{...t,method:"GET"}),PUT:(e,t)=>b(e,{...t,method:"PUT"}),POST:(e,t)=>b(e,{...t,method:"POST"}),DELETE:(e,t)=>b(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>b(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>b(e,{...t,method:"HEAD"}),PATCH:(e,t)=>b(e,{...t,method:"PATCH"}),TRACE:(e,t)=>b(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");v.push(t)}},eject(...e){for(let t of e){let e=v.indexOf(t);-1!==e&&v.splice(e,1)}}}}({Request:function(e,t){return new globalThis.Request((0,R.resolveRequestUrl)(e,{registeredBase:(0,x.getRequestBaseUrl)(),pageOrigin:globalThis.location?.origin}),t)}});w.use({onRequest({request:e}){let t=(0,x.getAuthToken)();t&&e.headers.set((0,x.getAuthHeaderName)(),`Bearer ${t}`)},async onResponse({response:e}){let t;if(e.ok)return e;let a=await e.clone().text(),r=a;try{r=JSON.parse(a),t=(0,y.deriveErrorMessage)(r)}catch{t=a||`HTTP ${e.status}`}throw(0,x.reportError)(t),new y.ApiError(t,e.status,r)}});let C=(t=async({queryKey:[e,t,a],signal:r})=>{let n=w[e.toUpperCase()],{data:i,error:o,response:s}=await n(t,{signal:r,...a});if(o)throw o;return 204===s.status||"0"===s.headers.get("Content-Length")?i??null:i},{queryOptions:a=(e,a,...[r,n])=>({queryKey:void 0===r?[e,a]:[e,a,r],queryFn:t,...n}),useQuery:(e,t,...[r,n,i])=>(0,m.useQuery)(a(e,t,r,n),i),useSuspenseQuery:(e,t,...[r,n,i])=>{var o;return o=a(e,t,r,n),(0,v.useBaseQuery)({...o,enabled:!0,suspense:!0,throwOnError:b.defaultThrowOnError,placeholderData:void 0},h.QueryObserver,i)},useInfiniteQuery:(e,t,r,n,i)=>{let{pageParamName:o="cursor",...s}=n,{queryKey:l}=a(e,t,r);return(0,g.useInfiniteQuery)({queryKey:l,queryFn:async({queryKey:[e,t,a],pageParam:r=0,signal:n})=>{let i=w[e.toUpperCase()],s={...a,signal:n,params:{...a?.params||{},query:{...a?.params?.query,[o]:r}}},{data:l,error:u}=await i(t,s);if(u)throw u;return l},...s},i)},useMutation:(e,t,a,r)=>(0,p.useMutation)({mutationKey:[e,t],mutationFn:async a=>{let r=w[e.toUpperCase()],{data:n,error:i}=await r(t,a);if(i)throw i;return n},...a},r)});e.s(["$api",0,C,"fetchClient",0,w],768371)},422444,e=>{"use strict";var t=e.i(571353);e.s(["keyDetailHref",0,function(e){return`${(0,t.migratedHref)("api-keys")}?key=${encodeURIComponent(e)}`},"teamDetailHref",0,function(e){return`${(0,t.migratedHref)("teams")}?team=${encodeURIComponent(e)}`}])},980187,e=>{"use strict";e.s(["createTeamAliasMap",0,e=>e?e.reduce((e,t)=>(e[t.team_id]=t.team_alias,e),{}):{},"resolveTeamAliasFromTeamID",0,(e,t)=>{let a=t.find(t=>t.team_id===e);return a?a.team_alias:null}])},695420,e=>{"use strict";var t=e.i(271645);e.s(["useVisitedTabs",0,function(e){let[a,r]=(0,t.useState)(()=>new Set([e]));return{onTabChange:(0,t.useCallback)(e=>{r(t=>new Set(t).add(String(e)))},[]),hasVisited:(0,t.useCallback)(e=>a.has(e),[a])}}])},367240,e=>{"use strict";let t=(0,e.i(475254).default)("rotate-ccw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);e.s(["RotateCcw",0,t],367240)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0e3vwdd43gm8b.js b/litellm/proxy/_experimental/out/_next/static/chunks/0e3vwdd43gm8b.js deleted file mode 100644 index 1408e4abb8a..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0e3vwdd43gm8b.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},515288,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let o=r.forwardRef(({className:e,size:r="default",...o},d)=>(0,t.jsx)("div",{ref:d,"data-slot":"card","data-size":r,className:(0,a.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...o}));o.displayName="Card";let d=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-header",className:(0,a.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...r}));d.displayName="CardHeader";let l=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-title",className:(0,a.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...r}));l.displayName="CardTitle";let s=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...r}));s.displayName="CardDescription";let i=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-action",className:(0,a.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...r}));i.displayName="CardAction";let n=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-content",className:(0,a.cn)("px-(--card-spacing)",e),...r}));n.displayName="CardContent";let c=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card-footer",className:(0,a.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...r}));c.displayName="CardFooter",e.s(["Card",0,o,"CardAction",0,i,"CardContent",0,n,"CardDescription",0,s,"CardFooter",0,c,"CardHeader",0,d,"CardTitle",0,l])},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,373488,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(["default",0,t],373488),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:o=0,side:d="bottom",sideOffset:l=4,className:s,...i}){return(0,t.jsx)(r.Menu.Portal,{children:(0,t.jsx)(r.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:o,side:d,sideOffset:l,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",s),...i})})})},"DropdownMenuItem",0,function({className:e,inset:o,variant:d="default",...l}){return(0,t.jsx)(r.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":o,"data-variant":d,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),...l})},"DropdownMenuSeparator",0,function({className:e,...o}){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),...o})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(r.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},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)},728889,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(829087),o=e.i(480731),d=e.i(444755),l=e.i(673706),s=e.i(95779);let i={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"}},n={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,l.makeClassName)("Icon"),g=r.default.forwardRef((e,g)=>{let{icon:m,variant:p="simple",tooltip:f,size:b=o.Sizes.SM,color:x,className:h}=e,v=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),w=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,l.getColorClassNames)(t,s.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,l.getColorClassNames)(t,s.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,d.tremorTwMerge)((0,l.getColorClassNames)(t,s.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,l.getColorClassNames)(t,s.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,d.tremorTwMerge)((0,l.getColorClassNames)(t,s.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,l.getColorClassNames)(t,s.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,d.tremorTwMerge)((0,l.getColorClassNames)(t,s.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,l.getColorClassNames)(t,s.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,d.tremorTwMerge)((0,l.getColorClassNames)(t,s.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,l.getColorClassNames)(t,s.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,d.tremorTwMerge)((0,l.getColorClassNames)(t,s.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(p,x),{tooltipProps:C,getReferenceProps:k}=(0,a.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,l.mergeRefs)([g,C.refs.setReference]),className:(0,d.tremorTwMerge)(u("root"),"inline-flex shrink-0 items-center justify-center",w.bgColor,w.textColor,w.borderColor,w.ringColor,c[p].rounded,c[p].border,c[p].shadow,c[p].ring,i[b].paddingX,i[b].paddingY,h)},k,v),r.default.createElement(a.default,Object.assign({text:f},C)),r.default.createElement(m,{className:(0,d.tremorTwMerge)(u("icon"),"shrink-0",n[b].height,n[b].width)}))});g.displayName="Icon",e.s(["default",0,g],728889)},752978,e=>{"use strict";var t=e.i(728889);e.s(["Icon",()=>t.default])},868499,e=>{"use strict";var t=e.i(843476);e.s([],558762),e.i(558762);var r=e.i(366250),a=e.i(402820),o=e.i(156736),d=e.i(209793),l=e.i(784324),s=e.i(264951),i=e.i(77173);let n=e.i(313488).DialogTrigger;var c=e.i(974217),u=e.i(325326),g=e.i(301807);let m={modal:!0,disablePointerDismissal:!0,role:"alertdialog"};class p extends u.DialogHandle{constructor(e){super(e??new g.DialogStore(m)),e&&this.store.update(m)}}e.s(["Backdrop",()=>a.DialogBackdrop,"Close",()=>o.DialogClose,"Description",()=>d.DialogDescription,"Handle",0,p,"Popup",()=>l.DialogPopup,"Portal",()=>s.DialogPortal,"Root",0,function(e){return(0,r.useRenderDialogRoot)(e,"alert-dialog")},"Title",()=>i.DialogTitle,"Trigger",0,n,"Viewport",()=>c.DialogViewport,"createHandle",0,function(){return new p}],734604);var f=e.i(734604),f=f,b=e.i(115504),x=e.i(519455);function h({...e}){return(0,t.jsx)(f.Portal,{"data-slot":"alert-dialog-portal",...e})}function v({className:e,...r}){return(0,t.jsx)(f.Backdrop,{"data-slot":"alert-dialog-overlay",className:(0,b.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...r})}e.s(["AlertDialog",0,function({...e}){return(0,t.jsx)(f.Root,{"data-slot":"alert-dialog",...e})},"AlertDialogAction",0,function({className:e,variant:r="default",size:a="default",...o}){return(0,t.jsx)(f.Close,{"data-slot":"alert-dialog-action",className:(0,b.cn)(e),render:(0,t.jsx)(x.Button,{variant:r,size:a}),...o})},"AlertDialogCancel",0,function({className:e,variant:r="outline",size:a="default",...o}){return(0,t.jsx)(f.Close,{"data-slot":"alert-dialog-cancel",className:(0,b.cn)(e),render:(0,t.jsx)(x.Button,{variant:r,size:a}),...o})},"AlertDialogContent",0,function({className:e,size:r="default",...a}){return(0,t.jsxs)(h,{children:[(0,t.jsx)(v,{}),(0,t.jsx)(f.Popup,{"data-slot":"alert-dialog-content","data-size":r,className:(0,b.cn)("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg 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),...a})]})},"AlertDialogDescription",0,function({className:e,...r}){return(0,t.jsx)(f.Description,{"data-slot":"alert-dialog-description",className:(0,b.cn)("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...r})},"AlertDialogFooter",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"alert-dialog-footer",className:(0,b.cn)("flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",e),...r})},"AlertDialogHeader",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"alert-dialog-header",className:(0,b.cn)("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",e),...r})},"AlertDialogTitle",0,function({className:e,...r}){return(0,t.jsx)(f.Title,{"data-slot":"alert-dialog-title",className:(0,b.cn)("text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",e),...r})},"AlertDialogTrigger",0,function({...e}){return(0,t.jsx)(f.Trigger,{"data-slot":"alert-dialog-trigger",...e})}],868499)},888288,e=>{"use strict";var t=e.i(271645);e.s(["default",0,(e,r)=>{let a=void 0!==r,[o,d]=(0,t.useState)(e);return[a?r:o,e=>{a||d(e)}]}])},793130,e=>{"use strict";var t=e.i(290571),r=e.i(783222),a=e.i(433336),o=e.i(271645),d=e.i(394487),l=e.i(503269),s=e.i(214520),i=e.i(746725),n=e.i(914189),c=e.i(144279),u=e.i(294316),g=e.i(601893),m=e.i(140721),p=e.i(942803),f=e.i(233538),b=e.i(694421),x=e.i(700020),h=e.i(35889),v=e.i(998348),w=e.i(722678);let C=(0,o.createContext)(null);C.displayName="GroupContext";let k=o.Fragment,y=Object.assign((0,x.forwardRefWithAs)(function(e,t){var k;let y=(0,o.useId)(),N=(0,p.useProvidedId)(),D=(0,g.useDisabled)(),{id:j=N||`headlessui-switch-${y}`,disabled:M=D||!1,checked:T,defaultChecked:P,onChange:z,name:R,value:A,form:S,autoFocus:E=!1,..._}=e,F=(0,o.useContext)(C),[H,I]=(0,o.useState)(null),B=(0,o.useRef)(null),L=(0,u.useSyncRefs)(B,t,null===F?null:F.setSwitch,I),O=(0,s.useDefaultValue)(P),[V,K]=(0,l.useControllable)(T,z,null!=O&&O),X=(0,i.useDisposables)(),[Y,q]=(0,o.useState)(!1),U=(0,n.useEvent)(()=>{q(!0),null==K||K(!V),X.nextFrame(()=>{q(!1)})}),G=(0,n.useEvent)(e=>{if((0,f.isDisabledReactIssue7711)(e.currentTarget))return e.preventDefault();e.preventDefault(),U()}),W=(0,n.useEvent)(e=>{e.key===v.Keys.Space?(e.preventDefault(),U()):e.key===v.Keys.Enter&&(0,b.attemptSubmit)(e.currentTarget)}),$=(0,n.useEvent)(e=>e.preventDefault()),J=(0,w.useLabelledBy)(),Q=(0,h.useDescribedBy)(),{isFocusVisible:Z,focusProps:ee}=(0,r.useFocusRing)({autoFocus:E}),{isHovered:et,hoverProps:er}=(0,a.useHover)({isDisabled:M}),{pressed:ea,pressProps:eo}=(0,d.useActivePress)({disabled:M}),ed=(0,o.useMemo)(()=>({checked:V,disabled:M,hover:et,focus:Z,active:ea,autofocus:E,changing:Y}),[V,et,Z,ea,M,Y,E]),el=(0,x.mergeProps)({id:j,ref:L,role:"switch",type:(0,c.useResolveButtonType)(e,H),tabIndex:-1===e.tabIndex?0:null!=(k=e.tabIndex)?k:0,"aria-checked":V,"aria-labelledby":J,"aria-describedby":Q,disabled:M||void 0,autoFocus:E,onClick:G,onKeyUp:W,onKeyPress:$},ee,er,eo),es=(0,o.useCallback)(()=>{if(void 0!==O)return null==K?void 0:K(O)},[K,O]),ei=(0,x.useRender)();return o.default.createElement(o.default.Fragment,null,null!=R&&o.default.createElement(m.FormFields,{disabled:M,data:{[R]:A||"on"},overrides:{type:"checkbox",checked:V},form:S,onReset:es}),ei({ourProps:el,theirProps:_,slot:ed,defaultTag:"button",name:"Switch"}))}),{Group:function(e){var t;let[r,a]=(0,o.useState)(null),[d,l]=(0,w.useLabels)(),[s,i]=(0,h.useDescriptions)(),n=(0,o.useMemo)(()=>({switch:r,setSwitch:a}),[r,a]),c=(0,x.useRender)();return o.default.createElement(i,{name:"Switch.Description",value:s},o.default.createElement(l,{name:"Switch.Label",value:d,props:{htmlFor:null==(t=n.switch)?void 0:t.id,onClick(e){r&&(e.currentTarget instanceof HTMLLabelElement&&e.preventDefault(),r.click(),r.focus({preventScroll:!0}))}}},o.default.createElement(C.Provider,{value:n},c({ourProps:{},theirProps:e,slot:{},defaultTag:k,name:"Switch.Group"}))))},Label:w.Label,Description:h.Description});var N=e.i(888288),D=e.i(95779),j=e.i(444755),M=e.i(673706),T=e.i(829087);let P=(0,M.makeClassName)("Switch"),z=o.default.forwardRef((e,r)=>{let{checked:a,defaultChecked:d=!1,onChange:l,color:s,name:i,error:n,errorMessage:c,disabled:u,required:g,tooltip:m,id:p}=e,f=(0,t.__rest)(e,["checked","defaultChecked","onChange","color","name","error","errorMessage","disabled","required","tooltip","id"]),b={bgColor:s?(0,M.getColorClassNames)(s,D.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",ringColor:s?(0,M.getColorClassNames)(s,D.colorPalette.ring).ringColor:"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"},[x,h]=(0,N.default)(d,a),[v,w]=(0,o.useState)(!1),{tooltipProps:C,getReferenceProps:k}=(0,T.useTooltip)(300);return o.default.createElement("div",{className:"flex flex-row items-center justify-start"},o.default.createElement(T.default,Object.assign({text:m},C)),o.default.createElement("div",Object.assign({ref:(0,M.mergeRefs)([r,C.refs.setReference]),className:(0,j.tremorTwMerge)(P("root"),"flex flex-row relative h-5")},f,k),o.default.createElement("input",{type:"checkbox",className:(0,j.tremorTwMerge)(P("input"),"absolute w-5 h-5 cursor-pointer left-0 top-0 opacity-0"),name:i,required:g,checked:x,onChange:e=>{e.preventDefault()}}),o.default.createElement(y,{checked:x,onChange:e=>{h(e),null==l||l(e)},disabled:u,className:(0,j.tremorTwMerge)(P("switch"),"w-10 h-5 group relative inline-flex shrink-0 cursor-pointer items-center justify-center rounded-tremor-full","focus:outline-none",u?"cursor-not-allowed":""),onFocus:()=>w(!0),onBlur:()=>w(!1),id:p},o.default.createElement("span",{className:(0,j.tremorTwMerge)(P("sr-only"),"sr-only")},"Switch ",x?"on":"off"),o.default.createElement("span",{"aria-hidden":"true",className:(0,j.tremorTwMerge)(P("background"),x?b.bgColor:"bg-tremor-border dark:bg-dark-tremor-border","pointer-events-none absolute mx-auto h-3 w-9 rounded-tremor-full transition-colors duration-100 ease-in-out")}),o.default.createElement("span",{"aria-hidden":"true",className:(0,j.tremorTwMerge)(P("round"),x?(0,j.tremorTwMerge)(b.bgColor,"translate-x-5 border-tremor-background dark:border-dark-tremor-background"):"translate-x-0 bg-tremor-border dark:bg-dark-tremor-border border-tremor-background dark:border-dark-tremor-background","pointer-events-none absolute left-0 inline-block h-5 w-5 transform rounded-tremor-full border-2 shadow-tremor-input duration-100 ease-in-out transition",v?(0,j.tremorTwMerge)("ring-2",b.ringColor):"")}))),n&&c?o.default.createElement("p",{className:(0,j.tremorTwMerge)(P("errorMessage"),"text-sm text-red-500 mt-1 ")},c):null)});z.displayName="Switch",e.s(["Switch",0,z],793130)},439573,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let o=(0,a.cva)({base:"group/alert relative grid w-full gap-0.5 rounded-lg border px-4 py-3 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",variants:{variant:{default:"bg-card text-card-foreground",destructive:"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"}},defaultVariants:{variant:"default"}}),d=r.forwardRef(({className:e,variant:r,...d},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"alert",role:"alert",className:(0,a.cn)(o({variant:r}),e),...d}));d.displayName="Alert";let l=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"alert-title",className:(0,a.cn)("font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",e),...r}));l.displayName="AlertTitle";let s=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"alert-description",className:(0,a.cn)("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",e),...r}));s.displayName="AlertDescription";let i=r.forwardRef(({className:e,...r},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"alert-action",className:(0,a.cn)("absolute top-2.5 right-3",e),...r}));i.displayName="AlertAction",e.s(["Alert",0,d,"AlertAction",0,i,"AlertDescription",0,s,"AlertTitle",0,l])},431343,e=>{"use strict";let t=(0,e.i(475254).default)("play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);e.s(["Play",0,t],431343)},569074,e=>{"use strict";let t=(0,e.i(475254).default)("upload",[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]);e.s(["Upload",0,t],569074)},269638,e=>{"use strict";let t=(0,e.i(475254).default)("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);e.s(["CheckCircle",0,t],269638)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0e5-pjnljk_pz.js b/litellm/proxy/_experimental/out/_next/static/chunks/0e5-pjnljk_pz.js new file mode 100644 index 00000000000..2fc7a998378 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0e5-pjnljk_pz.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,560025,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),n=e.i(931067),l=e.i(392221),i=e.i(703923),o=e.i(211577),r=e.i(209428),s=e.i(410160),c=e.i(914949),u=e.i(529681),d=e.i(611935),f=e.i(361275),m=e.i(174428),h=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}},p=function(e){return void 0!==e?"".concat(e,"px"):void 0};function v(e){var n=e.prefixCls,i=e.containerRef,o=e.value,s=e.getValueIndex,c=e.motionName,u=e.onMotionStart,v=e.onMotionEnd,g=e.direction,b=e.vertical,y=void 0!==b&&b,x=t.useRef(null),w=t.useState(o),$=(0,l.default)(w,2),C=$[0],k=$[1],S=function(e){var t,a=s(e),l=null==(t=i.current)?void 0:t.querySelectorAll(".".concat(n,"-item"))[a];return(null==l?void 0:l.offsetParent)&&l},O=t.useState(null),j=(0,l.default)(O,2),E=j[0],N=j[1],R=t.useState(null),M=(0,l.default)(R,2),D=M[0],z=M[1];(0,m.default)(function(){if(C!==o){var e=S(C),t=S(o),a=h(e,y),n=h(t,y);k(o),N(a),z(n),e&&t?u():v()}},[o]);var I=t.useMemo(function(){if(y){var e;return p(null!=(e=null==E?void 0:E.top)?e:0)}return"rtl"===g?p(-(null==E?void 0:E.right)):p(null==E?void 0:E.left)},[y,g,E]),L=t.useMemo(function(){if(y){var e;return p(null!=(e=null==D?void 0:D.top)?e:0)}return"rtl"===g?p(-(null==D?void 0:D.right)):p(null==D?void 0:D.left)},[y,g,D]);return E&&D?t.createElement(f.default,{visible:!0,motionName:c,motionAppear:!0,onAppearStart:function(){return y?{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 y?{transform:"translateY(var(--thumb-active-top))",height:"var(--thumb-active-height)"}:{transform:"translateX(var(--thumb-active-left))",width:"var(--thumb-active-width)"}},onVisibleChanged:function(){N(null),z(null),v()}},function(e,l){var i=e.className,o=e.style,s=(0,r.default)((0,r.default)({},o),{},{"--thumb-start-left":I,"--thumb-start-width":p(null==E?void 0:E.width),"--thumb-active-left":L,"--thumb-active-width":p(null==D?void 0:D.width),"--thumb-start-top":I,"--thumb-start-height":p(null==E?void 0:E.height),"--thumb-active-top":L,"--thumb-active-height":p(null==D?void 0:D.height)}),c={ref:(0,d.composeRef)(x,l),style:s,className:(0,a.default)("".concat(n,"-thumb"),i)};return t.createElement("div",c)}):null}var g=["prefixCls","direction","vertical","options","disabled","defaultValue","value","name","onChange","className","motionName"],b=function(e){var n=e.prefixCls,l=e.className,i=e.disabled,r=e.checked,s=e.label,c=e.title,u=e.value,d=e.name,f=e.onChange,m=e.onFocus,h=e.onBlur,p=e.onKeyDown,v=e.onKeyUp,g=e.onMouseDown;return t.createElement("label",{className:(0,a.default)(l,(0,o.default)({},"".concat(n,"-item-disabled"),i)),onMouseDown:g},t.createElement("input",{name:d,className:"".concat(n,"-item-input"),type:"radio",disabled:i,checked:r,onChange:function(e){i||f(e,u)},onFocus:m,onBlur:h,onKeyDown:p,onKeyUp:v}),t.createElement("div",{className:"".concat(n,"-item-label"),title:c},s))},y=t.forwardRef(function(e,f){var m,h=e.prefixCls,p=void 0===h?"rc-segmented":h,y=e.direction,x=e.vertical,w=e.options,$=void 0===w?[]:w,C=e.disabled,k=e.defaultValue,S=e.value,O=e.name,j=e.onChange,E=e.className,N=e.motionName,R=(0,i.default)(e,g),M=t.useRef(null),D=t.useMemo(function(){return(0,d.composeRef)(M,f)},[M,f]),z=t.useMemo(function(){return $.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}})},[$]),I=(0,c.default)(null==(m=z[0])?void 0:m.value,{value:S,defaultValue:k}),L=(0,l.default)(I,2),H=L[0],_=L[1],P=t.useState(!1),B=(0,l.default)(P,2),A=B[0],K=B[1],T=function(e,t){_(t),null==j||j(t)},V=(0,u.default)(R,["children"]),q=t.useState(!1),U=(0,l.default)(q,2),F=U[0],W=U[1],X=t.useState(!1),Y=(0,l.default)(X,2),G=Y[0],Q=Y[1],Z=function(){Q(!0)},J=function(){Q(!1)},ee=function(){W(!1)},et=function(e){"Tab"===e.key&&W(!0)},ea=function(e){var t=z.findIndex(function(e){return e.value===H}),a=z.length,n=z[(t+e+a)%a];n&&(_(n.value),null==j||j(n.value))},en=function(e){switch(e.key){case"ArrowLeft":case"ArrowUp":ea(-1);break;case"ArrowRight":case"ArrowDown":ea(1)}};return t.createElement("div",(0,n.default)({role:"radiogroup","aria-label":"segmented control",tabIndex:C?void 0:0,"aria-orientation":x?"vertical":"horizontal"},V,{className:(0,a.default)(p,(0,o.default)((0,o.default)((0,o.default)({},"".concat(p,"-rtl"),"rtl"===y),"".concat(p,"-disabled"),C),"".concat(p,"-vertical"),x),void 0===E?"":E),ref:D}),t.createElement("div",{className:"".concat(p,"-group")},t.createElement(v,{vertical:x,prefixCls:p,value:H,containerRef:M,motionName:"".concat(p,"-").concat(void 0===N?"thumb-motion":N),direction:y,getValueIndex:function(e){return z.findIndex(function(t){return t.value===e})},onMotionStart:function(){K(!0)},onMotionEnd:function(){K(!1)}}),z.map(function(e){return t.createElement(b,(0,n.default)({},e,{name:O,key:e.value,prefixCls:p,className:(0,a.default)(e.className,"".concat(p,"-item"),(0,o.default)((0,o.default)({},"".concat(p,"-item-selected"),e.value===H&&!A),"".concat(p,"-item-focused"),G&&F&&e.value===H)),checked:e.value===H,onChange:T,onFocus:Z,onBlur:J,onKeyDown:en,onKeyUp:et,onMouseDown:ee,disabled:!!C||!!e.disabled}))})))}),x=e.i(981444),w=e.i(242064),$=e.i(517455);e.i(296059);var C=e.i(915654),k=e.i(183293),S=e.i(246422),O=e.i(838378);function j(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 N=Object.assign({overflow:"hidden"},k.textEllipsis),R=(0,S.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(),n=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,k.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,k.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,C.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,k.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,C.unit)(a),padding:`0 ${(0,C.unit)(e.segmentedPaddingHorizontal)}`},N),"&-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,C.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:n,lineHeight:(0,C.unit)(n),padding:`0 ${(0,C.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,C.unit)(l),padding:`0 ${(0,C.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),j(`&-disabled ${t}-item`,e)),j(`${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,O.mergeToken)(e,{segmentedPaddingHorizontal:a(e.controlPaddingHorizontal).sub(t).equal(),segmentedPaddingHorizontalSM:a(e.controlPaddingHorizontalSM).sub(t).equal()}))},e=>{let{colorTextLabel:t,colorText:a,colorFillSecondary:n,colorBgElevated:l,colorFill:i,lineWidthBold:o,colorBgLayout:r}=e;return{trackPadding:o,trackBg:r,itemColor:t,itemHoverColor:a,itemHoverBg:n,itemSelectedBg:l,itemActiveBg:i,itemSelectedColor:a}});var M=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(a[n[l]]=e[n[l]]);return a};let D=t.forwardRef((e,n)=>{let l=(0,x.default)(),{prefixCls:i,className:o,rootClassName:r,block:s,options:c=[],size:u="middle",style:d,vertical:f,shape:m="default",name:h=l}=e,p=M(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:v,direction:g,className:b,style:C}=(0,w.useComponentConfig)("segmented"),k=v("segmented",i),[S,O,j]=R(k),E=(0,$.default)(u),N=t.useMemo(()=>c.map(e=>{if("object"==typeof e&&(null==e?void 0:e.icon)){let{icon:a,label:n}=e;return Object.assign(Object.assign({},M(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${k}-item-icon`},a),n&&t.createElement("span",null,n))})}return e}),[c,k]),D=(0,a.default)(o,r,b,{[`${k}-block`]:s,[`${k}-sm`]:"small"===E,[`${k}-lg`]:"large"===E,[`${k}-vertical`]:f,[`${k}-shape-${m}`]:"round"===m},O,j),z=Object.assign(Object.assign({},C),d);return S(t.createElement(y,Object.assign({},p,{name:h,className:D,style:z,options:N,ref:n,prefixCls:k,direction:g,vertical:f})))});e.s(["Segmented",0,D],560025)},608856,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),n=e.i(209428),l=e.i(392221),i=e.i(951160),o=e.i(174428),r=t.createContext(null),s=t.createContext({}),c=e.i(211577),u=e.i(931067),d=e.i(361275),f=e.i(404948),m=e.i(244009),h=e.i(703923),p=e.i(611935),v=["prefixCls","className","containerRef"];let g=function(e){var n=e.prefixCls,l=e.className,i=e.containerRef,o=(0,h.default)(e,v),r=t.useContext(s).panel,c=(0,p.useComposeRef)(r,i);return t.createElement("div",(0,u.default)({className:(0,a.default)("".concat(n,"-content"),l),role:"dialog",ref:c},(0,m.default)(e,{aria:!0}),{"aria-modal":"true"},o))};var b=e.i(883110);function y(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 x={width:0,height:0,overflow:"hidden",outline:"none",position:"absolute"},w=t.forwardRef(function(e,i){var o,s,h,p=e.prefixCls,v=e.open,b=e.placement,w=e.inline,$=e.push,C=e.forceRender,k=e.autoFocus,S=e.keyboard,O=e.classNames,j=e.rootClassName,E=e.rootStyle,N=e.zIndex,R=e.className,M=e.id,D=e.style,z=e.motion,I=e.width,L=e.height,H=e.children,_=e.mask,P=e.maskClosable,B=e.maskMotion,A=e.maskClassName,K=e.maskStyle,T=e.afterOpenChange,V=e.onClose,q=e.onMouseEnter,U=e.onMouseOver,F=e.onMouseLeave,W=e.onClick,X=e.onKeyDown,Y=e.onKeyUp,G=e.styles,Q=e.drawerRender,Z=t.useRef(),J=t.useRef(),ee=t.useRef();t.useImperativeHandle(i,function(){return Z.current}),t.useEffect(function(){if(v&&k){var e;null==(e=Z.current)||e.focus({preventScroll:!0})}},[v]);var et=t.useState(!1),ea=(0,l.default)(et,2),en=ea[0],el=ea[1],ei=t.useContext(r),eo=null!=(o=null!=(s=null==(h="boolean"==typeof $?$?{}:{distance:0}:$||{})?void 0:h.distance)?s:null==ei?void 0:ei.pushDistance)?o:180,er=t.useMemo(function(){return{pushDistance:eo,push:function(){el(!0)},pull:function(){el(!1)}}},[eo]);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(d.default,(0,u.default)({key:"mask"},B,{visible:_&&v}),function(e,l){var i=e.className,o=e.style;return t.createElement("div",{className:(0,a.default)("".concat(p,"-mask"),i,null==O?void 0:O.mask,A),style:(0,n.default)((0,n.default)((0,n.default)({},o),K),null==G?void 0:G.mask),onClick:P&&v?V:void 0,ref:l})}),ec="function"==typeof z?z(b):z,eu={};if(en&&eo)switch(b){case"top":eu.transform="translateY(".concat(eo,"px)");break;case"bottom":eu.transform="translateY(".concat(-eo,"px)");break;case"left":eu.transform="translateX(".concat(eo,"px)");break;default:eu.transform="translateX(".concat(-eo,"px)")}"left"===b||"right"===b?eu.width=y(I):eu.height=y(L);var ed={onMouseEnter:q,onMouseOver:U,onMouseLeave:F,onClick:W,onKeyDown:X,onKeyUp:Y},ef=t.createElement(d.default,(0,u.default)({key:"panel"},ec,{visible:v,forceRender:C,onVisibleChanged:function(e){null==T||T(e)},removeOnLeave:!1,leavedClassName:"".concat(p,"-content-wrapper-hidden")}),function(l,i){var o=l.className,r=l.style,s=t.createElement(g,(0,u.default)({id:M,containerRef:i,prefixCls:p,className:(0,a.default)(R,null==O?void 0:O.content),style:(0,n.default)((0,n.default)({},D),null==G?void 0:G.content)},(0,m.default)(e,{aria:!0}),ed),H);return t.createElement("div",(0,u.default)({className:(0,a.default)("".concat(p,"-content-wrapper"),null==O?void 0:O.wrapper,o),style:(0,n.default)((0,n.default)((0,n.default)({},eu),r),null==G?void 0:G.wrapper)},(0,m.default)(e,{data:!0})),Q?Q(s):s)}),em=(0,n.default)({},E);return N&&(em.zIndex=N),t.createElement(r.Provider,{value:er},t.createElement("div",{className:(0,a.default)(p,"".concat(p,"-").concat(b),j,(0,c.default)((0,c.default)({},"".concat(p,"-open"),v),"".concat(p,"-inline"),w)),style:em,tabIndex:-1,ref:Z,onKeyDown:function(e){var t,a,n=e.keyCode,l=e.shiftKey;switch(n){case f.default.TAB:n===f.default.TAB&&(l||document.activeElement!==ee.current?l&&document.activeElement===J.current&&(null==(a=ee.current)||a.focus({preventScroll:!0})):null==(t=J.current)||t.focus({preventScroll:!0}));break;case f.default.ESC:V&&S&&(e.stopPropagation(),V(e))}}},es,t.createElement("div",{tabIndex:0,ref:J,style:x,"aria-hidden":"true","data-sentinel":"start"}),ef,t.createElement("div",{tabIndex:0,ref:ee,style:x,"aria-hidden":"true","data-sentinel":"end"})))});let $=function(e){var a=e.open,r=e.prefixCls,c=e.placement,u=e.autoFocus,d=e.keyboard,f=e.width,m=e.mask,h=void 0===m||m,p=e.maskClosable,v=e.getContainer,g=e.forceRender,b=e.afterOpenChange,y=e.destroyOnClose,x=e.onMouseEnter,$=e.onMouseOver,C=e.onMouseLeave,k=e.onClick,S=e.onKeyDown,O=e.onKeyUp,j=e.panelRef,E=t.useState(!1),N=(0,l.default)(E,2),R=N[0],M=N[1],D=t.useState(!1),z=(0,l.default)(D,2),I=z[0],L=z[1];(0,o.default)(function(){L(!0)},[]);var H=!!I&&void 0!==a&&a,_=t.useRef(),P=t.useRef();(0,o.default)(function(){H&&(P.current=document.activeElement)},[H]);var B=t.useMemo(function(){return{panel:j}},[j]);if(!g&&!R&&!H&&y)return null;var A=(0,n.default)((0,n.default)({},e),{},{open:H,prefixCls:void 0===r?"rc-drawer":r,placement:void 0===c?"right":c,autoFocus:void 0===u||u,keyboard:void 0===d||d,width:void 0===f?378:f,mask:h,maskClosable:void 0===p||p,inline:!1===v,afterOpenChange:function(e){var t,a;M(e),null==b||b(e),e||!P.current||null!=(t=_.current)&&t.contains(P.current)||null==(a=P.current)||a.focus({preventScroll:!0})},ref:_},{onMouseEnter:x,onMouseOver:$,onMouseLeave:C,onClick:k,onKeyDown:S,onKeyUp:O});return t.createElement(s.Provider,{value:B},t.createElement(i.default,{open:H||g||R,autoDestroy:!1,getContainer:v,autoLock:h&&(H||R)},t.createElement(w,A)))};var C=e.i(981444),k=e.i(617206),S=e.i(122767),O=e.i(613541),j=e.i(340010),E=e.i(242064),N=e.i(922611),R=e.i(563113),M=e.i(185793);let D=e=>{var n,l,i,o;let r,{prefixCls:s,ariaId:c,title:u,footer:d,extra:f,closable:m,loading:h,onClose:p,headerStyle:v,bodyStyle:g,footerStyle:b,children:y,classNames:x,styles:w}=e,$=(0,E.useComponentConfig)("drawer");r=!1===m?void 0:void 0===m||!0===m?"start":(null==m?void 0:m.placement)==="end"?"end":"start";let C=t.useCallback(e=>t.createElement("button",{type:"button",onClick:p,className:(0,a.default)(`${s}-close`,{[`${s}-close-${r}`]:"end"===r})},e),[p,s,r]),[k,S]=(0,R.useClosable)((0,R.pickClosable)(e),(0,R.pickClosable)($),{closable:!0,closeIconRender:C});return t.createElement(t.Fragment,null,u||k?t.createElement("div",{style:Object.assign(Object.assign(Object.assign({},null==(i=$.styles)?void 0:i.header),v),null==w?void 0:w.header),className:(0,a.default)(`${s}-header`,{[`${s}-header-close-only`]:k&&!u&&!f},null==(o=$.classNames)?void 0:o.header,null==x?void 0:x.header)},t.createElement("div",{className:`${s}-header-title`},"start"===r&&S,u&&t.createElement("div",{className:`${s}-title`,id:c},u)),f&&t.createElement("div",{className:`${s}-extra`},f),"end"===r&&S):null,t.createElement("div",{className:(0,a.default)(`${s}-body`,null==x?void 0:x.body,null==(n=$.classNames)?void 0:n.body),style:Object.assign(Object.assign(Object.assign({},null==(l=$.styles)?void 0:l.body),g),null==w?void 0:w.body)},h?t.createElement(M.default,{active:!0,title:!1,paragraph:{rows:5},className:`${s}-body-skeleton`}):y),(()=>{var e,n;if(!d)return null;let l=`${s}-footer`;return t.createElement("div",{className:(0,a.default)(l,null==(e=$.classNames)?void 0:e.footer,null==x?void 0:x.footer),style:Object.assign(Object.assign(Object.assign({},null==(n=$.styles)?void 0:n.footer),b),null==w?void 0:w.footer)},d)})())};e.i(296059);var z=e.i(915654),I=e.i(183293),L=e.i(246422),H=e.i(838378);let _=(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}`}}},_({opacity:e},{opacity:1})),B=(0,L.genStyleHooks)("Drawer",e=>{let t=(0,H.mergeToken)(e,{});return[(e=>{let{borderRadiusSM:t,componentCls:a,zIndexPopup:n,colorBgMask:l,colorBgElevated:i,motionDurationSlow:o,motionDurationMid:r,paddingXS:s,padding:c,paddingLG:u,fontSizeLG:d,lineHeightLG:f,lineWidth:m,lineType:h,colorSplit:p,marginXS:v,colorIcon:g,colorIconHover:b,colorBgTextHover:y,colorBgTextActive:x,colorText:w,fontWeightStrong:$,footerPaddingBlock:C,footerPaddingInline:k,calc:S}=e,O=`${a}-content-wrapper`;return{[a]:{position:"fixed",inset:0,zIndex:n,pointerEvents:"none",color:w,"&-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:l,pointerEvents:"auto"},[O]:{position:"absolute",zIndex:n,maxWidth:"100vw",transition:`all ${o}`,"&-hidden":{display:"none"}},[`&-left > ${O}`]:{top:0,bottom:0,left:{_skip_check_:!0,value:0},boxShadow:e.boxShadowDrawerLeft},[`&-right > ${O}`]:{top:0,right:{_skip_check_:!0,value:0},bottom:0,boxShadow:e.boxShadowDrawerRight},[`&-top > ${O}`]:{top:0,insetInline:0,boxShadow:e.boxShadowDrawerUp},[`&-bottom > ${O}`]:{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,z.unit)(c)} ${(0,z.unit)(u)}`,fontSize:d,lineHeight:f,borderBottom:`${(0,z.unit)(m)} ${h} ${p}`,"&-title":{display:"flex",flex:1,alignItems:"center",minWidth:0,minHeight:0}},[`${a}-extra`]:{flex:"none"},[`${a}-close`]:Object.assign({display:"inline-flex",width:S(d).add(s).equal(),height:S(d).add(s).equal(),borderRadius:t,justifyContent:"center",alignItems:"center",color:g,fontWeight:$,fontSize:d,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:v},[`&:not(${a}-close-end)`]:{marginInlineEnd:v},"&:hover":{color:b,backgroundColor:y,textDecoration:"none"},"&:active":{backgroundColor:x}},(0,I.genFocusStyle)(e)),[`${a}-title`]:{flex:1,margin:0,fontWeight:e.fontWeightStrong,fontSize:d,lineHeight:f},[`${a}-body`]:{flex:1,minWidth:0,minHeight:0,padding:u,overflow:"auto",[`${a}-body-skeleton`]:{width:"100%",height:"100%",display:"flex",justifyContent:"center"}},[`${a}-footer`]:{flexShrink:0,padding:`${(0,z.unit)(C)} ${(0,z.unit)(k)}`,borderTop:`${(0,z.unit)(m)} ${h} ${p}`},"&-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 n;return Object.assign(Object.assign({},e),{[`&-${t}`]:[P(.7,a),_({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 A=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 l=0,n=Object.getOwnPropertySymbols(e);lt.indexOf(n[l])&&Object.prototype.propertyIsEnumerable.call(e,n[l])&&(a[n[l]]=e[n[l]]);return a};let K={distance:180},T=e=>{let{rootClassName:n,width:l,height:i,size:o="default",mask:r=!0,push:s=K,open:c,afterOpenChange:u,onClose:d,prefixCls:f,getContainer:m,panelRef:h=null,style:v,className:g,"aria-labelledby":b,visible:y,afterVisibleChange:x,maskStyle:w,drawerStyle:R,contentWrapperStyle:M,destroyOnClose:z,destroyOnHidden:I}=e,L=A(e,["rootClassName","width","height","size","mask","push","open","afterOpenChange","onClose","prefixCls","getContainer","panelRef","style","className","aria-labelledby","visible","afterVisibleChange","maskStyle","drawerStyle","contentWrapperStyle","destroyOnClose","destroyOnHidden"]),H=(0,C.default)(),_=L.title?H:void 0,{getPopupContainer:P,getPrefixCls:T,direction:V,className:q,style:U,classNames:F,styles:W}=(0,E.useComponentConfig)("drawer"),X=T("drawer",f),[Y,G,Q]=B(X),Z=void 0===m&&P?()=>P(document.body):m,J=(0,a.default)({"no-mask":!r,[`${X}-rtl`]:"rtl"===V},n,G,Q),ee=t.useMemo(()=>null!=l?l:"large"===o?736:378,[l,o]),et=t.useMemo(()=>null!=i?i:"large"===o?736:378,[i,o]),ea={motionName:(0,O.getTransitionName)(X,"mask-motion"),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500},en=(0,N.usePanelRef)(),el=(0,p.composeRef)(h,en),[ei,eo]=(0,S.useZIndex)("Drawer",L.zIndex),{classNames:er={},styles:es={}}=L;return Y(t.createElement(k.default,{form:!0,space:!0},t.createElement(j.default.Provider,{value:eo},t.createElement($,Object.assign({prefixCls:X,onClose:d,maskMotion:ea,motion:e=>({motionName:(0,O.getTransitionName)(X,`panel-motion-${e}`),motionAppear:!0,motionEnter:!0,motionLeave:!0,motionDeadline:500})},L,{classNames:{mask:(0,a.default)(er.mask,F.mask),content:(0,a.default)(er.content,F.content),wrapper:(0,a.default)(er.wrapper,F.wrapper)},styles:{mask:Object.assign(Object.assign(Object.assign({},es.mask),w),W.mask),content:Object.assign(Object.assign(Object.assign({},es.content),R),W.content),wrapper:Object.assign(Object.assign(Object.assign({},es.wrapper),M),W.wrapper)},open:null!=c?c:y,mask:r,push:s,width:ee,height:et,style:Object.assign(Object.assign({},U),v),className:(0,a.default)(q,g),rootClassName:J,getContainer:Z,afterOpenChange:null!=u?u:x,panelRef:el,zIndex:ei,"aria-labelledby":null!=b?b:_,destroyOnClose:null!=I?I:z}),t.createElement(D,Object.assign({prefixCls:X},L,{ariaId:_,onClose:d}))))))};T._InternalPanelDoNotUseOrYouWillBeFired=e=>{let{prefixCls:n,style:l,className:i,placement:o="right"}=e,r=A(e,["prefixCls","style","className","placement"]),{getPrefixCls:s}=t.useContext(E.ConfigContext),c=s("drawer",n),[u,d,f]=B(c),m=(0,a.default)(c,`${c}-pure`,`${c}-${o}`,d,f,i);return u(t.createElement("div",{className:m,style:l},t.createElement(D,Object.assign({prefixCls:c},r))))},e.s(["Drawer",0,T],608856)},133356,e=>{"use strict";var t=e.i(843476),a=e.i(199931),n=e.i(487486),l=e.i(115504);let i={complexity:"Auto-Router v2",adaptive:"Adaptive router",quality:"Quality router"};function o({label:e,children:a}){return(0,t.jsxs)("div",{className:"flex gap-3 py-1 text-sm",children:[(0,t.jsx)("span",{className:"w-28 shrink-0 text-muted-foreground",children:e}),(0,t.jsx)("span",{className:"min-w-0 break-words",children:a})]})}function r({decision:e,className:s}){if(!e||!e.cause)return null;let{router_model_name:c,router_type:u,routed_model:d,tier:f,tier_label:m,request_type:h,score:p,signals:v,escalated:g,escalation_keyword:b,tier_boundaries:y}=e,x=void 0!==p&&"reasoning_override"!==e.cause?function(e,t,a){if(!t)return null;let{simple_medium:n,medium_complex:l,complex_reasoning:i}=t;if(void 0===n||void 0===l||void 0===i)return null;let o=(e,t)=>a?e:`${e}, ${t}`;return e0&&(0,t.jsx)(o,{label:"Signals",children:(0,t.jsx)("span",{className:"flex flex-wrap gap-1",children:v.map(e=>(0,t.jsx)(n.Badge,{variant:"outline",className:"font-normal",children:e},e))})})]})]})}e.s(["RoutingDecisionCard",0,r,"default",0,r])},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])},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},518617,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:"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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["CloseCircleOutlined",0,i],518617)},19732,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 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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ExperimentOutlined",0,i],19732)},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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["ToolOutlined",0,i],366308)},782273,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:"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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["SoundOutlined",0,i],782273)},313603,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:"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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["SettingOutlined",0,i],313603)},793916,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:"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 l=e.i(9583),i=a.forwardRef(function(e,i){return a.createElement(l.default,(0,t.default)({},e,{ref:i,icon:n}))});e.s(["AudioOutlined",0,i],793916)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/2lmbrl05dz2hg.js b/litellm/proxy/_experimental/out/_next/static/chunks/0eblixumbp_86.js similarity index 60% rename from litellm/proxy/_experimental/out/_next/static/chunks/2lmbrl05dz2hg.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0eblixumbp_86.js index 24c1e70ce55..180c7bebfb3 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/2lmbrl05dz2hg.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0eblixumbp_86.js @@ -13,4 +13,4 @@ Return a structured verdict with confidence and justification.`,N=`{ "risk_category": "string", "suggested_action": "keep" | "adjust threshold" | "add allowlist" } -`;function C({open:e,onClose:s,guardrailName:r,accessToken:l,onRunEvaluation:i}){let[d,n]=(0,a.useState)(j),[o,u]=(0,a.useState)(N),[x,m]=(0,a.useState)(null),[g,w]=(0,a.useState)([]),[k,L]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if(!e||!l)return void w([]);let t=!1;return L(!0),(0,y.fetchAvailableModels)(l).then(e=>{t||w(e)}).catch(()=>{t||w([])}).finally(()=>{t||L(!1)}),()=>{t=!0}},[e,l]);let D=g.map(e=>({value:e.model_group,label:e.model_group}));return(0,t.jsxs)(p.Modal,{title:"Evaluation Settings",open:e,onCancel:s,width:640,footer:null,closeIcon:(0,t.jsx)(f.CloseOutlined,{}),destroyOnClose:!0,children:[(0,t.jsx)("p",{className:"text-sm text-gray-500 mb-4",children:r?`Configure AI evaluation for ${r}`:"Configure AI evaluation for re-running on logs"}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Evaluation Prompt"}),(0,t.jsx)("button",{type:"button",onClick:()=>n(j),className:"text-xs text-indigo-600 hover:text-indigo-700",children:"Reset to default"})]}),(0,t.jsx)(v.Input.TextArea,{value:d,onChange:e=>n(e.target.value),rows:6,className:"font-mono text-sm"}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"System prompt sent to the evaluation model. Output is structured via response_format."})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1.5",children:"Response Schema"}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mb-1",children:"response_format: json_schema"}),(0,t.jsx)(v.Input.TextArea,{value:o,onChange:e=>u(e.target.value),rows:6,className:"font-mono text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1.5",children:"Model"}),(0,t.jsx)(b.Select,{placeholder:k?"Loading models…":"Select a model",value:x??void 0,onChange:m,options:D,style:{width:"100%"},showSearch:!0,optionFilterProp:"label",loading:k,notFoundContent:l?"No models available":"Sign in to see models"})]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-end gap-2 mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsx)(c.Button,{onClick:s,children:"Cancel"}),(0,t.jsx)(c.Button,{type:"primary",icon:(0,t.jsx)(h.PlayCircleOutlined,{}),onClick:()=>{x&&(i?.({prompt:d,schema:o,model:x}),s())},disabled:!x,children:"Run Evaluation"})]})]})}var w=e.i(318842),k=e.i(972680);let L={healthy:{bg:"bg-green-50",text:"text-green-700",dot:"bg-green-500"},warning:{bg:"bg-amber-50",text:"text-amber-700",dot:"bg-amber-500"},critical:{bg:"bg-red-50",text:"text-red-700",dot:"bg-red-500"}};function D({guardrailId:e,onBack:r,accessToken:f=null,startDate:h,endDate:p}){let[b,v]=(0,a.useState)("overview"),[y,j]=(0,a.useState)(!1),[N,M]=(0,a.useState)(1),{data:Y,isLoading:S,error:R}=(0,o.useQuery)({queryKey:["guardrails-usage-detail",e,h,p],queryFn:()=>(0,s.getGuardrailsUsageDetail)(f,e,h,p),enabled:!!f&&!!e}),{data:O,isLoading:T}=(0,o.useQuery)({queryKey:["guardrails-usage-logs",e,N,50],queryFn:()=>(0,s.getGuardrailsUsageLogs)(f,{guardrailId:e,page:N,pageSize:50,startDate:h,endDate:p}),enabled:!!f&&!!e}),q=(0,a.useMemo)(()=>(O?.logs??[]).map(e=>({id:e.id,timestamp:e.timestamp,action:e.action,score:e.score,model:e.model,input_snippet:e.input_snippet,output_snippet:e.output_snippet,reason:e.reason})),[O?.logs]),E=Y?{name:Y.guardrail_name,description:Y.description??"",status:Y.status,provider:Y.provider,type:Y.type,requestsEvaluated:Y.requestsEvaluated,failRate:Y.failRate,avgScore:Y.avgScore,avgLatency:Y.avgLatency}:{name:e,description:"",status:"healthy",provider:"—",type:"—",requestsEvaluated:0,failRate:0,avgScore:void 0,avgLatency:void 0},B=L[E.status]??L.healthy;return S&&!Y?(0,t.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,t.jsx)(m.Spin,{size:"large"})}):R&&!Y?(0,t.jsxs)("div",{children:[(0,t.jsx)(c.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:r,className:"pl-0 mb-4",children:"Back to Overview"}),(0,t.jsx)("p",{className:"text-red-600",children:"Failed to load guardrail details."})]}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(c.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:r,className:"pl-0 mb-4",children:"Back to Overview"}),(0,t.jsxs)("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",children:[(0,t.jsx)(i.SafetyOutlined,{className:"text-xl text-gray-400"}),(0,t.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:E.name}),(0,t.jsxs)("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-0.5 text-xs font-medium rounded-full ${B.bg} ${B.text}`,children:[(0,t.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${B.dot}`}),E.status.charAt(0).toUpperCase()+E.status.slice(1)]})]}),(0,t.jsx)("p",{className:"text-sm text-gray-500 ml-8",children:E.description})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("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:E.provider}),(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(d.SettingOutlined,{}),onClick:()=>j(!0),title:"Evaluation settings"})]})]})]}),(0,t.jsx)(g.Tabs,{activeKey:b,onChange:v,items:[{key:"overview",label:"Overview"},{key:"logs",label:"Logs"}]}),"overview"===b&&(0,t.jsxs)("div",{className:"space-y-6 mt-4",children:[(0,t.jsxs)(x.Row,{gutter:[16,16],children:[(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Requests Evaluated",value:E.requestsEvaluated.toLocaleString()})}),(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Fail Rate",value:`${E.failRate}%`,valueColor:E.failRate>15?"text-red-600":E.failRate>5?"text-amber-600":"text-green-600",subtitle:`${Math.round(E.requestsEvaluated*E.failRate/100).toLocaleString()} blocked`,icon:E.failRate>15?(0,t.jsx)(n.WarningOutlined,{className:"text-red-400"}):void 0})}),(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Avg. latency added",value:null!=E.avgLatency?`${Math.round(E.avgLatency)}ms`:"—",valueColor:null!=E.avgLatency?E.avgLatency>150?"text-red-600":E.avgLatency>50?"text-amber-600":"text-green-600":"text-gray-500",subtitle:null!=E.avgLatency?"Per request (avg)":"No data"})})]}),(0,t.jsx)(w.LogViewer,{guardrailName:E.name,filterAction:"all",logs:q,logsLoading:T,totalLogs:O?.total??0,accessToken:f,startDate:h,endDate:p})]}),"logs"===b&&(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(w.LogViewer,{guardrailName:E.name,logs:q,logsLoading:T,totalLogs:O?.total??0,accessToken:f,startDate:h,endDate:p})}),(0,t.jsx)(C,{open:y,onClose:()=>j(!1),guardrailName:E.name,accessToken:f})]})}var M=e.i(737434);e.i(247167);var Y=e.i(931067);let S={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M917 211.1l-199.2 24c-6.6.8-9.4 8.9-4.7 13.6l59.3 59.3-226 226-101.8-101.7c-6.3-6.3-16.4-6.2-22.6 0L100.3 754.1a8.03 8.03 0 000 11.3l45 45.2c3.1 3.1 8.2 3.1 11.3 0L433.3 534 535 635.7c6.3 6.2 16.4 6.2 22.6 0L829 364.5l59.3 59.3a8.01 8.01 0 0013.6-4.7l24-199.2c.7-5.1-3.7-9.5-8.9-8.8z"}}]},name:"rise",theme:"outlined"};var R=e.i(9583),O=a.forwardRef(function(e,t){return a.createElement(R.default,(0,Y.default)({},e,{ref:t,icon:S}))}),T=e.i(175712),q=e.i(291542),E=e.i(898586);e.i(32117);var B=e.i(343053),V=e.i(515288);function $({data:e}){let a=e&&e.length>0?e:[];return(0,t.jsxs)(V.Card,{children:[(0,t.jsx)(V.CardHeader,{children:(0,t.jsx)(V.CardTitle,{className:"text-base font-semibold",children:"Request Outcomes Over Time"})}),(0,t.jsx)(V.CardContent,{children:(0,t.jsx)("div",{className:"h-80 min-h-[280px]",children:a.length>0?(0,t.jsx)(B.BarChart,{data:a,index:"date",categories:["passed","blocked"],colors:["green","red"],valueFormatter:e=>e.toLocaleString(),yAxisWidth:48,showLegend:!0,stack:!0,className:"h-full"}):(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-sm text-gray-500",children:"No chart data for this period"})})})]})}let A={Bedrock:"bg-orange-100 text-orange-700 border-orange-200","Google Cloud":"bg-sky-100 text-sky-700 border-sky-200",LiteLLM:"bg-indigo-100 text-indigo-700 border-indigo-200",Custom:"bg-gray-100 text-gray-600 border-gray-200"};function _({accessToken:e=null,startDate:r,endDate:l,onSelectGuardrail:g}){let[f,h]=(0,a.useState)("failRate"),[p,b]=(0,a.useState)("desc"),[v,y]=(0,a.useState)(!1),{data:j,isLoading:N,error:w}=(0,o.useQuery)({queryKey:["guardrails-usage-overview",r,l],queryFn:()=>(0,s.getGuardrailsUsageOverview)(e,r,l),enabled:!!e}),L=j?.rows??[],D=(0,a.useMemo)(()=>{let e,t,a,s;return j?{totalRequests:j.totalRequests??0,totalBlocked:j.totalBlocked??0,passRate:String(j.passRate??0),avgLatency:L.length?Math.round(L.reduce((e,t)=>e+(t.avgLatency??0),0)/L.length):0,count:L.length}:(e=L.reduce((e,t)=>e+t.requestsEvaluated,0),t=L.reduce((e,t)=>e+Math.round(t.requestsEvaluated*t.failRate/100),0),a=e>0?((1-t/e)*100).toFixed(1):"0",{totalRequests:e,totalBlocked:t,passRate:a,avgLatency:(s=L.filter(e=>null!=e.avgLatency)).length>0?Math.round(s.reduce((e,t)=>e+(t.avgLatency??0),0)/s.length):0,count:L.length})},[j,L]),Y=j?.chart,S=(0,a.useMemo)(()=>[...L].sort((e,t)=>{let a="desc"===p?-1:1,s=e[f]??0,r=t[f]??0;return(Number(s)-Number(r))*a}),[L,f,p]),R=[{title:"Guardrail",dataIndex:"name",key:"name",render:(e,a)=>(0,t.jsx)("button",{type:"button",className:"text-sm font-medium text-gray-900 hover:text-indigo-600 text-left",onClick:()=>g(a.id),children:e})},{title:"Provider",dataIndex:"provider",key:"provider",render:e=>(0,t.jsx)("span",{className:`inline-flex items-center px-2 py-0.5 text-xs font-medium rounded border ${A[e]??A.Custom}`,children:e})},{title:"Requests",dataIndex:"requestsEvaluated",key:"requestsEvaluated",align:"right",sorter:!0,sortOrder:"requestsEvaluated"===f?"desc"===p?"descend":"ascend":null,render:e=>e.toLocaleString()},{title:"Fail Rate",dataIndex:"failRate",key:"failRate",align:"right",sorter:!0,sortOrder:"failRate"===f?"desc"===p?"descend":"ascend":null,render:(e,a)=>(0,t.jsxs)("span",{className:e>15?"text-red-600":e>5?"text-amber-600":"text-green-600",children:[e,"%","up"===a.trend&&(0,t.jsx)("span",{className:"ml-1 text-xs text-red-400",children:"↑"}),"down"===a.trend&&(0,t.jsx)("span",{className:"ml-1 text-xs text-green-400",children:"↓"})]})},{title:"Avg. latency added",dataIndex:"avgLatency",key:"avgLatency",align:"right",sorter:!0,sortOrder:"avgLatency"===f?"desc"===p?"descend":"ascend":null,render:e=>(0,t.jsx)("span",{className:null==e?"text-gray-400":e>150?"text-red-600":e>50?"text-amber-600":"text-green-600",children:null!=e?`${e}ms`:"—"})},{title:"Status",dataIndex:"status",key:"status",align:"center",render:e=>(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,t.jsx)("span",{className:`w-2 h-2 rounded-full ${"healthy"===e?"bg-green-500":"warning"===e?"bg-amber-500":"bg-red-500"}`}),(0,t.jsx)("span",{className:"text-xs text-gray-600 capitalize",children:e})]})}],B=["failRate","requestsEvaluated","avgLatency"];return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-start justify-between mb-5",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,t.jsx)(i.SafetyOutlined,{className:"text-lg text-indigo-500"}),(0,t.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:"Guardrails Monitor"})]}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Monitor guardrail performance across all requests"})]}),(0,t.jsx)("div",{className:"flex items-center gap-3",children:(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(M.DownloadOutlined,{}),title:"Coming soon",children:"Export Data"})})]}),(0,t.jsxs)(x.Row,{gutter:[16,16],className:"mb-6",children:[(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Total Evaluations",value:D.totalRequests.toLocaleString()})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Blocked Requests",value:D.totalBlocked.toLocaleString(),valueColor:"text-red-600",icon:(0,t.jsx)(n.WarningOutlined,{className:"text-red-400"})})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Pass Rate",value:`${D.passRate}%`,valueColor:"text-green-600",icon:(0,t.jsx)(O,{className:"text-green-400"})})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Avg. latency added",value:`${D.avgLatency}ms`,valueColor:D.avgLatency>150?"text-red-600":D.avgLatency>50?"text-amber-600":"text-green-600"})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Active Guardrails",value:D.count})})]}),(0,t.jsx)("div",{className:"mb-6",children:(0,t.jsx)($,{data:Y})}),(0,t.jsxs)(T.Card,{className:"border border-gray-200 rounded-lg bg-white",styles:{body:{padding:0}},children:[(N||w)&&(0,t.jsxs)("div",{className:"px-6 py-4 border-b border-gray-200 flex items-center gap-2",children:[N&&(0,t.jsx)(m.Spin,{size:"small"}),w&&(0,t.jsx)("span",{className:"text-sm text-red-600",children:"Failed to load data. Try again."})]}),(0,t.jsxs)("div",{className:"px-6 py-4 border-b border-gray-200 flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(E.Typography.Title,{level:5,className:"mb-0! text-gray-900",children:"Guardrail Performance"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:"Click a guardrail to view details, logs, and configuration"})]}),(0,t.jsx)("div",{className:"flex items-center gap-2",children:(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(d.SettingOutlined,{}),onClick:()=>y(!0),title:"Evaluation settings"})})]}),(0,t.jsx)(q.Table,{columns:R,dataSource:S,rowKey:"id",pagination:!1,loading:N,onChange:(e,t,a)=>{a?.field&&B.includes(a.field)&&(h(a.field),b("ascend"===a.order?"asc":"desc"))},locale:0!==L.length||N?void 0:{emptyText:"No data for this period"},onRow:e=>({onClick:()=>g(e.id),style:{cursor:"pointer"}})})]}),(0,t.jsx)(C,{open:v,onClose:()=>y(!1),accessToken:e})]})}let z=new Date,H=new Date;function I({accessToken:e=null}){let[l,i]=(0,a.useState)({type:"overview"}),d=(0,a.useMemo)(()=>new Date(H),[]),n=(0,a.useMemo)(()=>new Date(z),[]),[o,c]=(0,a.useState)({from:d,to:n}),u=o.from?(0,s.formatDate)(o.from):"",x=o.to?(0,s.formatDate)(o.to):"",m=(0,a.useCallback)(e=>{c(e)},[]);return(0,t.jsxs)("div",{className:"p-6 w-full min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"flex items-center justify-end mb-4",children:(0,t.jsx)(r.default,{value:o,onValueChange:m,label:"",showTimeRange:!1})}),"overview"===l.type?(0,t.jsx)(_,{accessToken:e,startDate:u,endDate:x,onSelectGuardrail:e=>{i({type:"detail",guardrailId:e})}}):(0,t.jsx)(D,{guardrailId:l.guardrailId,onBack:()=>{i({type:"overview"})},accessToken:e,startDate:u,endDate:x})]})}H.setDate(H.getDate()-7);var F=e.i(135214);e.s(["default",0,function(){let{accessToken:e}=(0,F.default)();return(0,t.jsx)(I,{accessToken:e})}],55004)}]); \ No newline at end of file +`;function C({open:e,onClose:s,guardrailName:r,accessToken:l,onRunEvaluation:i}){let[d,n]=(0,a.useState)(j),[o,u]=(0,a.useState)(N),[x,m]=(0,a.useState)(null),[g,w]=(0,a.useState)([]),[k,L]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if(!e||!l)return void w([]);let t=!1;return L(!0),(0,y.fetchAvailableModels)(l).then(e=>{t||w(e)}).catch(()=>{t||w([])}).finally(()=>{t||L(!1)}),()=>{t=!0}},[e,l]);let D=g.map(e=>({value:e.model_group,label:e.model_group}));return(0,t.jsxs)(p.Modal,{title:"Evaluation Settings",open:e,onCancel:s,width:640,footer:null,closeIcon:(0,t.jsx)(f.CloseOutlined,{}),destroyOnClose:!0,children:[(0,t.jsx)("p",{className:"text-sm text-gray-500 mb-4",children:r?`Configure AI evaluation for ${r}`:"Configure AI evaluation for re-running on logs"}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Evaluation Prompt"}),(0,t.jsx)("button",{type:"button",onClick:()=>n(j),className:"text-xs text-indigo-600 hover:text-indigo-700",children:"Reset to default"})]}),(0,t.jsx)(v.Input.TextArea,{value:d,onChange:e=>n(e.target.value),rows:6,className:"font-mono text-sm"}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"System prompt sent to the evaluation model. Output is structured via response_format."})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1.5",children:"Response Schema"}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mb-1",children:"response_format: json_schema"}),(0,t.jsx)(v.Input.TextArea,{value:o,onChange:e=>u(e.target.value),rows:6,className:"font-mono text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1.5",children:"Model"}),(0,t.jsx)(b.Select,{placeholder:k?"Loading models…":"Select a model",value:x??void 0,onChange:m,options:D,style:{width:"100%"},showSearch:!0,optionFilterProp:"label",loading:k,notFoundContent:l?"No models available":"Sign in to see models"})]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-end gap-2 mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsx)(c.Button,{onClick:s,children:"Cancel"}),(0,t.jsx)(c.Button,{type:"primary",icon:(0,t.jsx)(h.PlayCircleOutlined,{}),onClick:()=>{x&&(i?.({prompt:d,schema:o,model:x}),s())},disabled:!x,children:"Run Evaluation"})]})]})}var w=e.i(318842),k=e.i(972680);let L={healthy:{bg:"bg-green-50",text:"text-green-700",dot:"bg-green-500"},warning:{bg:"bg-amber-50",text:"text-amber-700",dot:"bg-amber-500"},critical:{bg:"bg-red-50",text:"text-red-700",dot:"bg-red-500"}};function D({guardrailId:e,onBack:r,accessToken:f=null,startDate:h,endDate:p}){let[b,v]=(0,a.useState)("overview"),[y,j]=(0,a.useState)(!1),[N]=(0,a.useState)(1),{data:M,isLoading:Y,error:S}=(0,o.useQuery)({queryKey:["guardrails-usage-detail",e,h,p],queryFn:()=>(0,s.getGuardrailsUsageDetail)(f,e,h,p),enabled:!!f&&!!e}),{data:R,isLoading:O}=(0,o.useQuery)({queryKey:["guardrails-usage-logs",e,N,50],queryFn:()=>(0,s.getGuardrailsUsageLogs)(f,{guardrailId:e,page:N,pageSize:50,startDate:h,endDate:p}),enabled:!!f&&!!e}),T=(0,a.useMemo)(()=>(R?.logs??[]).map(e=>({id:e.id,timestamp:e.timestamp,action:e.action,score:e.score,model:e.model,input_snippet:e.input_snippet,output_snippet:e.output_snippet,reason:e.reason})),[R?.logs]),q=M?{name:M.guardrail_name,description:M.description??"",status:M.status,provider:M.provider,type:M.type,requestsEvaluated:M.requestsEvaluated,failRate:M.failRate,avgScore:M.avgScore,avgLatency:M.avgLatency}:{name:e,description:"",status:"healthy",provider:"—",type:"—",requestsEvaluated:0,failRate:0,avgScore:void 0,avgLatency:void 0},E=L[q.status]??L.healthy;return Y&&!M?(0,t.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,t.jsx)(m.Spin,{size:"large"})}):S&&!M?(0,t.jsxs)("div",{children:[(0,t.jsx)(c.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:r,className:"pl-0 mb-4",children:"Back to Overview"}),(0,t.jsx)("p",{className:"text-red-600",children:"Failed to load guardrail details."})]}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(c.Button,{type:"link",icon:(0,t.jsx)(l.ArrowLeftOutlined,{}),onClick:r,className:"pl-0 mb-4",children:"Back to Overview"}),(0,t.jsxs)("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",children:[(0,t.jsx)(i.SafetyOutlined,{className:"text-xl text-gray-400"}),(0,t.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:q.name}),(0,t.jsxs)("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-0.5 text-xs font-medium rounded-full ${E.bg} ${E.text}`,children:[(0,t.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${E.dot}`}),q.status.charAt(0).toUpperCase()+q.status.slice(1)]})]}),(0,t.jsx)("p",{className:"text-sm text-gray-500 ml-8",children:q.description})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("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.provider}),(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(d.SettingOutlined,{}),onClick:()=>j(!0),title:"Evaluation settings"})]})]})]}),(0,t.jsx)(g.Tabs,{activeKey:b,onChange:v,items:[{key:"overview",label:"Overview"},{key:"logs",label:"Logs"}]}),"overview"===b&&(0,t.jsxs)("div",{className:"space-y-6 mt-4",children:[(0,t.jsxs)(x.Row,{gutter:[16,16],children:[(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Requests Evaluated",value:q.requestsEvaluated.toLocaleString()})}),(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Fail Rate",value:`${q.failRate}%`,valueColor:q.failRate>15?"text-red-600":q.failRate>5?"text-amber-600":"text-green-600",subtitle:`${Math.round(q.requestsEvaluated*q.failRate/100).toLocaleString()} blocked`,icon:q.failRate>15?(0,t.jsx)(n.WarningOutlined,{className:"text-red-400"}):void 0})}),(0,t.jsx)(u.Col,{xs:12,md:8,children:(0,t.jsx)(k.MetricCard,{label:"Avg. latency added",value:null!=q.avgLatency?`${Math.round(q.avgLatency)}ms`:"—",valueColor:null!=q.avgLatency?q.avgLatency>150?"text-red-600":q.avgLatency>50?"text-amber-600":"text-green-600":"text-gray-500",subtitle:null!=q.avgLatency?"Per request (avg)":"No data"})})]}),(0,t.jsx)(w.LogViewer,{guardrailName:q.name,filterAction:"all",logs:T,logsLoading:O,totalLogs:R?.total??0,accessToken:f,startDate:h,endDate:p})]}),"logs"===b&&(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(w.LogViewer,{guardrailName:q.name,logs:T,logsLoading:O,totalLogs:R?.total??0,accessToken:f,startDate:h,endDate:p})}),(0,t.jsx)(C,{open:y,onClose:()=>j(!1),guardrailName:q.name,accessToken:f})]})}var M=e.i(737434);e.i(247167);var Y=e.i(931067);let S={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M917 211.1l-199.2 24c-6.6.8-9.4 8.9-4.7 13.6l59.3 59.3-226 226-101.8-101.7c-6.3-6.3-16.4-6.2-22.6 0L100.3 754.1a8.03 8.03 0 000 11.3l45 45.2c3.1 3.1 8.2 3.1 11.3 0L433.3 534 535 635.7c6.3 6.2 16.4 6.2 22.6 0L829 364.5l59.3 59.3a8.01 8.01 0 0013.6-4.7l24-199.2c.7-5.1-3.7-9.5-8.9-8.8z"}}]},name:"rise",theme:"outlined"};var R=e.i(9583),O=a.forwardRef(function(e,t){return a.createElement(R.default,(0,Y.default)({},e,{ref:t,icon:S}))}),T=e.i(175712),q=e.i(291542),E=e.i(898586);e.i(32117);var B=e.i(343053),V=e.i(515288);function $({data:e}){let a=e&&e.length>0?e:[];return(0,t.jsxs)(V.Card,{children:[(0,t.jsx)(V.CardHeader,{children:(0,t.jsx)(V.CardTitle,{className:"text-base font-semibold",children:"Request Outcomes Over Time"})}),(0,t.jsx)(V.CardContent,{children:(0,t.jsx)("div",{className:"h-80 min-h-[280px]",children:a.length>0?(0,t.jsx)(B.BarChart,{data:a,index:"date",categories:["passed","blocked"],colors:["green","red"],valueFormatter:e=>e.toLocaleString(),yAxisWidth:48,showLegend:!0,stack:!0,className:"h-full"}):(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-sm text-gray-500",children:"No chart data for this period"})})})]})}let A={Bedrock:"bg-orange-100 text-orange-700 border-orange-200","Google Cloud":"bg-sky-100 text-sky-700 border-sky-200",LiteLLM:"bg-indigo-100 text-indigo-700 border-indigo-200",Custom:"bg-gray-100 text-gray-600 border-gray-200"};function _({accessToken:e=null,startDate:r,endDate:l,onSelectGuardrail:g}){let[f,h]=(0,a.useState)("failRate"),[p,b]=(0,a.useState)("desc"),[v,y]=(0,a.useState)(!1),{data:j,isLoading:N,error:w}=(0,o.useQuery)({queryKey:["guardrails-usage-overview",r,l],queryFn:()=>(0,s.getGuardrailsUsageOverview)(e,r,l),enabled:!!e}),L=j?.rows??[],D=(0,a.useMemo)(()=>{let e,t,a,s;return j?{totalRequests:j.totalRequests??0,totalBlocked:j.totalBlocked??0,passRate:String(j.passRate??0),avgLatency:L.length?Math.round(L.reduce((e,t)=>e+(t.avgLatency??0),0)/L.length):0,count:L.length}:(e=L.reduce((e,t)=>e+t.requestsEvaluated,0),t=L.reduce((e,t)=>e+Math.round(t.requestsEvaluated*t.failRate/100),0),a=e>0?((1-t/e)*100).toFixed(1):"0",{totalRequests:e,totalBlocked:t,passRate:a,avgLatency:(s=L.filter(e=>null!=e.avgLatency)).length>0?Math.round(s.reduce((e,t)=>e+(t.avgLatency??0),0)/s.length):0,count:L.length})},[j,L]),Y=j?.chart,S=(0,a.useMemo)(()=>[...L].sort((e,t)=>{let a="desc"===p?-1:1,s=e[f]??0,r=t[f]??0;return(Number(s)-Number(r))*a}),[L,f,p]),R=[{title:"Guardrail",dataIndex:"name",key:"name",render:(e,a)=>(0,t.jsx)("button",{type:"button",className:"text-sm font-medium text-gray-900 hover:text-indigo-600 text-left",onClick:()=>g(a.id),children:e})},{title:"Provider",dataIndex:"provider",key:"provider",render:e=>(0,t.jsx)("span",{className:`inline-flex items-center px-2 py-0.5 text-xs font-medium rounded border ${A[e]??A.Custom}`,children:e})},{title:"Requests",dataIndex:"requestsEvaluated",key:"requestsEvaluated",align:"right",sorter:!0,sortOrder:"requestsEvaluated"===f?"desc"===p?"descend":"ascend":null,render:e=>e.toLocaleString()},{title:"Fail Rate",dataIndex:"failRate",key:"failRate",align:"right",sorter:!0,sortOrder:"failRate"===f?"desc"===p?"descend":"ascend":null,render:(e,a)=>(0,t.jsxs)("span",{className:e>15?"text-red-600":e>5?"text-amber-600":"text-green-600",children:[e,"%","up"===a.trend&&(0,t.jsx)("span",{className:"ml-1 text-xs text-red-400",children:"↑"}),"down"===a.trend&&(0,t.jsx)("span",{className:"ml-1 text-xs text-green-400",children:"↓"})]})},{title:"Avg. latency added",dataIndex:"avgLatency",key:"avgLatency",align:"right",sorter:!0,sortOrder:"avgLatency"===f?"desc"===p?"descend":"ascend":null,render:e=>(0,t.jsx)("span",{className:null==e?"text-gray-400":e>150?"text-red-600":e>50?"text-amber-600":"text-green-600",children:null!=e?`${e}ms`:"—"})},{title:"Status",dataIndex:"status",key:"status",align:"center",render:e=>(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,t.jsx)("span",{className:`w-2 h-2 rounded-full ${"healthy"===e?"bg-green-500":"warning"===e?"bg-amber-500":"bg-red-500"}`}),(0,t.jsx)("span",{className:"text-xs text-gray-600 capitalize",children:e})]})}],B=["failRate","requestsEvaluated","avgLatency"];return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-start justify-between mb-5",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,t.jsx)(i.SafetyOutlined,{className:"text-lg text-indigo-500"}),(0,t.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:"Guardrails Monitor"})]}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Monitor guardrail performance across all requests"})]}),(0,t.jsx)("div",{className:"flex items-center gap-3",children:(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(M.DownloadOutlined,{}),title:"Coming soon",children:"Export Data"})})]}),(0,t.jsxs)(x.Row,{gutter:[16,16],className:"mb-6",children:[(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Total Evaluations",value:D.totalRequests.toLocaleString()})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Blocked Requests",value:D.totalBlocked.toLocaleString(),valueColor:"text-red-600",icon:(0,t.jsx)(n.WarningOutlined,{className:"text-red-400"})})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Pass Rate",value:`${D.passRate}%`,valueColor:"text-green-600",icon:(0,t.jsx)(O,{className:"text-green-400"})})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Avg. latency added",value:`${D.avgLatency}ms`,valueColor:D.avgLatency>150?"text-red-600":D.avgLatency>50?"text-amber-600":"text-green-600"})}),(0,t.jsx)(u.Col,{xs:12,sm:12,md:8,flex:"1 0 20%",children:(0,t.jsx)(k.MetricCard,{label:"Active Guardrails",value:D.count})})]}),(0,t.jsx)("div",{className:"mb-6",children:(0,t.jsx)($,{data:Y})}),(0,t.jsxs)(T.Card,{className:"border border-gray-200 rounded-lg bg-white",styles:{body:{padding:0}},children:[(N||w)&&(0,t.jsxs)("div",{className:"px-6 py-4 border-b border-gray-200 flex items-center gap-2",children:[N&&(0,t.jsx)(m.Spin,{size:"small"}),w&&(0,t.jsx)("span",{className:"text-sm text-red-600",children:"Failed to load data. Try again."})]}),(0,t.jsxs)("div",{className:"px-6 py-4 border-b border-gray-200 flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(E.Typography.Title,{level:5,className:"mb-0! text-gray-900",children:"Guardrail Performance"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:"Click a guardrail to view details, logs, and configuration"})]}),(0,t.jsx)("div",{className:"flex items-center gap-2",children:(0,t.jsx)(c.Button,{type:"default",icon:(0,t.jsx)(d.SettingOutlined,{}),onClick:()=>y(!0),title:"Evaluation settings"})})]}),(0,t.jsx)(q.Table,{columns:R,dataSource:S,rowKey:"id",pagination:!1,loading:N,onChange:(e,t,a)=>{a?.field&&B.includes(a.field)&&(h(a.field),b("ascend"===a.order?"asc":"desc"))},locale:0!==L.length||N?void 0:{emptyText:"No data for this period"},onRow:e=>({onClick:()=>g(e.id),style:{cursor:"pointer"}})})]}),(0,t.jsx)(C,{open:v,onClose:()=>y(!1),accessToken:e})]})}let z=new Date,H=new Date;function I({accessToken:e=null}){let[l,i]=(0,a.useState)({type:"overview"}),d=(0,a.useMemo)(()=>new Date(H),[]),n=(0,a.useMemo)(()=>new Date(z),[]),[o,c]=(0,a.useState)({from:d,to:n}),u=o.from?(0,s.formatDate)(o.from):"",x=o.to?(0,s.formatDate)(o.to):"",m=(0,a.useCallback)(e=>{c(e)},[]);return(0,t.jsxs)("div",{className:"p-6 w-full min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"flex items-center justify-end mb-4",children:(0,t.jsx)(r.default,{value:o,onValueChange:m,label:"",showTimeRange:!1})}),"overview"===l.type?(0,t.jsx)(_,{accessToken:e,startDate:u,endDate:x,onSelectGuardrail:e=>{i({type:"detail",guardrailId:e})}}):(0,t.jsx)(D,{guardrailId:l.guardrailId,onBack:()=>{i({type:"overview"})},accessToken:e,startDate:u,endDate:x})]})}H.setDate(H.getDate()-7);var F=e.i(135214);e.s(["default",0,function(){let{accessToken:e}=(0,F.default)();return(0,t.jsx)(I,{accessToken:e})}],55004)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0eh5r_mh1kh_t.js b/litellm/proxy/_experimental/out/_next/static/chunks/0eh5r_mh1kh_t.js new file mode 100644 index 00000000000..b67e4c55e76 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0eh5r_mh1kh_t.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,400157,e=>{"use strict";var t,r=e.i(843476),s=e.i(271645),o=e.i(16715),a=e.i(602869),l=e.i(332102);e.i(707701);var i=e.i(807235),n=e.i(174886),c=e.i(541071),d=e.i(788699),m=e.i(727612),u=e.i(494862);e.i(622826);var x=e.i(581070),h=e.i(200208),p=e.i(997422),g=e.i(916925),v=e.i(519455),j=e.i(755146),f=e.i(115504),b=e.i(500330);function y({provider:e}){let{displayName:t,logo:s}=(0,g.getProviderLogoAndName)(e);return(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[s?(0,r.jsx)("img",{src:s,alt:"",className:"size-4 shrink-0",onError:e=>{e.currentTarget.style.display="none"}}):null,(0,r.jsx)("span",{className:"truncate text-sm",children:t})]})}function _({vectorStore:e}){let t=e.vector_store_metadata?.ingested_files||[];if(0===t.length)return(0,r.jsx)("span",{className:"text-sm text-muted-foreground",children:"-"});let s=t.map(e=>e.filename||e.file_url||"Unknown").join(", "),o=1===t.length?t[0].filename||t[0].file_url||"1 file":`${t.length} files`;return(0,r.jsx)(x.CellTooltip,{content:s,trigger:(0,r.jsx)("span",{className:"block max-w-60 truncate text-sm text-primary",children:o})})}function S({vectorStore:e,onEdit:t,onDelete:s}){return(0,r.jsxs)(j.DropdownMenu,{children:[(0,r.jsx)(j.DropdownMenuTrigger,{"aria-label":"Open vector store actions","data-testid":`vector-store-actions-${e.vector_store_id}`,className:(0,f.cn)((0,v.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,r.jsx)(c.MoreHorizontal,{className:"size-4"})}),(0,r.jsxs)(j.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,r.jsxs)(j.DropdownMenuItem,{"data-testid":"vector-store-action-edit",onClick:()=>t(e.vector_store_id),children:[(0,r.jsx)(d.Pencil,{}),"Edit"]}),(0,r.jsxs)(j.DropdownMenuItem,{"data-testid":"vector-store-action-copy",onClick:()=>void(0,b.copyToClipboard)(e.vector_store_id,"Vector store ID copied"),children:[(0,r.jsx)(n.Copy,{}),"Copy vector store ID"]}),(0,r.jsx)(j.DropdownMenuSeparator,{}),(0,r.jsxs)(j.DropdownMenuItem,{variant:"destructive","data-testid":"vector-store-action-delete",onClick:()=>s(e.vector_store_id),children:[(0,r.jsx)(m.Trash2,{}),"Delete"]})]})]})}let N=[{id:"created_at",desc:!0}];function I(){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)(l.Inbox,{className:"size-5 text-muted-foreground"})}),(0,r.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No vector stores"}),(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Connect a vector store to enable retrieval-augmented generation."})]})}let w=({data:e,onView:t,onEdit:o,onDelete:a,isLoading:l=!1})=>{let[n,c]=(0,s.useState)(N),d=(0,s.useMemo)(()=>(({onView:e,onEdit:t,onDelete:s})=>[{id:"vector_store_id",accessorKey:"vector_store_id",meta:{title:"Vector Store ID"},header:({column:e})=>(0,r.jsx)(u.DataTableSortHeader,{column:e,title:"Vector Store ID"}),size:220,enableSorting:!0,cell:({row:t})=>(0,r.jsx)(p.IdentityCell,{title:t.original.vector_store_id,titleClassName:"font-mono text-xs font-normal",className:"max-w-60",onClick:()=>e(t.original.vector_store_id)})},{id:"vector_store_name",accessorKey:"vector_store_name",meta:{title:"Name"},header:({column:e})=>(0,r.jsx)(u.DataTableSortHeader,{column:e,title:"Name"}),size:200,enableSorting:!0,cell:({row:e})=>{let t=e.original.vector_store_name;return(0,r.jsx)("span",{className:"block max-w-60 truncate text-sm font-medium",title:t??void 0,children:t||"-"})}},{id:"vector_store_description",accessorKey:"vector_store_description",meta:{title:"Description"},header:"Description",size:280,enableSorting:!1,cell:({row:e})=>{let t=e.original.vector_store_description;return(0,r.jsx)("span",{className:"block max-w-72 truncate text-sm text-muted-foreground",title:t??void 0,children:t||"-"})}},{id:"files",meta:{title:"Files"},header:"Files",size:160,enableSorting:!1,cell:({row:e})=>(0,r.jsx)(_,{vectorStore:e.original})},{id:"provider",accessorKey:"custom_llm_provider",meta:{title:"Provider"},header:"Provider",size:160,enableSorting:!1,cell:({row:e})=>(0,r.jsx)(y,{provider:e.original.custom_llm_provider})},{id:"created_at",accessorKey:"created_at",sortingFn:"datetime",meta:{title:"Created At"},header:({column:e})=>(0,r.jsx)(u.DataTableSortHeader,{column:e,title:"Created At"}),size:150,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(h.DateCell,{value:e.original.created_at,precision:"date"})},{id:"updated_at",accessorKey:"updated_at",sortingFn:"datetime",meta:{title:"Updated At"},header:({column:e})=>(0,r.jsx)(u.DataTableSortHeader,{column:e,title:"Updated At"}),size:150,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(h.DateCell,{value:e.original.updated_at,precision:"date"})},{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)(S,{vectorStore:e.original,onEdit:t,onDelete:s})})}])({onView:t,onEdit:o,onDelete:a}),[t,o,a]);return(0,r.jsx)(i.DataTable,{data:e,columns:d,getRowId:(e,t)=>e.vector_store_id||String(t),sortingMode:"client",sorting:n,onSortingChange:c,isLoading:l,loadingMessage:"Loading vector stores…",noDataMessage:(0,r.jsx)(I,{}),size:"compact"})};var C=e.i(779241),A=e.i(994388),T=e.i(212931),k=e.i(808613),D=e.i(199133),L=e.i(592968),V=e.i(311451),z=e.i(560445),E=e.i(827252);let O={src:e.i(338684).default,width:2378,height:2405,blurWidth:0,blurHeight:0};var P=e.i(284629);let M={src:e.i(832316).default,width:342,height:418,blurWidth:7,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAIAAAC6ZnJRAAAAu0lEQVR42gGwAE//APHw8e/l5vDZ3fDV2+/d4vDs7vn5+QDlysv0mZ71g5L1e5Pzf53tqr7s6esA7sfG9YeH8YCI6nqL8nKO8Zev8/DxAO/T0fuNh/mAge54gu1ug+uisurq6gDu3tz7l4v7hX37f4D1eoTlt77x8fEA8Ojn+qSV+4p694qA7ri66+Tn8PHxAPb19fDa1fPGvu7DvfPr7vPv9evs7QD+/v78/Pz5+fnv7+/s6+vw7O7o6OkZf4k6Qh5n1wAAAABJRU5ErkJggg=="};var F=((t={}).Bedrock="Amazon Bedrock",t.S3Vectors="Amazon S3 Vectors",t.PgVector="PostgreSQL pgvector (LiteLLM Connector)",t.VertexRagEngine="Vertex AI RAG Engine",t.VertexAiSearch="Vertex AI Search",t.OpenAI="OpenAI",t.Azure="Azure OpenAI",t.Milvus="Milvus",t);let B={Bedrock:"bedrock",PgVector:"pg_vector",VertexRagEngine:"vertex_ai",VertexAiSearch:"vertex_ai/search_api",OpenAI:"openai",Azure:"azure",Milvus:"milvus",S3Vectors:"s3_vectors"},q={"Amazon Bedrock":g.providerLogoMap[g.Providers.Bedrock]??"","PostgreSQL pgvector (LiteLLM Connector)":P.default.src,"Vertex AI RAG Engine":g.providerLogoMap[g.Providers.Vertex_AI]??"","Vertex AI Search":g.providerLogoMap[g.Providers.Vertex_AI]??"",OpenAI:g.providerLogoMap[g.Providers.OpenAI]??"","Azure OpenAI":g.providerLogoMap[g.Providers.Azure]??"",Milvus:O.src,"Amazon S3 Vectors":M.src},R={bedrock:[],pg_vector:[{name:"api_base",label:"API Base",tooltip:"Enter the base URL of your deployed litellm-pgvector server (e.g., http://your-server:8000)",placeholder:"http://your-deployed-server:8000",required:!0,type:"text"},{name:"api_key",label:"API Key",tooltip:"Enter the API key from your deployed litellm-pgvector server",placeholder:"your-deployed-api-key",required:!0,type:"password"}],vertex_rag_engine:[],"vertex_ai/search_api":[{name:"vertex_project",label:"Vertex Project",tooltip:"Google Cloud project ID that hosts the Vertex AI Search data store.",placeholder:"my-gcp-project-id",required:!0,type:"text"},{name:"vertex_location",label:"Vertex Location",tooltip:"Vertex AI Search data store location. Must be one of global, us, or eu.",required:!0,type:"select",options:[{value:"global",label:"global"},{value:"us",label:"us"},{value:"eu",label:"eu"}],initialValue:"global"},{name:"vertex_collection_id",label:"Collection ID (optional)",tooltip:"Discovery Engine collection ID. Leave blank to use the default collection.",placeholder:"e.g. my-custom-collection",required:!1,type:"text"},{name:"vertex_engine_id",label:"Engine ID (optional)",tooltip:"Search app (engine) ID. Required for website, healthcare, and connector-based data stores (Workspace, Slack, Jira, etc.) because these sources route search through an engine. Leave blank to query the data store directly.",placeholder:"e.g. my-search-app_1234567890",required:!1,type:"text"}],openai:[{name:"api_key",label:"API Key",tooltip:"Enter your OpenAI API key",placeholder:"sk-...",required:!0,type:"password"}],azure:[{name:"api_key",label:"API Key",tooltip:"Enter your Azure OpenAI API key",placeholder:"your-azure-api-key",required:!0,type:"password"},{name:"api_base",label:"API Base",tooltip:"Enter your Azure OpenAI endpoint (e.g., https://your-resource.openai.azure.com/)",placeholder:"https://your-resource.openai.azure.com/",required:!0,type:"text"}],milvus:[{name:"api_key",label:"API Key",tooltip:"To obtain a token, you should use a colon (:) to concatenate the username and password that you use to access your Milvus instance (e.g., username:password)",placeholder:"username:password or api key",required:!0,type:"password"},{name:"api_base",label:"API Base",tooltip:"Enter your Milvus endpoint (e.g., https://your-milvus-endpoint.com/)",placeholder:"https://your-milvus-endpoint.com/",required:!0,type:"text"},{name:"embedding_model",label:"Embedding Model",tooltip:"Select the embedding model to use",placeholder:"text-embedding-3-small",required:!0,type:"select"}],s3_vectors:[{name:"vector_bucket_name",label:"Vector Bucket Name",tooltip:"S3 bucket name for vector storage (will be auto-created if it doesn't exist)",placeholder:"my-vector-bucket",required:!0,type:"text"},{name:"index_name",label:"Index Name",tooltip:"Name for the vector index (optional, will be auto-generated if not provided)",placeholder:"my-vector-index",required:!1,type:"text"},{name:"aws_region_name",label:"AWS Region",tooltip:"AWS region where the S3 bucket is located (e.g., us-west-2)",placeholder:"us-west-2",required:!0,type:"text"},{name:"embedding_model",label:"Embedding Model",tooltip:"Select the embedding model to use for vector generation",placeholder:"text-embedding-3-small",required:!0,type:"select"}]},U=e=>R[e]||[];var G=e.i(174553),K=e.i(695411),$=e.i(727749);let H=({isVisible:e,onCancel:t,onSuccess:o,accessToken:l,credentials:i})=>{let[n]=k.Form.useForm(),[c,d]=(0,s.useState)("{}"),[m,u]=(0,s.useState)("bedrock"),[x,h]=(0,s.useState)([]),p=k.Form.useWatch("vertex_engine_id",n);(0,s.useEffect)(()=>{l&&(async()=>{try{let e=await (0,K.fetchAvailableModels)(l);e.length>0&&h(e)}catch(e){console.error("Error fetching model info:",e)}})()},[l]);let g=async e=>{if(l)try{let t={};try{t=c.trim()?JSON.parse(c):{}}catch(e){$.default.fromBackend("Invalid JSON in metadata field");return}let r={vector_store_id:e.vector_store_id,custom_llm_provider:e.custom_llm_provider,vector_store_name:e.vector_store_name,vector_store_description:e.vector_store_description,vector_store_metadata:t,litellm_credential_name:e.litellm_credential_name};r.litellm_params=U(e.custom_llm_provider).reduce((t,r)=>("milvus"===e.custom_llm_provider&&"embedding_model"===r.name?t.litellm_embedding_model=e[r.name]:t[r.name]=e[r.name],t),{}),await (0,a.vectorStoreCreateCall)(l,r),$.default.success("Vector store created successfully"),n.resetFields(),d("{}"),o()}catch(e){console.error("Error creating vector store:",e),$.default.fromBackend("Error creating vector store: "+e)}},v=()=>{n.resetFields(),d("{}"),u("bedrock"),t()};return(0,r.jsx)(T.Modal,{title:"Add New Vector Store",open:e,width:1e3,footer:null,onCancel:v,children:(0,r.jsxs)(k.Form,{form:n,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Provider"," ",(0,r.jsx)(L.Tooltip,{title:"Select the provider for this vector store",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"custom_llm_provider",rules:[{required:!0,message:"Please select a provider"}],initialValue:"bedrock",children:(0,r.jsx)(D.Select,{onChange:e=>u(e),children:Object.entries(F).map(([e,t])=>(0,r.jsx)(D.Select.Option,{value:B[e],children:(0,r.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,r.jsx)(G.Logo,{src:q[t],label:t,className:"w-5 h-5"}),(0,r.jsx)("span",{children:t})]})},e))})}),"pg_vector"===m&&(0,r.jsx)(z.Alert,{message:"PG Vector Setup Required",description:(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"LiteLLM provides a server to connect to PG Vector. To use this provider:"}),(0,r.jsxs)("ol",{style:{marginLeft:"16px",marginTop:"8px"},children:[(0,r.jsxs)("li",{children:["Deploy the litellm-pgvector server from:"," ",(0,r.jsx)("a",{href:"https://github.com/BerriAI/litellm-pgvector",target:"_blank",rel:"noopener noreferrer",children:"https://github.com/BerriAI/litellm-pgvector"})]}),(0,r.jsx)("li",{children:"Configure your PostgreSQL database with pgvector extension"}),(0,r.jsx)("li",{children:"Start the server and note the API base URL and API key"}),(0,r.jsx)("li",{children:"Enter those details in the fields below"})]})]}),type:"info",showIcon:!0,style:{marginBottom:"16px"}}),"vertex_rag_engine"===m&&(0,r.jsx)(z.Alert,{message:"Vertex AI RAG Engine Setup",description:(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"To use Vertex AI RAG Engine:"}),(0,r.jsx)("p",{style:{marginTop:"4px",fontStyle:"italic"},children:'Note: Google Cloud has renamed this to "RAG Engine" in its console — the steps below still apply.'}),(0,r.jsxs)("ol",{style:{marginLeft:"16px",marginTop:"8px"},children:[(0,r.jsxs)("li",{children:["Set up your Vertex AI RAG Engine corpus following the guide:"," ",(0,r.jsx)("a",{href:"https://cloud.google.com/vertex-ai/generative-ai/docs/rag-engine/rag-overview",target:"_blank",rel:"noopener noreferrer",children:"Vertex AI RAG Engine Overview"})]}),(0,r.jsx)("li",{children:"Create a corpus in your Google Cloud project"}),(0,r.jsx)("li",{children:'Note the corpus ID from the Vertex AI console (now labeled "RAG Engine" in Google Cloud)'}),(0,r.jsx)("li",{children:"Enter the corpus ID in the Vector Store ID field below"})]})]}),type:"info",showIcon:!0,style:{marginBottom:"16px"}}),"vertex_ai/search_api"===m&&(0,r.jsx)(z.Alert,{message:"Vertex AI Search Setup",description:(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"To use Vertex AI Search (Discovery Engine):"}),(0,r.jsx)("p",{style:{marginTop:"4px",fontStyle:"italic"},children:'Note: Google Cloud has renamed this to "Agent Search" in its console — the steps below still apply.'}),(0,r.jsxs)("ol",{style:{marginLeft:"16px",marginTop:"8px"},children:[(0,r.jsxs)("li",{children:["Enable the Discovery Engine API on your Google Cloud project and create a data store following the guide:"," ",(0,r.jsx)("a",{href:"https://cloud.google.com/generative-ai-app-builder/docs/create-data-store-es",target:"_blank",rel:"noopener noreferrer",style:{textDecoration:"underline"},children:"Create a Vertex AI Search data store"})]}),(0,r.jsx)("li",{children:"Pick a supported location: global, us, or eu"}),(0,r.jsx)("li",{children:"For most data store types (Cloud Storage, BigQuery, Media): copy the data store ID and enter it in the Vector Store ID field below."}),(0,r.jsxs)("li",{children:["For website, healthcare, and connector-based sources (Drive, Gmail, Slack, Jira, etc.): create a search app on top of the data store, then copy the ",(0,r.jsx)("strong",{children:"Engine ID"})," and enter it in the Engine ID field. The Vector Store ID is still required as the LiteLLM-side name for this record, but it isn't used in the GCP URL when Engine ID is set."]})]})]}),type:"info",showIcon:!0,style:{marginBottom:"16px"}}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Vector Store ID"," ",(0,r.jsx)(L.Tooltip,{title:"Enter the vector store ID from your api provider",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"vector_store_id",rules:[{required:!0,message:"Please input the vector store ID from your api provider"}],children:(0,r.jsx)(C.TextInput,{placeholder:"vertex_rag_engine"===m?'6917529027641081856 (corpus ID from Vertex AI / "RAG Engine" console)':"vertex_ai/search_api"===m?p?"Any identifier you'll use to reference this in LiteLLM":'my-datastore_1234567890 (data store ID from Vertex AI / "Agent Search" console)':"Enter vector store ID from your provider"})}),U(m).map(e=>{if("select"===e.type){let t=e.options??x.filter(e=>"embedding"===e.mode||null===e.mode).map(e=>({value:e.model_group,label:e.model_group}));return(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:[e.label," ",(0,r.jsx)(L.Tooltip,{title:e.tooltip,children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:e.name,initialValue:e.initialValue,rules:e.required?[{required:!0,message:`Please select the ${e.label.toLowerCase()}`}]:[],children:(0,r.jsx)(D.Select,{placeholder:e.placeholder,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:t,style:{width:"100%"}})},e.name)}return(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:[e.label," ",(0,r.jsx)(L.Tooltip,{title:e.tooltip,children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:e.name,rules:e.required?[{required:!0,message:`Please input the ${e.label.toLowerCase()}`}]:[],children:(0,r.jsx)(C.TextInput,{type:e.type||"text",placeholder:e.placeholder})},e.name)}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Vector Store Name"," ",(0,r.jsx)(L.Tooltip,{title:"Custom name you want to give to the vector store, this name will be rendered on the LiteLLM UI",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"vector_store_name",children:(0,r.jsx)(C.TextInput,{})}),(0,r.jsx)(k.Form.Item,{label:"Description",name:"vector_store_description",children:(0,r.jsx)(V.Input.TextArea,{rows:4})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Existing Credentials"," ",(0,r.jsx)(L.Tooltip,{title:"Optionally select API provider credentials for this vector store eg. Bedrock API KEY",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"litellm_credential_name",children:(0,r.jsx)(D.Select,{showSearch:!0,placeholder:"Select or search for existing credentials",optionFilterProp:"children",filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:[{value:null,label:"None"},...i.map(e=>({value:e.credential_name,label:e.credential_name}))],allowClear:!0})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Metadata"," ",(0,r.jsx)(L.Tooltip,{title:"JSON metadata for the vector store (optional)",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,r.jsx)(V.Input.TextArea,{rows:4,value:c,onChange:e=>d(e.target.value),placeholder:'{"key": "value"}'})}),(0,r.jsxs)("div",{className:"flex justify-end space-x-3",children:[(0,r.jsx)(A.Button,{onClick:v,variant:"secondary",children:"Cancel"}),(0,r.jsx)(A.Button,{variant:"primary",type:"submit",children:"Create"})]})]})})};var J=e.i(127952),W=e.i(304967),Q=e.i(599724),X=e.i(629569),Z=e.i(389083),Y=e.i(653824),ee=e.i(881073),et=e.i(197647),er=e.i(723731),es=e.i(404206),eo=e.i(464571),ea=e.i(530212),el=e.i(888259),ei=e.i(664659),en=e.i(463059),ec=e.i(658041),ed=e.i(514764),em=e.i(515288),eu=e.i(772436),ex=e.i(624687),eh=e.i(571303);let ep=({vectorStoreId:e,accessToken:t,className:o=""})=>{let[l,i]=(0,s.useState)(""),[n,c]=(0,s.useState)(!1),[d,m]=(0,s.useState)([]),[u,x]=(0,s.useState)({}),h=async()=>{if(!l.trim())return void el.default.warning("Please enter a search query");c(!0);try{let r=await (0,a.vectorStoreSearchCall)(t,e,l),s={query:l,response:r,timestamp:Date.now()};m(e=>[s,...e]),i("")}catch(e){console.error("Error searching vector store:",e),$.default.fromBackend("Failed to search vector store")}finally{c(!1)}};return(0,r.jsx)(em.Card,{className:`w-full py-0 shadow-md ${o}`,children:(0,r.jsxs)("div",{className:"flex h-150 flex-col",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between border-b p-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(ec.Database,{className:"mr-2 size-4 text-primary"}),(0,r.jsx)("h4",{className:"text-base font-medium text-foreground",children:"Test Vector Store"})]}),d.length>0&&(0,r.jsx)(v.Button,{variant:"outline",size:"sm",onClick:()=>{m([]),x({}),$.default.success("Search history cleared")},children:"Clear History"})]}),(0,r.jsxs)("div",{className:"flex-1 overflow-auto p-4 pb-0",children:[0===d.length?(0,r.jsxs)("div",{className:"flex h-full flex-col items-center justify-center text-muted-foreground",children:[(0,r.jsx)(ec.Database,{className:"mb-4 size-12"}),(0,r.jsx)("p",{className:"text-sm",children:"Test your vector store by entering a search query below"})]}):(0,r.jsx)("div",{className:"space-y-4",children:d.map((e,t)=>(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("div",{className:"text-right",children:(0,r.jsxs)("div",{className:"inline-block max-w-[80%] rounded-lg bg-muted p-3 shadow-xs ring-1 ring-foreground/10",children:[(0,r.jsxs)("div",{className:"mb-1 flex items-center gap-2",children:[(0,r.jsx)("strong",{className:"text-sm",children:"Query"}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:new Date(e.timestamp).toLocaleString()})]}),(0,r.jsx)("div",{className:"text-left",children:e.query})]})}),(0,r.jsx)("div",{className:"text-left",children:(0,r.jsxs)("div",{className:"inline-block max-w-[80%] rounded-lg bg-card p-3 shadow-xs ring-1 ring-foreground/10",children:[(0,r.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,r.jsx)(ec.Database,{className:"size-4 text-primary"}),(0,r.jsx)("strong",{className:"text-sm",children:"Vector Store Results"}),e.response&&(0,r.jsxs)("span",{className:"rounded-sm bg-muted px-2 py-0.5 text-xs text-muted-foreground",children:[e.response.data?.length||0," results"]})]}),e.response&&e.response.data&&e.response.data.length>0?(0,r.jsx)("div",{className:"space-y-3",children:e.response.data.map((e,s)=>{let o=u[`${t}-${s}`]||!1;return(0,r.jsxs)("div",{className:"overflow-hidden rounded-lg border bg-muted/50",children:[(0,r.jsxs)("div",{className:"flex cursor-pointer items-center justify-between p-3 transition-colors hover:bg-muted",onClick:()=>{let e;return e=`${t}-${s}`,void x(t=>({...t,[e]:!t[e]}))},children:[(0,r.jsxs)("div",{className:"flex items-center",children:[o?(0,r.jsx)(ei.ChevronDown,{className:"mr-2 size-4 text-muted-foreground"}):(0,r.jsx)(en.ChevronRight,{className:"mr-2 size-4 text-muted-foreground"}),(0,r.jsxs)("span",{className:"text-sm font-medium",children:["Result ",s+1]}),!o&&e.content&&e.content[0]&&(0,r.jsxs)("span",{className:"ml-2 max-w-md truncate text-xs text-muted-foreground",children:["- ",e.content[0].text.substring(0,100),"..."]})]}),(0,r.jsxs)("span",{className:"rounded-sm bg-muted px-2 py-1 text-xs text-foreground",children:["Score: ",e.score.toFixed(4)]})]}),o&&(0,r.jsxs)("div",{className:"border-t bg-card p-3",children:[e.content&&e.content.map((e,t)=>(0,r.jsxs)("div",{className:"mb-3",children:[(0,r.jsxs)("div",{className:"mb-1 text-xs text-muted-foreground",children:["Content (",e.type,")"]}),(0,r.jsx)("div",{className:"max-h-40 overflow-y-auto rounded-sm border bg-muted/50 p-3 text-sm text-foreground",children:e.text})]},t)),(e.file_id||e.filename||e.attributes)&&(0,r.jsxs)("div",{className:"mt-3 border-t pt-3",children:[(0,r.jsx)("div",{className:"mb-2 text-xs font-medium text-muted-foreground",children:"Metadata"}),(0,r.jsxs)("div",{className:"space-y-2 text-xs",children:[e.file_id&&(0,r.jsxs)("div",{className:"rounded-sm bg-muted/50 p-2",children:[(0,r.jsx)("span",{className:"font-medium",children:"File ID:"})," ",e.file_id]}),e.filename&&(0,r.jsxs)("div",{className:"rounded-sm bg-muted/50 p-2",children:[(0,r.jsx)("span",{className:"font-medium",children:"Filename:"})," ",e.filename]}),e.attributes&&Object.keys(e.attributes).length>0&&(0,r.jsxs)("div",{className:"rounded-sm bg-muted/50 p-2",children:[(0,r.jsx)("span",{className:"mb-1 block font-medium",children:"Attributes:"}),(0,r.jsx)("pre",{className:"overflow-x-auto rounded-sm border bg-card p-2 text-xs",children:JSON.stringify(e.attributes,null,2)})]})]})]})]})]},s)})}):(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"No results found"})]})}),ti(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),h())},placeholder:"Enter your search query... (Shift+Enter for new line)",disabled:n,rows:1,className:"field-sizing-fixed max-h-24 min-h-9 resize-none"})}),(0,r.jsxs)(v.Button,{onClick:h,disabled:n||!l.trim(),children:[n?(0,r.jsx)(eh.UiLoadingSpinner,{className:"size-4"}):(0,r.jsx)(ed.Send,{className:"size-4"}),"Search"]})]})})]})})},eg=({vectorStoreId:e,onClose:t,accessToken:o,is_admin:l,editVectorStore:i})=>{let[n]=k.Form.useForm(),[c,d]=(0,s.useState)(null),[m,u]=(0,s.useState)(i),[x,h]=(0,s.useState)("{}"),[p,v]=(0,s.useState)([]),j=async()=>{if(o)try{let t=await (0,a.vectorStoreInfoCall)(o,e);if(t&&t.vector_store){if(d(t.vector_store),t.vector_store.vector_store_metadata){let e="string"==typeof t.vector_store.vector_store_metadata?JSON.parse(t.vector_store.vector_store_metadata):t.vector_store.vector_store_metadata;h(JSON.stringify(e,null,2))}i&&n.setFieldsValue({vector_store_id:t.vector_store.vector_store_id,custom_llm_provider:t.vector_store.custom_llm_provider,vector_store_name:t.vector_store.vector_store_name,vector_store_description:t.vector_store.vector_store_description})}}catch(e){console.error("Error fetching vector store details:",e),$.default.fromBackend("Error fetching vector store details: "+e)}},f=async()=>{if(o)try{let e=await (0,a.credentialListCall)(o);v(e.credentials||[])}catch(e){console.error("Error fetching credentials:",e)}};(0,s.useEffect)(()=>{j(),f()},[e,o]);let b=async e=>{if(o)try{let t={};try{t=x?JSON.parse(x):{}}catch(e){$.default.fromBackend("Invalid JSON in metadata field");return}let r={vector_store_id:e.vector_store_id,custom_llm_provider:e.custom_llm_provider,vector_store_name:e.vector_store_name,vector_store_description:e.vector_store_description,vector_store_metadata:t};await (0,a.vectorStoreUpdateCall)(o,r),$.default.success("Vector store updated successfully"),u(!1),j()}catch(e){console.error("Error updating vector store:",e),$.default.fromBackend("Error updating vector store: "+e)}};return c?(0,r.jsxs)("div",{className:"p-4 max-w-full",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-6",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(A.Button,{icon:ea.ArrowLeftIcon,variant:"light",className:"mb-4",onClick:t,children:"Back to Vector Stores"}),(0,r.jsxs)(X.Title,{children:["Vector Store ID: ",c.vector_store_id]}),(0,r.jsx)(Q.Text,{className:"text-gray-500",children:c.vector_store_description||"No description"})]}),l&&!m&&(0,r.jsx)(A.Button,{onClick:()=>u(!0),children:"Edit Vector Store"})]}),(0,r.jsxs)(Y.TabGroup,{children:[(0,r.jsxs)(ee.TabList,{className:"mb-6",children:[(0,r.jsx)(et.Tab,{children:"Details"}),(0,r.jsx)(et.Tab,{children:"Test Vector Store"})]}),(0,r.jsxs)(er.TabPanels,{children:[(0,r.jsx)(es.TabPanel,{children:m?(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"flex justify-between items-center mb-4",children:(0,r.jsx)(X.Title,{children:"Edit Vector Store"})}),(0,r.jsx)(W.Card,{children:(0,r.jsxs)(k.Form,{form:n,onFinish:b,layout:"vertical",initialValues:c,children:[(0,r.jsx)(k.Form.Item,{label:"Vector Store ID",name:"vector_store_id",rules:[{required:!0,message:"Please input a vector store ID"}],children:(0,r.jsx)(V.Input,{disabled:!0})}),(0,r.jsx)(k.Form.Item,{label:"Vector Store Name",name:"vector_store_name",children:(0,r.jsx)(V.Input,{})}),(0,r.jsx)(k.Form.Item,{label:"Description",name:"vector_store_description",children:(0,r.jsx)(V.Input.TextArea,{rows:4})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Provider"," ",(0,r.jsx)(L.Tooltip,{title:"Select the provider for this vector store",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"custom_llm_provider",rules:[{required:!0,message:"Please select a provider"}],children:(0,r.jsx)(D.Select,{children:Object.entries(g.Providers).map(([e,t])=>"Bedrock"===e?(0,r.jsx)(D.Select.Option,{value:g.provider_map[e],children:(0,r.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,r.jsx)(G.Logo,{provider:e,label:t,className:"w-5 h-5"}),(0,r.jsx)("span",{children:t})]})},e):null)})}),(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsx)(Q.Text,{className:"text-sm text-gray-500 mb-2",children:"Either select existing credentials OR enter provider credentials below"})}),(0,r.jsx)(k.Form.Item,{label:"Existing Credentials",name:"litellm_credential_name",children:(0,r.jsx)(D.Select,{showSearch:!0,placeholder:"Select or search for existing credentials",optionFilterProp:"children",filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:[{value:null,label:"None"},...p.map(e=>({value:e.credential_name,label:e.credential_name}))],allowClear:!0})}),(0,r.jsxs)("div",{className:"flex items-center my-4",children:[(0,r.jsx)("div",{className:"grow border-t border-gray-200"}),(0,r.jsx)("span",{className:"px-4 text-gray-500 text-sm",children:"OR"}),(0,r.jsx)("div",{className:"grow border-t border-gray-200"})]}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Metadata"," ",(0,r.jsx)(L.Tooltip,{title:"JSON metadata for the vector store",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,r.jsx)(V.Input.TextArea,{rows:4,value:x,onChange:e=>h(e.target.value),placeholder:'{"key": "value"}'})}),(0,r.jsxs)("div",{className:"flex justify-end space-x-2",children:[(0,r.jsx)(eo.Button,{onClick:()=>u(!1),children:"Cancel"}),(0,r.jsx)(eo.Button,{type:"primary",htmlType:"submit",children:"Save Changes"})]})]})})]}):(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsx)(X.Title,{children:"Vector Store Details"}),l&&(0,r.jsx)(A.Button,{onClick:()=>u(!0),children:"Edit Vector Store"})]}),(0,r.jsx)(W.Card,{children:(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"ID"}),(0,r.jsx)(Q.Text,{children:c.vector_store_id})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Name"}),(0,r.jsx)(Q.Text,{children:c.vector_store_name||"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Description"}),(0,r.jsx)(Q.Text,{children:c.vector_store_description||"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Provider"}),(0,r.jsx)("div",{className:"flex items-center space-x-2 mt-1",children:(()=>{let{displayName:e,logo:t}=(e=>{let t=Object.keys(B).find(t=>B[t].toLowerCase()===e.toLowerCase());if(!t)return(0,g.getProviderLogoAndName)(e);let r=F[t];return{logo:q[r],displayName:r}})(c.custom_llm_provider||"bedrock");return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(G.Logo,{src:t,label:e,className:"w-5 h-5"}),(0,r.jsx)(Z.Badge,{color:"blue",children:e})]})})()})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Metadata"}),(0,r.jsx)("div",{className:"bg-gray-50 p-3 rounded-sm mt-2 font-mono text-xs overflow-auto max-h-48",children:(0,r.jsx)("pre",{children:x})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Created"}),(0,r.jsx)(Q.Text,{children:c.created_at?new Date(c.created_at).toLocaleString():"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Last Updated"}),(0,r.jsx)(Q.Text,{children:c.updated_at?new Date(c.updated_at).toLocaleString():"-"})]})]})})]})}),(0,r.jsx)(es.TabPanel,{children:(0,r.jsx)(ep,{vectorStoreId:c.vector_store_id,accessToken:o||""})})]})]})]}):(0,r.jsx)("div",{children:"Loading..."})};var ev=e.i(515831);e.i(247167);var ej=e.i(931067);let ef={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M885.2 446.3l-.2-.8-112.2-285.1c-5-16.1-19.9-27.2-36.8-27.2H281.2c-17 0-32.1 11.3-36.9 27.6L139.4 443l-.3.7-.2.8c-1.3 4.9-1.7 9.9-1 14.8-.1 1.6-.2 3.2-.2 4.8V830a60.9 60.9 0 0060.8 60.8h627.2c33.5 0 60.8-27.3 60.9-60.8V464.1c0-1.3 0-2.6-.1-3.7.4-4.9 0-9.6-1.3-14.1zm-295.8-43l-.3 15.7c-.8 44.9-31.8 75.1-77.1 75.1-22.1 0-41.1-7.1-54.8-20.6S436 441.2 435.6 419l-.3-15.7H229.5L309 210h399.2l81.7 193.3H589.4zm-375 76.8h157.3c24.3 57.1 76 90.8 140.4 90.8 33.7 0 65-9.4 90.3-27.2 22.2-15.6 39.5-37.4 50.7-63.6h156.5V814H214.4V480.1z"}}]},name:"inbox",theme:"outlined"};var eb=e.i(9583),ey=s.forwardRef(function(e,t){return s.createElement(eb.default,(0,ej.default)({},e,{ref:t,icon:ef}))}),e_=e.i(112179);let eS={uploading:{tone:"info",label:"Uploading"},done:{tone:"success",label:"Ready"},error:{tone:"error",label:"Error"},removed:{tone:"neutral",label:"Removed"}};function eN({document:e,onRemove:t}){return(0,r.jsxs)(j.DropdownMenu,{children:[(0,r.jsx)(j.DropdownMenuTrigger,{"aria-label":"Open document actions","data-testid":`document-actions-${e.uid}`,className:(0,f.cn)((0,v.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,r.jsx)(c.MoreHorizontal,{className:"size-4"})}),(0,r.jsxs)(j.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,r.jsxs)(j.DropdownMenuItem,{"data-testid":"document-action-copy",onClick:()=>void(0,b.copyToClipboard)(e.uid,"Document ID copied to clipboard"),children:[(0,r.jsx)(n.Copy,{}),"Copy document ID"]}),(0,r.jsxs)(j.DropdownMenuItem,{variant:"destructive","data-testid":"document-action-remove",onClick:()=>t(e.uid),children:[(0,r.jsx)(m.Trash2,{}),"Remove"]})]})]})}function eI(){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)(l.Inbox,{className:"size-5 text-muted-foreground"})}),(0,r.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No documents uploaded yet"}),(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Upload documents above to get started."})]})}let ew=({documents:e,onRemove:t})=>{let o=(0,s.useMemo)(()=>(({onRemove:e})=>[{id:"name",accessorKey:"name",meta:{title:"Name"},header:"Name",enableSorting:!1,cell:({row:e})=>(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"block max-w-72 truncate text-sm",title:e.original.name,children:e.original.name}),e.original.size?(0,r.jsxs)("span",{className:"text-xs text-muted-foreground",children:["(",function(e){if(!e)return"-";let t=e/1024;return t<1024?`${t.toFixed(2)} KB`:`${(t/1024).toFixed(2)} MB`}(e.original.size),")"]}):null]})},{id:"status",accessorKey:"status",meta:{title:"Status",skeleton:"badge"},header:"Status",size:150,enableSorting:!1,cell:({row:e})=>{let t=eS[e.original.status]??{tone:"neutral",label:e.original.status};return(0,r.jsx)(e_.StatusBadge,{tone:t.tone,label:t.label})}},{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:t})=>(0,r.jsx)("div",{className:"flex justify-end",children:(0,r.jsx)(eN,{document:t.original,onRemove:e})})}])({onRemove:t}),[t]);return(0,r.jsx)(i.DataTable,{data:e,columns:o,getRowId:(e,t)=>e.uid||String(t),noDataMessage:(0,r.jsx)(eI,{}),size:"compact"})},eC=({accessToken:e,providerParams:t,onParamsChange:o})=>{let[a,l]=(0,s.useState)([]),[i,n]=(0,s.useState)(!1);(0,s.useEffect)(()=>{e&&(async()=>{n(!0);try{let t=(await (0,K.fetchAvailableModels)(e)).filter(e=>"embedding"===e.mode);l(t)}catch(e){console.error("Error fetching embedding models:",e)}finally{n(!1)}})()},[e]);let c=(e,r)=>{o({...t,[e]:r})};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(z.Alert,{message:"AWS S3 Vectors Setup",description:(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"AWS S3 Vectors allows you to store and query vector embeddings directly in S3:"}),(0,r.jsxs)("ul",{style:{marginLeft:"16px",marginTop:"8px"},children:[(0,r.jsx)("li",{children:"Vector buckets and indexes will be automatically created if they don't exist"}),(0,r.jsx)("li",{children:"Vector dimensions are auto-detected from your selected embedding model"}),(0,r.jsx)("li",{children:"Ensure your AWS credentials have permissions for S3 Vectors operations"}),(0,r.jsxs)("li",{children:["Learn more:"," ",(0,r.jsx)("a",{href:"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-vector-buckets.html",target:"_blank",rel:"noopener noreferrer",children:"AWS S3 Vectors Documentation"})]})]})]}),type:"info",showIcon:!0,style:{marginBottom:"16px"}}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Vector Bucket Name"," ",(0,r.jsx)(L.Tooltip,{title:"S3 bucket name for vector storage (must be at least 3 characters, lowercase letters, numbers, hyphens, and periods only)",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:!0,validateStatus:t.vector_bucket_name&&t.vector_bucket_name.length<3?"error":void 0,help:t.vector_bucket_name&&t.vector_bucket_name.length<3?"Bucket name must be at least 3 characters":void 0,children:(0,r.jsx)(V.Input,{value:t.vector_bucket_name||"",onChange:e=>c("vector_bucket_name",e.target.value),placeholder:"my-vector-bucket (min 3 chars)",size:"large",className:"rounded-md"})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Index Name"," ",(0,r.jsx)(L.Tooltip,{title:"Name for the vector index (optional, will be auto-generated if not provided). If provided, must be at least 3 characters.",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),validateStatus:t.index_name&&t.index_name.length>0&&t.index_name.length<3?"error":void 0,help:t.index_name&&t.index_name.length>0&&t.index_name.length<3?"Index name must be at least 3 characters if provided":void 0,children:(0,r.jsx)(V.Input,{value:t.index_name||"",onChange:e=>c("index_name",e.target.value),placeholder:"my-vector-index (optional, min 3 chars)",size:"large",className:"rounded-md"})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["AWS Region"," ",(0,r.jsx)(L.Tooltip,{title:"AWS region where the S3 bucket is located (e.g., us-west-2)",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:!0,children:(0,r.jsx)(V.Input,{value:t.aws_region_name||"",onChange:e=>c("aws_region_name",e.target.value),placeholder:"us-west-2",size:"large",className:"rounded-md"})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Embedding Model"," ",(0,r.jsx)(L.Tooltip,{title:"Select the embedding model to use for vector generation",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:!0,children:(0,r.jsx)(D.Select,{value:t.embedding_model||void 0,onChange:e=>c("embedding_model",e),placeholder:"Select an embedding model",size:"large",showSearch:!0,loading:i,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:a.map(e=>({value:e.model_group,label:e.model_group})),style:{width:"100%"}})})]})},{Dragger:eA}=ev.Upload,eT=({accessToken:e,onSuccess:t})=>{let[o]=k.Form.useForm(),[l,i]=(0,s.useState)([]),[n,c]=(0,s.useState)(!1),[d,m]=(0,s.useState)("bedrock"),[u,x]=(0,s.useState)(""),[h,p]=(0,s.useState)(""),[g,v]=(0,s.useState)([]),[j,f]=(0,s.useState)({}),b={name:"file",multiple:!0,accept:".pdf,.txt,.docx,.md,.doc",beforeUpload:e=>{if(!["application/pdf","text/plain","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/msword","text/markdown"].includes(e.type))return el.default.error(`${e.name} is not a supported file type. Please upload PDF, TXT, DOCX, or MD files.`),ev.Upload.LIST_IGNORE;if(!(e.size/1024/1024<50))return el.default.error(`${e.name} must be smaller than 50MB!`),ev.Upload.LIST_IGNORE;let t={uid:e.uid,name:e.name,status:"done",size:e.size,type:e.type,originFileObj:e};return i(e=>[...e,t]),!1},onRemove:e=>{i(t=>t.filter(t=>t.uid!==e.uid))},fileList:l.map(e=>({uid:e.uid,name:e.name,status:e.status,size:e.size})),showUploadList:!1},y=async()=>{let r;if(0===l.length)return void el.default.warning("Please upload at least one document");if(!d)return void el.default.warning("Please select a provider");for(let e of U(d).filter(e=>e.required))if(!j[e.name])return void el.default.warning(`Please provide ${e.label}`);if("s3_vectors"===d){if(j.vector_bucket_name&&j.vector_bucket_name.length<3)return void el.default.warning("Vector bucket name must be at least 3 characters");if(j.index_name&&j.index_name.length>0&&j.index_name.length<3)return void el.default.warning("Index name must be at least 3 characters if provided")}if(!e)return void el.default.error("No access token available");c(!0);let s=[];try{for(let t of l)if(t.originFileObj){i(e=>e.map(e=>e.uid===t.uid?{...e,status:"uploading"}:e));try{let o=await (0,a.ragIngestCall)(e,t.originFileObj,d,r,u||void 0,h||void 0,j);!r&&o.vector_store_id&&(r=o.vector_store_id),s.push(o),i(e=>e.map(e=>e.uid===t.uid?{...e,status:"done"}:e))}catch(e){throw console.error(`Error ingesting ${t.name}:`,e),i(e=>e.map(e=>e.uid===t.uid?{...e,status:"error"}:e)),e}}v(s),$.default.success(`Successfully created vector store with ${s.length} document(s). Vector Store ID: ${r}`),t&&r&&t(r),setTimeout(()=>{i([]),v([])},3e3)}catch(e){console.error("Error creating vector store:",e),$.default.fromBackend(`Failed to create vector store: ${e}`)}finally{c(!1)}};return(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(X.Title,{children:"Create Vector Store"}),(0,r.jsx)(Q.Text,{className:"text-gray-500",children:"Upload documents and select a provider to create a new vector store with embedded content."})]}),(0,r.jsxs)(W.Card,{children:[(0,r.jsxs)("div",{className:"mb-4",children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Step 1: Upload Documents"}),(0,r.jsx)(Q.Text,{className:"text-sm text-gray-500 block mt-1",children:"Upload one or more documents (PDF, TXT, DOCX, MD). Maximum file size: 50MB per file."})]}),(0,r.jsxs)(eA,{...b,children:[(0,r.jsx)("p",{className:"ant-upload-drag-icon",children:(0,r.jsx)(ey,{style:{fontSize:"48px",color:"#1890ff"}})}),(0,r.jsx)("p",{className:"ant-upload-text",children:"Click or drag files to this area to upload"}),(0,r.jsx)("p",{className:"ant-upload-hint",children:"Support for single or bulk upload. Supported formats: PDF, TXT, DOCX, MD"})]})]}),l.length>0&&(0,r.jsxs)(W.Card,{children:[(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsxs)(Q.Text,{className:"font-medium",children:["Uploaded Documents (",l.length,")"]})}),(0,r.jsx)(ew,{documents:l,onRemove:e=>{i(t=>t.filter(t=>t.uid!==e))}})]}),(0,r.jsx)(W.Card,{children:(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(Q.Text,{className:"font-medium",children:"Step 2: Configure Vector Store"}),(0,r.jsx)(Q.Text,{className:"text-sm text-gray-500 block mt-1",children:"Choose the provider and optionally provide a name and description for your vector store."})]}),(0,r.jsxs)(k.Form,{form:o,layout:"vertical",children:[(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Vector Store Name"," ",(0,r.jsx)(L.Tooltip,{title:"Optional: Give your vector store a meaningful name",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,r.jsx)(V.Input,{value:u,onChange:e=>x(e.target.value),placeholder:"e.g., Product Documentation, Customer Support KB",size:"large",className:"rounded-md"})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Description"," ",(0,r.jsx)(L.Tooltip,{title:"Optional: Describe what this vector store contains",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,r.jsx)(V.Input.TextArea,{value:h,onChange:e=>p(e.target.value),placeholder:"e.g., Contains all product documentation and user guides",rows:2,size:"large",className:"rounded-md"})}),(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:["Provider"," ",(0,r.jsx)(L.Tooltip,{title:"Select the provider for embedding and vector store operations",children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:!0,children:(0,r.jsx)(D.Select,{value:d,onChange:m,placeholder:"Select a provider",size:"large",style:{width:"100%"},children:Object.entries(F).map(([e,t])=>(0,r.jsx)(D.Select.Option,{value:B[e],children:(0,r.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,r.jsx)(G.Logo,{src:q[t],label:t,className:"w-5 h-5"}),(0,r.jsx)("span",{children:t})]})},e))})}),"s3_vectors"===d&&(0,r.jsx)(eC,{accessToken:e,providerParams:j,onParamsChange:f}),"s3_vectors"!==d&&U(d).map(e=>"select"===e.type?(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:[e.label," ",(0,r.jsx)(L.Tooltip,{title:e.tooltip,children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:e.required,children:(0,r.jsx)(V.Input,{value:j[e.name]||"",onChange:t=>f(r=>({...r,[e.name]:t.target.value})),placeholder:e.placeholder,size:"large",className:"rounded-md"})},e.name):(0,r.jsx)(k.Form.Item,{label:(0,r.jsxs)("span",{children:[e.label," ",(0,r.jsx)(L.Tooltip,{title:e.tooltip,children:(0,r.jsx)(E.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),required:e.required,children:(0,r.jsx)(V.Input,{type:"password"===e.type?"password":"text",value:j[e.name]||"",onChange:t=>f(r=>({...r,[e.name]:t.target.value})),placeholder:e.placeholder,size:"large",className:"rounded-md"})},e.name))]}),(0,r.jsx)("div",{className:"flex justify-end",children:(0,r.jsx)(eo.Button,{type:"primary",size:"large",onClick:y,loading:n,disabled:0===l.length||!d,children:n?"Creating Vector Store...":"Create Vector Store"})})]})}),g.length>0&&(0,r.jsx)(z.Alert,{message:"Vector Store Created Successfully",description:(0,r.jsxs)("div",{children:[(0,r.jsxs)("p",{children:[(0,r.jsx)("strong",{children:"Vector Store ID:"})," ",g[0]?.vector_store_id]}),(0,r.jsxs)("p",{children:[(0,r.jsx)("strong",{children:"Documents Ingested:"})," ",g.length]})]}),type:"success",showIcon:!0,closable:!0})]})};var ek=e.i(131792);let eD=e=>e.vector_store_name||e.vector_store_id,eL=({accessToken:e,vectorStores:t})=>{let[o,a]=(0,s.useState)(t[0]??null);return e?0===t.length?(0,r.jsx)(em.Card,{children:(0,r.jsx)(em.CardContent,{children:(0,r.jsx)("div",{className:"py-8 text-center",children:(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"No vector stores available. Create one first to test it."})})})}):(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsx)(em.Card,{children:(0,r.jsxs)(em.CardContent,{className:"space-y-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h5",{className:"text-base font-medium text-foreground",children:"Select Vector Store"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Choose a vector store to test search queries against"})]}),(0,r.jsxs)(ek.Combobox,{items:t,value:o,onValueChange:a,itemToStringLabel:eD,children:[(0,r.jsx)(ek.ComboboxInput,{className:"w-full",placeholder:"Select a vector store"}),(0,r.jsxs)(ek.ComboboxContent,{children:[(0,r.jsx)(ek.ComboboxEmpty,{children:"No matching vector stores"}),(0,r.jsx)(ek.ComboboxList,{children:e=>(0,r.jsx)(ek.ComboboxItem,{value:e,children:(0,r.jsxs)("div",{className:"flex flex-col",children:[(0,r.jsx)("span",{className:"font-medium",children:eD(e)}),e.vector_store_name&&(0,r.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:e.vector_store_id})]})},e.vector_store_id)})]})]})]})}),o&&(0,r.jsx)(ep,{vectorStoreId:o.vector_store_id,accessToken:e})]}):(0,r.jsx)(em.Card,{children:(0,r.jsx)(em.CardContent,{children:(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Access token is required to test vector stores."})})})};var eV=e.i(708347),ez=e.i(677572),eE=e.i(695420);let eO=({accessToken:e,userID:t,userRole:l})=>{let[i,n]=(0,s.useState)([]),[c,d]=(0,s.useState)(!0),[m,u]=(0,s.useState)(!1),[x,h]=(0,s.useState)(!1),[p,g]=(0,s.useState)(null),[j,f]=(0,s.useState)(""),[b,y]=(0,s.useState)([]),[_,S]=(0,s.useState)(null),[N,I]=(0,s.useState)(!1),[C,A]=(0,s.useState)(!1),{onTabChange:T,hasVisited:k}=(0,eE.useVisitedTabs)("create"),D=async()=>{if(!e)return void d(!1);try{let t=await (0,a.vectorStoreListCall)(e);n(t.data||[])}catch(e){console.error("Error fetching vector stores:",e),$.default.fromBackend("Error fetching vector stores: "+e)}finally{d(!1)}},L=async()=>{if(e)try{let t=await (0,a.credentialListCall)(e);y(t.credentials||[])}catch(e){console.error("Error fetching credentials:",e),$.default.fromBackend("Error fetching credentials: "+e)}},V=async e=>{g(e),h(!0)},z=async()=>{if(e&&p){A(!0);try{await (0,a.vectorStoreDeleteCall)(e,p),$.default.success("Vector store deleted successfully"),D()}catch(e){console.error("Error deleting vector store:",e),$.default.fromBackend("Error deleting vector store: "+e)}finally{A(!1),h(!1),g(null)}}};return(0,s.useEffect)(()=>{D(),L()},[e]),_?(0,r.jsx)("div",{className:"w-full h-full",children:(0,r.jsx)(eg,{vectorStoreId:_,onClose:()=>{S(null),I(!1),D()},accessToken:e,is_admin:(0,eV.isAdminRole)(l||""),editVectorStore:N})}):(0,r.jsx)("div",{className:"mx-4 h-[75vh]",children:(0,r.jsxs)("div",{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,r.jsxs)("div",{className:"flex justify-between mt-2 w-full items-center mb-4",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight text-foreground",children:"Vector Store Management"}),(0,r.jsxs)("div",{className:"flex items-center space-x-2",children:[j&&(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Last Refreshed: ",j]}),(0,r.jsx)(v.Button,{variant:"outline",size:"icon-sm","aria-label":"Refresh",onClick:()=>{D(),L(),f(new Date().toLocaleString())},children:(0,r.jsx)(o.RefreshCw,{className:"size-4"})})]})]}),(0,r.jsx)("p",{className:"mb-4 text-sm text-muted-foreground",children:"You can use vector stores to store and retrieve LLM embeddings."}),(0,r.jsxs)(ez.Tabs,{defaultValue:"create",onValueChange:T,children:[(0,r.jsxs)(ez.TabsList,{variant:"line",className:"mb-6 h-auto w-full justify-start rounded-none border-b p-0",children:[(0,r.jsx)(ez.TabsTrigger,{value:"create",className:"flex-none rounded-none px-4 py-2",children:"Create Vector Store"}),(0,r.jsx)(ez.TabsTrigger,{value:"manage",className:"flex-none rounded-none px-4 py-2",children:"Manage Vector Stores"}),(0,r.jsx)(ez.TabsTrigger,{value:"test",className:"flex-none rounded-none px-4 py-2",children:"Test Vector Store"})]}),(0,r.jsx)(ez.TabsContent,{keepMounted:k("create"),value:"create",children:(0,r.jsx)(eT,{accessToken:e,onSuccess:e=>{D()}})}),(0,r.jsxs)(ez.TabsContent,{keepMounted:k("manage"),value:"manage",children:[(0,r.jsx)(v.Button,{className:"mb-4",onClick:()=>u(!0),children:"+ Add Vector Store"}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 pt-2 pb-2 w-full mt-2",children:(0,r.jsx)(w,{data:i,isLoading:c,onView:e=>{S(e),I(!1)},onEdit:e=>{S(e),I(!0)},onDelete:V})})]}),(0,r.jsx)(ez.TabsContent,{keepMounted:k("test"),value:"test",children:(0,r.jsx)(eL,{accessToken:e,vectorStores:i})})]}),(0,r.jsx)(H,{isVisible:m,onCancel:()=>u(!1),onSuccess:()=>{u(!1),D()},accessToken:e,credentials:b}),(0,r.jsx)(J.default,{isOpen:x,title:"Delete Vector Store",message:"Are you sure you want to delete this vector store? This action cannot be undone.",resourceInformationTitle:"Vector Store Information",resourceInformation:[{label:"Vector Store ID",value:p,code:!0}],onCancel:()=>h(!1),onOk:z,confirmLoading:C})]})})};var eP=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:t,userId:s}=(0,eP.default)();return(0,r.jsx)(eO,{accessToken:e,userRole:t,userID:s})}],400157)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0g8wwba6umbim.js b/litellm/proxy/_experimental/out/_next/static/chunks/0ex44ljfg9dp9.js similarity index 98% rename from litellm/proxy/_experimental/out/_next/static/chunks/0g8wwba6umbim.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0ex44ljfg9dp9.js index 4d5f14647c3..7342de736c4 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0g8wwba6umbim.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0ex44ljfg9dp9.js @@ -1 +1 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,176516,e=>{"use strict";let t=(0,e.i(475254).default)("scroll-text",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);e.s(["ScrollText",0,t],176516)},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)},759684,e=>{"use strict";var t,r,n,o,a,i=e.i(843476);e.s([],673176),e.i(673176),e.i(247167);var l=e.i(271645),s=e.i(667865),u=e.i(439957),c=e.i(733332);let d=l.createContext(void 0);function f(){let e=l.useContext(d);if(void 0===e)throw Error((0,c.default)(53));return e}var p=e.i(552245);let h=((t={}).scrollAreaCornerHeight="--scroll-area-corner-height",t.scrollAreaCornerWidth="--scroll-area-corner-width",t);function g(e,t,r){if(!e)return 0;let n=getComputedStyle(e),o="x"===r?"Inline":"Block";return"x"===r&&"margin"===t?2*parseFloat(n[`${t}InlineStart`]):parseFloat(n[`${t}${o}Start`])+parseFloat(n[`${t}${o}End`])}let v=((r={}).orientation="data-orientation",r.hovering="data-hovering",r.scrolling="data-scrolling",r.hasOverflowX="data-has-overflow-x",r.hasOverflowY="data-has-overflow-y",r.overflowXStart="data-overflow-x-start",r.overflowXEnd="data-overflow-x-end",r.overflowYStart="data-overflow-y-start",r.overflowYEnd="data-overflow-y-end",r);var S=e.i(60837),x=e.i(788015);let m=((n={}).scrolling="data-scrolling",n.hasOverflowX="data-has-overflow-x",n.hasOverflowY="data-has-overflow-y",n.overflowXStart="data-overflow-x-start",n.overflowXEnd="data-overflow-x-end",n.overflowYStart="data-overflow-y-start",n.overflowYEnd="data-overflow-y-end",n),y={hasOverflowX:e=>e?{[m.hasOverflowX]:""}:null,hasOverflowY:e=>e?{[m.hasOverflowY]:""}:null,overflowXStart:e=>e?{[m.overflowXStart]:""}:null,overflowXEnd:e=>e?{[m.overflowXEnd]:""}:null,overflowYStart:e=>e?{[m.overflowYStart]:""}:null,overflowYEnd:e=>e?{[m.overflowYEnd]:""}:null,cornerHidden:()=>null};var w=e.i(647554),E=e.i(172410);let b={x:0,y:0},R={width:0,height:0},C={xStart:!1,xEnd:!1,yStart:!1,yEnd:!1},O={x:!0,y:!0,corner:!0},P=l.forwardRef(function(e,t){let{render:r,className:n,overflowEdgeThreshold:o,style:a,...c}=e,{xStart:f,xEnd:m,yStart:P,yEnd:T}=function(e){if("number"==typeof e){let t=Math.max(0,e);return{xStart:t,xEnd:t,yStart:t,yEnd:t}}return{xStart:Math.max(0,e?.xStart||0),xEnd:Math.max(0,e?.xEnd||0),yStart:Math.max(0,e?.yStart||0),yEnd:Math.max(0,e?.yEnd||0)}}(o),k=(0,x.useBaseUiId)(),M=(0,u.useTimeout)(),I=(0,u.useTimeout)(),{nonce:A,disableStyleElements:H}=(0,E.useCSPContext)(),[N,F]=l.useState(!1),[z,j]=l.useState(!1),[D,W]=l.useState(!1),[Y,L]=l.useState(!1),[X,B]=l.useState(!1),[V,$]=l.useState(R),[K,U]=l.useState(R),[_,G]=l.useState(C),[q,J]=l.useState(O),Q=l.useRef(null),Z=l.useRef(null),ee=l.useRef(null),et=l.useRef(null),er=l.useRef(null),en=l.useRef(null),eo=l.useRef(null),ea=l.useRef(!1),ei=l.useRef(0),el=l.useRef(0),es=l.useRef(0),eu=l.useRef(0),ec=l.useRef("vertical"),ed=l.useRef(b),ef=(0,s.useStableCallback)(e=>{let t=e.x-ed.current.x,r=e.y-ed.current.y;ed.current=e,0!==r&&(W(!0),M.start(500,()=>{W(!1)})),0!==t&&(j(!0),I.start(500,()=>{j(!1)}))}),ep=(0,s.useStableCallback)(e=>{0===e.button&&(ea.current=!0,ei.current=e.clientY,el.current=e.clientX,ec.current=e.currentTarget.getAttribute(v.orientation),Z.current&&(es.current=Z.current.scrollTop,eu.current=Z.current.scrollLeft),er.current&&"vertical"===ec.current&&er.current.setPointerCapture(e.pointerId),en.current&&"horizontal"===ec.current&&en.current.setPointerCapture(e.pointerId))}),eh=(0,s.useStableCallback)(e=>{if(!ea.current)return;let t=e.clientY-ei.current,r=e.clientX-el.current;if(Z.current){let n=Z.current.scrollHeight,o=Z.current.clientHeight,a=Z.current.scrollWidth,i=Z.current.clientWidth;if(er.current&&ee.current&&"vertical"===ec.current){let r=g(ee.current,"padding","y"),a=g(er.current,"margin","y"),i=er.current.offsetHeight,l=ee.current.offsetHeight-i-r-a;Z.current.scrollTop=es.current+t/l*(n-o),e.preventDefault(),W(!0),M.start(500,()=>{W(!1)})}if(en.current&&et.current&&"horizontal"===ec.current){let t=g(et.current,"padding","x"),n=g(en.current,"margin","x"),o=en.current.offsetWidth,l=et.current.offsetWidth-o-t-n;Z.current.scrollLeft=eu.current+r/l*(a-i),e.preventDefault(),j(!0),I.start(500,()=>{j(!1)})}}}),eg=(0,s.useStableCallback)(e=>{ea.current=!1,er.current&&"vertical"===ec.current&&er.current.hasPointerCapture(e.pointerId)&&er.current.releasePointerCapture(e.pointerId),en.current&&"horizontal"===ec.current&&en.current.hasPointerCapture(e.pointerId)&&en.current.releasePointerCapture(e.pointerId)});function ev(e){L("touch"===e.pointerType)}function eS(e){ev(e),"touch"!==e.pointerType&&F((0,w.contains)(Q.current,e.target))}let ex=l.useMemo(()=>({scrolling:z||D,hasOverflowX:!q.x,hasOverflowY:!q.y,overflowXStart:_.xStart,overflowXEnd:_.xEnd,overflowYStart:_.yStart,overflowYEnd:_.yEnd,cornerHidden:q.corner}),[z,D,q.x,q.y,q.corner,_]),em={role:"presentation",onPointerEnter:eS,onPointerMove:eS,onPointerDown:ev,onPointerLeave(){F(!1)},style:{position:"relative",[h.scrollAreaCornerHeight]:`${V.height}px`,[h.scrollAreaCornerWidth]:`${V.width}px`}},ey=(0,p.useRenderElement)("div",e,{state:ex,ref:[t,Q],props:[em,c],stateAttributesMapping:y}),ew=l.useMemo(()=>({handlePointerDown:ep,handlePointerMove:eh,handlePointerUp:eg,handleScroll:ef,cornerSize:V,setCornerSize:$,thumbSize:K,setThumbSize:U,hasMeasuredScrollbar:X,setHasMeasuredScrollbar:B,touchModality:Y,cornerRef:eo,scrollingX:z,setScrollingX:j,scrollingY:D,setScrollingY:W,hovering:N,setHovering:F,viewportRef:Z,rootRef:Q,scrollbarYRef:ee,scrollbarXRef:et,thumbYRef:er,thumbXRef:en,rootId:k,hiddenState:q,setHiddenState:J,overflowEdges:_,setOverflowEdges:G,viewportState:ex,overflowEdgeThreshold:{xStart:f,xEnd:m,yStart:P,yEnd:T}}),[ep,eh,eg,ef,V,K,X,Y,z,j,D,W,N,F,k,q,_,ex,f,m,P,T]);return(0,i.jsxs)(d.Provider,{value:ew,children:[!H&&S.styleDisableScrollbar.getElement(A),ey]})});var T=e.i(146376),k=e.i(328744);let M=l.createContext(void 0);var I=e.i(872855),A=e.i(201675);let H=((o={}).scrollAreaOverflowXStart="--scroll-area-overflow-x-start",o.scrollAreaOverflowXEnd="--scroll-area-overflow-x-end",o.scrollAreaOverflowYStart="--scroll-area-overflow-y-start",o.scrollAreaOverflowYEnd="--scroll-area-overflow-y-end",o);var N=e.i(550896);let F=!1,z=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{viewportRef:c,scrollbarYRef:d,scrollbarXRef:h,thumbYRef:v,thumbXRef:x,cornerRef:m,cornerSize:w,setCornerSize:E,setThumbSize:b,rootId:R,setHiddenState:C,hiddenState:O,setHasMeasuredScrollbar:P,handleScroll:z,setHovering:j,setOverflowEdges:D,overflowEdges:W,overflowEdgeThreshold:Y,scrollingX:L,scrollingY:X}=f(),B=(0,I.useDirection)(),V=l.useRef(!0),$=l.useRef([NaN,NaN,NaN,NaN]),K=(0,u.useTimeout)(),U=(0,u.useTimeout)(),_=(0,s.useStableCallback)(()=>{var e;let t,r,n=c.current,o=d.current,a=h.current,i=v.current,l=x.current,s=m.current;if(!n)return;let u=n.scrollHeight,f=n.scrollWidth,p=n.clientHeight,S=n.clientWidth,y=n.scrollTop,R=n.scrollLeft,O=$.current,T=Number.isNaN(O[0]);if(O[0]=p,O[1]=u,O[2]=S,O[3]=f,T&&P(!0),0===u||0===f)return;let k=(t=(e=n).clientHeight>=e.scrollHeight,{y:t,x:r=e.clientWidth>=e.scrollWidth,corner:t||r}),M=k.y,I=k.x,F=S/f,z=p/u,j=Math.max(0,f-S),W=Math.max(0,u-p),L=0,X=0;if(!I){let e=0;e="rtl"===B?(0,A.clamp)(-R,0,j):(0,A.clamp)(R,0,j),L=(0,N.normalizeScrollOffset)(e,j),X=j-L}let V=M?0:(0,A.clamp)(y,0,W),K=M?0:(0,N.normalizeScrollOffset)(V,W),U=M?0:W-K,_=I?0:S,G=M?0:p,q=0,J=0;I||M||(q=o?.offsetWidth||0,J=a?.offsetHeight||0);let Q=0===w.width&&0===w.height,Z=Q?q:0,ee=Q?J:0,et=g(a,"padding","x"),er=g(o,"padding","y"),en=g(l,"margin","x"),eo=g(i,"margin","y"),ea=_-et-en,ei=G-er-eo,el=a?Math.min(a.offsetWidth-Z,ea):ea,es=o?Math.min(o.offsetHeight-ee,ei):ei,eu=Math.max(16,el*F),ec=Math.max(16,es*z);if(b(e=>e.height===ec&&e.width===eu?e:{width:eu,height:ec}),o&&i){let e=o.offsetHeight-ec-er-eo,t=u-p,r=Math.min(e,Math.max(0,(0===t?0:y/t)*e));i.style.transform=`translate3d(0,${r}px,0)`}if(a&&l){let e=a.offsetWidth-eu-et-en,t=f-S,r=0===t?0:R/t,n="rtl"===B?(0,A.clamp)(r*e,-e,0):(0,A.clamp)(r*e,0,e);l.style.transform=`translate3d(${n}px,0,0)`}for(let[e,t]of[[H.scrollAreaOverflowXStart,L],[H.scrollAreaOverflowXEnd,X],[H.scrollAreaOverflowYStart,K],[H.scrollAreaOverflowYEnd,U]])n.style.setProperty(e,`${t}px`);s&&(I||M?E({width:0,height:0}):I||M||E({width:q,height:J})),C(e=>{var t,r;return t=e,r=k,t.y===r.y&&t.x===r.x&&t.corner===r.corner?t:r});let ed={xStart:!I&&L>Y.xStart,xEnd:!I&&X>Y.xEnd,yStart:!M&&K>Y.yStart,yEnd:!M&&U>Y.yEnd};D(e=>e.xStart===ed.xStart&&e.xEnd===ed.xEnd&&e.yStart===ed.yStart&&e.yEnd===ed.yEnd?e:ed)});function G(){V.current=!1}(0,T.useIsoLayoutEffect)(()=>{c.current&&(F||k.platform.engine.webkit||("u">typeof CSS&&"registerProperty"in CSS&&[H.scrollAreaOverflowXStart,H.scrollAreaOverflowXEnd,H.scrollAreaOverflowYStart,H.scrollAreaOverflowYEnd].forEach(e=>{try{CSS.registerProperty({name:e,syntax:"",inherits:!1,initialValue:"0px"})}catch{}}),F=!0))},[c]),(0,T.useIsoLayoutEffect)(()=>{queueMicrotask(_)},[_,O,B,Y.xStart,Y.xEnd,Y.yStart,Y.yEnd]),(0,T.useIsoLayoutEffect)(()=>{c.current?.matches(":hover")&&j(!0)},[c,j]),(0,T.useIsoLayoutEffect)(()=>{let e=c.current;if("u"{if(!t){t=!0;let r=$.current;if(r[0]===e.clientHeight&&r[1]===e.scrollHeight&&r[2]===e.clientWidth&&r[3]===e.scrollWidth)return}_()});return r.observe(e),U.start(0,()=>{let t=e.getAnimations({subtree:!0});0!==t.length&&Promise.allSettled(t.map(e=>e.finished)).then(_).catch(()=>{})}),()=>{r.disconnect(),U.clear()}},[_,c,U]);let q={role:"presentation",...R&&{"data-id":`${R}-viewport`},tabIndex:O.x&&O.y?-1:0,className:S.styleDisableScrollbar.className,style:{overflow:"scroll"},onScroll(){c.current&&(_(),V.current||z({x:c.current.scrollLeft,y:c.current.scrollTop}),K.start(100,()=>{V.current=!0}))},onWheel:G,onTouchMove:G,onPointerMove:G,onPointerEnter:G,onKeyDown:G},J=l.useMemo(()=>({scrolling:L||X,hasOverflowX:!O.x,hasOverflowY:!O.y,overflowXStart:W.xStart,overflowXEnd:W.xEnd,overflowYStart:W.yStart,overflowYEnd:W.yEnd,cornerHidden:O.corner}),[L,X,O.x,O.y,O.corner,W]),Q=(0,p.useRenderElement)("div",e,{ref:[t,c],state:J,props:[q,a],stateAttributesMapping:y}),Z=l.useMemo(()=>({computeThumbPosition:_}),[_]);return(0,i.jsx)(M.Provider,{value:Z,children:Q})});var j=e.i(574735);let D=l.createContext(void 0),W=((a={}).scrollAreaThumbHeight="--scroll-area-thumb-height",a.scrollAreaThumbWidth="--scroll-area-thumb-width",a),Y=l.forwardRef(function(e,t){let{render:r,className:n,orientation:o="vertical",keepMounted:a=!1,style:s,...u}=e,{hovering:c,scrollingX:d,scrollingY:v,hiddenState:S,overflowEdges:x,scrollbarYRef:m,scrollbarXRef:E,viewportRef:b,thumbYRef:R,thumbXRef:C,handlePointerDown:O,handlePointerUp:P,handleScroll:T,rootId:k,thumbSize:M,hasMeasuredScrollbar:A}=f(),H={hovering:c,scrolling:{horizontal:d,vertical:v}[o],orientation:o,hasOverflowX:!S.x,hasOverflowY:!S.y,overflowXStart:x.xStart,overflowXEnd:x.xEnd,overflowYStart:x.yStart,overflowYEnd:x.yEnd,cornerHidden:S.corner},N=(0,I.useDirection)(),F=!A&&!a,z="vertical"===o?S.y:S.x,Y=a||!z;l.useEffect(()=>{if(!Y)return;let e=b.current,t="vertical"===o?m.current:E.current;if(t)return(0,j.addEventListener)(t,"wheel",function(r){if(!e||!t||r.ctrlKey)return;let n="horizontal"===o,a=n?"scrollLeft":"scrollTop",i=n?r.deltaX:r.deltaY;if(0===i)return;let l=n?e.scrollWidth-e.clientWidth:e.scrollHeight-e.clientHeight,s=n&&"rtl"===N?-l:0,u=n&&"rtl"===N?0:l,c=e[a];c<=s&&i<0||c>=u&&i>0||(r.preventDefault(),e[a]=Math.min(u,Math.max(s,c+i)),T({x:e.scrollLeft,y:e.scrollTop}))},{passive:!1})},[N,T,o,E,m,Y,b]);let L={...k&&{"data-id":`${k}-scrollbar`},onPointerDown(e){if(0!==e.button)return;let t=(0,w.getTarget)(e.nativeEvent),r="vertical"===o?R.current:C.current;if(!(r&&(0,w.contains)(r,t))&&b.current){if(R.current&&m.current&&"vertical"===o){let t=g(R.current,"margin","y"),r=g(m.current,"padding","y"),n=R.current.offsetHeight,o=m.current.getBoundingClientRect(),a=e.clientY-o.top-n/2-r+t/2,i=b.current.scrollHeight,l=b.current.clientHeight,s=m.current.offsetHeight-n-r-t;b.current.scrollTop=a/s*(i-l)}if(C.current&&E.current&&"horizontal"===o){let t,r=g(C.current,"margin","x"),n=g(E.current,"padding","x"),o=C.current.offsetWidth,a=E.current.getBoundingClientRect(),i=e.clientX-a.left-o/2-n+r/2,l=b.current.scrollWidth,s=b.current.clientWidth,u=i/(E.current.offsetWidth-o-n-r);"rtl"===N?(t=(1-u)*(l-s),b.current.scrollLeft<=0&&(t=-t)):t=u*(l-s),b.current.scrollLeft=t}T({x:b.current.scrollLeft,y:b.current.scrollTop}),O(e)}},onPointerUp:P,onPointerCancel:P,style:{position:"absolute",touchAction:"none",WebkitUserSelect:"none",userSelect:"none",visibility:F?"hidden":void 0,..."vertical"===o&&{top:0,bottom:`var(${h.scrollAreaCornerHeight})`,insetInlineEnd:0,[W.scrollAreaThumbHeight]:`${M.height}px`},..."horizontal"===o&&{insetInlineStart:0,insetInlineEnd:`var(${h.scrollAreaCornerWidth})`,bottom:0,[W.scrollAreaThumbWidth]:`${M.width}px`}}},X=(0,p.useRenderElement)("div",e,{ref:[t,"vertical"===o?m:E],state:H,props:[L,u],stateAttributesMapping:y}),B=l.useMemo(()=>({orientation:o}),[o]);return Y?(0,i.jsx)(D.Provider,{value:B,children:X}):null}),L=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{computeThumbPosition:i}=function(){let e=l.useContext(M);if(void 0===e)throw Error((0,c.default)(55));return e}(),{hasMeasuredScrollbar:s,viewportState:u}=f(),d=l.useRef(null),h=l.useRef(s);return(0,T.useIsoLayoutEffect)(()=>{if("u"{(e||(e=!0,h.current))&&i()});return d.current&&t.observe(d.current),()=>{t.disconnect()}},[i]),(0,p.useRenderElement)("div",e,{ref:[t,d],state:u,stateAttributesMapping:y,props:[{role:"presentation",style:{minWidth:"fit-content"}},a]})}),X=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{thumbYRef:i,thumbXRef:s,handlePointerDown:u,handlePointerMove:d,handlePointerUp:h,setScrollingX:g,setScrollingY:v,scrollingX:S,scrollingY:x,hasMeasuredScrollbar:m}=f(),{orientation:y}=function(){let e=l.useContext(D);if(void 0===e)throw Error((0,c.default)(54));return e}();function w(e){"vertical"===y&&v(!1),"horizontal"===y&&g(!1),h(e)}return(0,p.useRenderElement)("div",e,{ref:[t,"vertical"===y?i:s],state:{scrolling:"horizontal"===y?S:x,orientation:y},props:[{onPointerDown:u,onPointerMove:d,onPointerUp:w,onPointerCancel:w,style:{visibility:m?void 0:"hidden",..."vertical"===y&&{height:`var(${W.scrollAreaThumbHeight})`},..."horizontal"===y&&{width:`var(${W.scrollAreaThumbWidth})`}}},a]})}),B=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{cornerRef:i,cornerSize:l,hiddenState:s}=f(),u=(0,p.useRenderElement)("div",e,{ref:[t,i],props:[{style:{position:"absolute",bottom:0,insetInlineEnd:0,width:l.width,height:l.height}},a]});return s.corner?null:u});e.s(["Content",0,L,"Corner",0,B,"Root",0,P,"Scrollbar",0,Y,"Thumb",0,X,"Viewport",0,z],236093);var V=e.i(236093),V=V,$=e.i(115504);function K({className:e,orientation:t="vertical",...r}){return(0,i.jsx)(V.Scrollbar,{"data-slot":"scroll-area-scrollbar","data-orientation":t,orientation:t,className:(0,$.cn)("flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",e),...r,children:(0,i.jsx)(V.Thumb,{"data-slot":"scroll-area-thumb",className:"relative flex-1 rounded-full bg-border"})})}e.s(["ScrollArea",0,function({className:e,children:t,...r}){return(0,i.jsxs)(V.Root,{"data-slot":"scroll-area",className:(0,$.cn)("relative",e),...r,children:[(0,i.jsx)(V.Viewport,{"data-slot":"scroll-area-viewport",className:"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",children:t}),(0,i.jsx)(K,{}),(0,i.jsx)(V.Corner,{})]})}],759684)},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)},699375,e=>{"use strict";var t,r=e.i(843476);e.s([],924305),e.i(924305),e.i(247167);var n=e.i(271645),o=e.i(951437),a=e.i(828918),i=e.i(146376),l=e.i(502077),s=e.i(956789),u=e.i(333848),c=e.i(552245),d=e.i(176782),f=e.i(788015),p=e.i(540886),h=e.i(733332);let g=n.createContext(void 0);var v=e.i(875812);let S=((t={}).checked="data-checked",t.unchecked="data-unchecked",t.disabled="data-disabled",t.readonly="data-readonly",t.required="data-required",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),x={...v.fieldValidityMapping,checked:e=>e?{[S.checked]:""}:{[S.unchecked]:""}};var m=e.i(469690),y=e.i(381104),w=e.i(884708),E=e.i(247778),b=e.i(31421),R=e.i(538489),C=e.i(675606),O=e.i(56434),P=e.i(606039);let T=n.forwardRef(function(e,t){let{checked:h,className:v,defaultChecked:S,"aria-labelledby":T,form:k,id:M,inputRef:I,name:A,nativeButton:H=!1,onCheckedChange:N,readOnly:F=!1,required:z=!1,disabled:j=!1,render:D,uncheckedValue:W,value:Y,style:L,...X}=e,{clearErrors:B}=(0,w.useFormContext)(),{state:V,setTouched:$,setDirty:K,validityData:U,setFilled:_,setFocused:G,validationMode:q,disabled:J,name:Q,validation:Z}=(0,m.useFieldRootContext)(),{labelId:ee}=(0,E.useLabelableContext)(),et=J||j,er=Q??A,en=n.useRef(null),eo=(0,a.useMergedRefs)(en,I,Z.inputRef),ea=n.useRef(null),ei=(0,f.useBaseUiId)(),el=(0,R.useLabelableId)({id:M,implicit:!1,controlRef:ea}),es=H?void 0:el,[eu,ec]=(0,o.useControlled)({controlled:h,default:!!S,name:"Switch",state:"checked"});(0,y.useRegisterFieldControl)(ea,ei,eu,void 0,!et,A),(0,i.useIsoLayoutEffect)(()=>{en.current&&_(en.current.checked)},[en,_]),(0,P.useValueChanged)(eu,()=>{B(er),K(eu!==U.initialValue),_(eu),Z.change(eu)});let{getButtonProps:ed,buttonRef:ef}=(0,p.useButton)({disabled:et,native:H}),ep=(0,b.useAriaLabelledBy)(T,ee,en,!H,es),eh=(0,d.mergeProps)({checked:eu,disabled:et,form:k,id:es,name:er,required:z,style:er?l.visuallyHiddenInput:l.visuallyHidden,tabIndex:-1,type:"checkbox","aria-hidden":!0,ref:eo,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(F)return void e.preventDefault();let t=e.currentTarget.checked,r=(0,C.createChangeEventDetails)(O.REASONS.none,e.nativeEvent);N?.(t,r),r.isCanceled||ec(t)},onFocus(){ea.current?.focus()}},e=>Z.getValidationProps(et,e),void 0!==Y?{value:Y}:s.EMPTY_OBJECT),eg=n.useMemo(()=>({...V,checked:eu,disabled:et,readOnly:F,required:z}),[V,eu,et,F,z]),ev=(0,c.useRenderElement)("span",e,{state:eg,ref:[t,ea,ef],props:[{id:H?el:ei,role:"switch","aria-checked":eu,"aria-readonly":F||void 0,"aria-required":z||void 0,"aria-labelledby":ep,onFocus(){et||G(!0)},onBlur(){let e=en.current;e&&!et&&($(!0),G(!1),"onBlur"===q&&Z.commit(e.checked))},onClick(e){if(F||et)return;e.preventDefault();let t=en.current;t&&t.dispatchEvent(new((0,u.ownerWindow)(t)).PointerEvent("click",{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey}))}},X,ed,e=>Z.getValidationProps(et,e)],stateAttributesMapping:x});return(0,r.jsxs)(g.Provider,{value:eg,children:[ev,!eu&&er&&void 0!==W&&(0,r.jsx)("input",{type:"hidden",form:k,name:er,value:W,disabled:et}),(0,r.jsx)("input",{...eh,suppressHydrationWarning:!0})]})}),k=n.forwardRef(function(e,t){let{render:r,className:o,style:a,...i}=e,l=function(){let e=n.useContext(g);if(void 0===e)throw Error((0,h.default)(63));return e}();return(0,c.useRenderElement)("span",e,{state:l,ref:t,stateAttributesMapping:x,props:i})});e.s(["Root",0,T,"Thumb",0,k],450994);var M=e.i(450994),M=M,I=e.i(115504);e.s(["Switch",0,function({className:e,size:t="default",...n}){return(0,r.jsx)(M.Root,{"data-slot":"switch","data-size":t,className:(0,I.cn)("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",e),...n,children:(0,r.jsx)(M.Thumb,{"data-slot":"switch-thumb",className:"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"})})}],699375)},337822,e=>{"use strict";var t,r=e.i(843476);e.s([],158421),e.i(158421);var n=e.i(271645),o=e.i(956789),a=e.i(17989),i=e.i(46420);e.i(247167);var l=e.i(733332);let s=n.createContext(void 0);function u(e){let t=n.useContext(s);if(void 0===t&&!e)throw Error((0,l.default)(47));return t}var c=e.i(174080),d=e.i(301252),f=e.i(616269),p=e.i(439957),h=e.i(56434),g=e.i(264111),v=e.i(116786),S=e.i(990627),x=e.i(638396);let m={...v.popupStoreSelectors,disabled:(0,f.createSelector)(e=>e.disabled),instantType:(0,f.createSelector)(e=>e.instantType),openMethod:(0,f.createSelector)(e=>e.openMethod),openChangeReason:(0,f.createSelector)(e=>e.openChangeReason),modal:(0,f.createSelector)(e=>e.modal),focusManagerModal:(0,f.createSelector)(e=>e.focusManagerModal),stickIfOpen:(0,f.createSelector)(e=>e.stickIfOpen),titleElementId:(0,f.createSelector)(e=>e.titleElementId),descriptionElementId:(0,f.createSelector)(e=>e.descriptionElementId),openOnHover:(0,f.createSelector)(e=>e.openOnHover),closeDelay:(0,f.createSelector)(e=>e.closeDelay),hasViewport:(0,f.createSelector)(e=>e.hasViewport)};class y extends d.ReactStore{constructor(e,t,r=!1){const o={...(0,v.createInitialPopupStoreState)(),disabled:!1,modal:!1,focusManagerModal:!1,instantType:void 0,openMethod:null,openChangeReason:null,titleElementId:void 0,descriptionElementId:void 0,stickIfOpen:!0,nested:!1,openOnHover:!1,closeDelay:0,hasViewport:!1,...e},a=new S.PopupTriggerMap;o.open&&e?.mounted===void 0&&(o.mounted=!0),o.floatingRootContext=(0,v.createPopupFloatingRootContext)(a,t,r),super(o,{popupRef:n.createRef(),backdropRef:n.createRef(),internalBackdropRef:n.createRef(),onOpenChange:void 0,onOpenChangeComplete:void 0,triggerFocusTargetRef:n.createRef(),beforeContentFocusGuardRef:n.createRef(),stickIfOpenTimeout:new p.Timeout,triggerElements:a},m)}setOpen=(e,t)=>{let r=t.reason===h.REASONS.triggerHover,n=t.reason===h.REASONS.triggerPress&&0===t.event.detail,o=!e&&(t.reason===h.REASONS.escapeKey||null==t.reason),a=(0,g.attachPreventUnmountOnClose)(t),i=this.select("activeTriggerId");if(e||t.reason!==h.REASONS.closePress||null!=t.trigger||null==i||(t.trigger=this.context.triggerElements.getById(i)??this.select("activeTriggerElement")??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let l=()=>{let r={open:e,openChangeReason:t.reason};(0,g.setPopupOpenState)(r,e,t.trigger,a()),this.update(r)};r?(this.set("stickIfOpen",!0),this.context.stickIfOpenTimeout.start(x.PATIENT_CLICK_THRESHOLD,()=>{this.set("stickIfOpen",!1)}),c.flushSync(l)):l(),n||o?this.set("instantType",n?"click":"dismiss"):t.reason===h.REASONS.focusOut?this.set("instantType","focus"):this.set("instantType",void 0)};static useStore(e,t){let{store:r,internalStore:o}=(0,g.usePopupStore)(e,(e,r)=>new y(t,e,r));return n.useEffect(()=>o?.disposeEffect(),[o]),r}disposeEffect=()=>this.context.stickIfOpenTimeout.disposeEffect()}var w=e.i(675606),E=e.i(176782);function b({props:e}){let{children:t,open:o,defaultOpen:a=!1,onOpenChange:l,onOpenChangeComplete:u,modal:c=!1,handle:d,triggerId:f,defaultTriggerId:p=null}=e,v=y.useStore(d?.store,{modal:c,open:a,openProp:o,activeTriggerId:p,triggerIdProp:f});(0,g.useInitialOpenSync)(v,o,a,p),v.useControlledProp("openProp",o),v.useControlledProp("triggerIdProp",f);let S=v.useState("open"),x=v.useState("mounted"),m=v.useState("payload"),E=null!=(0,i.useFloatingParentNodeId)();v.useContextCallback("onOpenChange",l),v.useContextCallback("onOpenChangeComplete",u),(0,g.usePopupRootSync)(v,S),(0,g.useImplicitActiveTrigger)(v);let{forceUnmount:C}=(0,g.useOpenStateTransitions)(S,v,()=>{v.update({stickIfOpen:!0,openChangeReason:null})});v.useSyncedValues({modal:c,nested:E}),n.useEffect(()=>{S||v.context.stickIfOpenTimeout.clear()},[v,S]);let O=n.useCallback(()=>{v.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction))},[v]);n.useImperativeHandle(e.actionsRef,()=>({unmount:C,close:O}),[C,O]);let P=S||x,T=n.useMemo(()=>({store:v}),[v]);return(0,r.jsxs)(s.Provider,{value:T,children:[P&&(0,r.jsx)(R,{store:v,modal:c}),"function"==typeof t?t({payload:m}):t]})}function R({store:e,modal:t}){let r=e.useState("floatingRootContext"),i=(0,a.useDismiss)(r,{outsidePressEvent:{mouse:"trap-focus"===t?"sloppy":"intentional",touch:"sloppy"}}),l=i.reference??o.EMPTY_OBJECT,s=i.trigger??o.EMPTY_OBJECT,u=n.useMemo(()=>(0,E.mergeProps)(g.FOCUSABLE_POPUP_PROPS,i.floating),[i.floating]);return(0,g.usePopupInteractionProps)(e,{activeTriggerProps:l,inactiveTriggerProps:s,popupProps:u}),null}var C=e.i(540886),O=e.i(405005),P=e.i(552245),T=e.i(650316),k=e.i(385689),M=e.i(872135),I=e.i(788015),A=e.i(152535),H=e.i(346570),N=e.i(32199);let F=n.forwardRef(function(e,t){let{render:o,className:a,style:i,disabled:s=!1,nativeButton:c=!0,handle:d,payload:f,openOnHover:p=!1,delay:v=300,closeDelay:S=0,id:m,...y}=e,w=u(!0),E=d?.store??w?.store;if(!E)throw Error((0,l.default)(74));let b=(0,I.useBaseUiId)(m),R=E.useState("isTriggerActive",b),F=E.useState("floatingRootContext"),z=E.useState("isOpenedByTrigger",b),j=E.useState("triggerPopupId",b),D=n.useRef(null),{registerTrigger:W,isMountedByThisTrigger:Y}=(0,g.useTriggerDataForwarding)(b,D,E,{payload:f,disabled:s,openOnHover:p,closeDelay:S}),L=E.useState("openChangeReason"),X=E.useState("stickIfOpen"),B=E.useState("openMethod"),V=E.useState("focusManagerModal"),$=(0,M.useHoverReferenceInteraction)(F,{enabled:!s&&null!=F&&p&&("touch"!==B||L!==h.REASONS.triggerPress),mouseOnly:!0,move:!1,handleClose:(0,T.safePolygon)(),restMs:v,delay:{close:S},triggerElementRef:D,isActiveTrigger:R,isClosing:()=>"ending"===E.select("transitionStatus")}),K=(0,k.useClick)(F,{enabled:null!=F,stickIfOpen:X}),U=(0,N.useOpenMethodTriggerProps)(()=>E.select("open"),e=>{E.set("openMethod",e)}),_=E.useState("triggerProps",Y),{getButtonProps:G,buttonRef:q}=(0,C.useButton)({disabled:s,native:c}),{preFocusGuardRef:J,handlePreFocusGuardFocus:Q,handleFocusTargetFocus:Z}=(0,H.useTriggerFocusGuards)(E,D),ee=(0,P.useRenderElement)("button",e,{state:{disabled:s,open:z},ref:[q,t,W,D],props:[K.reference,$,_,U,{[x.CLICK_TRIGGER_IDENTIFIER]:"",id:b,"aria-haspopup":"dialog","aria-expanded":z,"aria-controls":j},y,G],stateAttributesMapping:{open:e=>e&&L===h.REASONS.triggerPress?O.pressableTriggerOpenStateMapping.open(e):O.triggerOpenStateMapping.open(e)}});return Y&&!V?(0,r.jsxs)(n.Fragment,{children:[(0,r.jsx)(A.FocusGuard,{ref:J,onFocus:Q}),(0,r.jsx)(n.Fragment,{children:ee},b),(0,r.jsx)(A.FocusGuard,{ref:E.context.triggerFocusTargetRef,onFocus:Z})]}):(0,r.jsx)(n.Fragment,{children:ee},b)});var z=e.i(726674);let j=n.createContext(void 0),D=n.forwardRef(function(e,t){let{keepMounted:n=!1,...o}=e,{store:a}=u();return a.useState("mounted")||n?(0,r.jsx)(j.Provider,{value:n,children:(0,r.jsx)(z.FloatingPortal,{ref:t,...o})}):null});var W=e.i(144394),Y=e.i(146376);let L=n.createContext(void 0);function X(){let e=n.useContext(L);if(!e)throw Error((0,l.default)(46));return e}var B=e.i(329365),V=e.i(426),$=e.i(222640),K=e.i(360495),U=e.i(789579),_=e.i(33383);let G=n.forwardRef(function(e,t){let{render:o,className:a,style:s,anchor:c,positionMethod:d="absolute",side:f="bottom",align:p="center",sideOffset:g=0,alignOffset:v=0,collisionBoundary:S="clipping-ancestors",collisionPadding:m=5,arrowPadding:y=5,sticky:w=!1,disableAnchorTracking:E=!1,collisionAvoidance:b=x.POPUP_COLLISION_AVOIDANCE,...R}=e,{store:C}=u(),O=function(){let e=n.useContext(j);if(void 0===e)throw Error((0,l.default)(45));return e}(),P=(0,i.useFloatingNodeId)(),T=C.useState("floatingRootContext"),k=C.useState("mounted"),M=C.useState("open"),I=C.useState("openChangeReason"),A=C.useState("activeTriggerElement"),H=C.useState("modal"),N=C.useState("openMethod"),F=C.useState("positionerElement"),z=C.useState("instantType"),D=C.useState("transitionStatus"),X=C.useState("hasViewport"),G=n.useRef(null),q=(0,$.useAnimationsFinished)(F,!1,!1),J=(0,B.useAnchorPositioning)({anchor:c,floatingRootContext:T,positionMethod:d,mounted:k,side:f,sideOffset:g,align:p,alignOffset:v,arrowPadding:y,collisionBoundary:S,collisionPadding:m,sticky:w,disableAnchorTracking:E,keepMounted:O,nodeId:P,collisionAvoidance:b,adaptiveOrigin:X?K.adaptiveOrigin:void 0}),Q=T.useState("domReferenceElement");(0,Y.useIsoLayoutEffect)(()=>{let e=G.current;if(Q&&(G.current=Q),e&&Q&&Q!==e){C.set("instantType",void 0);let e=new AbortController;return q(()=>{C.set("instantType","trigger-change")},e.signal),()=>{e.abort()}}},[Q,q,C]),(0,_.useAnchoredPopupScrollLock)(M&&!0===H&&I!==h.REASONS.triggerHover,"touch"===N,F,A);let Z=n.useCallback(e=>{C.set("positionerElement",e)},[C]),ee={open:M,side:J.side,align:J.align,anchorHidden:J.anchorHidden,instant:z},et=(0,U.usePositioner)(e,ee,{styles:J.positionerStyles,transitionStatus:D,props:R,refs:[t,Z],hidden:!k,inert:!M});return(0,r.jsxs)(L.Provider,{value:J,children:[k&&!0===H&&I!==h.REASONS.triggerHover&&(0,r.jsx)(V.InternalBackdrop,{ref:C.context.internalBackdropRef,inert:(0,W.inertValue)(!M),cutout:A}),(0,r.jsx)(i.FloatingNode,{id:P,children:et})]})});var q=e.i(229315),J=e.i(61487),Q=e.i(431157),Z=e.i(209407),ee=e.i(137584),et=e.i(673327),er=e.i(96533),en=e.i(815982),eo=e.i(667865);let ea=n.createContext(void 0);function ei(e){let{value:t,children:n}=e;return(0,r.jsx)(ea.Provider,{value:t,children:n})}let el={...O.popupStateMapping,...Z.transitionStatusMapping},es=n.forwardRef(function(e,t){let{render:o,className:a,style:i,initialFocus:l,finalFocus:s,...c}=e,{store:d}=u(),f=X(),p=null!=(0,er.useToolbarRootContext)(!0),{context:v,hasClosePart:S}=function(){let[e,t]=n.useState(0),r=(0,eo.useStableCallback)(()=>(t(e=>e+1),()=>{t(e=>Math.max(0,e-1))}));return{context:n.useMemo(()=>({register:r}),[r]),hasClosePart:e>0}}(),x=d.useState("open"),m=d.useState("openMethod"),y=d.useState("instantType"),w=d.useState("transitionStatus"),E=d.useState("popupProps"),b=d.useState("titleElementId"),R=d.useState("descriptionElementId"),C=d.useState("modal"),O=d.useState("mounted"),T=d.useState("openChangeReason"),k=d.useState("activeTriggerElement"),M=d.useState("floatingRootContext"),I=M.useState("floatingId"),A=d.useState("disabled"),H=d.useState("openOnHover"),N=d.useState("closeDelay"),F=c.id??I;(0,ee.useOpenChangeComplete)({open:x,ref:d.context.popupRef,onComplete(){x&&d.context.onOpenChangeComplete?.(!0)}}),(0,Q.useHoverFloatingInteraction)(M,{enabled:H&&!A,closeDelay:N});let z=void 0===l?(0,g.createDefaultInitialFocus)(d.context.popupRef):l,j=!1!==C&&S;d.useSyncedValue("focusManagerModal",j);let D=n.useCallback(e=>{d.set("popupElement",e)},[d]),W={open:x,side:f.side,align:f.align,instant:y,transitionStatus:w},Y=(0,P.useRenderElement)("div",e,{state:W,ref:[t,d.context.popupRef,D],props:[E,{id:F,role:"dialog",...g.FOCUSABLE_POPUP_PROPS,"aria-labelledby":b,"aria-describedby":R,onKeyDown(e){p&&et.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()}},(0,en.getDisabledMountTransitionStyles)(w),c],stateAttributesMapping:el});return(0,r.jsx)(J.FloatingFocusManager,{context:M,openInteractionType:m,modal:j,disabled:!O||T===h.REASONS.triggerHover,initialFocus:z,returnFocus:s,restoreFocus:"popup",previousFocusableElement:(0,q.isHTMLElement)(k)?k:void 0,nextFocusableElement:d.context.triggerFocusTargetRef,beforeContentFocusGuardRef:d.context.beforeContentFocusGuardRef,children:(0,r.jsx)(ei,{value:v,children:Y})})}),eu=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=i.useState("open"),{arrowRef:s,side:c,align:d,arrowUncentered:f,arrowStyles:p}=X();return(0,P.useRenderElement)("div",e,{state:{open:l,side:c,align:d,uncentered:f},ref:[t,s],props:[{style:p,"aria-hidden":!0},a],stateAttributesMapping:O.popupStateMapping})}),ec={...O.popupStateMapping,...Z.transitionStatusMapping},ed=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=i.useState("open"),s=i.useState("mounted"),c=i.useState("transitionStatus"),d=i.useState("openChangeReason");return(0,P.useRenderElement)("div",e,{state:{open:l,transitionStatus:c},ref:[i.context.backdropRef,t],props:[{role:"presentation",hidden:!s,style:{pointerEvents:d===h.REASONS.triggerHover?"none":void 0,userSelect:"none",WebkitUserSelect:"none"}},a],stateAttributesMapping:ec})}),ef=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=(0,I.useBaseUiId)(a.id);return i.useSyncedValueWithCleanup("titleElementId",l),(0,P.useRenderElement)("h2",e,{ref:t,props:[{id:l},a]})}),ep=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=(0,I.useBaseUiId)(a.id);return i.useSyncedValueWithCleanup("descriptionElementId",l),(0,P.useRenderElement)("p",e,{ref:t,props:[{id:l},a]})}),eh=n.forwardRef(function(e,t){let r,{render:o,className:a,style:i,disabled:l=!1,nativeButton:s=!0,...c}=e,{buttonRef:d,getButtonProps:f}=(0,C.useButton)({disabled:l,focusableWhenDisabled:!1,native:s}),{store:p}=u();return r=n.useContext(ea),(0,Y.useIsoLayoutEffect)(()=>r?.register(),[r]),(0,P.useRenderElement)("button",e,{ref:[t,d],props:[{onClick(e){p.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.closePress,e.nativeEvent))}},c,f]})}),eg=((t={}).popupWidth="--popup-width",t.popupHeight="--popup-height",t);var ev=e.i(818390);let eS={activationDirection:e=>e?{"data-activation-direction":e}:null},ex=n.forwardRef(function(e,t){let{render:r,className:n,style:o,children:a,...i}=e,{store:l}=u(),{side:s}=X(),c=l.useState("instantType"),{children:d,state:f}=(0,ev.usePopupViewport)({store:l,side:s,cssVars:eg,children:a}),p={activationDirection:f.activationDirection,transitioning:f.transitioning,instant:c};return(0,P.useRenderElement)("div",e,{state:p,ref:t,props:[i,{children:d}],stateAttributesMapping:eS})});class em{constructor(){this.store=new y}open(e){let t=e?this.store.context.triggerElements.getById(e)??void 0:void 0;if(e&&!t)throw Error((0,l.default)(80,e));this.store.setOpen(!0,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction,void 0,t))}close(){this.store.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",0,eu,"Backdrop",0,ed,"Close",0,eh,"Description",0,ep,"Handle",0,em,"Popup",0,es,"Portal",0,D,"Positioner",0,G,"Root",0,function(e){return u(!0)?(0,r.jsx)(b,{props:e}):(0,r.jsx)(i.FloatingTree,{children:(0,r.jsx)(b,{props:e})})},"Title",0,ef,"Trigger",0,F,"Viewport",0,ex,"createHandle",0,function(){return new em}],466914);var ey=e.i(466914),ey=ey,ew=e.i(115504);e.s(["Popover",0,function({...e}){return(0,r.jsx)(ey.Root,{"data-slot":"popover",...e})},"PopoverContent",0,function({className:e,align:t="center",alignOffset:n=0,side:o="bottom",sideOffset:a=4,...i}){return(0,r.jsx)(ey.Portal,{children:(0,r.jsx)(ey.Positioner,{align:t,alignOffset:n,side:o,sideOffset:a,className:"isolate z-50",children:(0,r.jsx)(ey.Popup,{"data-slot":"popover-content",className:(0,ew.cn)("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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),...i})})})},"PopoverTrigger",0,function({...e}){return(0,r.jsx)(ey.Trigger,{"data-slot":"popover-trigger",...e})}],337822)}]); \ No newline at end of file +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},176516,e=>{"use strict";let t=(0,e.i(475254).default)("scroll-text",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);e.s(["ScrollText",0,t],176516)},759684,e=>{"use strict";var t,r,n,o,a,i=e.i(843476);e.s([],673176),e.i(673176),e.i(247167);var l=e.i(271645),s=e.i(667865),u=e.i(439957),c=e.i(733332);let d=l.createContext(void 0);function f(){let e=l.useContext(d);if(void 0===e)throw Error((0,c.default)(53));return e}var p=e.i(552245);let h=((t={}).scrollAreaCornerHeight="--scroll-area-corner-height",t.scrollAreaCornerWidth="--scroll-area-corner-width",t);function g(e,t,r){if(!e)return 0;let n=getComputedStyle(e),o="x"===r?"Inline":"Block";return"x"===r&&"margin"===t?2*parseFloat(n[`${t}InlineStart`]):parseFloat(n[`${t}${o}Start`])+parseFloat(n[`${t}${o}End`])}let v=((r={}).orientation="data-orientation",r.hovering="data-hovering",r.scrolling="data-scrolling",r.hasOverflowX="data-has-overflow-x",r.hasOverflowY="data-has-overflow-y",r.overflowXStart="data-overflow-x-start",r.overflowXEnd="data-overflow-x-end",r.overflowYStart="data-overflow-y-start",r.overflowYEnd="data-overflow-y-end",r);var S=e.i(60837),x=e.i(788015);let m=((n={}).scrolling="data-scrolling",n.hasOverflowX="data-has-overflow-x",n.hasOverflowY="data-has-overflow-y",n.overflowXStart="data-overflow-x-start",n.overflowXEnd="data-overflow-x-end",n.overflowYStart="data-overflow-y-start",n.overflowYEnd="data-overflow-y-end",n),y={hasOverflowX:e=>e?{[m.hasOverflowX]:""}:null,hasOverflowY:e=>e?{[m.hasOverflowY]:""}:null,overflowXStart:e=>e?{[m.overflowXStart]:""}:null,overflowXEnd:e=>e?{[m.overflowXEnd]:""}:null,overflowYStart:e=>e?{[m.overflowYStart]:""}:null,overflowYEnd:e=>e?{[m.overflowYEnd]:""}:null,cornerHidden:()=>null};var w=e.i(647554),E=e.i(172410);let b={x:0,y:0},R={width:0,height:0},C={xStart:!1,xEnd:!1,yStart:!1,yEnd:!1},O={x:!0,y:!0,corner:!0},P=l.forwardRef(function(e,t){let{render:r,className:n,overflowEdgeThreshold:o,style:a,...c}=e,{xStart:f,xEnd:m,yStart:P,yEnd:T}=function(e){if("number"==typeof e){let t=Math.max(0,e);return{xStart:t,xEnd:t,yStart:t,yEnd:t}}return{xStart:Math.max(0,e?.xStart||0),xEnd:Math.max(0,e?.xEnd||0),yStart:Math.max(0,e?.yStart||0),yEnd:Math.max(0,e?.yEnd||0)}}(o),k=(0,x.useBaseUiId)(),M=(0,u.useTimeout)(),I=(0,u.useTimeout)(),{nonce:A,disableStyleElements:H}=(0,E.useCSPContext)(),[N,F]=l.useState(!1),[z,j]=l.useState(!1),[D,W]=l.useState(!1),[Y,L]=l.useState(!1),[X,B]=l.useState(!1),[V,$]=l.useState(R),[K,U]=l.useState(R),[_,G]=l.useState(C),[q,J]=l.useState(O),Q=l.useRef(null),Z=l.useRef(null),ee=l.useRef(null),et=l.useRef(null),er=l.useRef(null),en=l.useRef(null),eo=l.useRef(null),ea=l.useRef(!1),ei=l.useRef(0),el=l.useRef(0),es=l.useRef(0),eu=l.useRef(0),ec=l.useRef("vertical"),ed=l.useRef(b),ef=(0,s.useStableCallback)(e=>{let t=e.x-ed.current.x,r=e.y-ed.current.y;ed.current=e,0!==r&&(W(!0),M.start(500,()=>{W(!1)})),0!==t&&(j(!0),I.start(500,()=>{j(!1)}))}),ep=(0,s.useStableCallback)(e=>{0===e.button&&(ea.current=!0,ei.current=e.clientY,el.current=e.clientX,ec.current=e.currentTarget.getAttribute(v.orientation),Z.current&&(es.current=Z.current.scrollTop,eu.current=Z.current.scrollLeft),er.current&&"vertical"===ec.current&&er.current.setPointerCapture(e.pointerId),en.current&&"horizontal"===ec.current&&en.current.setPointerCapture(e.pointerId))}),eh=(0,s.useStableCallback)(e=>{if(!ea.current)return;let t=e.clientY-ei.current,r=e.clientX-el.current;if(Z.current){let n=Z.current.scrollHeight,o=Z.current.clientHeight,a=Z.current.scrollWidth,i=Z.current.clientWidth;if(er.current&&ee.current&&"vertical"===ec.current){let r=g(ee.current,"padding","y"),a=g(er.current,"margin","y"),i=er.current.offsetHeight,l=ee.current.offsetHeight-i-r-a;Z.current.scrollTop=es.current+t/l*(n-o),e.preventDefault(),W(!0),M.start(500,()=>{W(!1)})}if(en.current&&et.current&&"horizontal"===ec.current){let t=g(et.current,"padding","x"),n=g(en.current,"margin","x"),o=en.current.offsetWidth,l=et.current.offsetWidth-o-t-n;Z.current.scrollLeft=eu.current+r/l*(a-i),e.preventDefault(),j(!0),I.start(500,()=>{j(!1)})}}}),eg=(0,s.useStableCallback)(e=>{ea.current=!1,er.current&&"vertical"===ec.current&&er.current.hasPointerCapture(e.pointerId)&&er.current.releasePointerCapture(e.pointerId),en.current&&"horizontal"===ec.current&&en.current.hasPointerCapture(e.pointerId)&&en.current.releasePointerCapture(e.pointerId)});function ev(e){L("touch"===e.pointerType)}function eS(e){ev(e),"touch"!==e.pointerType&&F((0,w.contains)(Q.current,e.target))}let ex=l.useMemo(()=>({scrolling:z||D,hasOverflowX:!q.x,hasOverflowY:!q.y,overflowXStart:_.xStart,overflowXEnd:_.xEnd,overflowYStart:_.yStart,overflowYEnd:_.yEnd,cornerHidden:q.corner}),[z,D,q.x,q.y,q.corner,_]),em={role:"presentation",onPointerEnter:eS,onPointerMove:eS,onPointerDown:ev,onPointerLeave(){F(!1)},style:{position:"relative",[h.scrollAreaCornerHeight]:`${V.height}px`,[h.scrollAreaCornerWidth]:`${V.width}px`}},ey=(0,p.useRenderElement)("div",e,{state:ex,ref:[t,Q],props:[em,c],stateAttributesMapping:y}),ew=l.useMemo(()=>({handlePointerDown:ep,handlePointerMove:eh,handlePointerUp:eg,handleScroll:ef,cornerSize:V,setCornerSize:$,thumbSize:K,setThumbSize:U,hasMeasuredScrollbar:X,setHasMeasuredScrollbar:B,touchModality:Y,cornerRef:eo,scrollingX:z,setScrollingX:j,scrollingY:D,setScrollingY:W,hovering:N,setHovering:F,viewportRef:Z,rootRef:Q,scrollbarYRef:ee,scrollbarXRef:et,thumbYRef:er,thumbXRef:en,rootId:k,hiddenState:q,setHiddenState:J,overflowEdges:_,setOverflowEdges:G,viewportState:ex,overflowEdgeThreshold:{xStart:f,xEnd:m,yStart:P,yEnd:T}}),[ep,eh,eg,ef,V,K,X,Y,z,j,D,W,N,F,k,q,_,ex,f,m,P,T]);return(0,i.jsxs)(d.Provider,{value:ew,children:[!H&&S.styleDisableScrollbar.getElement(A),ey]})});var T=e.i(146376),k=e.i(328744);let M=l.createContext(void 0);var I=e.i(872855),A=e.i(201675);let H=((o={}).scrollAreaOverflowXStart="--scroll-area-overflow-x-start",o.scrollAreaOverflowXEnd="--scroll-area-overflow-x-end",o.scrollAreaOverflowYStart="--scroll-area-overflow-y-start",o.scrollAreaOverflowYEnd="--scroll-area-overflow-y-end",o);var N=e.i(550896);let F=!1,z=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{viewportRef:c,scrollbarYRef:d,scrollbarXRef:h,thumbYRef:v,thumbXRef:x,cornerRef:m,cornerSize:w,setCornerSize:E,setThumbSize:b,rootId:R,setHiddenState:C,hiddenState:O,setHasMeasuredScrollbar:P,handleScroll:z,setHovering:j,setOverflowEdges:D,overflowEdges:W,overflowEdgeThreshold:Y,scrollingX:L,scrollingY:X}=f(),B=(0,I.useDirection)(),V=l.useRef(!0),$=l.useRef([NaN,NaN,NaN,NaN]),K=(0,u.useTimeout)(),U=(0,u.useTimeout)(),_=(0,s.useStableCallback)(()=>{var e;let t,r,n=c.current,o=d.current,a=h.current,i=v.current,l=x.current,s=m.current;if(!n)return;let u=n.scrollHeight,f=n.scrollWidth,p=n.clientHeight,S=n.clientWidth,y=n.scrollTop,R=n.scrollLeft,O=$.current,T=Number.isNaN(O[0]);if(O[0]=p,O[1]=u,O[2]=S,O[3]=f,T&&P(!0),0===u||0===f)return;let k=(t=(e=n).clientHeight>=e.scrollHeight,{y:t,x:r=e.clientWidth>=e.scrollWidth,corner:t||r}),M=k.y,I=k.x,F=S/f,z=p/u,j=Math.max(0,f-S),W=Math.max(0,u-p),L=0,X=0;if(!I){let e=0;e="rtl"===B?(0,A.clamp)(-R,0,j):(0,A.clamp)(R,0,j),L=(0,N.normalizeScrollOffset)(e,j),X=j-L}let V=M?0:(0,A.clamp)(y,0,W),K=M?0:(0,N.normalizeScrollOffset)(V,W),U=M?0:W-K,_=I?0:S,G=M?0:p,q=0,J=0;I||M||(q=o?.offsetWidth||0,J=a?.offsetHeight||0);let Q=0===w.width&&0===w.height,Z=Q?q:0,ee=Q?J:0,et=g(a,"padding","x"),er=g(o,"padding","y"),en=g(l,"margin","x"),eo=g(i,"margin","y"),ea=_-et-en,ei=G-er-eo,el=a?Math.min(a.offsetWidth-Z,ea):ea,es=o?Math.min(o.offsetHeight-ee,ei):ei,eu=Math.max(16,el*F),ec=Math.max(16,es*z);if(b(e=>e.height===ec&&e.width===eu?e:{width:eu,height:ec}),o&&i){let e=o.offsetHeight-ec-er-eo,t=u-p,r=Math.min(e,Math.max(0,(0===t?0:y/t)*e));i.style.transform=`translate3d(0,${r}px,0)`}if(a&&l){let e=a.offsetWidth-eu-et-en,t=f-S,r=0===t?0:R/t,n="rtl"===B?(0,A.clamp)(r*e,-e,0):(0,A.clamp)(r*e,0,e);l.style.transform=`translate3d(${n}px,0,0)`}for(let[e,t]of[[H.scrollAreaOverflowXStart,L],[H.scrollAreaOverflowXEnd,X],[H.scrollAreaOverflowYStart,K],[H.scrollAreaOverflowYEnd,U]])n.style.setProperty(e,`${t}px`);s&&(I||M?E({width:0,height:0}):I||M||E({width:q,height:J})),C(e=>{var t,r;return t=e,r=k,t.y===r.y&&t.x===r.x&&t.corner===r.corner?t:r});let ed={xStart:!I&&L>Y.xStart,xEnd:!I&&X>Y.xEnd,yStart:!M&&K>Y.yStart,yEnd:!M&&U>Y.yEnd};D(e=>e.xStart===ed.xStart&&e.xEnd===ed.xEnd&&e.yStart===ed.yStart&&e.yEnd===ed.yEnd?e:ed)});function G(){V.current=!1}(0,T.useIsoLayoutEffect)(()=>{c.current&&(F||k.platform.engine.webkit||("u">typeof CSS&&"registerProperty"in CSS&&[H.scrollAreaOverflowXStart,H.scrollAreaOverflowXEnd,H.scrollAreaOverflowYStart,H.scrollAreaOverflowYEnd].forEach(e=>{try{CSS.registerProperty({name:e,syntax:"",inherits:!1,initialValue:"0px"})}catch{}}),F=!0))},[c]),(0,T.useIsoLayoutEffect)(()=>{queueMicrotask(_)},[_,O,B,Y.xStart,Y.xEnd,Y.yStart,Y.yEnd]),(0,T.useIsoLayoutEffect)(()=>{c.current?.matches(":hover")&&j(!0)},[c,j]),(0,T.useIsoLayoutEffect)(()=>{let e=c.current;if("u"{if(!t){t=!0;let r=$.current;if(r[0]===e.clientHeight&&r[1]===e.scrollHeight&&r[2]===e.clientWidth&&r[3]===e.scrollWidth)return}_()});return r.observe(e),U.start(0,()=>{let t=e.getAnimations({subtree:!0});0!==t.length&&Promise.allSettled(t.map(e=>e.finished)).then(_).catch(()=>{})}),()=>{r.disconnect(),U.clear()}},[_,c,U]);let q={role:"presentation",...R&&{"data-id":`${R}-viewport`},tabIndex:O.x&&O.y?-1:0,className:S.styleDisableScrollbar.className,style:{overflow:"scroll"},onScroll(){c.current&&(_(),V.current||z({x:c.current.scrollLeft,y:c.current.scrollTop}),K.start(100,()=>{V.current=!0}))},onWheel:G,onTouchMove:G,onPointerMove:G,onPointerEnter:G,onKeyDown:G},J=l.useMemo(()=>({scrolling:L||X,hasOverflowX:!O.x,hasOverflowY:!O.y,overflowXStart:W.xStart,overflowXEnd:W.xEnd,overflowYStart:W.yStart,overflowYEnd:W.yEnd,cornerHidden:O.corner}),[L,X,O.x,O.y,O.corner,W]),Q=(0,p.useRenderElement)("div",e,{ref:[t,c],state:J,props:[q,a],stateAttributesMapping:y}),Z=l.useMemo(()=>({computeThumbPosition:_}),[_]);return(0,i.jsx)(M.Provider,{value:Z,children:Q})});var j=e.i(574735);let D=l.createContext(void 0),W=((a={}).scrollAreaThumbHeight="--scroll-area-thumb-height",a.scrollAreaThumbWidth="--scroll-area-thumb-width",a),Y=l.forwardRef(function(e,t){let{render:r,className:n,orientation:o="vertical",keepMounted:a=!1,style:s,...u}=e,{hovering:c,scrollingX:d,scrollingY:v,hiddenState:S,overflowEdges:x,scrollbarYRef:m,scrollbarXRef:E,viewportRef:b,thumbYRef:R,thumbXRef:C,handlePointerDown:O,handlePointerUp:P,handleScroll:T,rootId:k,thumbSize:M,hasMeasuredScrollbar:A}=f(),H={hovering:c,scrolling:{horizontal:d,vertical:v}[o],orientation:o,hasOverflowX:!S.x,hasOverflowY:!S.y,overflowXStart:x.xStart,overflowXEnd:x.xEnd,overflowYStart:x.yStart,overflowYEnd:x.yEnd,cornerHidden:S.corner},N=(0,I.useDirection)(),F=!A&&!a,z="vertical"===o?S.y:S.x,Y=a||!z;l.useEffect(()=>{if(!Y)return;let e=b.current,t="vertical"===o?m.current:E.current;if(t)return(0,j.addEventListener)(t,"wheel",function(r){if(!e||!t||r.ctrlKey)return;let n="horizontal"===o,a=n?"scrollLeft":"scrollTop",i=n?r.deltaX:r.deltaY;if(0===i)return;let l=n?e.scrollWidth-e.clientWidth:e.scrollHeight-e.clientHeight,s=n&&"rtl"===N?-l:0,u=n&&"rtl"===N?0:l,c=e[a];c<=s&&i<0||c>=u&&i>0||(r.preventDefault(),e[a]=Math.min(u,Math.max(s,c+i)),T({x:e.scrollLeft,y:e.scrollTop}))},{passive:!1})},[N,T,o,E,m,Y,b]);let L={...k&&{"data-id":`${k}-scrollbar`},onPointerDown(e){if(0!==e.button)return;let t=(0,w.getTarget)(e.nativeEvent),r="vertical"===o?R.current:C.current;if(!(r&&(0,w.contains)(r,t))&&b.current){if(R.current&&m.current&&"vertical"===o){let t=g(R.current,"margin","y"),r=g(m.current,"padding","y"),n=R.current.offsetHeight,o=m.current.getBoundingClientRect(),a=e.clientY-o.top-n/2-r+t/2,i=b.current.scrollHeight,l=b.current.clientHeight,s=m.current.offsetHeight-n-r-t;b.current.scrollTop=a/s*(i-l)}if(C.current&&E.current&&"horizontal"===o){let t,r=g(C.current,"margin","x"),n=g(E.current,"padding","x"),o=C.current.offsetWidth,a=E.current.getBoundingClientRect(),i=e.clientX-a.left-o/2-n+r/2,l=b.current.scrollWidth,s=b.current.clientWidth,u=i/(E.current.offsetWidth-o-n-r);"rtl"===N?(t=(1-u)*(l-s),b.current.scrollLeft<=0&&(t=-t)):t=u*(l-s),b.current.scrollLeft=t}T({x:b.current.scrollLeft,y:b.current.scrollTop}),O(e)}},onPointerUp:P,onPointerCancel:P,style:{position:"absolute",touchAction:"none",WebkitUserSelect:"none",userSelect:"none",visibility:F?"hidden":void 0,..."vertical"===o&&{top:0,bottom:`var(${h.scrollAreaCornerHeight})`,insetInlineEnd:0,[W.scrollAreaThumbHeight]:`${M.height}px`},..."horizontal"===o&&{insetInlineStart:0,insetInlineEnd:`var(${h.scrollAreaCornerWidth})`,bottom:0,[W.scrollAreaThumbWidth]:`${M.width}px`}}},X=(0,p.useRenderElement)("div",e,{ref:[t,"vertical"===o?m:E],state:H,props:[L,u],stateAttributesMapping:y}),B=l.useMemo(()=>({orientation:o}),[o]);return Y?(0,i.jsx)(D.Provider,{value:B,children:X}):null}),L=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{computeThumbPosition:i}=function(){let e=l.useContext(M);if(void 0===e)throw Error((0,c.default)(55));return e}(),{hasMeasuredScrollbar:s,viewportState:u}=f(),d=l.useRef(null),h=l.useRef(s);return(0,T.useIsoLayoutEffect)(()=>{if("u"{(e||(e=!0,h.current))&&i()});return d.current&&t.observe(d.current),()=>{t.disconnect()}},[i]),(0,p.useRenderElement)("div",e,{ref:[t,d],state:u,stateAttributesMapping:y,props:[{role:"presentation",style:{minWidth:"fit-content"}},a]})}),X=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{thumbYRef:i,thumbXRef:s,handlePointerDown:u,handlePointerMove:d,handlePointerUp:h,setScrollingX:g,setScrollingY:v,scrollingX:S,scrollingY:x,hasMeasuredScrollbar:m}=f(),{orientation:y}=function(){let e=l.useContext(D);if(void 0===e)throw Error((0,c.default)(54));return e}();function w(e){"vertical"===y&&v(!1),"horizontal"===y&&g(!1),h(e)}return(0,p.useRenderElement)("div",e,{ref:[t,"vertical"===y?i:s],state:{scrolling:"horizontal"===y?S:x,orientation:y},props:[{onPointerDown:u,onPointerMove:d,onPointerUp:w,onPointerCancel:w,style:{visibility:m?void 0:"hidden",..."vertical"===y&&{height:`var(${W.scrollAreaThumbHeight})`},..."horizontal"===y&&{width:`var(${W.scrollAreaThumbWidth})`}}},a]})}),B=l.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{cornerRef:i,cornerSize:l,hiddenState:s}=f(),u=(0,p.useRenderElement)("div",e,{ref:[t,i],props:[{style:{position:"absolute",bottom:0,insetInlineEnd:0,width:l.width,height:l.height}},a]});return s.corner?null:u});e.s(["Content",0,L,"Corner",0,B,"Root",0,P,"Scrollbar",0,Y,"Thumb",0,X,"Viewport",0,z],236093);var V=e.i(236093),V=V,$=e.i(115504);function K({className:e,orientation:t="vertical",...r}){return(0,i.jsx)(V.Scrollbar,{"data-slot":"scroll-area-scrollbar","data-orientation":t,orientation:t,className:(0,$.cn)("flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",e),...r,children:(0,i.jsx)(V.Thumb,{"data-slot":"scroll-area-thumb",className:"relative flex-1 rounded-full bg-border"})})}e.s(["ScrollArea",0,function({className:e,children:t,...r}){return(0,i.jsxs)(V.Root,{"data-slot":"scroll-area",className:(0,$.cn)("relative",e),...r,children:[(0,i.jsx)(V.Viewport,{"data-slot":"scroll-area-viewport",className:"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",children:t}),(0,i.jsx)(K,{}),(0,i.jsx)(V.Corner,{})]})}],759684)},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)},699375,e=>{"use strict";var t,r=e.i(843476);e.s([],924305),e.i(924305),e.i(247167);var n=e.i(271645),o=e.i(951437),a=e.i(828918),i=e.i(146376),l=e.i(502077),s=e.i(956789),u=e.i(333848),c=e.i(552245),d=e.i(176782),f=e.i(788015),p=e.i(540886),h=e.i(733332);let g=n.createContext(void 0);var v=e.i(875812);let S=((t={}).checked="data-checked",t.unchecked="data-unchecked",t.disabled="data-disabled",t.readonly="data-readonly",t.required="data-required",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),x={...v.fieldValidityMapping,checked:e=>e?{[S.checked]:""}:{[S.unchecked]:""}};var m=e.i(469690),y=e.i(381104),w=e.i(884708),E=e.i(247778),b=e.i(31421),R=e.i(538489),C=e.i(675606),O=e.i(56434),P=e.i(606039);let T=n.forwardRef(function(e,t){let{checked:h,className:v,defaultChecked:S,"aria-labelledby":T,form:k,id:M,inputRef:I,name:A,nativeButton:H=!1,onCheckedChange:N,readOnly:F=!1,required:z=!1,disabled:j=!1,render:D,uncheckedValue:W,value:Y,style:L,...X}=e,{clearErrors:B}=(0,w.useFormContext)(),{state:V,setTouched:$,setDirty:K,validityData:U,setFilled:_,setFocused:G,validationMode:q,disabled:J,name:Q,validation:Z}=(0,m.useFieldRootContext)(),{labelId:ee}=(0,E.useLabelableContext)(),et=J||j,er=Q??A,en=n.useRef(null),eo=(0,a.useMergedRefs)(en,I,Z.inputRef),ea=n.useRef(null),ei=(0,f.useBaseUiId)(),el=(0,R.useLabelableId)({id:M,implicit:!1,controlRef:ea}),es=H?void 0:el,[eu,ec]=(0,o.useControlled)({controlled:h,default:!!S,name:"Switch",state:"checked"});(0,y.useRegisterFieldControl)(ea,ei,eu,void 0,!et,A),(0,i.useIsoLayoutEffect)(()=>{en.current&&_(en.current.checked)},[en,_]),(0,P.useValueChanged)(eu,()=>{B(er),K(eu!==U.initialValue),_(eu),Z.change(eu)});let{getButtonProps:ed,buttonRef:ef}=(0,p.useButton)({disabled:et,native:H}),ep=(0,b.useAriaLabelledBy)(T,ee,en,!H,es),eh=(0,d.mergeProps)({checked:eu,disabled:et,form:k,id:es,name:er,required:z,style:er?l.visuallyHiddenInput:l.visuallyHidden,tabIndex:-1,type:"checkbox","aria-hidden":!0,ref:eo,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(F)return void e.preventDefault();let t=e.currentTarget.checked,r=(0,C.createChangeEventDetails)(O.REASONS.none,e.nativeEvent);N?.(t,r),r.isCanceled||ec(t)},onFocus(){ea.current?.focus()}},e=>Z.getValidationProps(et,e),void 0!==Y?{value:Y}:s.EMPTY_OBJECT),eg=n.useMemo(()=>({...V,checked:eu,disabled:et,readOnly:F,required:z}),[V,eu,et,F,z]),ev=(0,c.useRenderElement)("span",e,{state:eg,ref:[t,ea,ef],props:[{id:H?el:ei,role:"switch","aria-checked":eu,"aria-readonly":F||void 0,"aria-required":z||void 0,"aria-labelledby":ep,onFocus(){et||G(!0)},onBlur(){let e=en.current;e&&!et&&($(!0),G(!1),"onBlur"===q&&Z.commit(e.checked))},onClick(e){if(F||et)return;e.preventDefault();let t=en.current;t&&t.dispatchEvent(new((0,u.ownerWindow)(t)).PointerEvent("click",{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey}))}},X,ed,e=>Z.getValidationProps(et,e)],stateAttributesMapping:x});return(0,r.jsxs)(g.Provider,{value:eg,children:[ev,!eu&&er&&void 0!==W&&(0,r.jsx)("input",{type:"hidden",form:k,name:er,value:W,disabled:et}),(0,r.jsx)("input",{...eh,suppressHydrationWarning:!0})]})}),k=n.forwardRef(function(e,t){let{render:r,className:o,style:a,...i}=e,l=function(){let e=n.useContext(g);if(void 0===e)throw Error((0,h.default)(63));return e}();return(0,c.useRenderElement)("span",e,{state:l,ref:t,stateAttributesMapping:x,props:i})});e.s(["Root",0,T,"Thumb",0,k],450994);var M=e.i(450994),M=M,I=e.i(115504);e.s(["Switch",0,function({className:e,size:t="default",...n}){return(0,r.jsx)(M.Root,{"data-slot":"switch","data-size":t,className:(0,I.cn)("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",e),...n,children:(0,r.jsx)(M.Thumb,{"data-slot":"switch-thumb",className:"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"})})}],699375)},337822,e=>{"use strict";var t,r=e.i(843476);e.s([],158421),e.i(158421);var n=e.i(271645),o=e.i(956789),a=e.i(17989),i=e.i(46420);e.i(247167);var l=e.i(733332);let s=n.createContext(void 0);function u(e){let t=n.useContext(s);if(void 0===t&&!e)throw Error((0,l.default)(47));return t}var c=e.i(174080),d=e.i(301252),f=e.i(616269),p=e.i(439957),h=e.i(56434),g=e.i(264111),v=e.i(116786),S=e.i(990627),x=e.i(638396);let m={...v.popupStoreSelectors,disabled:(0,f.createSelector)(e=>e.disabled),instantType:(0,f.createSelector)(e=>e.instantType),openMethod:(0,f.createSelector)(e=>e.openMethod),openChangeReason:(0,f.createSelector)(e=>e.openChangeReason),modal:(0,f.createSelector)(e=>e.modal),focusManagerModal:(0,f.createSelector)(e=>e.focusManagerModal),stickIfOpen:(0,f.createSelector)(e=>e.stickIfOpen),titleElementId:(0,f.createSelector)(e=>e.titleElementId),descriptionElementId:(0,f.createSelector)(e=>e.descriptionElementId),openOnHover:(0,f.createSelector)(e=>e.openOnHover),closeDelay:(0,f.createSelector)(e=>e.closeDelay),hasViewport:(0,f.createSelector)(e=>e.hasViewport)};class y extends d.ReactStore{constructor(e,t,r=!1){const o={...(0,v.createInitialPopupStoreState)(),disabled:!1,modal:!1,focusManagerModal:!1,instantType:void 0,openMethod:null,openChangeReason:null,titleElementId:void 0,descriptionElementId:void 0,stickIfOpen:!0,nested:!1,openOnHover:!1,closeDelay:0,hasViewport:!1,...e},a=new S.PopupTriggerMap;o.open&&e?.mounted===void 0&&(o.mounted=!0),o.floatingRootContext=(0,v.createPopupFloatingRootContext)(a,t,r),super(o,{popupRef:n.createRef(),backdropRef:n.createRef(),internalBackdropRef:n.createRef(),onOpenChange:void 0,onOpenChangeComplete:void 0,triggerFocusTargetRef:n.createRef(),beforeContentFocusGuardRef:n.createRef(),stickIfOpenTimeout:new p.Timeout,triggerElements:a},m)}setOpen=(e,t)=>{let r=t.reason===h.REASONS.triggerHover,n=t.reason===h.REASONS.triggerPress&&0===t.event.detail,o=!e&&(t.reason===h.REASONS.escapeKey||null==t.reason),a=(0,g.attachPreventUnmountOnClose)(t),i=this.select("activeTriggerId");if(e||t.reason!==h.REASONS.closePress||null!=t.trigger||null==i||(t.trigger=this.context.triggerElements.getById(i)??this.select("activeTriggerElement")??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let l=()=>{let r={open:e,openChangeReason:t.reason};(0,g.setPopupOpenState)(r,e,t.trigger,a()),this.update(r)};r?(this.set("stickIfOpen",!0),this.context.stickIfOpenTimeout.start(x.PATIENT_CLICK_THRESHOLD,()=>{this.set("stickIfOpen",!1)}),c.flushSync(l)):l(),n||o?this.set("instantType",n?"click":"dismiss"):t.reason===h.REASONS.focusOut?this.set("instantType","focus"):this.set("instantType",void 0)};static useStore(e,t){let{store:r,internalStore:o}=(0,g.usePopupStore)(e,(e,r)=>new y(t,e,r));return n.useEffect(()=>o?.disposeEffect(),[o]),r}disposeEffect=()=>this.context.stickIfOpenTimeout.disposeEffect()}var w=e.i(675606),E=e.i(176782);function b({props:e}){let{children:t,open:o,defaultOpen:a=!1,onOpenChange:l,onOpenChangeComplete:u,modal:c=!1,handle:d,triggerId:f,defaultTriggerId:p=null}=e,v=y.useStore(d?.store,{modal:c,open:a,openProp:o,activeTriggerId:p,triggerIdProp:f});(0,g.useInitialOpenSync)(v,o,a,p),v.useControlledProp("openProp",o),v.useControlledProp("triggerIdProp",f);let S=v.useState("open"),x=v.useState("mounted"),m=v.useState("payload"),E=null!=(0,i.useFloatingParentNodeId)();v.useContextCallback("onOpenChange",l),v.useContextCallback("onOpenChangeComplete",u),(0,g.usePopupRootSync)(v,S),(0,g.useImplicitActiveTrigger)(v);let{forceUnmount:C}=(0,g.useOpenStateTransitions)(S,v,()=>{v.update({stickIfOpen:!0,openChangeReason:null})});v.useSyncedValues({modal:c,nested:E}),n.useEffect(()=>{S||v.context.stickIfOpenTimeout.clear()},[v,S]);let O=n.useCallback(()=>{v.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction))},[v]);n.useImperativeHandle(e.actionsRef,()=>({unmount:C,close:O}),[C,O]);let P=S||x,T=n.useMemo(()=>({store:v}),[v]);return(0,r.jsxs)(s.Provider,{value:T,children:[P&&(0,r.jsx)(R,{store:v,modal:c}),"function"==typeof t?t({payload:m}):t]})}function R({store:e,modal:t}){let r=e.useState("floatingRootContext"),i=(0,a.useDismiss)(r,{outsidePressEvent:{mouse:"trap-focus"===t?"sloppy":"intentional",touch:"sloppy"}}),l=i.reference??o.EMPTY_OBJECT,s=i.trigger??o.EMPTY_OBJECT,u=n.useMemo(()=>(0,E.mergeProps)(g.FOCUSABLE_POPUP_PROPS,i.floating),[i.floating]);return(0,g.usePopupInteractionProps)(e,{activeTriggerProps:l,inactiveTriggerProps:s,popupProps:u}),null}var C=e.i(540886),O=e.i(405005),P=e.i(552245),T=e.i(650316),k=e.i(385689),M=e.i(872135),I=e.i(788015),A=e.i(152535),H=e.i(346570),N=e.i(32199);let F=n.forwardRef(function(e,t){let{render:o,className:a,style:i,disabled:s=!1,nativeButton:c=!0,handle:d,payload:f,openOnHover:p=!1,delay:v=300,closeDelay:S=0,id:m,...y}=e,w=u(!0),E=d?.store??w?.store;if(!E)throw Error((0,l.default)(74));let b=(0,I.useBaseUiId)(m),R=E.useState("isTriggerActive",b),F=E.useState("floatingRootContext"),z=E.useState("isOpenedByTrigger",b),j=E.useState("triggerPopupId",b),D=n.useRef(null),{registerTrigger:W,isMountedByThisTrigger:Y}=(0,g.useTriggerDataForwarding)(b,D,E,{payload:f,disabled:s,openOnHover:p,closeDelay:S}),L=E.useState("openChangeReason"),X=E.useState("stickIfOpen"),B=E.useState("openMethod"),V=E.useState("focusManagerModal"),$=(0,M.useHoverReferenceInteraction)(F,{enabled:!s&&null!=F&&p&&("touch"!==B||L!==h.REASONS.triggerPress),mouseOnly:!0,move:!1,handleClose:(0,T.safePolygon)(),restMs:v,delay:{close:S},triggerElementRef:D,isActiveTrigger:R,isClosing:()=>"ending"===E.select("transitionStatus")}),K=(0,k.useClick)(F,{enabled:null!=F,stickIfOpen:X}),U=(0,N.useOpenMethodTriggerProps)(()=>E.select("open"),e=>{E.set("openMethod",e)}),_=E.useState("triggerProps",Y),{getButtonProps:G,buttonRef:q}=(0,C.useButton)({disabled:s,native:c}),{preFocusGuardRef:J,handlePreFocusGuardFocus:Q,handleFocusTargetFocus:Z}=(0,H.useTriggerFocusGuards)(E,D),ee=(0,P.useRenderElement)("button",e,{state:{disabled:s,open:z},ref:[q,t,W,D],props:[K.reference,$,_,U,{[x.CLICK_TRIGGER_IDENTIFIER]:"",id:b,"aria-haspopup":"dialog","aria-expanded":z,"aria-controls":j},y,G],stateAttributesMapping:{open:e=>e&&L===h.REASONS.triggerPress?O.pressableTriggerOpenStateMapping.open(e):O.triggerOpenStateMapping.open(e)}});return Y&&!V?(0,r.jsxs)(n.Fragment,{children:[(0,r.jsx)(A.FocusGuard,{ref:J,onFocus:Q}),(0,r.jsx)(n.Fragment,{children:ee},b),(0,r.jsx)(A.FocusGuard,{ref:E.context.triggerFocusTargetRef,onFocus:Z})]}):(0,r.jsx)(n.Fragment,{children:ee},b)});var z=e.i(726674);let j=n.createContext(void 0),D=n.forwardRef(function(e,t){let{keepMounted:n=!1,...o}=e,{store:a}=u();return a.useState("mounted")||n?(0,r.jsx)(j.Provider,{value:n,children:(0,r.jsx)(z.FloatingPortal,{ref:t,...o})}):null});var W=e.i(144394),Y=e.i(146376);let L=n.createContext(void 0);function X(){let e=n.useContext(L);if(!e)throw Error((0,l.default)(46));return e}var B=e.i(329365),V=e.i(426),$=e.i(222640),K=e.i(360495),U=e.i(789579),_=e.i(33383);let G=n.forwardRef(function(e,t){let{render:o,className:a,style:s,anchor:c,positionMethod:d="absolute",side:f="bottom",align:p="center",sideOffset:g=0,alignOffset:v=0,collisionBoundary:S="clipping-ancestors",collisionPadding:m=5,arrowPadding:y=5,sticky:w=!1,disableAnchorTracking:E=!1,collisionAvoidance:b=x.POPUP_COLLISION_AVOIDANCE,...R}=e,{store:C}=u(),O=function(){let e=n.useContext(j);if(void 0===e)throw Error((0,l.default)(45));return e}(),P=(0,i.useFloatingNodeId)(),T=C.useState("floatingRootContext"),k=C.useState("mounted"),M=C.useState("open"),I=C.useState("openChangeReason"),A=C.useState("activeTriggerElement"),H=C.useState("modal"),N=C.useState("openMethod"),F=C.useState("positionerElement"),z=C.useState("instantType"),D=C.useState("transitionStatus"),X=C.useState("hasViewport"),G=n.useRef(null),q=(0,$.useAnimationsFinished)(F,!1,!1),J=(0,B.useAnchorPositioning)({anchor:c,floatingRootContext:T,positionMethod:d,mounted:k,side:f,sideOffset:g,align:p,alignOffset:v,arrowPadding:y,collisionBoundary:S,collisionPadding:m,sticky:w,disableAnchorTracking:E,keepMounted:O,nodeId:P,collisionAvoidance:b,adaptiveOrigin:X?K.adaptiveOrigin:void 0}),Q=T.useState("domReferenceElement");(0,Y.useIsoLayoutEffect)(()=>{let e=G.current;if(Q&&(G.current=Q),e&&Q&&Q!==e){C.set("instantType",void 0);let e=new AbortController;return q(()=>{C.set("instantType","trigger-change")},e.signal),()=>{e.abort()}}},[Q,q,C]),(0,_.useAnchoredPopupScrollLock)(M&&!0===H&&I!==h.REASONS.triggerHover,"touch"===N,F,A);let Z=n.useCallback(e=>{C.set("positionerElement",e)},[C]),ee={open:M,side:J.side,align:J.align,anchorHidden:J.anchorHidden,instant:z},et=(0,U.usePositioner)(e,ee,{styles:J.positionerStyles,transitionStatus:D,props:R,refs:[t,Z],hidden:!k,inert:!M});return(0,r.jsxs)(L.Provider,{value:J,children:[k&&!0===H&&I!==h.REASONS.triggerHover&&(0,r.jsx)(V.InternalBackdrop,{ref:C.context.internalBackdropRef,inert:(0,W.inertValue)(!M),cutout:A}),(0,r.jsx)(i.FloatingNode,{id:P,children:et})]})});var q=e.i(229315),J=e.i(61487),Q=e.i(431157),Z=e.i(209407),ee=e.i(137584),et=e.i(673327),er=e.i(96533),en=e.i(815982),eo=e.i(667865);let ea=n.createContext(void 0);function ei(e){let{value:t,children:n}=e;return(0,r.jsx)(ea.Provider,{value:t,children:n})}let el={...O.popupStateMapping,...Z.transitionStatusMapping},es=n.forwardRef(function(e,t){let{render:o,className:a,style:i,initialFocus:l,finalFocus:s,...c}=e,{store:d}=u(),f=X(),p=null!=(0,er.useToolbarRootContext)(!0),{context:v,hasClosePart:S}=function(){let[e,t]=n.useState(0),r=(0,eo.useStableCallback)(()=>(t(e=>e+1),()=>{t(e=>Math.max(0,e-1))}));return{context:n.useMemo(()=>({register:r}),[r]),hasClosePart:e>0}}(),x=d.useState("open"),m=d.useState("openMethod"),y=d.useState("instantType"),w=d.useState("transitionStatus"),E=d.useState("popupProps"),b=d.useState("titleElementId"),R=d.useState("descriptionElementId"),C=d.useState("modal"),O=d.useState("mounted"),T=d.useState("openChangeReason"),k=d.useState("activeTriggerElement"),M=d.useState("floatingRootContext"),I=M.useState("floatingId"),A=d.useState("disabled"),H=d.useState("openOnHover"),N=d.useState("closeDelay"),F=c.id??I;(0,ee.useOpenChangeComplete)({open:x,ref:d.context.popupRef,onComplete(){x&&d.context.onOpenChangeComplete?.(!0)}}),(0,Q.useHoverFloatingInteraction)(M,{enabled:H&&!A,closeDelay:N});let z=void 0===l?(0,g.createDefaultInitialFocus)(d.context.popupRef):l,j=!1!==C&&S;d.useSyncedValue("focusManagerModal",j);let D=n.useCallback(e=>{d.set("popupElement",e)},[d]),W={open:x,side:f.side,align:f.align,instant:y,transitionStatus:w},Y=(0,P.useRenderElement)("div",e,{state:W,ref:[t,d.context.popupRef,D],props:[E,{id:F,role:"dialog",...g.FOCUSABLE_POPUP_PROPS,"aria-labelledby":b,"aria-describedby":R,onKeyDown(e){p&&et.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()}},(0,en.getDisabledMountTransitionStyles)(w),c],stateAttributesMapping:el});return(0,r.jsx)(J.FloatingFocusManager,{context:M,openInteractionType:m,modal:j,disabled:!O||T===h.REASONS.triggerHover,initialFocus:z,returnFocus:s,restoreFocus:"popup",previousFocusableElement:(0,q.isHTMLElement)(k)?k:void 0,nextFocusableElement:d.context.triggerFocusTargetRef,beforeContentFocusGuardRef:d.context.beforeContentFocusGuardRef,children:(0,r.jsx)(ei,{value:v,children:Y})})}),eu=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=i.useState("open"),{arrowRef:s,side:c,align:d,arrowUncentered:f,arrowStyles:p}=X();return(0,P.useRenderElement)("div",e,{state:{open:l,side:c,align:d,uncentered:f},ref:[t,s],props:[{style:p,"aria-hidden":!0},a],stateAttributesMapping:O.popupStateMapping})}),ec={...O.popupStateMapping,...Z.transitionStatusMapping},ed=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=i.useState("open"),s=i.useState("mounted"),c=i.useState("transitionStatus"),d=i.useState("openChangeReason");return(0,P.useRenderElement)("div",e,{state:{open:l,transitionStatus:c},ref:[i.context.backdropRef,t],props:[{role:"presentation",hidden:!s,style:{pointerEvents:d===h.REASONS.triggerHover?"none":void 0,userSelect:"none",WebkitUserSelect:"none"}},a],stateAttributesMapping:ec})}),ef=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=(0,I.useBaseUiId)(a.id);return i.useSyncedValueWithCleanup("titleElementId",l),(0,P.useRenderElement)("h2",e,{ref:t,props:[{id:l},a]})}),ep=n.forwardRef(function(e,t){let{render:r,className:n,style:o,...a}=e,{store:i}=u(),l=(0,I.useBaseUiId)(a.id);return i.useSyncedValueWithCleanup("descriptionElementId",l),(0,P.useRenderElement)("p",e,{ref:t,props:[{id:l},a]})}),eh=n.forwardRef(function(e,t){let r,{render:o,className:a,style:i,disabled:l=!1,nativeButton:s=!0,...c}=e,{buttonRef:d,getButtonProps:f}=(0,C.useButton)({disabled:l,focusableWhenDisabled:!1,native:s}),{store:p}=u();return r=n.useContext(ea),(0,Y.useIsoLayoutEffect)(()=>r?.register(),[r]),(0,P.useRenderElement)("button",e,{ref:[t,d],props:[{onClick(e){p.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.closePress,e.nativeEvent))}},c,f]})}),eg=((t={}).popupWidth="--popup-width",t.popupHeight="--popup-height",t);var ev=e.i(818390);let eS={activationDirection:e=>e?{"data-activation-direction":e}:null},ex=n.forwardRef(function(e,t){let{render:r,className:n,style:o,children:a,...i}=e,{store:l}=u(),{side:s}=X(),c=l.useState("instantType"),{children:d,state:f}=(0,ev.usePopupViewport)({store:l,side:s,cssVars:eg,children:a}),p={activationDirection:f.activationDirection,transitioning:f.transitioning,instant:c};return(0,P.useRenderElement)("div",e,{state:p,ref:t,props:[i,{children:d}],stateAttributesMapping:eS})});class em{constructor(){this.store=new y}open(e){let t=e?this.store.context.triggerElements.getById(e)??void 0:void 0;if(e&&!t)throw Error((0,l.default)(80,e));this.store.setOpen(!0,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction,void 0,t))}close(){this.store.setOpen(!1,(0,w.createChangeEventDetails)(h.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",0,eu,"Backdrop",0,ed,"Close",0,eh,"Description",0,ep,"Handle",0,em,"Popup",0,es,"Portal",0,D,"Positioner",0,G,"Root",0,function(e){return u(!0)?(0,r.jsx)(b,{props:e}):(0,r.jsx)(i.FloatingTree,{children:(0,r.jsx)(b,{props:e})})},"Title",0,ef,"Trigger",0,F,"Viewport",0,ex,"createHandle",0,function(){return new em}],466914);var ey=e.i(466914),ey=ey,ew=e.i(115504);e.s(["Popover",0,function({...e}){return(0,r.jsx)(ey.Root,{"data-slot":"popover",...e})},"PopoverContent",0,function({className:e,align:t="center",alignOffset:n=0,side:o="bottom",sideOffset:a=4,...i}){return(0,r.jsx)(ey.Portal,{children:(0,r.jsx)(ey.Positioner,{align:t,alignOffset:n,side:o,sideOffset:a,className:"isolate z-50",children:(0,r.jsx)(ey.Popup,{"data-slot":"popover-content",className:(0,ew.cn)("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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),...i})})})},"PopoverTrigger",0,function({...e}){return(0,r.jsx)(ey.Trigger,{"data-slot":"popover-trigger",...e})}],337822)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0fldyxjw1x7b3.js b/litellm/proxy/_experimental/out/_next/static/chunks/0fldyxjw1x7b3.js new file mode 100644 index 00000000000..0ff1c3df24a --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0fldyxjw1x7b3.js @@ -0,0 +1,89 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,366321,e=>{"use strict";var t=e.i(843476),s=e.i(708347),r=e.i(475254);let l=(0,r.default)("circle-help",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);var a=e.i(555436),n=e.i(487486),i=e.i(519455),o=e.i(950594),c=e.i(967489),d=e.i(677572),u=e.i(746798),m=e.i(571303),h=e.i(868499),x=e.i(844444),p=e.i(271645),g=e.i(266027),f=e.i(500727),j=e.i(912598),v=e.i(243652),b=e.i(602869),y=e.i(135214);let _=(0,v.createQueryKeys)("mcpServerHealth");var N=e.i(727749),w=e.i(988846),k=e.i(678784),C=e.i(995926),T=e.i(328196),S=e.i(302202),A=e.i(409797),I=e.i(54131),O=e.i(440987);let P=[{label:"Documentation",fields:[{key:"description",label:"Description",description:"Must have a non-empty description",check:e=>!!e.description?.trim()},{key:"alias",label:"Alias",description:"Must have a display alias",check:e=>!!e.alias?.trim()}]},{label:"Source",fields:[{key:"source_url",label:"GitHub / Source URL",description:"Must link to a source repository",check:e=>!!e.source_url?.trim()}]},{label:"Connection",fields:[{key:"url",label:"Server URL",description:"Must have a URL configured",check:e=>!!e.url?.trim()}]},{label:"Security",fields:[{key:"auth_type",label:"Auth configured",description:"Must use authentication (not 'none')",check:e=>!!e.auth_type&&"none"!==e.auth_type}]}],M=P.flatMap(e=>e.fields),F="mcp_required_fields",E={active:{label:"Active",bg:"bg-green-50",text:"text-green-700",dot:"bg-green-500"},pending_review:{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"}};function L({label:e,value:s,color:r}){return(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg px-4 py-3",children:[(0,t.jsx)("div",{className:`text-2xl font-bold ${r}`,children:s}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-0.5",children:e})]})}function R({action:e,serverName:s,isCurrentlyActive:r,onConfirm:l,onCancel:a}){let[n,i]=(0,p.useState)(""),o="approve"===e;return(0,t.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,t.jsxs)("div",{className:"bg-white rounded-xl shadow-xl p-6 max-w-sm w-full mx-4",children:[(0,t.jsx)("div",{className:`w-10 h-10 rounded-full flex items-center justify-center mb-4 ${o?"bg-green-100":"bg-red-100"}`,children:o?(0,t.jsx)(k.CheckIcon,{className:"h-5 w-5 text-green-600"}):(0,t.jsx)(T.AlertCircleIcon,{className:"h-5 w-5 text-red-600"})}),(0,t.jsx)("h3",{className:"text-base font-semibold text-gray-900 mb-1",children:o?"Approve MCP Server":"Reject MCP Server"}),(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-4",children:["Are you sure you want to ",e," ",(0,t.jsxs)("span",{className:"font-medium text-gray-700",children:['"',s,'"']}),"?"," ",o?"This will activate the server. The submitting user will see it in their MCP Servers list once approved.":r?"This server is currently live. Rejecting it will immediately remove it from the proxy runtime.":"This will mark the submission as rejected."]}),!o&&(0,t.jsx)("textarea",{placeholder:"Reason for rejection (optional)",value:n,onChange:e=>i(e.target.value),className:"w-full border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 placeholder-gray-400 focus:outline-hidden focus:ring-1 focus:ring-blue-500 mb-4 resize-none",rows:3}),(0,t.jsxs)("div",{className:"flex gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:a,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,t.jsx)("button",{type:"button",onClick:()=>l(o?void 0:n||void 0),className:`flex-1 text-white text-sm font-medium py-2 rounded-md transition-colors ${o?"bg-green-500 hover:bg-green-600":"bg-red-500 hover:bg-red-600"}`,children:o?"Approve":"Reject"})]})]})})}function U({requiredFields:e,onChange:s,onSave:r,isSaving:l}){let[a,n]=(0,p.useState)(!1),i=M.filter(t=>e.includes(t.key));return(0,t.jsxs)("div",{className:"mb-5 border border-gray-200 rounded-lg bg-white overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 cursor-pointer select-none",onClick:()=>n(e=>!e),children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(O.SettingsIcon,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-800",children:"Submission Rules"}),i.length>0?(0,t.jsxs)("span",{className:"text-xs text-gray-500",children:["(",i.length," required field",1!==i.length?"s":"",")"]}):(0,t.jsx)("span",{className:"text-xs text-gray-400 italic",children:"no rules set"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[!a&&i.length>0&&(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5 max-w-md",children:i.map(e=>(0,t.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs bg-blue-50 text-blue-700 border border-blue-200 px-2 py-0.5 rounded-full",children:[(0,t.jsx)(k.CheckIcon,{className:"h-3 w-3"}),e.label]},e.key))}),a?(0,t.jsx)(I.ChevronUpIcon,{className:"h-4 w-4 text-gray-400"}):(0,t.jsx)(A.ChevronDownIcon,{className:"h-4 w-4 text-gray-400"})]})]}),a&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 pt-4 pb-4",children:[(0,t.jsx)("p",{className:"text-xs text-gray-500 mb-4",children:"Select which fields must be filled in before a submission is considered compliant. LiteLLM will show ✓ / ✗ for each rule on every submission card below."}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-8 gap-y-5",children:P.map(r=>(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2",children:r.label}),(0,t.jsx)("div",{className:"space-y-2",children:r.fields.map(r=>{let l=e.includes(r.key);return(0,t.jsxs)("label",{className:"flex items-start gap-2.5 cursor-pointer group",children:[(0,t.jsx)("input",{type:"checkbox",checked:l,onChange:()=>{var t;return t=r.key,void s(e.includes(t)?e.filter(e=>e!==t):[...e,t])},className:"mt-0.5 h-4 w-4 rounded-sm border-gray-300 text-blue-600 focus:ring-blue-500 cursor-pointer"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-medium text-gray-800 group-hover:text-blue-700 transition-colors",children:r.label}),(0,t.jsx)("div",{className:"text-xs text-gray-400",children:r.description})]})]},r.key)})})]},r.label))}),(0,t.jsxs)("div",{className:"mt-5 flex items-center gap-3",children:[(0,t.jsx)("button",{type:"button",disabled:l,onClick:async()=>{await r(),n(!1)},className:"px-4 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 disabled:opacity-50 rounded-md transition-colors",children:l?"Saving…":"Save Rules"}),(0,t.jsx)("button",{type:"button",onClick:()=>n(!1),className:"px-4 py-1.5 text-sm font-medium text-gray-600 hover:text-gray-900 border border-gray-200 rounded-md hover:bg-gray-50 transition-colors",children:"Cancel"})]})]})]})}function z({server:e,onApprove:s,onReject:r,requiredFields:l}){let a=e.approval_status??"active",n=E[a]??E.active,i=M.filter(e=>l.includes(e.key)).map(t=>({key:t.key,label:t.label,description:t.description,passed:t.check(e)})),o=i.filter(e=>e.passed).length,c=i.length-o,d=i.length>0&&0===c;return(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"px-4 pt-4 pb-3",children:(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:"flex items-center gap-2 mb-1.5",children:(0,t.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${n.bg} ${n.text}`,children:[(0,t.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${n.dot}`}),n.label]})}),(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:e.alias??e.server_name??e.server_id}),e.description&&(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5 line-clamp-1",children:e.description}),e.url&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5 mt-1.5",children:[(0,t.jsx)(S.ServerIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0"}),(0,t.jsx)("code",{className:"text-xs text-gray-500 font-mono truncate",children:e.url})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 mt-1.5 text-xs text-gray-400",children:[(0,t.jsxs)("span",{children:["Transport: ",(0,t.jsx)("span",{className:"text-gray-600",children:e.transport??"sse"})]}),(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)("span",{children:["Submitted by: ",(0,t.jsx)("span",{className:"text-gray-600",children:e.submitted_by??"—"})]}),(0,t.jsx)("span",{children:"·"}),(0,t.jsx)("span",{children: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)})]}),"rejected"===a&&e.review_notes&&(0,t.jsxs)("p",{className:"text-xs text-red-600 mt-1.5",children:["Rejection reason: ",e.review_notes]})]}),0===i.length&&"rejected"!==a&&(0,t.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:["active"!==a&&(0,t.jsx)("button",{type:"button",onClick:s,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,t.jsx)("button",{type:"button",onClick:r,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===i.length&&"rejected"===a&&(0,t.jsx)("div",{className:"flex items-center gap-2 shrink-0",children:(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-500 hover:bg-green-600 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Re-approve"})})]})}),i.length>0&&(0,t.jsxs)("div",{className:"border-t border-gray-200",children:[(0,t.jsxs)("div",{className:`flex items-center gap-3 px-4 py-3 ${d?"bg-green-50 border-b border-green-100":"bg-red-50 border-b border-red-100"}`,children:[(0,t.jsx)("div",{className:`w-8 h-8 rounded-full flex items-center justify-center shrink-0 ${d?"bg-green-500":"bg-red-500"}`,children:d?(0,t.jsx)(k.CheckIcon,{className:"h-4 w-4 text-white"}):(0,t.jsx)(C.XIcon,{className:"h-4 w-4 text-white"})}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:`text-sm font-semibold leading-tight ${d?"text-green-800":"text-red-800"}`,children:d?"All checks passed":`${c} check${1!==c?"s":""} failed`}),(0,t.jsxs)("div",{className:"text-xs text-gray-500 mt-0.5",children:[o," passing, ",c," failing"]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:["active"!==a&&"rejected"!==a&&(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-600 hover:bg-green-700 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Approve"}),"rejected"===a&&(0,t.jsx)("button",{type:"button",onClick:s,className:"text-xs bg-green-600 hover:bg-green-700 text-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Re-approve"}),"rejected"!==a&&(0,t.jsx)("button",{type:"button",onClick:r,className:"text-xs border border-red-300 text-red-600 hover:bg-red-50 bg-white px-3 py-1.5 rounded-md transition-colors font-medium",children:"Reject"})]})]}),(0,t.jsx)("div",{className:"divide-y divide-gray-100",children:i.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-3 px-4 py-2.5",children:[(0,t.jsx)("div",{className:`w-5 h-5 rounded-full flex items-center justify-center shrink-0 ${e.passed?"bg-green-100":"bg-red-100"}`,children:e.passed?(0,t.jsx)(k.CheckIcon,{className:"h-3 w-3 text-green-600"}):(0,t.jsx)(C.XIcon,{className:"h-3 w-3 text-red-600"})}),(0,t.jsx)("span",{className:`text-sm flex-1 ${e.passed?"text-gray-700":"text-gray-800"}`,children:e.label}),(0,t.jsx)("span",{className:`text-xs ${e.passed?"text-green-600":"text-red-500"}`,children:e.passed?"Passes":"Missing"})]},e.key))})]})]})}function V({accessToken:e}){let[s,r]=(0,p.useState)({total:0,pending_review:0,active:0,rejected:0,items:[]}),[l,a]=(0,p.useState)(""),[n,i]=(0,p.useState)("all"),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(!0),[m,h]=(0,p.useState)(null),[x,g]=(0,p.useState)([]),[f,j]=(0,p.useState)(!1),v=(0,p.useCallback)(async()=>{if(!e)return void u(!1);u(!0),h(null);try{let[t,s]=await Promise.all([(0,b.fetchMCPSubmissions)(e),(0,b.getGeneralSettingsCall)(e).catch(e=>(console.warn("MCPSubmissionsTab: failed to load general settings, compliance rules will be empty:",e),null))]);if(r(t),s?.data&&Array.isArray(s.data)){let e=s.data.find(e=>e.field_name===F);e&&Array.isArray(e.field_value)&&g(e.field_value)}}catch(e){h(e instanceof Error?e.message:"Failed to load submissions")}finally{u(!1)}},[e]);(0,p.useEffect)(()=>{v()},[v]);let y=async()=>{if(e){j(!0);try{await (0,b.updateConfigFieldSetting)(e,F,x),N.default.success("Submission rules saved")}catch{N.default.fromBackend("Failed to save submission rules")}finally{j(!1)}}},_=s.items.filter(e=>{if("all"!==n&&e.approval_status!==n)return!1;if(l.trim()){let t=l.toLowerCase(),s=(e.alias??e.server_name??e.server_id??"").toLowerCase(),r=(e.url??"").toLowerCase();return s.includes(t)||r.includes(t)}return!0});async function k(t,s){if(e)try{await (0,b.approveMCPServer)(e,t),await v(),N.default.success(`MCP server "${s}" approved`)}catch{N.default.fromBackend("Failed to approve MCP server")}finally{c(null)}}async function C(t,s,r){if(e)try{await (0,b.rejectMCPServer)(e,t,r),await v(),N.default.success(`MCP server "${s}" rejected`)}catch{N.default.fromBackend("Failed to reject MCP server")}finally{c(null)}}return(0,t.jsxs)("div",{className:"p-6",children:[(0,t.jsx)(U,{requiredFields:x,onChange:g,onSave:y,isSaving:f}),(0,t.jsxs)("div",{className:"grid grid-cols-4 gap-4 mb-6",children:[(0,t.jsx)(L,{label:"Total Submitted",value:s.total,color:"text-gray-900"}),(0,t.jsx)(L,{label:"Pending Review",value:s.pending_review,color:"text-yellow-600"}),(0,t.jsx)(L,{label:"Active",value:s.active,color:"text-green-600"}),(0,t.jsx)(L,{label:"Rejected",value:s.rejected,color:"text-red-600"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-5",children:[(0,t.jsxs)("div",{className:"relative flex-1 max-w-xs",children:[(0,t.jsx)(w.SearchIcon,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400"}),(0,t.jsx)("input",{type:"text",placeholder:"Search MCP servers...",value:l,onChange:e=>a(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,t.jsxs)("select",{value:n,onChange:e=>i(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,t.jsx)("option",{value:"all",children:"All Status"}),(0,t.jsx)("option",{value:"pending_review",children:"Pending Review"}),(0,t.jsx)("option",{value:"active",children:"Active"}),(0,t.jsx)("option",{value:"rejected",children:"Rejected"})]})]}),(0,t.jsxs)("div",{className:"space-y-3",children:[d&&(0,t.jsx)("div",{className:"text-center py-12 text-gray-500 text-sm",children:"Loading submissions…"}),m&&(0,t.jsx)("div",{className:"text-center py-12 text-red-600 text-sm",children:m}),!d&&!m&&0===_.length&&(0,t.jsx)("div",{className:"text-center py-12 text-gray-400 text-sm",children:"No MCP server submissions match your filters."}),!d&&!m&&_.map(e=>(0,t.jsx)(z,{server:e,requiredFields:x,onApprove:()=>c({serverId:e.server_id,serverName:e.alias??e.server_name??e.server_id,action:"approve"}),onReject:()=>c({serverId:e.server_id,serverName:e.alias??e.server_name??e.server_id,action:"reject",isCurrentlyActive:"active"===e.approval_status})},e.server_id))]}),o&&(0,t.jsx)(R,{action:o.action,serverName:o.serverName,isCurrentlyActive:o.isCurrentlyActive,onConfirm:e=>"approve"===o.action?k(o.serverId,o.serverName):C(o.serverId,o.serverName,e),onCancel:()=>c(null)})]})}var H=e.i(994388),D=e.i(599724),B=e.i(629569),q=e.i(212931),$=e.i(808613),W=e.i(311451),K=e.i(998573),G=e.i(482725),Y=e.i(988297),J=e.i(332102),Q=e.i(699857);e.i(707701);var Z=e.i(807235),X=e.i(174886);let ee=(0,r.default)("link-2",[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]]);var et=e.i(541071),es=e.i(788699),er=e.i(727612),el=e.i(494862);e.i(622826);var ea=e.i(200208),en=e.i(399536),ei=e.i(997422),eo=e.i(755146),ec=e.i(115504),ed=e.i(500330);function eu(e,t){return e?`${e}-${t}`:t}function em(e){return`${(0,b.getProxyBaseUrl)()}/toolset/${e}/mcp`}function eh({toolset:e,isAdmin:s,onEditClick:r,onDeleteClick:l}){return(0,t.jsxs)(eo.DropdownMenu,{children:[(0,t.jsx)(eo.DropdownMenuTrigger,{"aria-label":"Open toolset actions","data-testid":`toolset-actions-${e.toolset_id}`,className:(0,ec.cn)((0,i.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,t.jsx)(et.MoreHorizontal,{className:"size-4"})}),(0,t.jsxs)(eo.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-copy-url",onClick:()=>void(0,ed.copyToClipboard)(em(e.toolset_name),"Endpoint URL copied"),children:[(0,t.jsx)(ee,{}),"Copy endpoint URL"]}),(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-copy-id",onClick:()=>void(0,ed.copyToClipboard)(e.toolset_id,"Toolset ID copied"),children:[(0,t.jsx)(X.Copy,{}),"Copy toolset ID"]}),s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eo.DropdownMenuSeparator,{}),(0,t.jsxs)(eo.DropdownMenuItem,{"data-testid":"toolset-action-edit",onClick:()=>r(e),children:[(0,t.jsx)(es.Pencil,{}),"Edit"]}),(0,t.jsxs)(eo.DropdownMenuItem,{variant:"destructive","data-testid":"toolset-action-delete",onClick:()=>l(e.toolset_id),children:[(0,t.jsx)(er.Trash2,{}),"Delete"]})]})]})]})}function ex({serverId:e,serverName:s,accessToken:r,selectedTools:l,onToggle:a}){let[n,i]=(0,p.useState)([]),[o,c]=(0,p.useState)(!1),[d,u]=(0,p.useState)(!1),m=new Set(l.filter(t=>t.server_id===e).map(e=>e.tool_name)),h=(0,p.useCallback)(async()=>{if(r&&!(n.length>0)){c(!0);try{let t=await (0,b.listMCPTools)(r,e),s=Array.isArray(t)?t:t?.tools??[];i(s.map(e=>({name:e.name??e.tool_name??e,description:e.description??""})))}catch{i([])}finally{c(!1)}}},[r,e,n.length]);return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,t.jsxs)("button",{type:"button",className:"w-full flex items-center justify-between px-4 py-3 bg-gray-50 hover:bg-gray-100 transition-colors",onClick:()=>{d||h(),u(!d)},children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-blue-500 shrink-0"}),s,m.size>0&&(0,t.jsxs)("span",{className:"ml-1 text-xs text-purple-600 font-semibold",children:[m.size," selected"]})]}),(0,t.jsx)("span",{className:"text-gray-400 text-xs",children:d?"▲":"▼"})]}),d&&(0,t.jsx)("div",{className:"p-2",children:o?(0,t.jsx)("div",{className:"flex justify-center py-3",children:(0,t.jsx)(G.Spin,{size:"small"})}):0===n.length?(0,t.jsx)("p",{className:"text-xs text-gray-400 px-2 py-2",children:"No tools found for this server."}):(0,t.jsx)("div",{className:"flex flex-col gap-1",children:n.map(s=>{let r=m.has(s.name);return(0,t.jsxs)("button",{type:"button",onClick:()=>a({server_id:e,tool_name:s.name}),className:`flex items-start justify-between px-3 py-2 rounded-lg text-left transition-colors ${r?"bg-purple-50 border border-purple-300":"bg-white border border-gray-100 hover:bg-gray-50"}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("p",{className:`text-sm font-medium leading-tight ${r?"text-purple-800":"text-gray-800"}`,children:s.name}),s.description&&(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-0.5 leading-tight line-clamp-2",children:s.description})]}),r&&(0,t.jsx)("span",{className:"text-purple-500 text-xs font-semibold ml-2 shrink-0 mt-0.5",children:"✓"})]},s.name)})})})]})}function ep({open:e,onClose:s,onSave:r,accessToken:l,initialToolset:a}){let[n]=$.Form.useForm(),[i,o]=(0,p.useState)(a?.tools||[]),[c,d]=(0,p.useState)(!1),[u,m]=(0,p.useState)(""),{data:h=[]}=(0,f.useMCPServers)(),x=p.default.useMemo(()=>new Map(h.map(e=>[e.server_id,e.alias||e.server_name||e.server_id])),[h]);p.default.useEffect(()=>{e&&(n.setFieldsValue({toolset_name:a?.toolset_name||"",description:a?.description||""}),o(a?.tools||[]),m(""))},[e,a]);let g=e=>{o(t=>t.some(t=>t.server_id===e.server_id&&t.tool_name===e.tool_name)?t.filter(t=>t.server_id!==e.server_id||t.tool_name!==e.tool_name):[...t,e])},j=async()=>{let e=await n.validateFields();d(!0);try{await r(e.toolset_name,e.description,i),s()}finally{d(!1)}},v=h.filter(e=>{let t=u.toLowerCase();return!t||(e.alias||"").toLowerCase().includes(t)||(e.server_name||"").toLowerCase().includes(t)});return(0,t.jsxs)(q.Modal,{open:e,onCancel:s,title:a?"Edit Toolset":"New Toolset",width:960,footer:null,forceRender:!0,children:[(0,t.jsx)($.Form,{form:n,layout:"vertical",className:"mt-2",children:(0,t.jsxs)("div",{className:"flex gap-4 mb-4",children:[(0,t.jsx)($.Form.Item,{label:"Toolset Name",name:"toolset_name",rules:[{required:!0,message:"Please enter a toolset name"}],className:"flex-1 mb-0",children:(0,t.jsx)(W.Input,{placeholder:"e.g. github-linear-tools"})}),(0,t.jsx)($.Form.Item,{label:"Description",name:"description",className:"flex-1 mb-0",children:(0,t.jsx)(W.Input,{placeholder:"Optional description"})})]})}),(0,t.jsxs)("div",{className:"flex gap-4 mt-2",style:{minHeight:360},children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:"flex items-center justify-between mb-2",children:(0,t.jsx)(D.Text,{className:"text-sm font-semibold text-gray-700",children:"Available Tools"})}),(0,t.jsx)(W.Input,{placeholder:"Search MCP servers...",value:u,onChange:e=>m(e.target.value),className:"mb-2",allowClear:!0}),(0,t.jsx)("div",{className:"space-y-2 overflow-y-auto",style:{maxHeight:300},children:0===v.length?(0,t.jsx)(D.Text,{className:"text-gray-400 text-sm",children:0===h.length?"No MCP servers configured":"No servers match your search"}):v.map(e=>(0,t.jsx)(ex,{serverId:e.server_id,serverName:e.alias||e.server_name||e.server_id,accessToken:l,selectedTools:i,onToggle:g},e.server_id))})]}),(0,t.jsx)("div",{className:"w-px bg-gray-200 shrink-0"}),(0,t.jsxs)("div",{className:"w-72 shrink-0",children:[(0,t.jsxs)(D.Text,{className:"text-sm font-semibold text-gray-700 mb-2 block",children:["Your Toolset ",(0,t.jsxs)("span",{className:"text-xs font-normal text-gray-400",children:["(",i.length," tools)"]})]}),(0,t.jsx)("div",{className:"space-y-1 overflow-y-auto",style:{maxHeight:340},children:0===i.length?(0,t.jsx)(D.Text,{className:"text-gray-400 text-sm",children:"No tools added yet"}):i.map((e,s)=>(0,t.jsxs)("button",{type:"button",onClick:()=>g(e),className:"w-full flex items-center justify-between px-3 py-1.5 rounded-lg border border-purple-200 bg-purple-50 hover:bg-red-50 hover:border-red-200 group transition-colors",children:[(0,t.jsxs)("div",{className:"min-w-0 text-left",children:[(0,t.jsx)("span",{className:"text-xs font-medium text-purple-800 group-hover:text-red-600 truncate block",children:eu(x.get(e.server_id),e.tool_name)}),(0,t.jsxs)("span",{className:"text-[10px] text-purple-400 truncate block",children:[e.server_id.slice(0,8),"…"]})]}),(0,t.jsx)("span",{className:"ml-2 text-purple-300 group-hover:text-red-400 text-xs shrink-0",children:"✕"})]},s))})]})]}),(0,t.jsxs)("div",{className:"flex justify-end gap-2 mt-4 pt-4 border-t border-gray-200",children:[(0,t.jsx)(H.Button,{variant:"secondary",onClick:s,children:"Cancel"}),(0,t.jsx)(H.Button,{onClick:j,loading:c,children:a?"Save Changes":"Create Toolset"})]})]})}function eg(){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)(J.Inbox,{className:"size-5 text-muted-foreground"})}),(0,t.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No toolsets yet"}),(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:"Create a toolset to give keys and teams a curated set of MCP tools."})]})}function ef(){let[e,s]=(0,p.useState)(!1),r=(0,b.getProxyBaseUrl)(),l=`{ + "mcpServers": { + "my-toolset": { + "url": "${r}/toolset//mcp", + "headers": { "x-litellm-api-key": "Bearer " } + } + } +}`,a=async()=>{try{await navigator.clipboard.writeText(l),s(!0),setTimeout(()=>s(!1),1500)}catch{}};return(0,t.jsxs)("div",{className:"mb-6 rounded-lg border border-gray-200 bg-gray-50 px-5 py-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-gray-700 mb-1",children:"How toolsets work"}),(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-3",children:["Create a toolset, assign it to a key via"," ",(0,t.jsx)("span",{className:"font-medium text-gray-700",children:"API Keys → Edit Key → MCP Servers"}),", then point your MCP client at the toolset URL. The client only sees the tools you picked."]}),(0,t.jsx)("div",{className:"text-xs text-gray-400 mb-1",children:"Claude Code / Cursor config"}),(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("pre",{className:"bg-white border border-gray-200 rounded-sm px-4 py-3 text-xs font-mono text-gray-700 overflow-x-auto leading-relaxed pr-14",children:l}),(0,t.jsx)("button",{type:"button",onClick:a,className:"absolute top-2 right-2 px-2 py-1 text-xs rounded-sm border bg-white hover:bg-gray-50 text-gray-400 hover:text-gray-600 border-gray-200 transition-colors",children:e?"✓":"copy"})]})]})}function ej({accessToken:e,userRole:s}){let r=(0,j.useQueryClient)(),{data:l=[],isLoading:a}=(0,Q.useMCPToolsets)(),{data:n=[]}=(0,f.useMCPServers)(),[i,o]=(0,p.useState)(!1),[c,d]=(0,p.useState)(null),[u,m]=(0,p.useState)(null),[h,x]=(0,p.useState)(!1),g="Admin"===s||"proxy_admin"===s,v=async(t,s,l)=>{e&&(await (0,b.createMCPToolset)(e,{toolset_name:t,description:s,tools:l}),K.message.success("Toolset created"),r.invalidateQueries({queryKey:["mcpToolsets"]}))},y=async(t,s,l)=>{e&&c&&(await (0,b.updateMCPToolset)(e,{toolset_id:c.toolset_id,toolset_name:t,description:s,tools:l}),K.message.success("Toolset updated"),r.invalidateQueries({queryKey:["mcpToolsets"]}),d(null))},_=async()=>{if(e&&u){x(!0);try{await (0,b.deleteMCPToolset)(e,u),K.message.success("Toolset deleted"),r.invalidateQueries({queryKey:["mcpToolsets"]}),m(null)}finally{x(!1)}}},N=p.default.useMemo(()=>new Map(n.map(e=>[e.server_id,e.alias||e.server_name||e.server_id])),[n]),[w,k]=(0,p.useState)([]),C=p.default.useMemo(()=>(({isAdmin:e,serverPrefixById:s,onEditClick:r,onDeleteClick:l})=>[{id:"toolset_id",accessorKey:"toolset_id",meta:{title:"Toolset ID"},header:"Toolset ID",size:140,enableSorting:!1,cell:({row:e})=>(0,t.jsx)(en.IdCell,{value:e.original.toolset_id})},{id:"toolset_name",accessorKey:"toolset_name",meta:{title:"Name"},header:({column:e})=>(0,t.jsx)(el.DataTableSortHeader,{column:e,title:"Name"}),size:260,enableSorting:!0,sortingFn:"alphanumeric",cell:({row:s})=>(0,t.jsx)(ei.IdentityCell,{title:s.original.toolset_name,subtitle:em(s.original.toolset_name),className:"max-w-80",onClick:e?()=>r(s.original):void 0})},{id:"description",accessorKey:"description",meta:{title:"Description"},header:"Description",size:200,enableSorting:!1,cell:({row:e})=>(0,t.jsx)("span",{className:"block max-w-72 truncate text-sm text-muted-foreground",title:e.original.description,children:e.original.description||"—"})},{id:"tools",meta:{title:"Tools",skeleton:"chips"},header:"Tools",size:260,enableSorting:!1,cell:({row:e})=>{let r=e.original.tools;return(0,t.jsxs)("div",{className:"flex max-w-xs flex-wrap gap-1",children:[r.slice(0,4).map(e=>(0,t.jsx)("span",{className:"inline-flex items-center rounded-md bg-muted px-1.5 py-0.5 text-xs",children:eu(s.get(e.server_id),e.tool_name)},`${e.server_id}-${e.tool_name}`)),r.length>4&&(0,t.jsxs)("span",{className:"self-center text-xs text-muted-foreground",children:["+",r.length-4," more"]})]})}},{id:"created_at",accessorKey:"created_at",meta:{title:"Created"},header:({column:e})=>(0,t.jsx)(el.DataTableSortHeader,{column:e,title:"Created"}),size:120,enableSorting:!0,cell:({row:e})=>(0,t.jsx)(ea.DateCell,{value:e.original.created_at,precision:"date"})},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,t.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:s})=>(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(eh,{toolset:s.original,isAdmin:e,onEditClick:r,onDeleteClick:l})})}])({isAdmin:g,serverPrefixById:N,onEditClick:d,onDeleteClick:m}),[g,N]);return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(B.Title,{children:"MCP Toolsets"}),(0,t.jsx)(D.Text,{className:"text-gray-500 text-sm",children:"Curated collections of tools from one or more MCP servers. Assign toolsets to keys and teams via the MCP permissions dropdown."})]}),g&&(0,t.jsx)(H.Button,{icon:Y.PlusIcon,onClick:()=>o(!0),children:"New Toolset"})]}),(0,t.jsx)(ef,{}),(0,t.jsx)(Z.DataTable,{data:l,columns:C,getRowId:(e,t)=>e.toolset_id||String(t),sortingMode:"client",sorting:w,onSortingChange:k,isLoading:a,loadingMessage:"Loading toolsets…",noDataMessage:(0,t.jsx)(eg,{}),size:"compact"}),(0,t.jsx)(ep,{open:i,onClose:()=>o(!1),onSave:v,accessToken:e}),c&&(0,t.jsx)(ep,{open:!!c,onClose:()=>d(null),onSave:y,accessToken:e,initialToolset:c}),(0,t.jsx)(q.Modal,{open:!!u,onCancel:()=>m(null),onOk:_,okText:"Delete",okButtonProps:{danger:!0,loading:h},title:"Delete Toolset",children:(0,t.jsx)("p",{children:"Are you sure you want to delete this toolset? Keys and teams using it will lose access to the scoped tools."})})]})}var ev=e.i(592968),eb=e.i(199133),ey=e.i(28651),e_=e.i(362024),eN=e.i(827252),ew=e.i(779241),ek=e.i(909119),eC=e.i(292335);let eT=e=>{try{let t=e.indexOf("/mcp/");if(-1===t)return{token:null,baseUrl:e};let s=e.split("/mcp/");if(2!==s.length)return{token:null,baseUrl:e};let r=s[0]+"/mcp/",l=s[1];if(!l)return{token:null,baseUrl:e};return{token:l,baseUrl:r}}catch(t){return console.error("Error parsing MCP URL:",t),{token:null,baseUrl:e}}},eS=e=>{let{token:t}=eT(e);return{maskedUrl:(e=>{let{token:t,baseUrl:s}=eT(e);return t?s+"...":e})(e),hasToken:!!t}},eA=e=>e?/^https?:\/\/[^\s/$.?#].[^\s]*$/i.test(e)?Promise.resolve():Promise.reject("Please enter a valid URL (e.g., http://service-name.domain:1234/path or https://example.com)"):Promise.resolve(),eI=e=>e&&(e.includes("-")||e.includes(" "))?Promise.reject("Cannot contain '-' (hyphen) or spaces. Please use '_' (underscore) instead."):Promise.resolve(),eO=/^[a-zA-Z0-9_-]+$/,eP=e=>{if(!Array.isArray(e))return[];let t=new Set,s=[];for(let r of e){if(!r||"object"!=typeof r)continue;let e=String(r.name??"").trim();if(!e||t.has(e)||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))continue;let l="user"===r.scope?"user":"global";s.push({name:e,value:"user"===l?"":String(r.value??""),scope:l,description:r.description||void 0}),t.add(e)}return s},eM=e=>{if(!e)return{};if("string"==typeof e){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}return{}}return e},eF=[eC.AUTH_TYPE.API_KEY,eC.AUTH_TYPE.BEARER_TOKEN,eC.AUTH_TYPE.TOKEN,eC.AUTH_TYPE.BASIC],eE=[...eF,eC.AUTH_TYPE.OAUTH2,eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,eC.AUTH_TYPE.OAUTH2_ID_JAG,eC.AUTH_TYPE.AWS_SIGV4,eC.AUTH_TYPE.TRUE_PASSTHROUGH,eC.AUTH_TYPE.OAUTH_DELEGATE],eL=e=>Array.isArray(e)?e.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{};var eR=e.i(434166);let eU="litellm-mcp-oauth-create-state",ez=()=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-2",children:["For MCP servers hosted on AWS Bedrock AgentCore."," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/mcp_aws_sigv4",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700",children:"View docs →"})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Region",(0,t.jsx)(ev.Tooltip,{title:"AWS region for SigV4 signing (e.g., us-east-1)",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_region_name"],rules:[{required:!0,message:"AWS region is required for SigV4 auth"}],children:(0,t.jsx)(W.Input,{placeholder:"us-east-1",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Service Name",(0,t.jsx)(ev.Tooltip,{title:"AWS service name for SigV4 signing. Defaults to 'bedrock-agentcore'.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_service_name"],children:(0,t.jsx)(W.Input,{placeholder:"bedrock-agentcore",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Access Key ID",(0,t.jsx)(ev.Tooltip,{title:"Optional. If not provided, falls back to the boto3 credential chain (IAM role, env vars, etc.).",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_access_key_id"],dependencies:[["credentials","aws_secret_access_key"]],rules:[({getFieldValue:e})=>({validator:(t,s)=>e(["credentials","aws_secret_access_key"])&&!s?Promise.reject(Error("Access Key ID is required when Secret Access Key is provided")):Promise.resolve()})],children:(0,t.jsx)(W.Input.Password,{placeholder:"AKIA... (optional — uses IAM role if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Secret Access Key",(0,t.jsx)(ev.Tooltip,{title:"Optional. Required if AWS Access Key ID is provided.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_secret_access_key"],dependencies:[["credentials","aws_access_key_id"]],rules:[({getFieldValue:e})=>({validator:(t,s)=>e(["credentials","aws_access_key_id"])&&!s?Promise.reject(Error("Secret Access Key is required when Access Key ID is provided")):Promise.resolve()})],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter secret key (optional — uses IAM role if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Token",(0,t.jsx)(ev.Tooltip,{title:"Optional. Only needed for temporary STS credentials.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_token"],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter session token (optional)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Role ARN",(0,t.jsx)(ev.Tooltip,{title:"Optional. IAM role ARN to assume via STS before signing. If set, LiteLLM calls sts:AssumeRole to get temporary credentials. Uses ambient credentials (IAM role, env vars) as the source identity unless explicit keys are also provided.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_role_name"],children:(0,t.jsx)(W.Input,{placeholder:"arn:aws:iam::123456789012:role/MyRole (optional)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Name",(0,t.jsx)(ev.Tooltip,{title:"Optional. Session name for the AssumeRole call — appears in CloudTrail logs. Auto-generated if omitted.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_name"],children:(0,t.jsx)(W.Input,{placeholder:"litellm-prod (optional, auto-generated if blank)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})]});var eV=e.i(790848);let eH=()=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center gap-2",children:["BYOK (Bring Your Own Key)",(0,t.jsx)(ev.Tooltip,{title:"When enabled, each user provides their own API key for this service. Keys are stored per-user and never shared.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"is_byok",valuePropName:"checked",children:(0,t.jsx)(eV.Switch,{})}),(0,t.jsx)($.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.is_byok!==t.is_byok||e.auth_type!==t.auth_type,children:({getFieldValue:e})=>e("is_byok")?(0,t.jsxs)(t.Fragment,{children:[e("auth_type")&&"none"!==e("auth_type")&&(0,t.jsxs)("div",{className:"mb-4 p-3 bg-blue-50 rounded-lg text-sm text-blue-700 flex items-start gap-2",children:[(0,t.jsx)(eN.InfoCircleOutlined,{className:"mt-0.5 shrink-0"}),(0,t.jsxs)("span",{children:["User keys will be sent as:"," ",(0,t.jsxs)("code",{className:"font-mono bg-blue-100 px-1 rounded-sm",children:["bearer_token"===e("auth_type")&&"Authorization: Bearer {key}","token"===e("auth_type")&&"Authorization: token {key}","api_key"===e("auth_type")&&"x-api-key: {key}","basic"===e("auth_type")&&"Authorization: Basic {key}","authorization"===e("auth_type")&&"Authorization: {key}"]}),!e("auth_type")&&"Set Authentication Type below to specify the format."]})]}),!e("auth_type")&&(0,t.jsxs)("div",{className:"mb-4 p-3 bg-yellow-50 rounded-lg text-sm text-yellow-700 flex items-start gap-2",children:[(0,t.jsx)(eN.InfoCircleOutlined,{className:"mt-0.5 shrink-0"}),(0,t.jsxs)("span",{children:["Set the ",(0,t.jsx)("strong",{children:"Authentication Type"})," below to specify how user keys are sent (e.g., Bearer Token, API Key header)."]})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Access Description",(0,t.jsx)(ev.Tooltip,{title:"List of permissions shown to users in the connection modal (e.g. 'Create and manage Jira issues')",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"byok_description",children:(0,t.jsx)(eb.Select,{mode:"tags",placeholder:"Add access description items (press Enter after each)",className:"w-full",tokenSeparators:[","]})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["API Key Help URL",(0,t.jsx)(ev.Tooltip,{title:"Optional link shown to users to help them find their API key",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"byok_api_key_help_url",children:(0,t.jsx)(W.Input,{placeholder:"https://docs.example.com/api-keys"})})]}):null})]}),eD=[{value:"client_secret_basic",label:"Client Secret Basic"},{value:"client_secret_post",label:"Client Secret Post"}],eB=({isEditing:e=!1})=>(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Token Endpoint Auth Method (optional)",(0,t.jsx)(ev.Tooltip,{title:"How the proxy authenticates to the upstream OAuth token endpoint. Client Secret Basic sends the client credentials in an HTTP Basic Authorization header; leave blank to use the default, Client Secret Post, which sends them in the request body.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","token_endpoint_auth_method"],children:(0,t.jsx)(eb.Select,{allowClear:!0,placeholder:e?"Leave blank to keep existing (default Client Secret Post)":"Default (Client Secret Post)",className:"rounded-lg",size:"large",options:eD})}),eq="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",e$=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),eW=()=>(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Resource Indicator (optional)",tooltip:"RFC 8707 resource indicator sent to the authorization server so it mints a token audienced for this MCP server. Leave blank to send nothing, which is the default and what most providers expect. Use 'auto' to send this server's own URL. Set an exact identifier when the authorization server expects a specific one. Some providers reject this parameter and take the audience from scopes instead; if you see AADSTS901002, leave it blank. If you see invalid_target, the authorization server needs it set."}),name:["credentials","upstream_resource"],children:(0,t.jsx)(ew.TextInput,{placeholder:"auto, or https://mcp.example.com/mcp",className:eq})}),eK=({isM2M:e,isEditing:s=!1,oauthFlow:r,initialFlowType:l,docsUrl:a})=>{let n=s?" (leave blank to keep existing)":"",i=e=>s?[]:[{required:!0,message:e}];return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"OAuth Flow Type",tooltip:"Choose how the proxy authenticates with this MCP server. M2M is for server-to-server communication using client credentials. Interactive (PKCE) is for user-facing flows that require browser-based authorization."}),name:"oauth_flow_type",...l?{initialValue:l}:{},children:(0,t.jsxs)(eb.Select,{placeholder:"Select OAuth flow",className:"rounded-lg",size:"large",children:[(0,t.jsx)(eb.Select.Option,{value:eC.OAUTH_FLOW.M2M,children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"font-medium",children:"Machine-to-Machine (M2M)"}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-2",children:"server-to-server, no user interaction"})]})}),(0,t.jsx)(eb.Select.Option,{value:eC.OAUTH_FLOW.INTERACTIVE,children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"font-medium",children:"Interactive (PKCE)"}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-2",children:"browser-based user authorization"})]})})]})}),e?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client ID",tooltip:"OAuth2 client ID for the client_credentials grant."}),name:["credentials","client_id"],rules:i("Client ID is required for M2M OAuth"),children:(0,t.jsx)(ew.TextInput,{type:"password",placeholder:`Enter OAuth client ID${n}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client Secret",tooltip:"OAuth2 client secret for the client_credentials grant."}),name:["credentials","client_secret"],rules:i("Client Secret is required for M2M OAuth"),children:(0,t.jsx)(ew.TextInput,{type:"password",placeholder:`Enter OAuth client secret${n}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Token URL",tooltip:"Token endpoint URL for the client_credentials grant."}),name:"token_url",rules:i("Token URL is required for M2M OAuth"),children:(0,t.jsx)(ew.TextInput,{placeholder:"https://auth.example.com/oauth/token",className:eq})}),(0,t.jsx)(eB,{isEditing:s}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Scopes (optional)",tooltip:"Optional scopes to request with the client_credentials grant."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})}),(0,t.jsx)(eW,{})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"flex items-center justify-between w-full",children:[(0,t.jsx)(e$,{label:"Client ID (optional)",tooltip:"Provide only if your MCP server cannot handle dynamic client registration."}),a&&(0,t.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-blue-500 hover:text-blue-700 ml-2 font-normal",onClick:e=>e.stopPropagation(),children:"Create OAuth App →"})]}),name:["credentials","client_id"],children:(0,t.jsx)(ew.TextInput,{type:"password",placeholder:`Enter client ID${n}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Client Secret (optional)",tooltip:"Provide only if your MCP server cannot handle dynamic client registration."}),name:["credentials","client_secret"],children:(0,t.jsx)(ew.TextInput,{type:"password",placeholder:`Enter client secret${n}`,className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Scopes (optional)",tooltip:"Optional scopes requested during token exchange. Separate multiple scopes with enter or commas."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})}),(0,t.jsx)(eW,{}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Issuer (optional)",tooltip:"OAuth 2.0 authorization server issuer (RFC 8414). Leave empty to discover endpoints from the upstream resource; set it to pin the trust anchor, which makes this issuer's document the only endpoint source (RFC 8414 §3.3), overriding the Authorization/Token/Registration URLs above and failing closed if its metadata cannot be fetched."}),name:"issuer",children:(0,t.jsx)(ew.TextInput,{placeholder:"https://issuer.example.com",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Authorization URL (optional)",tooltip:"Optional override for the authorization endpoint."}),name:"authorization_url",children:(0,t.jsx)(ew.TextInput,{placeholder:"https://example.com/oauth/authorize",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Token URL (optional)",tooltip:"Optional override for the token endpoint."}),name:"token_url",children:(0,t.jsx)(ew.TextInput,{placeholder:"https://example.com/oauth/token",className:eq})}),(0,t.jsx)(eB,{isEditing:s}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Registration URL (optional)",tooltip:"Optional override for the dynamic client registration endpoint."}),name:"registration_url",children:(0,t.jsx)(ew.TextInput,{placeholder:"https://example.com/oauth/register",className:eq})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Token Validation Rules (optional)",tooltip:'JSON object of key-value rules checked against the OAuth token response before storing. Supports dot-notation for nested fields (e.g. {"organization": "my-org", "team.id": "123"}). Tokens that fail validation are rejected with HTTP 403.'}),name:"token_validation_json",rules:[{validator:(e,t)=>{if(!t||""===t.trim())return Promise.resolve();try{return JSON.parse(t),Promise.resolve()}catch{return Promise.reject(Error("Must be valid JSON"))}}}],children:(0,t.jsx)(W.Input.TextArea,{placeholder:'{\n "organization": "my-org",\n "team.id": "123"\n}',rows:4,className:"font-mono text-sm rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e$,{label:"Token Storage TTL (seconds, optional)",tooltip:"How long to cache each user's OAuth access token in Redis before evicting it (never longer than the token's own expires_in). Leave blank to derive the TTL from the token's expires_in, or fall back to the 12-hour default."}),name:"token_storage_ttl_seconds",children:(0,t.jsx)(ey.InputNumber,{min:1,placeholder:"e.g. 3600",className:"w-full rounded-lg",style:{width:"100%"}})}),r&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-gray-300 p-4 space-y-2",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Use OAuth to fetch a fresh access token and temporarily save it in the session as the authentication value."}),(0,t.jsx)(H.Button,{variant:"secondary",onClick:r.startOAuthFlow,disabled:"authorizing"===r.status||"exchanging"===r.status,children:"authorizing"===r.status?"Waiting for authorization...":"exchanging"===r.status?"Exchanging authorization code...":"Authorize & Fetch Token"}),r.error&&(0,t.jsx)("p",{className:"text-sm text-red-500",children:r.error}),"success"===r.status&&r.tokenResponse?.access_token&&(0,t.jsxs)("p",{className:"text-sm text-green-600",children:["Token fetched. Expires in ",r.tokenResponse.expires_in??"?"," seconds."]})]})]})]})};var eG=e.i(89128),eY=e.i(439573);function eJ({authType:e}){return e!==eC.AUTH_TYPE.TRUE_PASSTHROUGH?null:(0,t.jsxs)(eY.Alert,{className:"mb-4",children:[(0,t.jsx)(eG.TriangleAlert,{}),(0,t.jsx)(eY.AlertTitle,{children:"True Passthrough disables LiteLLM authentication for this server"}),(0,t.jsx)(eY.AlertDescription,{children:"Anyone who can reach the gateway can call this server without a LiteLLM key. The caller's Authorization header is forwarded to the upstream verbatim, per-key and per-team rate limits and spend tracking do not apply, and the upstream is fully responsible for authenticating callers. Choose OAuth Delegate instead if callers should still authenticate to LiteLLM."})]})}var eQ=e.i(464571),eZ=e.i(536916);function eX({authType:e,initialChecked:s}){return(0,eC.isClientForwardedTokenMode)(e)?(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Gateway-hosted sign-in (DCR bridge)",(0,t.jsx)(ev.Tooltip,{title:"Lets OAuth-only clients like Claude Desktop register and sign in through the gateway. Turn off to relay the upstream server's own OAuth metadata instead (for clients pre-registered with the upstream IdP).",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"dcr_bridge",valuePropName:"checked",initialValue:s,children:(0,t.jsx)(eV.Switch,{})}):null}function e0({authType:e,oauthFlow:s,dcrBridgeInitialChecked:r,isEditing:l=!1,savedAuthType:a,removeStoredApp:n=!1,onRemoveStoredAppChange:i,appMayNotMatchUpstream:o=!1}){if(!(0,eC.isClientForwardedTokenMode)(e))return null;let c={authorizing:"Waiting for authorization...",exchanging:"Exchanging authorization code..."}[s.status]??"Authorize & Fetch Tools (browser-only)",d=l&&(0,eC.credentialAuthClass)(a)===(0,eC.credentialAuthClass)(e);return(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-gray-300 p-4 space-y-2 mb-4",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Callers bring their own upstream token for this auth type, so LiteLLM never stores tokens. To preview tools and configure the tool allowlist, authorize against the upstream here: the token stays in this browser session only and is never saved to LiteLLM. An OAuth app configured below IS saved with the server, so internal users who authorize from the Tools page go through it."}),o&&(0,t.jsx)("p",{className:"text-sm text-amber-600",children:"You changed the upstream URL or endpoints; the OAuth app entered here was registered for the previous upstream and may not be valid. Update the client ID, or clear it to use dynamic client registration."}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"OAuth Client ID (optional)"}),name:["credentials","client_id"],extra:d?"Set this to make everyone authorize through a specific app; required for upstreams without dynamic client registration (e.g. a pre-registered Slack app).":"Switching the auth type discards the previously saved app; enter a client ID here or leave blank to use dynamic client registration.",children:(0,t.jsx)(W.Input.Password,{placeholder:d?"Leave blank to keep the currently saved app (if any)":"Leave blank to use dynamic client registration",disabled:n,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"OAuth Client Secret (optional)"}),name:["credentials","client_secret"],children:(0,t.jsx)(W.Input.Password,{placeholder:d?"Leave blank to keep the currently saved secret (if any)":"Leave blank for public clients / PKCE",disabled:n,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(eX,{authType:e,initialChecked:r}),l&&i&&(0,t.jsx)(eZ.Checkbox,{checked:n,onChange:e=>i(e.target.checked),children:(0,t.jsx)("span",{className:"text-sm text-gray-700",children:"Remove the saved OAuth app on save (the server goes back to dynamic client registration)"})}),(0,t.jsx)(eQ.Button,{onClick:s.startOAuthFlow,disabled:"authorizing"===s.status||"exchanging"===s.status,children:c}),s.error&&(0,t.jsx)("p",{className:"text-sm text-red-500",children:s.error}),"success"===s.status&&s.tokenResponse?.access_token&&(0,t.jsx)("p",{className:"text-sm text-green-600",children:"Token held for this browser session. Tools can now be previewed and configured; the token was not saved to LiteLLM."})]})}let e2="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",e1=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),e4=({isEditing:e=!1})=>{let s=e?" (leave blank to keep existing)":"";return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Profile",tooltip:"Token-exchange wire dialect. RFC 8693 is the standard token-exchange grant. Microsoft Entra OBO uses Entra's On-Behalf-Of dialect (the RFC 7523 jwt-bearer grant with requested_token_use=on_behalf_of) and carries the target resource in a scope like api:///.default."}),name:"token_exchange_profile",...e?{}:{initialValue:"rfc8693"},children:(0,t.jsxs)(eb.Select,{className:"rounded-lg",size:"large",children:[(0,t.jsx)(eb.Select.Option,{value:"rfc8693",children:(0,t.jsx)("span",{className:"font-medium",children:"RFC 8693 (standard)"})}),(0,t.jsx)(eb.Select.Option,{value:"entra_obo",children:(0,t.jsx)("span",{className:"font-medium",children:"Microsoft Entra OBO"})})]})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Token Exchange Endpoint (optional)",tooltip:"RFC 8693 token endpoint. The proxy exchanges the user's incoming token here for a scoped token used to call the upstream MCP server. Leave blank to auto-discover it from the upstream's protected-resource metadata (RFC 9728 then RFC 8414)."}),name:"token_exchange_endpoint",children:(0,t.jsx)(W.Input,{placeholder:"https://idp.example.com/oauth2/token",className:e2})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Client ID",tooltip:"OAuth2 client ID used to authenticate to the token exchange endpoint."}),name:["credentials","client_id"],rules:[{required:!e,message:"Client ID is required for token exchange"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client ID${s}`,className:e2})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Client Secret",tooltip:"OAuth2 client secret used to authenticate to the token exchange endpoint."}),name:["credentials","client_secret"],rules:[{required:!e,message:"Client Secret is required for token exchange"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client secret${s}`,className:e2})}),(0,t.jsx)($.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.token_exchange_profile!==t.token_exchange_profile,children:({getFieldValue:e})=>{let s="entra_obo"===e("token_exchange_profile");return(0,t.jsxs)(t.Fragment,{children:[!s&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Audience (optional)",tooltip:"Target audience for the exchanged token (RFC 8693 audience). Identifies the upstream MCP server the token is for."}),name:"audience",children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com",className:e2})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:"Subject Token Type (optional)",tooltip:"Type of the user's incoming token (RFC 8693 subject_token_type). Defaults to urn:ietf:params:oauth:token-type:access_token."}),name:"subject_token_type",children:(0,t.jsx)(W.Input,{placeholder:"urn:ietf:params:oauth:token-type:access_token",className:e2})})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e1,{label:s?"Scopes":"Scopes (optional)",tooltip:s?"Microsoft Entra OBO carries the target resource in the scope, so at least one is required (e.g. api:///.default).":"Optional scopes to request during the token exchange."}),name:["credentials","scopes"],rules:s?[{required:!0,message:"Microsoft Entra OBO requires a scope, e.g. api:///.default"}]:[],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:s?"api:///.default":"Add scopes",className:"rounded-lg",size:"large"})})]})}})]})},e5="rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",e3=({label:e,tooltip:s})=>(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[e,(0,t.jsx)(ev.Tooltip,{title:s,children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),e6=({isEditing:e=!1})=>{let s=e?" (leave blank to keep existing)":"";return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Org Token Endpoint (leg 1)",tooltip:"Your IdP org authorization server's token endpoint. LiteLLM exchanges the user's identity assertion here for an ID-JAG assertion (RFC 8693 with requested_token_type=urn:ietf:params:oauth:token-type:id-jag)."}),name:"token_exchange_endpoint",rules:[{required:!e,message:"The org token endpoint is required for ID-JAG"}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-org.okta.com/oauth2/v1/token",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Resource Token Endpoint (leg 2)",tooltip:"The upstream resource authorization server's token endpoint. LiteLLM posts the ID-JAG assertion here as an RFC 7523 jwt-bearer grant to get the access token the MCP server accepts."}),name:["credentials","id_jag_resource_token_endpoint"],rules:[{required:!e,message:"The resource token endpoint is required for ID-JAG"}],children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com/oauth2/token",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Client ID",tooltip:"OAuth2 client ID LiteLLM authenticates as on both legs."}),name:["credentials","client_id"],rules:[{required:!e,message:"Client ID is required for ID-JAG"}],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client ID${s}`,className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Client Secret",tooltip:"Authenticates LiteLLM as the OAuth client via client_secret_post. Leave blank when using a private key instead; a private key takes precedence over this secret."}),name:["credentials","client_secret"],dependencies:[["credentials","client_private_key"]],rules:[({getFieldValue:t})=>({validator:(s,r)=>e||r||t(["credentials","client_private_key"])?Promise.resolve():Promise.reject(Error("Provide either a client secret or a client private key"))})],children:(0,t.jsx)(W.Input.Password,{placeholder:`Enter OAuth client secret${s}`,className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Client Private Key (PEM)",tooltip:"PEM private key signing the RFC 7523 private_key_jwt client assertion. Okta Cross App Access normally requires this. When set it takes precedence over the client secret."}),name:["credentials","client_private_key"],children:(0,t.jsx)(W.Input.TextArea,{rows:3,placeholder:`-----BEGIN PRIVATE KEY-----${s}`,className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Private Key ID (optional)",tooltip:"The kid advertised in the client assertion JWT header, so the IdP can select the right registered key."}),name:["credentials","client_private_key_id"],children:(0,t.jsx)(W.Input,{placeholder:"my-signing-key-1",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Client Assertion Signing Algorithm (optional)",tooltip:"Algorithm signing the client assertion JWT. Defaults to RS256."}),name:["credentials","client_assertion_signing_alg"],children:(0,t.jsx)(W.Input,{placeholder:"RS256",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Audience (optional)",tooltip:"RFC 8693 audience sent on leg 1, identifying the upstream the ID-JAG assertion is minted for."}),name:"audience",children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Resource Indicator (optional)",tooltip:"RFC 8707 resource indicator sent on leg 1. Separate from Audience, which is the RFC 8693 parameter."}),name:["credentials","id_jag_resource"],children:(0,t.jsx)(W.Input,{placeholder:"https://upstream.example.com/mcp",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Subject Token Type (optional)",tooltip:"Type of the identity assertion exchanged on leg 1. Defaults to urn:ietf:params:oauth:token-type:id_token."}),name:"subject_token_type",children:(0,t.jsx)(W.Input,{placeholder:"urn:ietf:params:oauth:token-type:id_token",className:e5})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)(e3,{label:"Scopes (optional)",tooltip:"Scopes requested on leg 1 of the exchange."}),name:["credentials","scopes"],children:(0,t.jsx)(eb.Select,{mode:"tags",tokenSeparators:[","],placeholder:"Add scopes",className:"rounded-lg",size:"large"})})]})};var e7=e.i(952571),e8=e.i(849550),e8=e8,e9=e.i(195116),te=e.i(515288),tt=e.i(204258);let ts=({value:e,placeholder:s,disabled:r,className:l,onChange:a})=>{let[n,i]=(0,p.useState)(null),c=n??(null==e?"":e.toFixed(4));return(0,t.jsxs)(o.InputGroup,{className:l,children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(o.InputGroupText,{children:"$"})}),(0,t.jsx)(o.InputGroupInput,{type:"text",inputMode:"decimal",placeholder:s,disabled:r,value:c,onFocus:()=>i(null==e?"":String(e)),onBlur:()=>i(null),onChange:e=>{var t;let s;return i(t=e.target.value),s=Number(t),void a(""===t.trim()||Number.isNaN(s)?null:s)}})]})},tr=({value:e={},onChange:s,tools:r=[],disabled:l=!1})=>(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsx)(te.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center gap-2",children:[(0,t.jsx)(e8.default,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Cost Configuration"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(e7.Info,{className:"size-4 text-muted-foreground","aria-label":"About cost configuration"})}),(0,t.jsx)(u.TooltipContent,{children:"Configure costs for this MCP server's tool calls. Set a default rate and per-tool overrides."})]})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("label",{className:"mb-2 block text-sm font-medium",children:["Default Cost per Query ($)",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(e7.Info,{className:"ml-1 inline size-4 text-muted-foreground","aria-label":"About the default cost"})}),(0,t.jsx)(u.TooltipContent,{children:"Default cost charged for each tool call to this server."})]})]}),(0,t.jsx)(ts,{value:e.default_cost_per_query,placeholder:"0.0000",disabled:l,className:"w-50",onChange:t=>{let r={...e,default_cost_per_query:t};s?.(r)}}),(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:"Set a default cost for all tool calls to this server"})]}),r.length>0&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("label",{className:"block text-sm font-medium",children:["Tool-Specific Costs ($)",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(e7.Info,{className:"ml-1 inline size-4 text-muted-foreground","aria-label":"About per-tool costs"})}),(0,t.jsx)(u.TooltipContent,{children:"Override the default cost for specific tools. Leave blank to use the default rate."})]})]}),(0,t.jsxs)(tt.Collapsible,{className:"rounded-lg border border-border",children:[(0,t.jsx)(tt.CollapsibleTrigger,{render:(0,t.jsxs)("button",{type:"button",className:"flex w-full items-center gap-2 p-3 text-left",children:[(0,t.jsx)(e9.Wrench,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("span",{className:"font-medium",children:"Available Tools"}),(0,t.jsx)(n.Badge,{variant:"secondary",children:r.length})]})}),(0,t.jsx)(tt.CollapsibleContent,{children:(0,t.jsx)("div",{className:"max-h-64 space-y-3 overflow-y-auto p-3",children:r.map((r,a)=>(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted p-3",children:[(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:r.name}),r.description&&(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:r.description})]}),(0,t.jsx)("div",{className:"ml-4",children:(0,t.jsx)(ts,{value:e.tool_name_to_cost_per_query?.[r.name],placeholder:"Use default",disabled:l,className:"w-40",onChange:t=>{var l;let a;return l=r.name,a={...e,tool_name_to_cost_per_query:{...e.tool_name_to_cost_per_query,[l]:t}},void s?.(a)}})})]},a))})})]})]})]}),(e.default_cost_per_query||e.tool_name_to_cost_per_query&&Object.keys(e.tool_name_to_cost_per_query).length>0)&&(0,t.jsxs)("div",{className:"mt-6 rounded-lg border border-border bg-muted p-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Cost Summary:"}),(0,t.jsxs)("div",{className:"mt-2 space-y-1",children:[e.default_cost_per_query&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• Default cost: $",e.default_cost_per_query.toFixed(4)," per query"]}),e.tool_name_to_cost_per_query&&Object.entries(e.tool_name_to_cost_per_query).map(([e,s])=>null!=s&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• ",e,": $",s.toFixed(4)," per query"]},e))]})]})]})})});var tl=e.i(101048),ta=e.i(707621),tn=e.i(16715);let ti=({formValues:e,tools:s,isLoadingTools:r,toolsError:l,toolsErrorStatus:a=null,toolsErrorStackTrace:n,canFetchTools:o,fetchTools:c})=>{let d=403===a;return o||e.url||e.spec_path?(0,t.jsx)(te.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(tl.CircleCheck,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Connection Status"})]}),!o&&(e.url||e.spec_path)&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(e9.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"Complete required fields to test connection"}),(0,t.jsx)("p",{className:"text-sm",children:"Fill in URL, Transport, and Authentication to test MCP server connection"})]}),o&&(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:r?"Testing connection to MCP server...":s.length>0?"Connection successful":l?d?"Ready to submit":"Connection failed":"Ready to test connection"}),(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Server: ",e.url||e.spec_path]})]}),r&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm",children:"Connecting..."})]}),!r&&!l&&s.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(tl.CircleCheck,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Connected"})]}),l&&!d&&(0,t.jsxs)("div",{className:"flex items-center gap-1 text-destructive",children:[(0,t.jsx)(ta.CircleAlert,{className:"size-4"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Failed"})]})]}),r&&(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 py-6",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm",children:"Testing connection and loading tools..."})]}),l&&d&&(0,t.jsxs)(eY.Alert,{children:[(0,t.jsx)(e7.Info,{}),(0,t.jsx)(eY.AlertTitle,{children:"Tool preview unavailable"}),(0,t.jsx)(eY.AlertDescription,{children:l})]}),l&&!d&&(0,t.jsxs)(eY.Alert,{variant:"destructive",children:[(0,t.jsx)(ta.CircleAlert,{}),(0,t.jsx)(eY.AlertTitle,{children:"Connection Failed"}),(0,t.jsxs)(eY.AlertDescription,{children:[(0,t.jsx)("div",{children:l}),n&&(0,t.jsxs)(tt.Collapsible,{className:"mt-3",children:[(0,t.jsx)(tt.CollapsibleTrigger,{render:(0,t.jsx)(i.Button,{variant:"link",size:"sm",className:"h-auto p-0",children:"Stack Trace"})}),(0,t.jsx)(tt.CollapsibleContent,{children:(0,t.jsx)("pre",{className:"mt-2 max-h-100 overflow-auto rounded-sm bg-muted p-2 font-mono text-xs break-words whitespace-pre-wrap",children:n})})]})]}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",onClick:c,children:[(0,t.jsx)(tn.RefreshCw,{}),"Retry"]})})]}),!r&&0===s.length&&!l&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center",children:[(0,t.jsx)(tl.CircleCheck,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Connection successful!"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"No tools found for this MCP server"})]})]})]})}):null};var to=e.i(257428),tc=e.i(793479),td=e.i(624687),tu=e.i(531516);let tm=({tool:e,isEnabled:s,isEditExpanded:r,toolNameToDisplayName:l,toolNameToDescription:a,onToggle:o,onToggleExpand:c,onDisplayNameChange:d,onDescriptionChange:u})=>{let m=l[e.name]||"",h=""!==m&&!eO.test(m);return(0,t.jsxs)("div",{className:(0,ec.cn)("rounded-lg border transition-colors",s?"border-primary/40 bg-accent":"border-border bg-muted"),children:[(0,t.jsx)("div",{className:"cursor-pointer p-4",onClick:()=>o(e.name),children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)(to.Checkbox,{checked:s,onCheckedChange:()=>o(e.name)}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:l[e.name]||e.name}),(0,t.jsx)(n.Badge,{variant:s?"secondary":"outline",children:s?"Enabled":"Disabled"}),l[e.name]&&(0,t.jsx)(n.Badge,{variant:"secondary",children:"Custom name"})]}),(a[e.name]||e.description)&&(0,t.jsx)("p",{className:"mt-1 block text-sm text-muted-foreground",children:a[e.name]||e.description}),(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:s?"✓ Users can call this tool":"✗ Users cannot call this tool"})]}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm",onClick:t=>c(e.name,t),title:"Edit display name and description",children:(0,t.jsx)(es.Pencil,{})})]})}),r&&(0,t.jsxs)("div",{className:"space-y-3 rounded-b-lg border-t border-border bg-muted px-4 pt-3 pb-4",onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-1 block text-xs font-medium",children:"Display Name"}),(0,t.jsx)(tc.Input,{placeholder:e.name,value:l[e.name]||"",onChange:t=>d(e.name,t.target.value),"aria-invalid":h||void 0}),h?(0,t.jsx)("p",{className:"mt-1 block text-xs text-destructive",children:"Only letters, digits, underscores, and hyphens are allowed (no spaces)."}):(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:"Override how this tool's name appears to users. Leave blank to use original."})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-1 block text-xs font-medium",children:"Description"}),(0,t.jsx)(td.Textarea,{className:"field-sizing-fixed",placeholder:e.description||"No description",value:a[e.name]||"",onChange:t=>u(e.name,t.target.value),rows:2}),(0,t.jsx)("p",{className:"mt-1 block text-xs text-muted-foreground",children:"Override the tool description shown to users. Leave blank to use original."})]})]})]})},th=({accessToken:e,formValues:s,allowedTools:r,existingAllowedTools:l,onAllowedToolsChange:c,toolNameToDisplayName:d,toolNameToDescription:u,onToolNameToDisplayNameChange:h,onToolNameToDescriptionChange:x,hasToolAllowlistInteraction:g=!1,onToolAllowlistInteraction:f,keyTools:j,externalTools:v,externalIsLoading:b,externalError:y,externalErrorStatus:_=null,externalCanFetch:N,isEditMode:w=!1})=>{let k=(0,p.useRef)([]),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)("crud"),I=(0,p.useRef)(!1),O=(0,p.useRef)(""),[P,M]=(0,p.useState)(new Set),F=403===_,E=v??[],L=b??!1,R=y??null,U=N??!1,z=(0,p.useMemo)(()=>{if(!j||0===j.length||0===E.length)return[];let e=new Set,t=[];for(let s of j){let r=s.name.split("_").map(e=>e.toLowerCase()).filter(e=>e.length>1);if(0===r.length)continue;let l=e=>e.toLowerCase().replace(/[-_/]/g," "),a=E.find(t=>{if(e.has(t.name))return!1;let s=l(t.name);return r.every(e=>s.includes(e))});if(!a){let t=r.find(e=>e.length>3)??r[r.length-1];a=E.find(s=>!e.has(s.name)&&l(s.name).includes(t))}a&&(t.push(a),e.add(a.name))}return t},[j,E]),V=(0,p.useMemo)(()=>new Set(z.map(e=>e.name)),[z]),H=(0,p.useMemo)(()=>E.filter(e=>{let t=C.toLowerCase();return e.name.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t)}),[E,C]),D=(0,p.useMemo)(()=>H.filter(e=>V.has(e.name)),[H,V]),B=(0,p.useMemo)(()=>H.filter(e=>!V.has(e.name)),[H,V]);(0,p.useEffect)(()=>{let e=E.map(e=>e.name).sort().join(","),t=k.current.map(e=>e.name).sort().join(","),s=z.map(e=>e.name).sort().join(",");if(s!==O.current&&(O.current=s,""!==s&&(I.current=!1)),E.length>0&&e!==t){let e=E.map(e=>e.name);I.current?c(r.filter(t=>e.includes(t))):(I.current=!0,null!==l?c(l.filter(t=>e.includes(t))):w?c(g?r.filter(t=>e.includes(t)):[]):z.length>0?c(z.map(e=>e.name).filter(t=>e.includes(t))):c(e))}k.current=E},[E,r,l,c,z,g,w]);let q=w&&null===l&&0===r.length&&!g,$=(0,p.useMemo)(()=>q?E.map(e=>e.name):r,[r,q,E]),W=(0,p.useMemo)(()=>new Set($),[$]),K=e=>{f?.(),c(e)},G=e=>{W.has(e)?K($.filter(t=>t!==e)):K([...$,e])},Y=(e,t)=>{t.stopPropagation(),M(t=>{let s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},J=(e,t)=>{let s={...d};t?s[e]=t:delete s[e],h(s)},Q=(e,t)=>{let s={...u};t?s[e]=t:delete s[e],x(s)};return U||s.url||s.spec_path?(0,t.jsx)(te.Card,{className:"p-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(e9.Wrench,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h3",{className:"text-lg font-medium",children:"Tool Configuration"}),E.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",children:E.length})]}),E.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(i.Button,{size:"sm",variant:"crud"===S?"default":"outline",onClick:()=>A("crud"),children:"Risk Groups"}),(0,t.jsx)(i.Button,{size:"sm",variant:"flat"===S?"default":"outline",onClick:()=>A("flat"),children:"Flat List"})]})]}),(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-3",children:(0,t.jsxs)("p",{className:"text-sm",children:[(0,t.jsx)("strong",{children:"Select which tools users can call:"})," Only checked tools will be available for users to invoke. Unchecked tools will be blocked from execution."]})}),L&&(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 py-6",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm",children:"Loading tools from spec..."})]}),R&&!L&&F&&(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-4",children:(0,t.jsx)("p",{className:"text-sm",children:R})}),R&&!L&&!F&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed border-destructive/40 bg-destructive/5 py-6 text-center",children:[(0,t.jsx)(e9.Wrench,{className:"mx-auto mb-2 size-6 text-destructive"}),(0,t.jsx)("p",{className:"text-sm font-medium text-destructive",children:"Unable to load tools"}),(0,t.jsx)("p",{className:"text-sm text-destructive",children:R})]}),!L&&!R&&0===E.length&&U&&(j&&j.length>0?(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-4 text-center text-muted-foreground",children:[(0,t.jsx)(e9.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"No tools loaded from spec"}),(0,t.jsxs)("p",{className:"mt-1 block text-sm",children:["Expected tools: ",j.map(e=>e.name).join(", ")]})]}):(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(e9.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"No tools available for configuration"}),(0,t.jsx)("p",{className:"text-sm",children:"Connect to an MCP server with tools to configure them"})]})),!U&&(s.url||s.spec_path)&&(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(e9.Wrench,{className:"mx-auto mb-2 size-6"}),(0,t.jsx)("p",{className:"text-sm",children:"Complete required fields to configure tools"}),(0,t.jsx)("p",{className:"text-sm",children:"Fill in URL, Transport, and Authentication to load available tools"})]}),!L&&!R&&E.length>0&&(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-muted p-3",children:[(0,t.jsx)(tl.CircleCheck,{className:"size-4"}),(0,t.jsxs)("p",{className:"text-sm font-medium",children:[$.length," of ",E.length," ",1===E.length?"tool":"tools"," enabled for user access"]})]}),(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search tools by name or description...",value:C,onChange:e=>T(e.target.value)})]}),"crud"===S&&(0,t.jsx)(tu.default,{tools:E,searchFilter:C,value:q?void 0:r,onChange:K}),"flat"===S&&(0,t.jsx)(t.Fragment,{children:0===H.length?(0,t.jsxs)("div",{className:"rounded-lg border border-dashed py-6 text-center text-muted-foreground",children:[(0,t.jsx)(a.Search,{className:"mx-auto mb-2 size-6"}),(0,t.jsxs)("p",{className:"text-sm",children:['No tools found matching "',C,'"']})]}):(0,t.jsxs)("div",{className:"space-y-2",children:[D.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-1",children:[(0,t.jsx)("p",{className:"text-xs font-semibold tracking-wide text-muted-foreground uppercase",children:"Suggested tools"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{let e=z.map(e=>e.name).filter(e=>!W.has(e));0!==e.length&&K([...$,...e])},children:"Enable all"}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{K($.filter(e=>!V.has(e)))},children:"Disable all"})]})]}),D.map(e=>(0,t.jsx)(tm,{tool:e,isEnabled:W.has(e.name),isEditExpanded:P.has(e.name),toolNameToDisplayName:d,toolNameToDescription:u,onToggle:G,onToggleExpand:Y,onDisplayNameChange:J,onDescriptionChange:Q},e.name))]}),B.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-1 pt-2",children:[(0,t.jsx)("p",{className:"text-xs font-semibold tracking-wide text-muted-foreground uppercase",children:D.length>0?"All tools":"Tools"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{let e=E.filter(e=>!V.has(e.name)).map(e=>e.name).filter(e=>!W.has(e));0!==e.length&&K([...$,...e])},children:"Enable all"}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>{K($.filter(e=>V.has(e)))},children:"Disable all"})]})]}),B.map(e=>(0,t.jsx)(tm,{tool:e,isEnabled:W.has(e.name),isEditExpanded:P.has(e.name),toolNameToDisplayName:d,toolNameToDescription:u,onToggle:G,onToggleExpand:Y,onDisplayNameChange:J,onDescriptionChange:Q},e.name))]})]})})]})]})}):null},tx=({isVisible:e,required:s=!0})=>e?(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Stdio Configuration (JSON)",(0,t.jsx)(ev.Tooltip,{title:"Paste your stdio MCP server configuration in JSON format. You can use the full mcpServers structure from config.yaml or just the inner server configuration.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"stdio_config",rules:[...s?[{required:!0,message:"Please enter stdio configuration"}]:[],{validator:(e,t)=>{if(!t)return Promise.resolve();try{return JSON.parse(t),Promise.resolve()}catch{return Promise.reject("Please enter valid JSON")}}}],children:(0,t.jsx)(W.Input.TextArea,{placeholder:`{ + "mcpServers": { + "circleci-mcp-server": { + "command": "npx", + "args": ["-y", "@circleci/mcp-server-circleci"], + "env": { + "CIRCLECI_TOKEN": "your-circleci-token", + "CIRCLECI_BASE_URL": "https://circleci.com" + } + } + } +}`,rows:12,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500 font-mono text-sm"})}):null;var tp=e.i(560445),tg=e.i(770914),tf=e.i(564897),tj=e.i(646563);let{Panel:tv}=e_.Collapse,tb=({availableAccessGroups:e,mcpServer:s,searchValue:r,setSearchValue:l,getAccessGroupOptions:a})=>{let n=$.Form.useFormInstance(),i=$.Form.useWatch("auth_type",n),o=i===eC.AUTH_TYPE.OAUTH2,c=i===eC.AUTH_TYPE.NONE||null==i,d=$.Form.useWatch("extra_headers",n),u=Array.isArray(d)&&d.some(e=>"string"==typeof e&&"authorization"===e.toLowerCase()),m=c&&u,h=$.Form.useWatch("delegate_auth_to_upstream",n),x=$.Form.useWatch("available_on_public_internet",n),g=o&&!0===h&&!1===x;return(0,p.useEffect)(()=>{if(s){if(s.static_headers){let e=Object.entries(s.static_headers).map(([e,t])=>({header:e,value:null!=t?String(t):""}));n.setFieldValue("static_headers",e)}Array.isArray(s.env_vars)&&s.env_vars.length>0&&n.setFieldValue("env_vars",s.env_vars.map(e=>({name:e.name,value:e.value??"",scope:e.scope??"global",description:e.description??""}))),"boolean"==typeof s.allow_all_keys&&n.setFieldValue("allow_all_keys",s.allow_all_keys),"boolean"==typeof s.available_on_public_internet&&n.setFieldValue("available_on_public_internet",s.available_on_public_internet),"boolean"==typeof s.delegate_auth_to_upstream&&n.setFieldValue("delegate_auth_to_upstream",s.delegate_auth_to_upstream),"boolean"==typeof s.oauth_passthrough&&n.setFieldValue("oauth_passthrough",s.oauth_passthrough)}else n.setFieldValue("allow_all_keys",!1),n.setFieldValue("available_on_public_internet",!0),n.setFieldValue("delegate_auth_to_upstream",!1),n.setFieldValue("oauth_passthrough",!1)},[s,n]),(0,p.useEffect)(()=>{o||n.setFieldValue("delegate_auth_to_upstream",!1)},[o,n]),(0,p.useEffect)(()=>{m||n.setFieldValue("oauth_passthrough",!1)},[m,n]),(0,t.jsx)(e_.Collapse,{className:"bg-gray-50 border border-gray-200 rounded-lg",expandIconPosition:"end",ghost:!1,children:(0,t.jsx)(tv,{header:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900",children:"Permission Management / Access Control"})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 ml-4",children:"Configure access permissions and security settings (Optional)"})]}),className:"border-0",forceRender:!0,children:(0,t.jsxs)("div",{className:"space-y-6 pt-4",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Allow All LiteLLM Keys",(0,t.jsx)(ev.Tooltip,{title:"When enabled, every API key can access this MCP server.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:'Enable if this server should be "public" to all keys.'})]}),(0,t.jsx)($.Form.Item,{name:"allow_all_keys",valuePropName:"checked",initialValue:s?.allow_all_keys??!1,className:"mb-0",children:(0,t.jsx)(eV.Switch,{})})]}),(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Internal network only",(0,t.jsx)(ev.Tooltip,{title:"When on, only requests from within your internal network are accepted. Turn off to allow external clients (other clusters, ChatGPT, etc). API key authentication is always required regardless of this setting.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Turn on to restrict access to callers within your internal network only."})]}),(0,t.jsx)($.Form.Item,{name:"available_on_public_internet",valuePropName:"checked",getValueProps:e=>({checked:!e}),getValueFromEvent:e=>!e,initialValue:!0,className:"mb-0",children:(0,t.jsx)(eV.Switch,{})})]}),o&&(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Delegate auth to upstream (PKCE passthrough)",(0,t.jsx)(ev.Tooltip,{title:"When on, LiteLLM skips its own API key/SSO check for this server and lets the client complete PKCE directly with the upstream MCP server. Only honored when Auth Type is oauth2. No spend tracking or per-key rate limiting will run on this route.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Bypass LiteLLM auth so clients authenticate directly with the upstream OAuth MCP server."})]}),(0,t.jsx)($.Form.Item,{name:"delegate_auth_to_upstream",valuePropName:"checked",initialValue:s?.delegate_auth_to_upstream??!1,className:"mb-0",children:(0,t.jsx)(eV.Switch,{})})]}),m&&(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OAuth pass-through",(0,t.jsx)(ev.Tooltip,{title:"When on, this server is treated as an OAuth pass-through: the gateway proxies the upstream /.well-known/oauth-protected-resource metadata, emits spec-compliant 401 challenges when no bearer is supplied, and propagates upstream 401/403 responses. Only honored when Auth Type is None and 'Authorization' is in Extra Headers.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:"Forward upstream OAuth discovery and 401 challenges so clients negotiate OAuth directly with the upstream MCP server."})]}),(0,t.jsx)($.Form.Item,{name:"oauth_passthrough",valuePropName:"checked",initialValue:s?.oauth_passthrough??!1,className:"mb-0",children:(0,t.jsx)(eV.Switch,{})})]}),g&&(0,t.jsx)(tp.Alert,{type:"warning",showIcon:!0,className:"mb-2",message:"Internal server with upstream OAuth delegation",description:"This MCP server is configured as internal-only but delegates auth to upstream. Anonymous users will be able to reach the upstream OAuth2 /authorize flow without a LiteLLM session. Ensure your upstream provider and network enforce access controls."}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["MCP Access Groups",(0,t.jsx)(ev.Tooltip,{title:"Specify access groups for this MCP server. Users must be in at least one of these groups to access the server.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"mcp_access_groups",className:"mb-4",children:(0,t.jsx)(eb.Select,{mode:"tags",showSearch:!0,placeholder:"Select existing groups or type to create new ones",optionFilterProp:"value",filterOption:(e,t)=>(t?.value??"").toLowerCase().includes(e.toLowerCase()),onSearch:e=>l(e),tokenSeparators:[","],options:a(),maxTagCount:"responsive",allowClear:!0})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Extra Headers",(0,t.jsx)(ev.Tooltip,{title:"Forward custom headers from incoming requests to this MCP server (e.g., Authorization, X-Custom-Header, User-Agent)",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})}),s?.extra_headers&&s.extra_headers.length>0&&(0,t.jsxs)("span",{className:"ml-2 text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded-full",children:[s.extra_headers.length," configured"]})]}),name:"extra_headers",children:(0,t.jsx)(eb.Select,{mode:"tags",placeholder:s?.extra_headers&&s.extra_headers.length>0?`Currently: ${s.extra_headers.join(", ")}`:"Enter header names (e.g., Authorization, X-Custom-Header)",className:"rounded-lg",size:"large",tokenSeparators:[","],allowClear:!0})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Static Headers",(0,t.jsx)(ev.Tooltip,{title:"Send these key-value headers with every request to this MCP server.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),required:!1,children:(0,t.jsx)($.Form.List,{name:"static_headers",children:(e,{add:s,remove:r})=>(0,t.jsxs)("div",{className:"space-y-3",children:[e.map(({key:e,name:s,...l})=>(0,t.jsxs)(tg.Space,{className:"flex w-full",align:"baseline",size:"middle",children:[(0,t.jsx)($.Form.Item,{...l,name:[s,"header"],className:"flex-1",rules:[{required:!0,message:"Header name is required"}],children:(0,t.jsx)(W.Input,{size:"large",allowClear:!0,className:"rounded-lg",placeholder:"Header name (e.g., X-API-Key)"})}),(0,t.jsx)($.Form.Item,{...l,name:[s,"value"],className:"flex-1",rules:[{required:!0,message:"Header value is required"}],children:(0,t.jsx)(W.Input,{size:"large",allowClear:!0,className:"rounded-lg",placeholder:"Header value"})}),(0,t.jsx)(tf.MinusCircleOutlined,{onClick:()=>r(s),className:"text-gray-500 hover:text-red-500 cursor-pointer"})]},e)),(0,t.jsx)(eQ.Button,{type:"dashed",onClick:()=>s(),icon:(0,t.jsx)(tj.PlusOutlined,{}),block:!0,children:"Add Static Header"})]})})})]})},"permissions")})},ty=({accessToken:e,selectedName:s,onSelect:r})=>{let[l,a]=(0,p.useState)([]),[n,i]=(0,p.useState)(!1),[o,c]=(0,p.useState)(new Set);return((0,p.useEffect)(()=>{e&&(i(!0),(0,b.fetchOpenAPIRegistry)(e).then(e=>a(e.apis??[])).catch(()=>a([])).finally(()=>i(!1)))},[e]),n)?(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium",children:"Popular APIs"}),(0,t.jsx)("div",{className:"flex justify-center py-6",children:(0,t.jsx)(m.UiLoadingSpinner,{className:"size-5 text-muted-foreground"})})]}):0===l.length?null:(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("span",{className:"mb-2 block text-sm font-medium",children:"Popular APIs"}),(0,t.jsx)("div",{className:"grid grid-cols-5 gap-2",children:l.map(e=>{let l=s===e.name,a=o.has(e.name);return(0,t.jsxs)("button",{type:"button",title:e.description,onClick:()=>r(e),className:(0,ec.cn)("flex cursor-pointer flex-col items-center gap-1.5 rounded-lg border p-3 transition-all",l?"border-primary bg-accent shadow-xs":"border-border hover:bg-accent"),children:[a?(0,t.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-full bg-muted text-sm font-bold text-muted-foreground",children:e.title.charAt(0)}):(0,t.jsx)("img",{src:e.icon_url,alt:e.title,className:"h-7 w-7 object-contain",onError:()=>{var t;return t=e.name,void c(e=>new Set(e).add(t))}}),(0,t.jsx)("span",{className:"text-center text-xs leading-tight font-medium text-muted-foreground",children:e.title})]},e.name)})}),(0,t.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Select an API to pre-fill the spec URL and OAuth 2.0 settings, or enter your own spec URL below."})]})},t_=({form:e,accessToken:s,onValuesChange:r,onKeyToolsChange:l,onLogoUrlChange:a,onOAuthDocsUrlChange:n})=>{let[i,o]=(0,p.useState)(null);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(ty,{accessToken:s,selectedName:i,onSelect:t=>{o(t.name),l?.(t.key_tools??[]),a?.(t.icon_url||void 0);let s={spec_path:t.spec_url};t.oauth?(s.auth_type=eC.AUTH_TYPE.OAUTH2,s.oauth_flow_type=eC.OAUTH_FLOW.INTERACTIVE,s.authorization_url=t.oauth.authorization_url,s.token_url=t.oauth.token_url,e.setFieldsValue(s),n?.(t.oauth.docs_url??null)):(e.resetFields(["auth_type","authorization_url","token_url"]),e.setFieldsValue(s),n?.(null)),r(s)}}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OpenAPI Spec URL",(0,t.jsx)(ev.Tooltip,{title:"URL to an OpenAPI specification (JSON or YAML). MCP tools will be automatically generated from the API endpoints defined in the spec.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"spec_path",rules:[{required:!0,message:"Please enter an OpenAPI spec URL"}],children:(0,t.jsx)(W.Input,{placeholder:"https://petstore3.swagger.io/api/v3/openapi.json",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",onChange:()=>{o(null),l?.([]),n?.(null)}})})]})};var tN=e.i(221345),tw=e.i(174553);let tk={src:e.i(703330).default,width:16,height:16,blurWidth:0,blurHeight:0},tC={src:e.i(924056).default,width:24,height:24,blurWidth:0,blurHeight:0},tT={src:e.i(806471).default,width:24,height:24,blurWidth:0,blurHeight:0},tS={src:e.i(67456).default,width:24,height:24,blurWidth:0,blurHeight:0},tA={src:e.i(459465).default,width:24,height:24,blurWidth:0,blurHeight:0},tI={src:e.i(283873).default,width:24,height:24,blurWidth:0,blurHeight:0},tO={src:e.i(88313).default,width:24,height:24,blurWidth:0,blurHeight:0},tP={src:e.i(243999).default,width:24,height:24,blurWidth:0,blurHeight:0},tM={src:e.i(798962).default,width:24,height:24,blurWidth:0,blurHeight:0},tF={src:e.i(762217).default,width:24,height:24,blurWidth:0,blurHeight:0},tE={src:e.i(758618).default,width:24,height:24,blurWidth:0,blurHeight:0},tL={src:e.i(333191).default,width:24,height:24,blurWidth:0,blurHeight:0},tR={src:e.i(675865).default,width:24,height:24,blurWidth:0,blurHeight:0};var tU=e.i(9774);let tz={src:e.i(301873).default,width:24,height:24,blurWidth:0,blurHeight:0};var tV=e.i(284629),tH=e.i(247044);let tD={src:e.i(72982).default,width:24,height:24,blurWidth:0,blurHeight:0};var tB=e.i(336712);let tq={src:e.i(521442).default,width:24,height:24,blurWidth:0,blurHeight:0},t$="/ui/assets/logos/",tW=[{name:"GitHub",url:`${t$}github.svg`,src:tk.src},{name:"Slack",url:`${t$}slack.svg`,src:tC.src},{name:"Notion",url:`${t$}notion.svg`,src:tT.src},{name:"Linear",url:`${t$}linear.svg`,src:tS.src},{name:"Jira",url:`${t$}jira.svg`,src:tA.src},{name:"Figma",url:`${t$}figma.svg`,src:tI.src},{name:"Gmail",url:`${t$}gmail.svg`,src:tO.src},{name:"Google Drive",url:`${t$}google_drive.svg`,src:tP.src},{name:"Stripe",url:`${t$}stripe.svg`,src:tM.src},{name:"Shopify",url:`${t$}shopify.svg`,src:tF.src},{name:"Salesforce",url:`${t$}salesforce.svg`,src:tE.src},{name:"HubSpot",url:`${t$}hubspot.svg`,src:tL.src},{name:"Twilio",url:`${t$}twilio.svg`,src:tR.src},{name:"Cloudflare",url:`${t$}cloudflare.svg`,src:tU.default.src},{name:"Sentry",url:`${t$}sentry.svg`,src:tz.src},{name:"PostgreSQL",url:`${t$}postgresql.svg`,src:tV.default.src},{name:"Snowflake",url:`${t$}snowflake.svg`,src:tH.default.src},{name:"Zapier",url:`${t$}zapier.svg`,src:tD.src},{name:"Google",url:`${t$}google.svg`,src:tB.default.src},{name:"GitLab",url:`${t$}gitlab.svg`,src:tq.src}],tK=({value:e,onChange:s})=>{let r=tW.find(t=>t.url===e);return(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium",children:"Logo"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(e7.Info,{className:"size-4 cursor-help text-muted-foreground","aria-label":"About the logo"})}),(0,t.jsx)(u.TooltipContent,{children:"Select a well-known logo or paste a URL to any image. The logo is shown on the admin and chat pages."})]})]}),e&&(0,t.jsxs)("div",{className:"mb-3 flex items-center gap-3 rounded-lg border border-border bg-muted p-3",children:[(0,t.jsx)(tw.Logo,{src:r?.src??e,label:"Selected",className:"h-10 w-10 rounded-sm object-contain"}),(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)("div",{className:"truncate text-xs text-muted-foreground",children:e})}),(0,t.jsx)("button",{type:"button",onClick:()=>s?.(void 0),className:"cursor-pointer border-none bg-transparent text-xs text-muted-foreground hover:text-destructive",children:"✕"})]}),(0,t.jsx)("div",{className:"mb-3 grid grid-cols-10 gap-1.5",children:tW.map(r=>{let l=e===r.url;return(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=r.url,void s?.(e===t?void 0:t)},className:(0,ec.cn)("flex size-10 cursor-pointer items-center justify-center rounded-lg border p-2 transition-all",l?"border-primary bg-accent shadow-xs":"border-border hover:bg-accent"),children:(0,t.jsx)("img",{src:r.src,alt:r.name,className:"h-5 w-5 object-contain"})})}),(0,t.jsx)(u.TooltipContent,{children:r.name})]},r.name)})}),(0,t.jsxs)(o.InputGroup,{children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(tN.Link,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Or paste a custom logo URL...",value:e&&!r?e:"",onChange:e=>{let t=e.target.value.trim();s?.(t||void 0)}})]})]})})};var tG=e.i(898586);let{Text:tY}=tG.Typography,tJ=[{value:"global",label:"Instance"},{value:"user",label:"Per-user"}],tQ=({name:e,restField:s})=>"user"===$.Form.useWatch(["env_vars",e,"scope"])?(0,t.jsx)($.Form.Item,{...s,name:[e,"description"],className:"mb-0",children:(0,t.jsx)(W.Input,{addonBefore:(0,t.jsx)(ev.Tooltip,{title:"Per-user variables have no shared value. This text is only a hint shown to each user when they fill in their own value.",children:(0,t.jsxs)("span",{className:"text-xs text-gray-500 cursor-help whitespace-nowrap",children:[(0,t.jsx)(eN.InfoCircleOutlined,{className:"mr-1"}),"Hint"]})}),placeholder:"e.g. Your DB username",styles:{input:{color:"#9ca3af"}}})}):(0,t.jsx)($.Form.Item,{...s,name:[e,"value"],className:"mb-0",children:(0,t.jsx)(W.Input,{placeholder:"e.g. postgresql",className:"rounded-md font-mono"})}),tZ=()=>(0,t.jsxs)("div",{className:"rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,t.jsx)(tY,{strong:!0,className:"text-sm",children:"Variables"}),(0,t.jsx)(ev.Tooltip,{title:(0,t.jsxs)(t.Fragment,{children:["Define variables you can interpolate in Static Headers or Authentication using"," ",(0,t.jsx)("code",{children:"${VAR_NAME}"}),". ",(0,t.jsx)("br",{}),(0,t.jsx)("b",{children:"Instance"}),": admin-defined value used for every user.",(0,t.jsx)("br",{}),(0,t.jsx)("b",{children:"Per-user"}),": each user supplies their own value (e.g. personal credentials) via the MCP Gateway dashboard."]}),children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"text-blue-400 hover:text-blue-600 cursor-help"})})]}),(0,t.jsxs)(tY,{className:"text-xs text-gray-600 block mb-3",children:["Reference these in Static Headers or Authentication as ",(0,t.jsx)("code",{children:"${VAR_NAME}"}),". For example:"," ",(0,t.jsx)("code",{className:"bg-white px-1 rounded-sm border border-gray-200",children:"${DB_PROTOCOL}://${CORP_USERNAME}:${CORP_PASSWORD}@${DB_HOSTNAME}"})]}),(0,t.jsx)($.Form.List,{name:"env_vars",children:(e,{add:s,remove:r})=>(0,t.jsxs)("div",{className:"space-y-2",children:[e.length>0&&(0,t.jsxs)("div",{className:"flex gap-3 px-1 text-xs font-medium text-gray-500 uppercase tracking-wide",children:[(0,t.jsx)("div",{style:{flex:1},children:"Variable Name"}),(0,t.jsx)("div",{style:{flex:1},children:"Value / Description"}),(0,t.jsx)("div",{style:{width:160},children:"Scope"}),(0,t.jsx)("div",{style:{width:24}})]}),e.map(({key:e,name:s,...l})=>(0,t.jsxs)("div",{className:"flex gap-3 items-start",children:[(0,t.jsx)($.Form.Item,{...l,name:[s,"name"],className:"mb-0",style:{flex:1},rules:[{required:!0,message:"Variable name is required"},{pattern:/^[A-Za-z_][A-Za-z0-9_]*$/,message:"Use letters, digits, underscores; cannot start with a digit."}],children:(0,t.jsx)(W.Input,{placeholder:"e.g. DB_PROTOCOL",className:"rounded-md font-mono"})}),(0,t.jsx)("div",{style:{flex:1},children:(0,t.jsx)(tQ,{name:s,restField:l})}),(0,t.jsx)($.Form.Item,{...l,name:[s,"scope"],className:"mb-0",initialValue:"global",style:{width:160},children:(0,t.jsx)(eb.Select,{options:tJ})}),(0,t.jsx)("div",{style:{width:24,height:32},className:"flex items-center justify-center",children:(0,t.jsx)(tf.MinusCircleOutlined,{onClick:()=>r(s),className:"text-gray-500 hover:text-red-500 cursor-pointer"})})]},e)),(0,t.jsx)(eQ.Button,{type:"dashed",onClick:()=>s({scope:"global"}),icon:(0,t.jsx)(tj.PlusOutlined,{}),block:!0,children:"Add Variable"})]})})]});var tX=e.i(122520),t0=e.i(165615);let t2=({accessToken:e,getCredentials:t,getTemporaryPayload:s,onTokenReceived:r,onBeforeRedirect:l,flowSource:a})=>{let[n,i]=(0,p.useState)("idle"),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(null),m=(0,p.useRef)(!1),h=(0,p.useRef)(0),x="litellm-mcp-oauth-flow-state",g="litellm-mcp-oauth-result",f="litellm-mcp-oauth-return-url",j=(e,t)=>{(0,eR.setSecureItem)(e,t)},v=e=>{try{return(0,eR.getSecureItem)(e)}catch(t){return console.warn(`Failed to get storage item ${e}`,t),null}},y=()=>{try{window.sessionStorage.removeItem(x),window.sessionStorage.removeItem(g),window.sessionStorage.removeItem(f),window.localStorage.removeItem(x),window.localStorage.removeItem(g),window.localStorage.removeItem(f)}catch(e){console.warn("Failed to clear OAuth storage",e)}},_=()=>{let e,t,s;return s=((t=(e=window.location.pathname||"").indexOf("/ui"))>=0?e.slice(0,t+3):"").replace(/\/+$/,""),`${window.location.origin}${s}/mcp/oauth/callback`},w=(0,p.useCallback)(async()=>{let r=t()||{};if(!e){c("Missing admin token"),N.default.error("Access token missing. Please re-authenticate and try again.");return}let n=s();if(!n||!n.url||!n.transport){let e="Please complete server URL and transport before starting OAuth.";c(e),N.default.error(e);return}try{i("authorizing"),c(null);let t=await (0,b.cacheTemporaryMcpServer)(e,n),s=t?.server_id?.trim();if(!s)throw Error("Temporary MCP server identifier missing. Please retry.");let o={};if(!n.credentials?.client_id){let t=await (0,b.registerMcpOAuthClient)(e,s,{client_name:n.alias||n.server_name||s,grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:n.credentials&&n.credentials.client_secret?"client_secret_post":"none",redirect_uris:[_()]});o={clientId:t?.client_id,clientSecret:t?.client_secret}}let d=(0,t0.generateCodeVerifier)(),u=await (0,t0.generateCodeChallenge)(d),m=crypto.randomUUID(),h=o.clientId||r.client_id,p=Array.isArray(r.scopes)?r.scopes.filter(e=>e&&e.trim().length>0).join(" "):void 0,g=(0,b.buildMcpOAuthAuthorizeUrl)({serverId:s,clientId:h,redirectUri:_(),state:m,codeChallenge:u,scope:p}),v={state:m,codeVerifier:d,clientId:h,clientSecret:o.clientSecret||r.client_secret,serverId:s,redirectUri:_(),flowSource:a};if(l)try{l()}catch(e){console.error("Failed to prepare for OAuth redirect",e)}try{j(x,JSON.stringify(v)),j(f,window.location.href)}catch(e){throw Error("Unable to access browser storage for OAuth. Please enable storage and retry.")}window.location.href=g}catch(t){console.error("Failed to start OAuth flow",t),i("error");let e=(0,tX.extractErrorMessage)(t);c(e),N.default.error(e)}},[e,t,s,l]),k=(0,p.useCallback)(async()=>{if(m.current)return;let t=null,s=null;try{let e=v(g);if(!e)return;let r=v(x);if(!r)return;m.current=!0,t=JSON.parse(e),s=JSON.parse(r)}catch(e){y(),m.current=!1,c("Failed to resume OAuth flow. Please retry."),i("error"),N.default.error("Failed to resume OAuth flow. Please retry.");return}if(!t||s?.flowSource!==a){m.current=!1;return}try{window.sessionStorage.removeItem(g),window.localStorage.removeItem(g)}catch(e){}let l=h.current;try{if(!s||!s.state||!s.codeVerifier||!s.serverId)throw Error("OAuth session state was lost. This can happen if you have strict browser privacy settings. Please try again and ensure cookies/storage is enabled.");if(!t.state||t.state!==s.state)throw Error("OAuth state mismatch. Please retry.");if(t.error)throw Error(t.error_description||t.error);if(!t.code)throw Error("Authorization code missing in callback.");i("exchanging");let a=await (0,b.exchangeMcpOAuthToken)({serverId:s.serverId,code:t.code,clientId:s.clientId,clientSecret:s.clientSecret,codeVerifier:s.codeVerifier,redirectUri:s.redirectUri,accessToken:e});if(l!==h.current)return;r(a,{clientId:s.clientId,clientSecret:s.clientSecret}),u(a),i("success"),c(null),N.default.success("OAuth token retrieved successfully")}catch(t){if(l!==h.current)return;let e=(0,tX.extractErrorMessage)(t);c(e),i("error"),N.default.error(e)}finally{l===h.current&&(y(),setTimeout(()=>{m.current=!1},1e3))}},[r]);return(0,p.useEffect)(()=>{k()},[k]),{startOAuthFlow:w,status:n,error:o,tokenResponse:d,reset:(0,p.useCallback)(()=>{h.current+=1,i("idle"),c(null),u(null),m.current=!1},[])}},t1={src:e.i(756788).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAkklEQVR42lWOOwrEIBRF3XJWkJBAUiRlAtZauAt3oGhp5wIsLATF38wbMh/mFsq7B8576PGJ914pFUK4R3R/zrnrutZ1ZYzlnN8A2vM8p2ma53kYBkopMBRjJIRABWAcx33fj+MAISqlWGuXZQEPMHillL33l6rWyjnHGG/bJoSA9rccorUGZ2vt7ypISskY8wVPejadvQjN/QQAAAAASUVORK5CYII="}.src,t4=({userID:e,userRole:r,accessToken:l,onCreateSuccess:a,isModalVisible:n,setModalVisible:i,availableAccessGroups:o,prefillData:c,onBackToDiscovery:d})=>{let[u]=$.Form.useForm(),[m,h]=(0,p.useState)(!1),[x,g]=(0,p.useState)({}),[f,j]=(0,p.useState)({}),[v,y]=(0,p.useState)(null),[_,w]=(0,p.useState)(!1),[k,C]=(0,p.useState)([]),[T,S]=(0,p.useState)(!1),[A,I]=(0,p.useState)({}),[O,P]=(0,p.useState)({}),[M,F]=(0,p.useState)(""),[E,L]=(0,p.useState)([]),[R,U]=(0,p.useState)(""),[z,V]=(0,p.useState)(null),[D,B]=(0,p.useState)(void 0),[K,G]=(0,p.useState)(null),[Y,J]=(0,p.useState)(void 0),Q=p.default.useRef(null),[Z,X]=(0,p.useState)(!1),{tools:ee,isLoadingTools:et,toolsError:es,toolsErrorStatus:er,toolsErrorStackTrace:el,canFetchTools:ea,fetchTools:en,clearTools:ei}=(({accessToken:e,oauthAccessToken:t,formValues:s,enabled:r=!0})=>{let[l,a]=(0,p.useState)([]),[n,i]=(0,p.useState)(!1),[o,c]=(0,p.useState)(null),[d,u]=(0,p.useState)(null),[m,h]=(0,p.useState)(null),[x,g]=(0,p.useState)(!1),f=s.auth_type===eC.AUTH_TYPE.OAUTH2&&s.oauth_flow_type===eC.OAUTH_FLOW.M2M,j=(0,eC.isClientForwardedTokenMode)(s.auth_type),v=s.auth_type===eC.AUTH_TYPE.OAUTH2&&!f||j,y=s.transport===eC.TRANSPORT.OPENAPI,_=y?!!s.spec_path:!!s.url,N=y?!!(_&&e):!!(_&&s.transport&&s.auth_type&&e&&(!v||t)),w=JSON.stringify(s.static_headers??{}),k=JSON.stringify(s.credentials??{}),C=async()=>{if(e&&(s.url||s.spec_path)&&(!v||t||y)){i(!0),c(null),u(null);try{let r=Array.isArray(s.static_headers)?s.static_headers.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=t?.value!=null?String(t.value):""),e},{}):!Array.isArray(s.static_headers)&&s.static_headers&&"object"==typeof s.static_headers?Object.entries(s.static_headers).reduce((e,[t,s])=>(t&&(e[t]=null!=s?String(s):""),e),{}):{},l=s.credentials&&"object"==typeof s.credentials?Object.entries(s.credentials).reduce((e,[t,s])=>{if(null==s||""===s)return e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{}):void 0,n=s.transport===eC.TRANSPORT.OPENAPI?"http":s.transport,i={server_id:s.server_id||"",server_name:s.server_name||"",url:s.url,spec_path:s.spec_path,transport:n,auth_type:s.auth_type,authorization_url:s.authorization_url,token_url:s.token_url,registration_url:s.registration_url,mcp_info:s.mcp_info,static_headers:r};l&&Object.keys(l).length>0&&(i.credentials=l);let o=await (0,b.testMCPToolsListRequest)(e,i,t);if(o.tools&&!o.error)a(o.tools),c(null),u(null),h(null),o.tools.length>0&&!x&&g(!0);else{let e=o.message||"Failed to retrieve tools list";c(e),u("number"==typeof o.status?o.status:null),h(403===o.status?null:o.stack_trace||null),a([]),g(!1)}}catch(e){console.error("Tools fetch error:",e),c(e instanceof Error?e.message:String(e)),u(null),h(null),a([]),g(!1)}finally{i(!1)}}},T=(0,p.useCallback)(()=>{a([]),c(null),u(null),h(null),g(!1)},[]);return(0,p.useEffect)(()=>{r&&(N?C():T())},[s.url,s.spec_path,s.transport,s.auth_type,e,r,t,N,w,k]),{tools:l,isLoadingTools:n,toolsError:o,toolsErrorStatus:d,toolsErrorStackTrace:m,hasShownSuccessMessage:x,canFetchTools:N,fetchTools:C,clearTools:T}})({accessToken:l,oauthAccessToken:z,formValues:f,enabled:!0}),eo=f.auth_type,ec=!!eo&&eF.includes(eo),ed=eo===eC.AUTH_TYPE.OAUTH2,eu=eo===eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,em=eo===eC.AUTH_TYPE.OAUTH2_ID_JAG,eh=eo===eC.AUTH_TYPE.AWS_SIGV4,ex=ed&&f.oauth_flow_type===eC.OAUTH_FLOW.M2M,{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej,reset:eT}=t2({accessToken:l,getCredentials:()=>({...u.getFieldValue("credentials")??{},...Q.current??{}}),getTemporaryPayload:()=>{let e=u.getFieldsValue(!0),t=e.transport||M,s=e.url||(t===eC.TRANSPORT.OPENAPI?e.spec_path:void 0);if(!s||!t)return null;let r=eL(e.static_headers);return{server_id:void 0,server_name:e.server_name,alias:e.alias,description:e.description,url:s,transport:t===eC.TRANSPORT.OPENAPI?"http":t,auth_type:(0,eC.isClientForwardedTokenMode)(e.auth_type)?e.auth_type:eC.AUTH_TYPE.OAUTH2,credentials:(0,eC.isClientForwardedTokenMode)(e.auth_type)?(0,eC.preservedAdminCredentials)(e.credentials):{...e.credentials??{},...Q.current??{}},issuer:e.issuer,authorization_url:e.authorization_url,token_url:e.token_url,registration_url:e.registration_url,mcp_access_groups:e.mcp_access_groups,static_headers:r,command:e.command,args:e.args,env:e.env}},onTokenReceived:(e,t)=>{if(V(e?.access_token??null),!e?.access_token)return;if((0,eC.isClientForwardedTokenMode)(u.getFieldValue("auth_type"))){J((0,eC.getOAuthAuthorizationIdentity)(u.getFieldsValue(!0))),N.default.success("Token held for this browser session. Tools can now be previewed and configured; the token is not saved to LiteLLM.");return}Q.current=t?.clientId?{client_id:t.clientId,...t.clientSecret&&{client_secret:t.clientSecret}}:null;let s=u.getFieldValue("credentials")??{},r={...(0,eC.preservedAdminCredentials)(s)??{},...void 0!==s.scopes&&{scopes:s.scopes},access_token:e.access_token,...e.refresh_token&&{refresh_token:e.refresh_token},...e.expires_in&&{expires_in:e.expires_in},...e.scope&&{scope:e.scope}};u.setFieldValue("credentials",r),J((0,eC.getOAuthAuthorizationIdentity)(u.getFieldsValue(!0))),N.default.success("OAuth authorization successful! Please click 'Create MCP Server' to save the configuration.")},onBeforeRedirect:()=>{var e={modalVisible:n,formValues:u.getFieldsValue(!0),transportType:M,costConfig:x,allowedTools:k,hasToolAllowlistInteraction:T,searchValue:R,aliasManuallyEdited:_,logoUrl:D,authorizedIdentity:Y};try{(0,eR.setSecureItem)(eU,JSON.stringify(e))}catch(e){console.warn("Failed to persist MCP create state",e)}},flowSource:"create"}),eS=(e={})=>{V(null),ei(),eT(),J(void 0),Q.current=null;let t=(0,eC.preservedAdminCredentials)(u.getFieldValue("credentials"));u.resetFields([...eC.CLEARED_ON_INVALIDATION]),t&&u.setFieldsValue({credentials:t});let s=Object.fromEntries(eC.CLEARED_ON_INVALIDATION.filter(t=>t in e).map(t=>[t,e[t]]));Object.keys(s).length>0&&u.setFieldsValue(s)};p.default.useEffect(()=>{let e=(()=>{let e=(0,eR.getSecureItem)(eU);if(!e)return null;try{let t=JSON.parse(e),s=t.formValues?.transport||t.transportType||"";return{...t.modalVisible?{modalVisible:!0}:{},...s?{transportType:s}:{},...t.formValues?{formValues:{...t.formValues,credentials:(0,eC.withoutMintedTokenCredentials)(t.formValues.credentials)}}:{},..."string"==typeof t.authorizedIdentity?{authorizedIdentity:t.authorizedIdentity}:{},...t.costConfig?{costConfig:t.costConfig}:{},...t.allowedTools?{allowedTools:t.allowedTools}:{},..."boolean"==typeof t.hasToolAllowlistInteraction?{hasToolAllowlistInteraction:t.hasToolAllowlistInteraction}:{},...t.searchValue?{searchValue:t.searchValue}:{},..."boolean"==typeof t.aliasManuallyEdited?{aliasManuallyEdited:t.aliasManuallyEdited}:{},...t.logoUrl?{logoUrl:t.logoUrl}:{}}}catch(e){return console.error("Failed to restore MCP create state",e),null}finally{window.sessionStorage.removeItem(eU)}})();e&&(e.modalVisible&&i(!0),e.transportType&&F(e.transportType),e.formValues&&y({values:e.formValues,transport:e.transportType}),void 0!==e.authorizedIdentity&&J(e.authorizedIdentity),e.costConfig&&g(e.costConfig),e.allowedTools&&C([...e.allowedTools]),void 0!==e.hasToolAllowlistInteraction&&S(e.hasToolAllowlistInteraction),e.searchValue&&U(e.searchValue),void 0!==e.aliasManuallyEdited&&w(e.aliasManuallyEdited),e.logoUrl&&B(e.logoUrl))},[u,i]),p.default.useEffect(()=>{v&&(!v.transport||M)&&(u.setFieldsValue(v.values),j(v.values),y(null))},[v,u,M]),p.default.useEffect(()=>{if(!n||!c)return;let e=(c.name||"").replace(/[^a-zA-Z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),t=c.transport||"";F(t);let s={server_name:e,alias:e,description:c.description||"",transport:t};if("stdio"===t){let e={};if(c.command&&(e.command=c.command),c.args&&c.args.length>0&&(e.args=c.args),c.env_vars&&c.env_vars.length>0){let t={};for(let e of c.env_vars)t[e.name]=e.description?`<${e.description}>`:"";e.env=t}Object.keys(e).length>0&&(s.stdio_config=JSON.stringify(e,null,2))}else c.url&&(s.url=c.url);u.setFieldsValue(s),j(s),w(!1)},[n,c,u]);let eM=async t=>{let s=((e,t)=>{let s,r=(s=t.toolNameToDisplayName,Object.entries(s).find(([,e])=>e&&!eO.test(e))?.[1]);if(void 0!==r)return{kind:"invalid_tool_display_name",displayName:r};let{static_headers:l,env_vars:a,stdio_config:n,credentials:i,allow_all_keys:o,available_on_public_internet:c,delegate_auth_to_upstream:d,oauth_passthrough:u,dcr_bridge:m,token_validation_json:h,...x}=e,p=n&&"stdio"===t.transportType?(e=>{try{let t=JSON.parse(e),s=t.mcpServers&&"object"==typeof t.mcpServers?Object.keys(t.mcpServers)[0]:void 0,r=void 0===s?t:t.mcpServers[s];return{kind:"ok",fields:{command:r.command,args:r.args,env:r.env},...void 0===s?{}:{derivedServerName:s.replace(/-/g,"_")}}}catch{return{kind:"invalid"}}})(n):{kind:"ok",fields:{}};if("invalid"===p.kind)return{kind:"invalid_stdio_json"};let g=h&&""!==h.trim()?(e=>{try{return{kind:"ok",value:JSON.parse(e)}}catch{return{kind:"invalid"}}})(h):{kind:"ok",value:null};if("invalid"===g.kind)return{kind:"invalid_token_validation_json"};let f=g.value,j=x.server_name||p.derivedServerName,v=x.transport===eC.TRANSPORT.OPENAPI?"http":x.transport,b=x.auth_type,y=(e=>{if(e&&"object"==typeof e)return Object.entries(e).reduce((e,[t,s])=>{if(null==s||""===s)return e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{})})(i),_=void 0!==b&&eE.includes(b),N=(0,eC.isClientForwardedTokenMode)(b)?(0,eC.preservedAdminCredentials)(y):y,w=_&&N&&Object.keys(N).length>0?N:void 0,k=b===eC.AUTH_TYPE.OAUTH2&&t.dcrClient?{...w??{},...t.dcrClient}:w;return{kind:"ok",payload:{...x,...p.fields,...j===x.server_name?{}:{server_name:j},...v===x.transport?{}:{transport:v},stdio_config:void 0,mcp_info:{server_name:j||x.url,description:x.description,logo_url:t.logoUrl||void 0,mcp_server_cost_info:Object.keys(t.costConfig).length>0?t.costConfig:null,tool_allowlist_enforced:t.hasToolAllowlistInteraction||t.allowedTools.length>0},mcp_access_groups:x.mcp_access_groups,alias:x.alias,allowed_tools:[...t.allowedTools],tool_name_to_display_name:t.toolNameToDisplayName,tool_name_to_description:t.toolNameToDescription,allow_all_keys:!!o,available_on_public_internet:!!c,delegate_auth_to_upstream:!!d,oauth_passthrough:!!u,dcr_bridge:!!(0,eC.isClientForwardedTokenMode)(b)&&!!(m??!0),...b===eC.AUTH_TYPE.OAUTH2?{oauth2_flow:e.oauth_flow_type===eC.OAUTH_FLOW.M2M?eC.MCP_OAUTH2_FLOW_M2M:eC.MCP_OAUTH2_FLOW_INTERACTIVE}:{},static_headers:eL(l),env_vars:eP(a),...null!==f&&{token_validation:f},...void 0===k?{}:{credentials:k}}}})(t,{transportType:M,costConfig:x,allowedTools:k,hasToolAllowlistInteraction:T,toolNameToDisplayName:A,toolNameToDescription:O,logoUrl:D,dcrClient:Q.current});if("ok"!==s.kind)return void N.default.fromBackend((e=>{switch(e.kind){case"invalid_tool_display_name":return`Tool display name "${e.displayName}" is invalid. Only letters, digits, underscores, and hyphens are allowed (no spaces).`;case"invalid_stdio_json":return"Invalid JSON in stdio configuration";case"invalid_token_validation_json":return"Invalid JSON in Token Validation Rules"}})(s));let r=s.payload;h(!0);try{if(null!=l){let s=eB?await (0,b.createMCPServer)(l,r):await (0,b.registerMCPServer)(l,r);if(ej?.access_token&&s?.server_id){let r=(0,eC.getMcpOAuthMode)({auth_type:t.auth_type,oauth2_flow:t.oauth_flow_type===eC.OAUTH_FLOW.M2M?eC.MCP_OAUTH2_FLOW_M2M:null,delegate_auth_to_upstream:!!t.delegate_auth_to_upstream});if("authorization_code"===r){let e=ej.scope,t={access_token:ej.access_token,refresh_token:ej.refresh_token,expires_in:ej.expires_in,scopes:"string"==typeof e&&e?e.split(" "):void 0};await (0,b.storeMCPOAuthUserCredential)(l,s.server_id,t)}else{let t={access_token:ej.access_token,expires_in:ej.expires_in,token_type:ej.token_type};(0,ek.setToken)(s.server_id,t,e)}}N.default.success(eB?"MCP Server created successfully":{message:"MCP Server submitted for admin review",description:"Once an admin approves it, the server will appear in your MCP Servers list."}),u.resetFields(),g({}),ei(),C([]),S(!1),w(!1),B(void 0),i(!1),a(s)}}catch(t){let e=t instanceof Error?t.message:String(t);N.default.fromBackend(eB?`Error creating MCP Server: ${e}`:`Error submitting MCP Server: ${e}`)}finally{h(!1)}},eV=()=>{u.resetFields(),g({}),ei(),C([]),S(!1),w(!1),B(void 0),J(void 0),Q.current=null,X(!1),i(!1)};p.default.useEffect(()=>{if(!_&&f.server_name){let e=f.server_name.replace(/\s+/g,"_");u.setFieldsValue({alias:e}),j(t=>({...t,alias:e}))}},[f.server_name]);let eD=p.default.useRef(n);p.default.useEffect(()=>{let e=eD.current;eD.current=n,!n&&e&&(u.resetFields(),j({}),V(null),ei(),eT(),J(void 0),Q.current=null,X(!1))},[n,u,ei,eT]);let eB=(0,s.isAdminRole)(r),eq=(e,t)=>{if("credentials"in e)X(!1);else{let t=["url","spec_path","issuer","authorization_url","token_url","registration_url"].some(t=>t in e),s=void 0!==(0,eC.preservedDeclaredAppCredentials)(u.getFieldValue("credentials"));t&&s&&X(!0)}if((0,eC.isHeldOAuthTokenStale)(u.getFieldsValue(!0),Y)){eS(e),j(u.getFieldsValue(!0));return}j(t)};return(0,t.jsx)(q.Modal,{title:(0,t.jsxs)("div",{className:"flex items-center pb-4 border-b border-gray-100",style:{gap:12},children:[d&&(0,t.jsx)("button",{onClick:d,className:"text-sm text-blue-600 hover:text-blue-800 cursor-pointer bg-transparent border-none",style:{flexShrink:0},children:"←"}),(0,t.jsx)("img",{src:t1,alt:"MCP Logo",className:"w-8 h-8 object-contain",style:{height:"20px",width:"20px",objectFit:"contain"}}),(0,t.jsx)("h2",{className:"text-xl font-semibold text-gray-900",children:eB?"Add New MCP Server":"Submit MCP Server for Review"})]}),open:n,width:1e3,onCancel:eV,footer:null,forceRender:!0,className:"top-8",styles:{body:{padding:"24px"},header:{padding:"24px 24px 0 24px",border:"none"}},children:(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsxs)($.Form,{form:u,onFinish:eM,onValuesChange:eq,layout:"vertical",className:"space-y-6",children:[!eB&&(0,t.jsx)("div",{className:"rounded-md bg-blue-50 border border-blue-200 px-4 py-3 text-sm text-blue-800",children:"Your submission will be sent for admin review. Once approved, the server will appear in your MCP Servers list. The request must be made with a team-scoped API key."}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-6",children:[(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["MCP Server Name",(0,t.jsx)(ev.Tooltip,{title:"Best practice: Use a descriptive name that indicates the server's purpose (e.g., 'GitHub_MCP', 'Email_Service'). Cannot contain spaces or hyphens; use underscores instead. Names must comply with SEP-986 and will be rejected if invalid (https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool-names).",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"server_name",rules:[{required:!1,message:"Please enter a server name"},{validator:(e,t)=>eI(t)}],children:(0,t.jsx)(ew.TextInput,{placeholder:"e.g., GitHub_MCP, Zapier_MCP, etc.",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Alias",(0,t.jsx)(ev.Tooltip,{title:"A short, unique identifier for this server. Defaults to the server name if not provided. Cannot contain spaces or hyphens; use underscores instead.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"alias",rules:[{required:!1},{validator:(e,t)=>eI(t)}],children:(0,t.jsx)(ew.TextInput,{placeholder:"e.g., GitHub_MCP, Zapier_MCP, etc.",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500",onChange:()=>w(!0)})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Description"}),name:"description",rules:[{required:!1,message:"Please enter a server description"}],children:(0,t.jsx)(ew.TextInput,{placeholder:"Brief description of what this server does",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(tK,{value:D,onChange:B}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"GitHub / Source URL"}),name:"source_url",children:(0,t.jsx)(ew.TextInput,{placeholder:"https://github.com/org/mcp-server",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Transport Type"}),name:"transport",rules:[{required:!0,message:"Please select a transport type"}],children:(0,t.jsxs)(eb.Select,{placeholder:"Select transport",className:"rounded-lg",size:"large",onChange:e=>{F(e);let t="stdio"===e?{url:void 0,spec_path:void 0,auth_type:void 0,credentials:void 0}:e===eC.TRANSPORT.OPENAPI?{url:void 0,command:void 0,args:void 0,env:void 0}:{spec_path:void 0,command:void 0,args:void 0,env:void 0};u.setFieldsValue(t),(0,eC.isHeldOAuthTokenStale)(u.getFieldsValue(!0),Y)&&eS(),j(u.getFieldsValue(!0))},value:M,children:[(0,t.jsx)(eb.Select.Option,{value:"http",children:"Streamable HTTP (Recommended)"}),(0,t.jsx)(eb.Select.Option,{value:"sse",children:"Server-Sent Events (SSE)"}),(0,t.jsx)(eb.Select.Option,{value:"stdio",children:"Standard Input/Output (stdio)"}),(0,t.jsx)(eb.Select.Option,{value:eC.TRANSPORT.OPENAPI,children:"OpenAPI Spec"})]})}),("http"===M||"sse"===M)&&(0,t.jsx)($.Form.Item,{label:(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"MCP Server URL"}),name:"url",rules:[{required:!0,message:"Please enter a server URL"},{validator:(e,t)=>eA(t)}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-mcp-server.com",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),M===eC.TRANSPORT.OPENAPI&&(0,t.jsx)(t_,{form:u,accessToken:n?l:null,onValuesChange:e=>eq(e,{...u.getFieldsValue(!0),...e}),onKeyToolsChange:L,onLogoUrlChange:B,onOAuthDocsUrlChange:G}),M===eC.TRANSPORT.OPENAPI&&(0,t.jsx)(eH,{}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Max Concurrent Requests (optional)",(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tool calls LiteLLM will run against this server at the same time. Additional calls wait for a free slot. Leave blank for no limit.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"max_concurrent_requests",children:(0,t.jsx)(ey.InputNumber,{min:1,precision:0,placeholder:"e.g. 10",style:{width:"100%"},className:"rounded-lg"})}),"stdio"!==M&&""!==M&&(0,t.jsx)(e_.Collapse,{defaultActiveKey:["auth"],className:"mb-4",items:[{key:"auth",label:(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-700",children:"Authentication"}),children:(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{name:"auth_type",rules:[{required:!0,message:"Please select an auth type"}],children:(0,t.jsxs)(eb.Select,{placeholder:"Select auth type",className:"rounded-lg",size:"large",virtual:!1,children:[(0,t.jsx)(eb.Select.Option,{value:"none",children:"None"}),(0,t.jsx)(eb.Select.Option,{value:"api_key",children:"API Key"}),(0,t.jsx)(eb.Select.Option,{value:"bearer_token",children:"Bearer Token"}),(0,t.jsx)(eb.Select.Option,{value:"token",children:"Token"}),(0,t.jsx)(eb.Select.Option,{value:"basic",children:"Basic Auth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2",children:"OAuth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_token_exchange",children:"OAuth Token Exchange (OBO)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_id_jag",children:"ID-JAG (Okta Cross App Access)"}),(0,t.jsx)(eb.Select.Option,{value:"aws_sigv4",children:"AWS SigV4 (Bedrock AgentCore MCPs)"}),(0,t.jsx)(eb.Select.Option,{value:"true_passthrough",children:"True Passthrough (no LiteLLM auth)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth_delegate",children:"OAuth Delegate (client-supplied upstream token)"})]})}),(0,t.jsx)(eJ,{authType:eo}),(0,t.jsx)(e0,{authType:eo,dcrBridgeInitialChecked:!0,oauthFlow:{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej},appMayNotMatchUpstream:Z}),ec&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Authentication Value",(0,t.jsx)(ev.Tooltip,{title:"Token, password, or header value to send with each request for the selected auth type.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","auth_value"],rules:[{validator:(e,t)=>t&&"string"==typeof t&&""===t.trim()?Promise.reject(Error("Authentication value cannot be empty whitespace")):Promise.resolve()}],children:(0,t.jsx)(ew.TextInput,{type:"password",placeholder:"Enter token or secret",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),ed&&(0,t.jsx)(eK,{isM2M:ex,initialFlowType:eC.OAUTH_FLOW.INTERACTIVE,docsUrl:K,oauthFlow:{startOAuthFlow:ep,status:eg,error:ef,tokenResponse:ej}}),eu&&(0,t.jsx)(e4,{}),em&&(0,t.jsx)(e6,{})]})}]}),"stdio"!==M&&""!==M&&eh&&(0,t.jsx)(ez,{}),(0,t.jsx)(tx,{isVisible:"stdio"===M})]}),(0,t.jsx)("div",{className:"mt-8",children:(0,t.jsx)(tZ,{})}),(0,t.jsx)("div",{className:"mt-8",children:(0,t.jsx)(tb,{availableAccessGroups:o,mcpServer:null,searchValue:R,setSearchValue:U,getAccessGroupOptions:()=>{let e=o.map(e=>({value:e,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:e})]})}));return R&&!o.some(e=>e.toLowerCase().includes(R.toLowerCase()))&&e.push({value:R,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:R}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-1",children:"create new group"})]})}),e}})}),(0,t.jsx)("div",{className:"mt-8 pt-6 border-t border-gray-200",children:(0,t.jsx)(ti,{formValues:f,tools:ee,isLoadingTools:et,toolsError:es,toolsErrorStatus:er,toolsErrorStackTrace:el,canFetchTools:ea,fetchTools:en})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(th,{accessToken:l,formValues:f,allowedTools:k,existingAllowedTools:null,onAllowedToolsChange:C,hasToolAllowlistInteraction:T,onToolAllowlistInteraction:()=>S(!0),toolNameToDisplayName:A,toolNameToDescription:O,onToolNameToDisplayNameChange:I,onToolNameToDescriptionChange:P,keyTools:E,externalTools:ee,externalIsLoading:et,externalError:es,externalErrorStatus:er,externalCanFetch:ea})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(tr,{value:x,onChange:g,tools:ee.filter(e=>k.includes(e.name)),disabled:!1})}),(0,t.jsxs)("div",{className:"flex items-center justify-end space-x-3 pt-6 border-t border-gray-100",children:[(0,t.jsx)(H.Button,{variant:"secondary",onClick:eV,children:"Cancel"}),(0,t.jsx)(H.Button,{variant:"primary",loading:m,children:m?"Creating...":"Add MCP Server"})]})]})})})};var t5=e.i(175712),t3=e.i(404206),t6=e.i(723731),t7=e.i(653824),t8=e.i(881073),t9=e.i(197647),se=e.i(118366),st=e.i(758472),ss=e.i(868054);let sr=(0,r.default)("globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);var sl=e.i(634831),sa=e.i(438100);let sn=(0,r.default)("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),{Title:si,Text:so}=tG.Typography,sc=({icon:e,title:s,description:r,children:l,serverName:a,accessGroups:n=["dev-group"]})=>{let[i,o]=(0,p.useState)(!1);return(0,t.jsxs)(t5.Card,{className:"border border-gray-200",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)("span",{className:"p-2 rounded-lg bg-gray-50",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)(si,{level:5,className:"mb-0",children:s}),(0,t.jsx)(so,{className:"text-gray-600",children:r})]})]}),a&&("Implementation Example"===s||"Configuration"===s)&&(0,t.jsxs)($.Form.Item,{className:"mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,t.jsx)(eV.Switch,{size:"small",checked:i,onChange:o}),(0,t.jsxs)(so,{className:"text-sm",children:["Limit tools to specific MCP servers or MCP groups by passing the ",(0,t.jsx)("code",{children:"x-mcp-servers"})," header"]})]}),i&&(0,t.jsx)(tp.Alert,{className:"mt-2",type:"info",showIcon:!0,message:"Two Options",description:(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{children:"Option 1:"})," Get a specific server: ",(0,t.jsxs)("code",{children:['"',a.replace(/\s+/g,"_"),'"']})]}),(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{children:"Option 2:"})," Get a group of MCPs: ",(0,t.jsx)("code",{children:'"dev-group"'})]}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-gray-600",children:["You can also mix both: ",(0,t.jsx)("code",{children:'"Server1,dev-group"'})]})]})})]}),p.default.Children.map(l,e=>{if(p.default.isValidElement(e)&&e.props.hasOwnProperty("code")&&e.props.hasOwnProperty("copyKey")){let t=e.props.code;if(t&&t.includes('"headers":'))return p.default.cloneElement(e,{code:t.replace(/"headers":\s*{[^}]*}/,`"headers": ${JSON.stringify((()=>{let e={"x-litellm-api-key":"Bearer YOUR_LITELLM_API_KEY"};if(i&&a){let t=[a.replace(/\s+/g,"_"),...n].join(",");e["x-mcp-servers"]=t}return e})(),null,8)}`)})}return e})]})},sd=({currentServerAccessGroups:e=[]})=>{let s=(0,b.getProxyBaseUrl)(),[r,l]=(0,p.useState)({}),[a]=(0,p.useState)("Zapier_MCP"),n=async(e,t)=>{await (0,ed.copyToClipboard)(e)&&(l(e=>({...e,[t]:!0})),setTimeout(()=>{l(e=>({...e,[t]:!1}))},2e3))},i=({code:e,copyKey:s,title:l,className:a=""})=>(0,t.jsxs)("div",{className:"relative group",children:[l&&(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,t.jsx)(st.Code,{size:16,className:"text-blue-600"}),(0,t.jsx)(so,{strong:!0,className:"text-gray-700",children:l})]}),(0,t.jsxs)(t5.Card,{className:`bg-gray-50 border border-gray-200 relative ${a}`,children:[(0,t.jsx)(eQ.Button,{type:"text",size:"small",icon:r[s]?(0,t.jsx)(k.CheckIcon,{size:12}):(0,t.jsx)(se.CopyIcon,{size:12}),onClick:()=>n(e,s),className:`absolute top-2 right-2 z-10 transition-all duration-200 ${r[s]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`}),(0,t.jsx)("pre",{className:"text-sm overflow-x-auto pr-10 text-gray-800 font-mono leading-relaxed",children:e})]})]}),o=({step:e,title:s,children:r})=>(0,t.jsxs)("div",{className:"flex gap-4",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("div",{className:"w-8 h-8 bg-blue-600 text-white rounded-full flex items-center justify-center text-sm font-semibold",children:e})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)(so,{strong:!0,className:"text-gray-800 block mb-2",children:s}),r]})]});return(0,t.jsx)("div",{children:(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(B.Title,{className:"text-3xl font-bold text-gray-900 mb-3",children:"Connect to your MCP client"}),(0,t.jsx)(D.Text,{className:"text-lg text-gray-600",children:"Use tools directly from any MCP client with LiteLLM MCP. Enable your AI assistant to perform real-world tasks through a simple, secure connection."})]}),(0,t.jsxs)(t7.TabGroup,{className:"w-full",children:[(0,t.jsx)(t8.TabList,{className:"flex justify-start mt-8 mb-6",children:(0,t.jsxs)("div",{className:"flex bg-gray-100 p-1 rounded-lg",children:[(0,t.jsx)(t9.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(st.Code,{size:18}),"OpenAI API"]})}),(0,t.jsx)(t9.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(sn,{size:18}),"LiteLLM Proxy"]})}),(0,t.jsx)(t9.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(ss.Terminal,{size:18}),"Cursor"]})}),(0,t.jsx)(t9.Tab,{className:"px-6 py-3 rounded-md transition-all duration-200",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 font-medium",children:[(0,t.jsx)(sr,{size:18}),"Streamable HTTP"]})})]})}),(0,t.jsxs)(t6.TabPanels,{children:[(0,t.jsx)(t3.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-blue-50 to-indigo-50 p-6 rounded-lg border border-blue-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(st.Code,{className:"text-blue-600",size:24}),(0,t.jsx)(si,{level:4,className:"mb-0 text-blue-900",children:"OpenAI Responses API Integration"})]}),(0,t.jsx)(so,{className:"text-blue-700",children:"Connect OpenAI Responses API to your LiteLLM MCP server for seamless tool integration"})]}),(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(sc,{icon:(0,t.jsx)(sa.KeyIcon,{className:"text-blue-600",size:16}),title:"API Key Setup",description:"Configure your OpenAI API key for authentication",children:(0,t.jsxs)(tg.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsxs)(so,{children:["Get your API key from the"," ",(0,t.jsxs)("a",{href:"https://platform.openai.com/api-keys",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-700 inline-flex items-center gap-1",children:["OpenAI platform ",(0,t.jsx)(sl.ExternalLinkIcon,{size:12})]})]})}),(0,t.jsx)(i,{title:"Environment Variable",code:'export OPENAI_API_KEY="sk-..."',copyKey:"openai-env"})]})}),(0,t.jsx)(sc,{icon:(0,t.jsx)(S.ServerIcon,{className:"text-blue-600",size:16}),title:"MCP Server Information",description:"Connection details for your LiteLLM MCP server",children:(0,t.jsx)(i,{title:"Server URL",code:`${s}/mcp`,copyKey:"openai-server-url"})}),(0,t.jsx)(sc,{icon:(0,t.jsx)(st.Code,{className:"text-blue-600",size:16}),title:"Implementation Example",description:"Complete cURL example for using the Responses API",serverName:"Zapier Gmail",accessGroups:["dev-group"],children:(0,t.jsx)(i,{code:`curl --location 'https://api.openai.com/v1/responses' \\ +--header 'Content-Type: application/json' \\ +--header "Authorization: Bearer $OPENAI_API_KEY" \\ +--data '{ + "model": "gpt-4.1", + "tools": [ + { + "type": "mcp", + "server_label": "litellm", + "server_url": "${s}/mcp", + "require_approval": "never", + "headers": { + "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY", + "x-mcp-servers": "Zapier_MCP,dev-group" + } + } + ], + "input": "Run available tools", + "tool_choice": "required" +}'`,copyKey:"openai-curl",className:"text-xs"})})]})]}),{})}),(0,t.jsx)(t3.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-emerald-50 to-green-50 p-6 rounded-lg border border-emerald-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(sn,{className:"text-emerald-600",size:24}),(0,t.jsx)(si,{level:4,className:"mb-0 text-emerald-900",children:"LiteLLM Proxy API Integration"})]}),(0,t.jsx)(so,{className:"text-emerald-700",children:"Connect to LiteLLM Proxy Responses API for seamless tool integration with multiple model providers"})]}),(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(sc,{icon:(0,t.jsx)(sa.KeyIcon,{className:"text-emerald-600",size:16}),title:"Virtual Key Setup",description:"Configure your LiteLLM Proxy Virtual Key for authentication",children:(0,t.jsxs)(tg.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsx)(so,{children:"Get your Virtual Key from your LiteLLM Proxy dashboard or contact your administrator"})}),(0,t.jsx)(i,{title:"Environment Variable",code:'export LITELLM_API_KEY="sk-..."',copyKey:"litellm-env"})]})}),(0,t.jsx)(sc,{icon:(0,t.jsx)(S.ServerIcon,{className:"text-emerald-600",size:16}),title:"MCP Server Information",description:"Connection details for your LiteLLM MCP server",children:(0,t.jsx)(i,{title:"Server URL",code:`${s}/mcp`,copyKey:"litellm-server-url"})}),(0,t.jsx)(sc,{icon:(0,t.jsx)(st.Code,{className:"text-emerald-600",size:16}),title:"Implementation Example",description:"Complete cURL example for using the LiteLLM Proxy Responses API",serverName:a,accessGroups:["dev-group"],children:(0,t.jsx)(i,{code:`curl --location '${s}/v1/responses' \\ +--header 'Content-Type: application/json' \\ +--header "Authorization: Bearer $LITELLM_VIRTUAL_KEY" \\ +--data '{ + "model": "gpt-4", + "tools": [ + { + "type": "mcp", + "server_label": "litellm", + "server_url": "litellm_proxy", + "require_approval": "never", + "headers": { + "x-litellm-api-key": "Bearer YOUR_LITELLM_VIRTUAL_KEY", + "x-mcp-servers": "Zapier_MCP,dev-group" + } + } + ], + "input": "Run available tools", + "tool_choice": "required" +}'`,copyKey:"litellm-curl",className:"text-xs"})})]})]}),{})}),(0,t.jsx)(t3.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-purple-50 to-blue-50 p-6 rounded-lg border border-purple-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(ss.Terminal,{className:"text-purple-600",size:24}),(0,t.jsx)(si,{level:4,className:"mb-0 text-purple-900",children:"Cursor IDE Integration"})]}),(0,t.jsx)(so,{className:"text-purple-700",children:"Use tools directly from Cursor IDE with LiteLLM MCP. Enable your AI assistant to perform real-world tasks without leaving your coding environment."})]}),(0,t.jsxs)(t5.Card,{className:"border border-gray-200",children:[(0,t.jsx)(si,{level:5,className:"mb-4 text-gray-800",children:"Setup Instructions"}),(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(o,{step:1,title:"Open Cursor Settings",children:(0,t.jsxs)(so,{className:"text-gray-600",children:["Use the keyboard shortcut ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"⇧+⌘+J"})," (Mac) or"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Ctrl+Shift+J"})," (Windows/Linux)"]})}),(0,t.jsx)(o,{step:2,title:"Navigate to MCP Tools",children:(0,t.jsx)(so,{className:"text-gray-600",children:'Go to the "MCP Tools" tab and click "New MCP Server"'})}),(0,t.jsxs)(o,{step:3,title:"Add Configuration",children:[(0,t.jsxs)(so,{className:"text-gray-600 mb-3",children:["Copy the JSON configuration below and paste it into Cursor, then save with"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Cmd+S"})," or"," ",(0,t.jsx)("code",{className:"bg-gray-100 px-2 py-1 rounded-sm",children:"Ctrl+S"})]}),(0,t.jsx)(sc,{icon:(0,t.jsx)(st.Code,{className:"text-purple-600",size:16}),title:"Configuration",description:"Cursor MCP configuration",serverName:"Zapier Gmail",accessGroups:["dev-group"],children:(0,t.jsx)(i,{code:`{ + "mcpServers": { + "Zapier_MCP": { + "url": "${s}/mcp", + "headers": { + "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY", + "x-mcp-servers": "Zapier_MCP,dev-group" + } + } + } +}`,copyKey:"cursor-config",className:"text-xs"})})]})]})]})]}),{})}),(0,t.jsx)(t3.TabPanel,{className:"mt-6",children:(0,t.jsx)(()=>(0,t.jsxs)(tg.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"bg-linear-to-r from-green-50 to-teal-50 p-6 rounded-lg border border-green-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 mb-3",children:[(0,t.jsx)(sr,{className:"text-green-600",size:24}),(0,t.jsx)(si,{level:4,className:"mb-0 text-green-900",children:"Streamable HTTP Transport"})]}),(0,t.jsx)(so,{className:"text-green-700",children:"Connect to LiteLLM MCP using HTTP transport. Compatible with any MCP client that supports HTTP streaming."})]}),(0,t.jsx)(sc,{icon:(0,t.jsx)(sr,{className:"text-green-600",size:16}),title:"Universal MCP Connection",description:"Use this URL with any MCP client that supports HTTP transport",children:(0,t.jsxs)(tg.Space,{direction:"vertical",size:"middle",className:"w-full",children:[(0,t.jsx)("div",{children:(0,t.jsx)(so,{children:"Each MCP client supports different transports. Refer to your client documentation to determine the appropriate transport method."})}),(0,t.jsx)(i,{title:"Server URL",code:`${s}/mcp`,copyKey:"http-server-url"}),(0,t.jsx)(i,{title:"Headers Configuration",code:JSON.stringify({"x-litellm-api-key":"Bearer YOUR_LITELLM_API_KEY"},null,2),copyKey:"http-headers"}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(eQ.Button,{type:"link",className:"p-0 h-auto text-blue-600 hover:text-blue-700",href:"https://modelcontextprotocol.io/docs/concepts/transports",icon:(0,t.jsx)(sl.ExternalLinkIcon,{size:14}),children:"Learn more about MCP transports"})})]})})]}),{})})]})]})]})})};var su=e.i(643531),sm=e.i(373488),sm=sm;let sh={healthy:{dot:"bg-green-500"},unhealthy:{dot:"bg-red-500"},unknown:{dot:"bg-gray-300"}},sx=e=>e.stopPropagation(),sp=({status:e,isLoadingHealth:s,isRechecking:r,onRecheck:l,lastCheck:a,error:i,dotClass:o})=>s||r?(0,t.jsxs)(n.Badge,{variant:"outline",className:"text-muted-foreground",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground"}),"Checking"]}):(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",className:l?"cursor-pointer hover:opacity-80":"cursor-default",onClick:l?e=>{e.stopPropagation(),l()}:void 0,children:[(0,t.jsx)("span",{className:(0,ec.cn)("h-1.5 w-1.5 rounded-full",o)}),e.charAt(0).toUpperCase()+e.slice(1)]})}),(0,t.jsxs)(u.TooltipContent,{side:"top",className:"max-w-xs",children:[(0,t.jsxs)("div",{className:"mb-1 font-semibold",children:["Health: ",e]}),a&&(0,t.jsxs)("div",{className:"mb-1 text-xs",children:["Last check: ",new Date(a).toLocaleString()]}),i&&(0,t.jsxs)("div",{className:"text-xs",children:[(0,t.jsx)("div",{className:"mb-1 font-medium",children:"Error"}),(0,t.jsx)("div",{className:"wrap-break-word",children:i})]}),!a&&!i&&(0,t.jsx)("div",{className:"text-xs",children:"No health data"}),l&&(0,t.jsx)("div",{className:"mt-1 text-xs",children:"Click to recheck"})]})]}),sg=({connected:e,onConnect:s})=>e?(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsx)("span",{className:"text-muted-foreground",children:"BYOK credential"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)(su.Check,{})," Connected"]}),s&&(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:e=>{sx(e),s()},children:"Update"})]})]}):(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsx)("span",{className:"text-muted-foreground",children:"BYOK credential"}),s?(0,t.jsx)(i.Button,{size:"sm",onClick:e=>{sx(e),s()},children:"Connect"}):(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})]}),sf=({server:e,missingUserFields:s,isLoadingHealth:r,isRechecking:l,onClick:a,onRecheckHealth:o,onByokConnect:c,onOpenFillFields:d,onDelete:m})=>{let h=e.alias||e.server_name||"",x=e.server_name||h||e.server_id,p=e.mcp_info?.logo_url??void 0,g=e.transport||"http",f=e.spec_path&&"stdio"!==g?"openapi":g,j=e.auth_type||"none",v=e.auth_type===eC.AUTH_TYPE.OAUTH2&&!e.oauth2_flow&&!e.delegate_auth_to_upstream,b=e.status||"unknown",y=sh[b]??sh.unknown,_=e.available_on_public_internet,N=(e.mcp_access_groups??[]).filter(e=>"string"==typeof e),w=s??[],k=w.length>0,C=k?"border-2 border-destructive/40 bg-destructive/5 hover:border-destructive/60 hover:shadow-md":"border border-border bg-card hover:shadow-md",T=e.url||"",{maskedUrl:S}=T?eS(T):{maskedUrl:""},A="",I="";"stdio"===g?I=A=[e.command,...e.args??[]].filter(e=>"string"==typeof e&&e.length>0).join(" "):e.spec_path?(A=e.spec_path,I=e.spec_path):T&&(A=S,I=T);let O=!!o||!!m;return(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),a())},className:(0,ec.cn)("group relative flex h-full cursor-pointer flex-col gap-3 rounded-lg p-4 transition-all duration-150 focus:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",C),children:[(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[p?(0,t.jsx)(tw.Logo,{src:p,label:x,className:"h-10 w-10 shrink-0 rounded-sm object-contain"}):(0,t.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-sm bg-muted font-semibold text-muted-foreground",children:(x||"?").slice(0,2).toUpperCase()}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:"block w-full truncate text-left font-semibold",title:x,children:x}),(0,t.jsxs)("div",{className:"mt-0.5 flex items-center gap-2 text-xs text-muted-foreground",children:[h&&(0,t.jsx)("span",{className:"truncate",children:h}),h&&(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("span",{className:"font-mono text-primary",children:e.server_id.slice(0,7)})}),(0,t.jsx)(u.TooltipContent,{children:e.server_id})]})]})]}),O&&(0,t.jsxs)(eo.DropdownMenu,{children:[(0,t.jsx)(eo.DropdownMenuTrigger,{render:(0,t.jsx)("button",{type:"button",onClick:sx,onKeyDown:sx,"aria-label":"Server actions",className:"-mr-1 -mt-1 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",children:(0,t.jsx)(sm.default,{className:"size-5"})})}),(0,t.jsxs)(eo.DropdownMenuContent,{align:"end",children:[o&&(0,t.jsxs)(eo.DropdownMenuItem,{disabled:l,onClick:e=>{sx(e),o()},children:[(0,t.jsx)(sn,{}),"Test Connection"]}),o&&m&&(0,t.jsx)(eo.DropdownMenuSeparator,{}),m&&(0,t.jsxs)(eo.DropdownMenuItem,{variant:"destructive",onClick:e=>{sx(e),m()},children:[(0,t.jsx)(er.Trash2,{}),"Delete"]})]})]})]}),A?(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)("p",{className:"truncate font-mono text-xs text-muted-foreground",children:A})}),(0,t.jsx)(u.TooltipContent,{children:I})]}):(0,t.jsx)("div",{className:"h-[18px]","aria-hidden":!0}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,t.jsx)(sp,{status:b,isLoadingHealth:r,isRechecking:l,onRecheck:o,lastCheck:e.last_health_check,error:e.health_check_error,dotClass:y.dot}),(0,t.jsx)(n.Badge,{variant:"outline",children:f.toUpperCase()}),(0,t.jsx)(n.Badge,{variant:"outline",children:j}),v&&(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)(ta.CircleAlert,{}),"OAuth flow not set"]})}),(0,t.jsx)(u.TooltipContent,{children:"This OAuth server has no flow set (Machine-to-Machine vs Interactive). Open it and choose an OAuth Flow Type so LiteLLM authenticates it as you intend."})]}),(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:(0,ec.cn)("h-1.5 w-1.5 rounded-full",_?"bg-green-500":"bg-orange-500")}),_?"Public":"Internal"]}),N.slice(0,2).map(e=>(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(n.Badge,{variant:"outline",className:"max-w-[120px] truncate",children:e})}),(0,t.jsx)(u.TooltipContent,{children:e})]},e)),N.length>2&&(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)(n.Badge,{variant:"outline",children:["+",N.length-2]})}),(0,t.jsx)(u.TooltipContent,{children:N.slice(2).join(", ")})]})]}),(e.is_byok||k)&&(0,t.jsxs)("div",{className:"mt-auto flex flex-col gap-2",children:[e.is_byok&&(0,t.jsx)(sg,{connected:!!e.has_user_credential,onConnect:c}),k&&(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsxs)("span",{className:"inline-flex items-center gap-1 font-semibold text-destructive",children:[(0,t.jsx)(ta.CircleAlert,{className:"size-3.5"}),w.length," user field",1===w.length?"":"s"," missing"]})}),(0,t.jsxs)(u.TooltipContent,{children:[(0,t.jsx)("div",{className:"mb-1 font-semibold",children:"Missing user fields:"}),(0,t.jsx)("ul",{className:"ml-3",children:w.map(e=>(0,t.jsxs)("li",{children:["• ",e]},e))})]})]}),d&&(0,t.jsx)(i.Button,{variant:"destructive",size:"sm",onClick:e=>{sx(e),d()},children:"Set"})]})]})]})})};var sj=e.i(871689),sv=e.i(286536),sb=e.i(77705),sy=e.i(954616),s_=e.i(555987);function sN(e){if(!e)return[];if(Array.isArray(e))return e.map(e=>sw(e)).filter(e=>void 0!==e);let t=sw(e);return void 0===t?[]:[t]}function sw(e,t){if(!e)return;let s=void 0!==t?t:e.default;if("object"===e.type){let t="object"!=typeof s||null===s||Array.isArray(s)?{}:{...s};return e.properties&&Object.entries(e.properties).forEach(([e,s])=>{t[e]=sw(s,t[e])}),t}if("array"===e.type){if(Array.isArray(s)){let t=e.items;if(!t)return s;if(0===s.length){let e=sN(t);return e.length?e:s}return Array.isArray(t)?s.map((e,s)=>sw(t[s]??t[t.length-1],e)):s.map(e=>sw(t,e))}return void 0!==s?s:sN(e.items)}if(void 0!==s)return s;switch(e.type){case"integer":case"number":return 0;case"boolean":return!1;default:return""}}let sk=e=>{let t=sw(e);if("object"===e.type||"array"===e.type){let s="array"===e.type?[]:{};return JSON.stringify(t??s,null,2)}return t};function sC({tool:e,onSubmit:s,isLoading:r,result:l,error:a,onClose:n}){let[i]=$.Form.useForm(),[o,c]=p.default.useState("formatted"),[d,u]=p.default.useState(null),[m,h]=p.default.useState(null),x=p.default.useMemo(()=>"string"==typeof e.inputSchema?{type:"object",properties:{input:{type:"string",description:"Input for this tool"}},required:["input"]}:e.inputSchema,[e.inputSchema]),g=p.default.useMemo(()=>x.properties&&x.properties.params&&"object"===x.properties.params.type&&x.properties.params.properties?{type:"object",properties:x.properties.params.properties,required:x.properties.params.required||[]}:x,[x]);p.default.useEffect(()=>{if(i.resetFields(),!g.properties)return;let e={};Object.entries(g.properties).forEach(([t,s])=>{e[t]=sk(s)}),i.setFieldsValue(e)},[i,g,e]),p.default.useEffect(()=>{d&&(l||a)&&h(Date.now()-d)},[l,a,d]);let f=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 s=document.execCommand("copy");if(document.body.removeChild(t),!s)throw Error("execCommand failed");return!0}}catch(e){return console.error("Copy failed:",e),!1}},j=async()=>{await f(JSON.stringify(l,null,2))?N.default.success("Result copied to clipboard"):N.default.fromBackend("Failed to copy result")},v=async()=>{await f(e.name)?N.default.success("Tool name copied to clipboard"):N.default.fromBackend("Failed to copy tool name")};return(0,t.jsxs)("div",{className:"space-y-4 h-full",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between pb-3 border-b border-gray-200",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-3",children:[e.mcp_info.logo_url&&(0,t.jsx)("img",{src:(0,s_.resolveLogoSrc)(e.mcp_info.logo_url),alt:`${e.mcp_info.server_name} logo`,className:"w-6 h-6 object-contain"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-gray-900",children:"Test Tool:"}),(0,t.jsxs)("div",{className:"group inline-flex items-center space-x-1 bg-slate-50 hover:bg-slate-100 px-3 py-1 rounded-md cursor-pointer transition-colors border border-slate-200",onClick:v,title:"Click to copy tool name",children:[(0,t.jsx)("span",{className:"font-mono text-slate-700 font-medium text-sm",children:e.name}),(0,t.jsx)("svg",{className:"w-3 h-3 text-slate-400 group-hover:text-slate-600 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})})]})]}),(0,t.jsx)("p",{className:"text-xs text-gray-600",children:e.description}),(0,t.jsxs)("p",{className:"text-xs text-gray-500",children:["Provider: ",e.mcp_info.server_name]})]})]}),(0,t.jsx)(H.Button,{onClick:n,variant:"light",size:"sm",className:"text-gray-500 hover:text-gray-700",children:(0,t.jsx)("svg",{className:"w-4 h-4",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.jsxs)("div",{className:"grid grid-cols-2 gap-4 h-full",children:[(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-4 py-2",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Input Parameters"}),(0,t.jsx)(ev.Tooltip,{title:"Configure the input parameters for this tool call",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-600"})})]})}),(0,t.jsx)("div",{className:"p-4",children:(0,t.jsxs)($.Form,{form:i,onFinish:e=>{u(Date.now()),h(null);let t={};Object.entries(e).forEach(([e,s])=>{let r=g.properties?.[e],l="string"==typeof s?s.trim():s;if(r&&null!=l&&""!==l)switch(r.type){case"boolean":t[e]="true"===l||!0===l;break;case"number":case"integer":{let s=Number(l);t[e]=Number.isNaN(s)?l:"integer"===r.type?Math.trunc(s):s;break}case"object":case"array":try{let s="string"==typeof l?JSON.parse(l):l,a="object"===r.type&&null!==s&&"object"==typeof s&&!Array.isArray(s),n="array"===r.type&&Array.isArray(s);"object"===r.type&&a||"array"===r.type&&n?t[e]=s:t[e]=l}catch(s){t[e]=l}break;case"string":t[e]=String(l);break;default:t[e]=l}else null!=l&&""!==l&&(t[e]=l)}),s(x.properties&&x.properties.params&&"object"===x.properties.params.type&&x.properties.params.properties?{params:t}:t)},layout:"vertical",className:"space-y-3",children:["string"==typeof e.inputSchema?(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Input ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]}),name:"input",rules:[{required:!0,message:"Please enter input for this tool"}],className:"mb-3",children:(0,t.jsx)(ew.TextInput,{placeholder:"Enter input for this tool",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})}):void 0===g.properties?(0,t.jsx)("div",{className:"text-center py-6 bg-gray-50 rounded-lg border border-gray-200",children:(0,t.jsxs)("div",{className:"max-w-sm mx-auto",children:[(0,t.jsx)("h4",{className:"text-sm font-medium text-gray-900 mb-1",children:"No Parameters Required"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"This tool can be called without any input parameters."})]})}):(0,t.jsx)("div",{className:"space-y-3",children:Object.entries(g.properties).map(([s,r])=>{let l=sk(r),a=`${e.name}-${s}`;return(0,t.jsxs)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[s," ",g.required?.includes(s)&&(0,t.jsx)("span",{className:"text-red-500",children:"*"}),r.description&&(0,t.jsx)(ev.Tooltip,{title:r.description,children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-gray-400 hover:text-gray-600"})})]}),name:s,initialValue:l,rules:[{required:g.required?.includes(s),message:`Please enter ${s}`},..."object"===r.type||"array"===r.type?[{validator:(e,t)=>{if((null==t||""===t)&&!g.required?.includes(s))return Promise.resolve();try{let e="string"==typeof t?JSON.parse(t):t,s="object"===r.type&&null!==e&&"object"==typeof e&&!Array.isArray(e),l="array"===r.type&&Array.isArray(e);if("object"===r.type&&s||"array"===r.type&&l)return Promise.resolve();return Promise.reject(Error("object"===r.type?"Please enter a JSON object":"Please enter a JSON array"))}catch(e){return Promise.reject(Error("Invalid JSON"))}}}]:[]],className:"mb-3",children:["string"===r.type&&r.enum&&(0,t.jsxs)("select",{className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm transition-colors",defaultValue:l??"",children:[!g.required?.includes(s)&&(0,t.jsxs)("option",{value:"",children:["Select ",s]}),r.enum.map(e=>(0,t.jsx)("option",{value:e,children:e},e))]}),"string"===r.type&&!r.enum&&(0,t.jsx)(ew.TextInput,{placeholder:r.description||`Enter ${s}`,defaultValue:l??"",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"}),("number"===r.type||"integer"===r.type)&&(0,t.jsx)("input",{type:"number",step:"integer"===r.type?1:"any",placeholder:r.description||`Enter ${s}`,defaultValue:l??0,className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm transition-colors"}),"boolean"===r.type&&(0,t.jsxs)(eb.Select,{placeholder:`Select ${s}`,allowClear:!g.required?.includes(s),className:"w-full",children:[(0,t.jsx)(eb.Select.Option,{value:!0,children:"True"}),(0,t.jsx)(eb.Select.Option,{value:!1,children:"False"})]}),("object"===r.type||"array"===r.type)&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("textarea",{rows:"object"===r.type?6:4,placeholder:r.description||("object"===r.type?`Enter JSON object for ${s}`:`Enter JSON array for ${s}`),defaultValue:l??("object"===r.type?"{}":"[]"),spellCheck:!1,"data-testid":`textarea-${s}`,className:"w-full px-3 py-2 border border-gray-300 rounded-lg shadow-xs focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm font-mono"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"object"===r.type?"Provide a valid JSON object.":"Provide a valid JSON array."})]})]},a)})}),(0,t.jsx)("div",{className:"pt-3 border-t border-gray-100",children:(0,t.jsx)(H.Button,{type:"button",onClick:()=>i.submit(),disabled:r,variant:"primary",className:"w-full",loading:r,children:r?"Calling Tool...":l||a?"Call Again":"Call Tool"})})]})})]}),(0,t.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-4 py-2",children:(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Tool Result"})}),(0,t.jsx)("div",{className:"p-4",children:l||a||r?(0,t.jsxs)("div",{className:"space-y-3",children:[l&&!r&&!a&&(0,t.jsx)("div",{className:"p-2 bg-green-50 border border-green-200 rounded-lg",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("svg",{className:"h-4 w-4 text-green-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})}),(0,t.jsx)("h4",{className:"text-xs font-medium text-green-900",children:"Tool executed successfully"}),null!==m&&(0,t.jsxs)("span",{className:"text-xs text-green-600 ml-1",children:["• ",(m/1e3).toFixed(2),"s"]})]}),(0,t.jsxs)("div",{className:"flex items-center space-x-1",children:[(0,t.jsxs)("div",{className:"flex bg-white rounded-sm border border-green-300 p-0.5",children:[(0,t.jsx)("button",{onClick:()=>c("formatted"),className:`px-2 py-1 text-xs font-medium rounded transition-colors ${"formatted"===o?"bg-green-100 text-green-800":"text-green-600 hover:text-green-800"}`,children:"Formatted"}),(0,t.jsx)("button",{onClick:()=>c("json"),className:`px-2 py-1 text-xs font-medium rounded transition-colors ${"json"===o?"bg-green-100 text-green-800":"text-green-600 hover:text-green-800"}`,children:"JSON"})]}),(0,t.jsx)("button",{onClick:j,className:"p-1 hover:bg-green-100 rounded-sm text-green-700",title:"Copy response",children:(0,t.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,t.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})})]})]})}),(0,t.jsxs)("div",{className:"max-h-96 overflow-y-auto",children:[r&&(0,t.jsxs)("div",{className:"flex flex-col justify-center items-center h-48 text-gray-500",children:[(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("div",{className:"animate-spin rounded-full h-8 w-8 border-2 border-gray-200"}),(0,t.jsx)("div",{className:"animate-spin rounded-full h-8 w-8 border-2 border-blue-600 border-t-transparent absolute top-0"})]}),(0,t.jsx)("p",{className:"text-sm font-medium mt-3",children:"Calling tool..."}),(0,t.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"Please wait while we process your request"})]}),a&&(0,t.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-lg p-3",children:(0,t.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("svg",{className:"h-4 w-4 text-red-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,t.jsx)("h4",{className:"text-xs font-medium text-red-900",children:"Tool Call Failed"}),null!==m&&(0,t.jsxs)("span",{className:"text-xs text-red-600",children:["• ",(m/1e3).toFixed(2),"s"]})]}),(0,t.jsx)("div",{className:"bg-white border border-red-200 rounded-sm p-2 max-h-48 overflow-y-auto",children:(0,t.jsx)("pre",{className:"text-xs whitespace-pre-wrap text-red-700 font-mono",children:a.message})})]})]})}),l&&!r&&!a&&(0,t.jsx)("div",{className:"space-y-3",children:"formatted"===o?l.map((e,s)=>(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:["text"===e.type&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Text Response"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsx)("div",{className:"bg-white rounded-sm border border-gray-200 max-h-64 overflow-y-auto",children:(0,t.jsx)("div",{className:"p-3 space-y-2",children:e.text.split("\n\n").map((e,s)=>{if(""===e.trim())return null;if(e.startsWith("##")){let r=e.replace(/^#+\s/,"");return(0,t.jsx)("div",{className:"border-b border-gray-200 pb-1 mb-2",children:(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:r})},s)}let r=/(https?:\/\/[^\s\)]+)/g;if(r.test(e)){let l=e.split(r);return(0,t.jsx)("div",{className:"bg-blue-50 border border-blue-200 rounded-sm p-2",children:(0,t.jsx)("div",{className:"text-xs text-gray-700 leading-relaxed whitespace-pre-wrap",children:l.map((e,s)=>r.test(e)?(0,t.jsx)("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 underline break-all",children:e},s):e)})},s)}return e.includes("Score:")?(0,t.jsx)("div",{className:"bg-green-50 border-l-4 border-green-400 p-2 rounded-r",children:(0,t.jsx)("p",{className:"text-xs text-green-800 font-medium whitespace-pre-wrap",children:e})},s):(0,t.jsx)("div",{className:"bg-gray-50 rounded-sm p-2 border border-gray-200",children:(0,t.jsx)("div",{className:"text-xs text-gray-700 leading-relaxed whitespace-pre-wrap font-mono",children:e})},s)}).filter(Boolean)})})})]}),"image"===e.type&&e.url&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Image Response"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsx)("div",{className:"bg-gray-50 rounded-sm p-3 border border-gray-200",children:(0,t.jsx)("img",{src:e.url,alt:"Tool result",className:"max-w-full h-auto rounded-sm shadow-xs"})})})]}),"embedded_resource"===e.type&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"bg-gray-50 px-3 py-1 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-xs font-medium text-gray-700 uppercase tracking-wide",children:"Embedded Resource"})}),(0,t.jsx)("div",{className:"p-3",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2 p-3 bg-blue-50 border border-blue-200 rounded-sm",children:[(0,t.jsx)("div",{className:"shrink-0",children:(0,t.jsx)("svg",{className:"h-5 w-5 text-blue-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})})}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("p",{className:"text-xs font-medium text-blue-900",children:["Resource Type: ",e.resource_type]}),e.url&&(0,t.jsxs)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center text-xs text-blue-600 hover:text-blue-800 hover:underline mt-1 transition-colors",children:["View Resource",(0,t.jsxs)("svg",{className:"ml-1 h-3 w-3",fill:"currentColor",viewBox:"0 0 20 20",children:[(0,t.jsx)("path",{d:"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z"}),(0,t.jsx)("path",{d:"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z"})]})]})]})]})})]})]},s)):(0,t.jsx)("div",{className:"bg-white rounded-sm border border-gray-200",children:(0,t.jsx)("div",{className:"p-3 overflow-auto max-h-80 bg-gray-50",children:(0,t.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap break-all text-gray-800",children:JSON.stringify(l,null,2)})})})})]})]}):(0,t.jsx)("div",{className:"flex flex-col justify-center items-center h-48 text-gray-500",children:(0,t.jsxs)("div",{className:"text-center max-w-sm",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsx)("svg",{className:"mx-auto h-12 w-12 text-gray-300",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1,d:"M13 10V3L4 14h7v7l9-11h-7z"})})}),(0,t.jsx)("h4",{className:"text-sm font-medium text-gray-900 mb-1",children:"Ready to Call Tool"}),(0,t.jsx)("p",{className:"text-xs text-gray-500 leading-relaxed",children:'Configure the input parameters and click "Call Tool" to see the results here.'})]})})})]})]})]})}function sT(e){return e.toLowerCase().trim().replace(/[^a-z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function sS(e,t){let s=e?sT(e):"";return{[s?`x-mcp-${s}-authorization`:"x-mcp-auth"]:`Bearer ${t}`}}var sA=e.i(779129);let sI="litellm-tools-mcp-oauth-flow-state",sO="litellm-tools-mcp-oauth-result";var sP=e.i(280024),sM=e.i(531245),sF=e.i(181692),sF=sF,sE=e.i(319023);let sL=({serverId:e,accessToken:s,auth_type:r,oauth2_flow:l,delegate_auth_to_upstream:c,dcr_bridge:d,userRole:u,userID:h,serverAlias:x,extraHeaders:f})=>{let[j,v]=(0,p.useState)(null),[y,_]=(0,p.useState)(null),[w,k]=(0,p.useState)(null),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)({}),[I,O]=(0,p.useState)(!1),P=(0,eC.getMcpOAuthMode)({auth_type:r,oauth2_flow:l,delegate_auth_to_upstream:c}),M="passthrough"===P||(0,eC.isClientForwardedTokenMode)(r),F="authorization_code"===P,[E,L]=(0,p.useState)(()=>M&&(0,ek.isTokenValid)(e,h)?(0,ek.getToken)(e,h)?.access_token??null:null);(0,p.useEffect)(()=>{M?L((0,ek.isTokenValid)(e,h)?(0,ek.getToken)(e,h)?.access_token??null:null):L(null)},[e,h,M]);let{startOAuthFlow:R,status:U,error:z}=(({accessToken:e,serverId:t,serverAlias:s,userId:r,scopes:l,clientId:a,gatewayMintsClient:n,onSuccess:i})=>{let[o,c]=(0,p.useState)("idle"),[d,u]=(0,p.useState)(null),m=(0,p.useRef)(!1),h=(0,p.useRef)(i);h.current=i;let x=(0,p.useCallback)(async()=>{try{let r;c("authorizing"),u(null);let i=a??void 0,o=(0,sA.buildCallbackUrl)();if(!i&&!n)try{let l=await (0,b.registerMcpOAuthClient)(e,t,{client_name:s||t,grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none",redirect_uris:[o]});i=l?.client_id,r=l?.client_secret}catch(e){}let d=(0,t0.generateCodeVerifier)(),m=await (0,t0.generateCodeChallenge)(d),h=crypto.randomUUID(),x=l?.filter(e=>e.trim()).join(" "),p=(0,b.buildMcpOAuthAuthorizeUrl)({serverId:t,clientId:i,redirectUri:o,state:h,codeChallenge:m,scope:x}),g={state:h,codeVerifier:d,serverId:t,redirectUri:o,clientId:i,clientSecret:r,scopes:l};(0,eR.setSecureItem)(sI,JSON.stringify(g)),(0,eR.setSecureItem)("litellm-mcp-oauth-return-url",window.location.href),window.location.href=p}catch(t){let e=(0,tX.extractErrorMessage)(t);u(e),c("error"),N.default.error(e)}},[e,t,s,l,a,n]),g=(0,p.useCallback)(async()=>{if(m.current)return;let s=(0,eR.getSecureItem)(sO);if(!s)return;let l=(0,eR.getSecureItem)(sI);if(!l)return;let a=null;try{if((a=JSON.parse(l)).serverId&&a.serverId!==t)return}catch(e){}m.current=!0,(0,sA.clearStorage)(sO);let n=null,i=null;try{n=JSON.parse(s),i=a}catch(e){u("Failed to resume OAuth flow. Please retry."),c("error"),m.current=!1,(0,sA.clearStorage)(sI);return}try{if(!i?.state||!i.codeVerifier||!i.serverId)throw Error("OAuth session state was lost. Please retry.");if(!n?.state||n.state!==i.state)throw Error("OAuth state mismatch. Please retry.");if(n.error)throw Error(n.error_description||n.error);if(!n.code)throw Error("Authorization code missing in callback.");c("exchanging");let t=await (0,b.exchangeMcpOAuthToken)({serverId:i.serverId,code:n.code,clientId:i.clientId,clientSecret:i.clientSecret,codeVerifier:i.codeVerifier,redirectUri:i.redirectUri,accessToken:e});(0,ek.setToken)(i.serverId,{access_token:t.access_token,expires_in:t.expires_in,token_type:t.token_type},r),c("success"),u(null),N.default.success("Connected successfully"),h.current(t.access_token)}catch(t){let e=(0,tX.extractErrorMessage)(t);u(e),c("error"),N.default.error(e)}finally{(0,sA.clearStorage)(sI),setTimeout(()=>{m.current=!1},1e3)}},[e,t,r]);return(0,p.useEffect)(()=>{g()},[g]),{startOAuthFlow:x,status:o,error:d}})({accessToken:s??"",serverId:e,serverAlias:x,userId:h,gatewayMintsClient:(0,eC.gatewayMintsClientFor)({auth_type:r,dcr_bridge:d}),onSuccess:L}),{data:V,isLoading:H,isError:D,refetch:B}=(0,g.useQuery)({queryKey:["mcpOauthUserCredStatus",e,h],queryFn:()=>(0,b.getMCPOAuthUserCredentialStatus)(s??"",e),enabled:!!s&&F,staleTime:3e4}),q=!!V?.has_credential,$=F&&!H&&(D||!!V&&!q),W=F&&H,K=f&&f.length>0,G=()=>{let e={};if(M&&E&&Object.assign(e,sS(x,E)),x&&K){let t=sT(x);t&&Object.entries(S).forEach(([s,r])=>{r&&r.trim()&&(e[`x-mcp-${t}-${s.toLowerCase()}`]=r)})}return Object.keys(e).length>0?e:void 0},{data:Y,isLoading:J,error:Q,refetch:Z}=(0,g.useQuery)({queryKey:["mcpTools",e,S,E],queryFn:async()=>{if(!s)throw Error("Access Token required");let t=await (0,b.listMCPTools)(s,e,G());if(t?.error){let s=t.status;401===s&&(0,ek.removeToken)(e,h);let r=Error(t.message||t.error||"Failed to fetch MCP tools");throw r.status=s,r.statusText=t.statusText,r.details=t.details,r}return t},enabled:!!s&&(M?null!==E:!F||q),staleTime:3e4,retry:(e,t)=>t?.status!==401&&t?.response?.status!==401&&e<2}),X=(0,p.useCallback)(()=>{B(),Z()},[B,Z]),{startOAuthFlow:ee,status:et,error:es}=(0,sP.useUserMcpOAuthFlow)({accessToken:s??"",serverId:e,serverAlias:x,onSuccess:X}),er=(0,p.useCallback)(()=>{try{(0,eR.setSecureItem)(sA.TOOLS_OAUTH_UI_STATE_KEY,JSON.stringify({serverId:e}))}catch(e){}ee()},[e,ee]);(0,p.useEffect)(()=>{401===(Q?.status??Q?.response?.status)&&((0,ek.removeToken)(e,h),L(null))},[Q,e,h]);let{mutate:el,isPending:ea}=(0,sy.useMutation)({mutationFn:async t=>{if(!s)throw Error("Access Token required");try{return await (0,b.callMCPTool)(s,e,t.tool.name,t.arguments,{customHeaders:G()})}catch(e){throw e}},onSuccess:e=>{_(e.content),k(null)},onError:t=>{k(t),_(null),(t?.status===401||t?.response?.status===401)&&((0,ek.removeToken)(e,h),L(null))}}),en=Y?.tools||[],ei=F&&(Q?.status??Q?.response?.status)===401,eo=M&&!E||$||ei,ed=J||W,eu=en.filter(e=>{let t=C.toLowerCase();return e.name.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t)||e.mcp_info.server_name&&e.mcp_info.server_name.toLowerCase().includes(t)});return(0,t.jsx)("div",{className:"w-full p-4",children:(0,t.jsx)(te.Card,{className:"w-full overflow-hidden rounded-xl shadow-md",children:(0,t.jsxs)("div",{className:"grid h-auto w-full grid-cols-4 gap-4",children:[(0,t.jsxs)("div",{className:"col-span-1 flex flex-col bg-muted p-4",children:[(0,t.jsx)("h2",{className:"mt-2 mb-6 text-xl font-semibold",children:"MCP Tools"}),(0,t.jsxs)("div",{className:"flex flex-col flex-1",children:[K&&(0,t.jsxs)("div",{className:"mb-4 rounded-lg border border-border bg-card p-3",children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(sF.default,{className:"mr-2 size-4 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm font-medium",children:"Additional Headers"})]}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:()=>O(!I),children:I?"Hide":"Configure"})]}),!I&&0===Object.keys(S).length&&(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:'This server requires additional headers. Click "Configure" to provide values.'}),I&&(0,t.jsxs)("div",{className:"mt-3 space-y-2",children:[f?.map(e=>(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"mb-1 block text-xs font-medium",children:e}),(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(sF.default,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:`Enter ${e}`,value:S[e]||"",onChange:t=>{A({...S,[e]:t.target.value})}})]})]},e)),(0,t.jsx)(i.Button,{size:"sm",onClick:()=>{Z(),O(!1)},disabled:Object.values(S).every(e=>!e||!e.trim()),className:"mt-2 w-full",children:"Load Tools"})]}),!I&&Object.keys(S).length>0&&(0,t.jsx)("div",{className:"mt-2",children:(0,t.jsxs)("p",{className:"flex items-center text-xs text-muted-foreground",children:[(0,t.jsx)("span",{className:"mr-2 inline-block size-2 rounded-full bg-green-500"}),Object.keys(S).length," header(s) configured"]})})]}),(0,t.jsxs)("div",{className:"flex flex-col flex-1 min-h-0",children:[(0,t.jsxs)("p",{className:"mb-3 flex items-center text-sm font-medium",children:[(0,t.jsx)(e9.Wrench,{className:"mr-2 size-4"})," Available Tools",en.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",className:"ml-2",children:en.length})]}),M&&!E&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(sE.Lock,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"Authentication required"}),(0,t.jsx)("p",{className:"mb-3 text-xs text-muted-foreground",children:"Authenticate to view available tools"}),(0,t.jsx)(i.Button,{size:"sm",onClick:R,disabled:!s||"authorizing"===U||"exchanging"===U,children:"Authorize"}),z&&(0,t.jsx)("p",{className:"mt-2 text-xs text-destructive",children:z})]}),($||ei)&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(sE.Lock,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"Authentication required"}),(0,t.jsx)("p",{className:"mb-3 text-xs text-muted-foreground",children:"Authenticate with the upstream provider to view available tools"}),(0,t.jsx)(i.Button,{size:"sm",onClick:er,disabled:!s||"authorizing"===et||"exchanging"===et,children:"Authorize"}),es&&(0,t.jsx)("p",{className:"mt-2 text-xs text-destructive",children:es})]}),eo?null:(0,t.jsxs)(t.Fragment,{children:[en.length>0&&(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)(o.InputGroup,{className:"w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search tools...",value:C,onChange:e=>T(e.target.value)})]})}),ed&&(0,t.jsxs)("div",{className:"flex flex-col items-center justify-center rounded-lg border border-border bg-card py-8",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"mb-3 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-xs font-medium",children:"Loading tools..."})]}),(Y?.error||Q)&&!ed&&!en.length&&(0,t.jsx)("div",{className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-xs text-destructive",children:(0,t.jsxs)("p",{className:"font-medium",children:["Error: ",Y?.message||Q?.message]})}),!ed&&!Y?.error&&!Q&&(!en||0===en.length)&&(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)("div",{className:"mx-auto mb-2 flex size-8 items-center justify-center rounded-full bg-muted",children:(0,t.jsx)("svg",{className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 8.172V5L8 4z"})})}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"No tools available"}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"No tools found for this server"})]}),!ed&&!Y?.error&&en.length>0&&(0,t.jsx)(t.Fragment,{children:0===eu.length?(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-card p-4 text-center",children:[(0,t.jsx)(a.Search,{className:"mx-auto mb-2 size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"mb-1 text-xs font-medium",children:"No tools found"}),(0,t.jsxs)("p",{className:"text-xs text-muted-foreground",children:['No tools match "',C,'"']})]}):(0,t.jsx)("div",{className:"mcp-tools-scrollable max-h-100 min-h-0 flex-1 space-y-2 overflow-y-auto",children:eu.map(e=>(0,t.jsxs)("div",{className:(0,ec.cn)("cursor-pointer rounded-lg border p-3 transition-all hover:shadow-xs",j?.name===e.name?"border-primary bg-accent ring-1 ring-ring":"border-border bg-card"),onClick:()=>{v(e),_(null),k(null)},children:[(0,t.jsxs)("div",{className:"flex items-start space-x-2",children:[e.mcp_info.logo_url&&(0,t.jsx)("img",{src:(0,s_.resolveLogoSrc)(e.mcp_info.logo_url),alt:`${e.mcp_info.server_name} logo`,className:"w-4 h-4 object-contain shrink-0 mt-0.5"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("h4",{className:"truncate font-mono text-xs font-medium",children:e.name}),(0,t.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:e.mcp_info.server_name}),(0,t.jsx)("p",{className:"mt-1 line-clamp-2 text-xs leading-relaxed text-muted-foreground",children:e.description})]})]}),j?.name===e.name&&(0,t.jsx)("div",{className:"mt-2 border-t border-border pt-2",children:(0,t.jsxs)("div",{className:"flex items-center text-xs font-medium text-primary",children:[(0,t.jsx)("svg",{className:"w-3 h-3 mr-1",fill:"currentColor",viewBox:"0 0 20 20",children:(0,t.jsx)("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"})}),"Selected"]})})]},e.name))})})]})]})]})]}),(0,t.jsxs)("div",{className:"col-span-3 flex flex-col",children:[(0,t.jsx)("div",{className:"flex items-center justify-between border-b border-border p-4",children:(0,t.jsx)("h2",{className:"mb-0 text-xl font-semibold",children:"Tool Testing Playground"})}),(0,t.jsx)("div",{className:"flex-1 overflow-auto p-4",children:j?(0,t.jsx)("div",{className:"h-full",children:(0,t.jsx)(sC,{tool:j,onSubmit:e=>{el({tool:j,arguments:e})},result:y,error:w,isLoading:ea,onClose:()=>v(null)})}):(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center text-muted-foreground",children:[(0,t.jsx)(sM.Bot,{className:"mb-4 size-12"}),(0,t.jsx)("p",{className:"mb-2 text-lg font-medium",children:"Select a Tool to Test"}),(0,t.jsx)("p",{className:"max-w-md text-center text-sm",children:"Choose a tool from the left sidebar to start testing its functionality with custom inputs."})]})})]})]})})})},sR=[eC.AUTH_TYPE.API_KEY,eC.AUTH_TYPE.BEARER_TOKEN,eC.AUTH_TYPE.TOKEN,eC.AUTH_TYPE.BASIC],sU=[...sR,eC.AUTH_TYPE.OAUTH2,eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,eC.AUTH_TYPE.OAUTH2_ID_JAG,eC.AUTH_TYPE.AWS_SIGV4,eC.AUTH_TYPE.TRUE_PASSTHROUGH,eC.AUTH_TYPE.OAUTH_DELEGATE],sz="litellm-mcp-oauth-edit-state",sV=({mcpServer:e,accessToken:s,userID:r,onCancel:l,onSuccess:a,availableAccessGroups:n})=>{let[i]=$.Form.useForm(),[o,c]=(0,p.useState)({}),[d,u]=(0,p.useState)([]),[m,h]=(0,p.useState)(!1),[x,g]=(0,p.useState)(null),[f,j]=(0,p.useState)(""),[v,y]=(0,p.useState)(!1),[_,w]=(0,p.useState)(!1),[k,C]=(0,p.useState)(!1),[T,S]=(0,p.useState)([]),[A,I]=(0,p.useState)(!1),[O,P]=(0,p.useState)({}),[M,F]=(0,p.useState)({}),[E,L]=(0,p.useState)(null),[R,U]=(0,p.useState)(e.mcp_info?.logo_url||void 0),z=$.Form.useWatch("auth_type",i),V=$.Form.useWatch("transport",i),D="stdio"===V,B=V===eC.TRANSPORT.OPENAPI,q=!!z&&sR.includes(z),K=z===eC.AUTH_TYPE.OAUTH2,G=z===eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE,Y=z===eC.AUTH_TYPE.OAUTH2_ID_JAG,J=z===eC.AUTH_TYPE.AWS_SIGV4,Q=$.Form.useWatch("oauth_flow_type",i),Z=K&&Q===eC.OAUTH_FLOW.M2M,X=$.Form.useWatch("delegate_auth_to_upstream",i)??!!e.delegate_auth_to_upstream,ee=$.Form.useWatch("url",i),et=$.Form.useWatch("spec_path",i),es=$.Form.useWatch("server_name",i),er=$.Form.useWatch("auth_type",i),el=$.Form.useWatch("static_headers",i),ea=$.Form.useWatch("credentials",i),en=$.Form.useWatch("issuer",i),ei=$.Form.useWatch("authorization_url",i),eo=$.Form.useWatch("token_url",i),ec=$.Form.useWatch("registration_url",i),ed=!!e.mcp_info?.tool_allowlist_enforced||(e.allowed_tools?.length??0)>0,eu=ed?e.allowed_tools??[]:null,em=()=>i.getFieldValue("auth_type")??e.auth_type,eh=p.default.useRef(void 0),{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef,reset:ej}=t2({accessToken:s,getCredentials:()=>i.getFieldValue("credentials"),getTemporaryPayload:()=>{let t=i.getFieldsValue(!0),s=t.url||e.url,r=t.transport||e.transport;if(!s||!r)return null;let l=Array.isArray(t.static_headers)?t.static_headers.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{};return{server_id:e.server_id,server_name:t.server_name||e.server_name||e.alias,alias:t.alias||e.alias,description:t.description||e.description,url:s,transport:r,auth_type:(0,eC.isClientForwardedTokenMode)(t.auth_type)?t.auth_type:eC.AUTH_TYPE.OAUTH2,credentials:(0,eC.isClientForwardedTokenMode)(t.auth_type)?(0,eC.preservedAdminCredentials)(t.credentials):t.credentials,mcp_access_groups:t.mcp_access_groups||e.mcp_access_groups,static_headers:l,command:t.command,args:t.args,env:t.env}},onTokenReceived:t=>{if(!t?.access_token)return;if(eh.current=(0,eC.getOAuthAuthorizationIdentity)(i.getFieldsValue(!0)),(0,eC.isClientForwardedTokenMode)(em())){let s={access_token:t.access_token,expires_in:t.expires_in,token_type:t.token_type};(0,ek.setToken)(e.server_id,s,r),N.default.success("Token held for this browser session. Tools can now be loaded and configured; the token is not saved to LiteLLM.");return}let s=i.getFieldValue("credentials")??{},l={...(0,eC.preservedAdminCredentials)(s)??{},...void 0!==s.scopes&&{scopes:s.scopes},access_token:t.access_token,...t.refresh_token&&{refresh_token:t.refresh_token},...t.expires_in&&{expires_in:t.expires_in},...t.scope&&{scope:t.scope}};i.setFieldValue("credentials",l),eh.current=(0,eC.getOAuthAuthorizationIdentity)(i.getFieldsValue(!0)),N.default.success("OAuth authorization successful! Please click 'Update MCP Server' to save the credentials.")},onBeforeRedirect:()=>{try{let t=i.getFieldsValue(!0);(0,eR.setSecureItem)(sz,JSON.stringify({serverId:e.server_id,formValues:t,costConfig:o,allowedTools:T,hasToolAllowlistInteraction:A,searchValue:f,aliasManuallyEdited:v}))}catch(e){console.warn("Failed to persist MCP edit state",e)}},flowSource:"edit"}),e_=p.default.useMemo(()=>e.static_headers?Object.entries(e.static_headers).map(([e,t])=>({header:e,value:null!=t?String(t):""})):[],[e.static_headers]),ew=p.default.useMemo(()=>Array.isArray(e.env_vars)?e.env_vars.map(e=>({name:e.name,value:e.value??"",scope:"user"===e.scope?"user":"global",description:e.description??""})):[],[e.env_vars]),eT=p.default.useMemo(()=>{let t=e.env??void 0;if(!t||0===Object.keys(t).length)return"";try{return JSON.stringify(t,null,2)}catch{return""}},[e.env]),eS=p.default.useMemo(()=>e.spec_path&&"stdio"!==e.transport?eC.TRANSPORT.OPENAPI:e.transport,[e]),eF=p.default.useMemo(()=>({...e,transport:eS,static_headers:e_,env_vars:ew,extra_headers:e.extra_headers||[],oauth_flow_type:(0,eC.oauth2FlowToFormValue)(e.oauth2_flow),dcr_bridge:!!e.dcr_bridge,token_validation_json:e.token_validation?JSON.stringify(e.token_validation,null,2):void 0}),[e,eS,e_,ew,eT]),eE=p.default.useRef(null);(0,p.useEffect)(()=>{e.server_id&&eE.current!==e.server_id&&(eE.current=e.server_id,i.setFieldsValue(eF),C(!1),w(!1))},[e.server_id,eF,i]),(0,p.useEffect)(()=>{e.mcp_info?.mcp_server_cost_info&&c(e.mcp_info.mcp_server_cost_info)},[e]),(0,p.useEffect)(()=>{I(!1)},[e.server_id]),(0,p.useEffect)(()=>{ed&&S(e.allowed_tools??[]),P(eM(e.tool_name_to_display_name)),F(eM(e.tool_name_to_description))},[e,ed]),(0,p.useEffect)(()=>{let t=(0,eR.getSecureItem)(sz);if(t)try{let s=JSON.parse(t);if(!s||s.serverId!==e.server_id)return;if(s.formValues){let t=(0,eC.withoutMintedTokenCredentials)({...e.credentials??{},...s.formValues.credentials??{}}),r={...e,...s.formValues,credentials:t};L(r)}s.costConfig&&c(s.costConfig),s.allowedTools&&S(s.allowedTools),"boolean"==typeof s.hasToolAllowlistInteraction&&I(s.hasToolAllowlistInteraction),s.searchValue&&j(s.searchValue),"boolean"==typeof s.aliasManuallyEdited&&y(s.aliasManuallyEdited)}catch(e){console.error("Failed to restore MCP edit state",e)}finally{window.sessionStorage.removeItem(sz)}},[i,e]),(0,p.useEffect)(()=>{if(!E)return;let t=E.transport||e.transport;t&&t!==i.getFieldValue("transport")?i.setFieldsValue({transport:t}):(i.setFieldsValue(E),L(null))},[E,i,e.transport,V]),(0,p.useEffect)(()=>{if(e.mcp_access_groups){let t=e.mcp_access_groups.map(e=>"string"==typeof e?e:e.name||String(e));i.setFieldValue("mcp_access_groups",t)}},[e]),(0,p.useEffect)(()=>{e.server_id&&""!==e.server_id.trim()&&ez()},[e,s,r,ef?.access_token]);let eL=(t={})=>{eh.current=void 0,e.server_id&&(0,ek.removeToken)(e.server_id,r),u([]),ej();let s=(0,eC.preservedAdminCredentials)(i.getFieldValue("credentials"));i.resetFields([...eC.CLEARED_ON_INVALIDATION]),s&&i.setFieldsValue({credentials:s});let l=Object.fromEntries(eC.CLEARED_ON_INVALIDATION.filter(e=>e in t).map(e=>[e,t[e]]));Object.keys(l).length>0&&i.setFieldsValue(l)},eU=async(t,r)=>{let l=t||r||em()!==eC.AUTH_TYPE.OAUTH2?void 0:ef?.access_token;if(!l)return!1;h(!0),g(null);try{let t=i.getFieldsValue(!0),r=t.transport||e.transport,a={server_id:e.server_id,server_name:t.server_name||e.server_name||e.alias,url:t.url||e.url,spec_path:t.spec_path||e.spec_path,transport:r===eC.TRANSPORT.OPENAPI?eC.TRANSPORT.HTTP:r,auth_type:eC.AUTH_TYPE.OAUTH2,oauth2_flow:eC.MCP_OAUTH2_FLOW_INTERACTIVE,issuer:t.issuer,authorization_url:t.authorization_url,token_url:t.token_url,registration_url:t.registration_url},n=await (0,b.testMCPToolsListRequest)(s,a,l);n.tools&&!n.error?u(n.tools):(u([]),g(n.message||"Failed to load tools"))}catch(e){u([]),g(e instanceof Error?e.message:"Failed to load tools")}finally{h(!1)}return!0},ez=async()=>{let t;if(!s||!e.server_id)return;let l="passthrough"===(0,eC.getMcpOAuthMode)({auth_type:e.auth_type,oauth2_flow:e.oauth2_flow,delegate_auth_to_upstream:e.delegate_auth_to_upstream}),a=(0,eC.isClientForwardedTokenMode)(em());if(!await eU(l,a)){if(l||a){let s=ef?.access_token??((0,ek.isTokenValid)(e.server_id,r)?(0,ek.getToken)(e.server_id,r)?.access_token??null:null);if(!s){u([]),g(a?"Authorize with the upstream (browser-only, in the Authentication section) to load and configure this server's tools.":"Authenticate with this server in the Tools tab to load and configure its tools.");return}t=sS(e.alias,s)}h(!0),g(null);try{let r=await (0,b.listMCPTools)(s,e.server_id,t,!0);r.tools&&!r.error?u(r.tools):(u([]),g(r.message||"Failed to load tools"))}catch(e){u([]),g(e instanceof Error?e.message:"Failed to load tools")}finally{h(!1)}}},eV=async t=>{if(!s)return;let l=Object.entries(O).find(([,e])=>e&&!eO.test(e));if(l)return void N.default.fromBackend(`Tool display name "${l[1]}" is invalid. Only letters, digits, underscores, and hyphens are allowed (no spaces).`);try{let l,n,{static_headers:i,env_vars:c,credentials:d,stdio_config:u,env_json:m,command:h,args:x,allow_all_keys:p,available_on_public_internet:g,delegate_auth_to_upstream:f,oauth_passthrough:j,dcr_bridge:v,token_validation_json:y,...w}=t,k=(w.mcp_access_groups||[]).map(e=>"string"==typeof e?e:e.name||String(e)),S=Array.isArray(i)?i.reduce((e,t)=>{let s=t?.header?.trim();return s&&(e[s]=(t?.value??"").trim()),e},{}):{},I=eP(c),P=d&&"object"==typeof d?Object.entries(d).reduce((e,[t,s])=>{if(null==s||""===s)return""===s&&eC.ADMIN_CONFIG_CREDENTIAL_KEYS.includes(t)&&(e[t]=null),e;if("scopes"===t){if(Array.isArray(s)){let r=s.filter(e=>null!=e&&""!==e);r.length>0&&(e[t]=r)}}else e[t]=s;return e},{}):void 0,F={};if("stdio"===w.transport)if(u)try{let e=JSON.parse(u),t=e;if(e?.mcpServers&&"object"==typeof e.mcpServers){let s=Object.keys(e.mcpServers);s.length>0&&(t=e.mcpServers[s[0]])}let s=Array.isArray(t?.args)?t.args.map(e=>String(e)).filter(e=>""!==e.trim()):[],r=t?.env&&"object"==typeof t.env&&!Array.isArray(t.env)?Object.entries(t.env).reduce((e,[t,s])=>(null==t||""===String(t).trim()||(e[String(t)]=null==s?"":String(s)),e),{}):{};if(!(F={command:t?.command?String(t.command):void 0,args:s,env:r}).command)return void N.default.fromBackend("Stdio configuration must include a command")}catch{N.default.fromBackend("Invalid JSON in stdio configuration");return}else{let e={};if(m)try{let t=JSON.parse(m);t&&"object"==typeof t&&!Array.isArray(t)&&(e=Object.entries(t).reduce((e,[t,s])=>(null==t||""===String(t).trim()||(e[String(t)]=null==s?"":String(s)),e),{}))}catch{N.default.fromBackend("Invalid JSON in stdio env configuration");return}let t=Array.isArray(x)?x.map(e=>String(e)).filter(e=>""!==e.trim()):[],s=h?String(h).trim():"";if(!s)return void N.default.fromBackend("Stdio transport requires a command");F={command:s,args:t,env:e}}w.transport===eC.TRANSPORT.OPENAPI&&(w.transport="http");let E=null;if(y&&""!==y.trim())try{E=JSON.parse(y)}catch{N.default.fromBackend("Invalid JSON in Token Validation Rules");return}let L=w.server_name||w.url||e.server_name||e.url||w.alias||e.alias||"unknown",U=ed||A||T.length>0,z={...w,...F,stdio_config:void 0,env_json:void 0,...e.auth_type===eC.AUTH_TYPE.OAUTH2&&w.auth_type!==eC.AUTH_TYPE.OAUTH2?{issuer:null,authorization_url:null,token_url:null,registration_url:null}:{},...e.auth_type===eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE&&w.auth_type!==eC.AUTH_TYPE.OAUTH2_TOKEN_EXCHANGE?{token_exchange_endpoint:null,audience:null,subject_token_type:null,token_exchange_profile:null}:{},server_id:e.server_id,mcp_info:{...e.mcp_info??{},server_name:L,description:w.description,logo_url:R||void 0,mcp_server_cost_info:Object.keys(o).length>0?o:null,tool_allowlist_enforced:U},mcp_access_groups:k,alias:w.alias,extra_headers:w.extra_headers||[],...U?{allowed_tools:T}:{},tool_name_to_display_name:Object.keys(O).length>0?O:null,tool_name_to_description:Object.keys(M).length>0?M:null,disallowed_tools:w.disallowed_tools||[],static_headers:S,env_vars:I,allow_all_keys:!!(p??e.allow_all_keys),available_on_public_internet:!!(g??e.available_on_public_internet),delegate_auth_to_upstream:w.auth_type===eC.AUTH_TYPE.OAUTH2&&!!(f??e.delegate_auth_to_upstream),oauth_passthrough:(l=w.auth_type===eC.AUTH_TYPE.NONE||null==w.auth_type,n=(Array.isArray(w.extra_headers)?w.extra_headers:[]).some(e=>"string"==typeof e&&"authorization"===e.toLowerCase()),!!l&&!!n&&!!(j??e.oauth_passthrough)),dcr_bridge:!!(0,eC.isClientForwardedTokenMode)(w.auth_type)&&!!(v??e.dcr_bridge),...w.auth_type===eC.AUTH_TYPE.OAUTH2&&w.oauth_flow_type?{oauth2_flow:w.oauth_flow_type===eC.OAUTH_FLOW.M2M?eC.MCP_OAUTH2_FLOW_M2M:eC.MCP_OAUTH2_FLOW_INTERACTIVE}:{},...null!==E||e.token_validation?{token_validation:E}:{}},V=w.auth_type&&sU.includes(w.auth_type),H=(0,eC.isClientForwardedTokenMode)(w.auth_type)?(0,eC.preservedAdminCredentials)(P):P;V&&H&&Object.keys(H).length>0&&(z.credentials=H),_&&(0,eC.isClientForwardedTokenMode)(w.auth_type)&&(z.credentials={client_id:null,client_secret:null});let D=await (0,b.updateMCPServer)(s,z);if(ef?.access_token){let t=(0,eC.getMcpOAuthMode)({auth_type:w.auth_type,oauth2_flow:Z?eC.MCP_OAUTH2_FLOW_M2M:null,delegate_auth_to_upstream:!!(f??e.delegate_auth_to_upstream)});try{if("authorization_code"===t){let t=ef.scope,r={access_token:ef.access_token,refresh_token:ef.refresh_token,expires_in:ef.expires_in,scopes:"string"==typeof t&&t?t.split(" "):void 0};await (0,b.storeMCPOAuthUserCredential)(s,e.server_id,r)}else if("passthrough"===t||(0,eC.isClientForwardedTokenMode)(w.auth_type)){let t={access_token:ef.access_token,expires_in:ef.expires_in,token_type:ef.token_type};(0,ek.setToken)(e.server_id,t,r)}}catch(t){let e=t instanceof Error?t.message:"";N.default.fromBackend("MCP Server updated, but failed to persist OAuth token"+(e?`: ${e}`:""));return}}N.default.success("MCP Server updated successfully"),C(!1),a(D)}catch(e){N.default.fromBackend("Failed to update MCP Server"+(e?.message?`: ${e.message}`:""))}};return(0,t.jsxs)(t7.TabGroup,{children:[(0,t.jsxs)(t8.TabList,{className:"grid w-full grid-cols-2",children:[(0,t.jsx)(t9.Tab,{children:"Server Configuration"}),(0,t.jsx)(t9.Tab,{children:"Cost Configuration"})]}),(0,t.jsxs)(t6.TabPanels,{className:"mt-6",children:[(0,t.jsx)(t3.TabPanel,{children:(0,t.jsxs)($.Form,{form:i,onFinish:eV,onValuesChange:e=>{if("credentials"in e)C(!1);else{let t=["url","spec_path","issuer","authorization_url","token_url","registration_url"].some(t=>t in e),s=void 0!==(0,eC.preservedDeclaredAppCredentials)(i.getFieldValue("credentials"));t&&s&&C(!0)}(0,eC.isHeldOAuthTokenStale)(i.getFieldsValue(!0),eh.current)&&eL(e)},initialValues:eF,layout:"vertical",children:[(0,t.jsx)($.Form.Item,{label:"MCP Server Name",name:"server_name",rules:[{validator:(e,t)=>eI(t)}],children:(0,t.jsx)(W.Input,{className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Alias",name:"alias",rules:[{validator:(e,t)=>eI(t)}],children:(0,t.jsx)(W.Input,{onChange:()=>y(!0),className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Description",name:"description",children:(0,t.jsx)(W.Input,{className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)(tK,{value:R,onChange:U}),(0,t.jsx)($.Form.Item,{label:"Transport Type",name:"transport",rules:[{required:!0}],children:(0,t.jsxs)(eb.Select,{onChange:e=>{"stdio"===e?i.setFieldsValue({url:void 0,spec_path:void 0,auth_type:void 0,credentials:void 0,issuer:void 0,authorization_url:void 0,token_url:void 0,registration_url:void 0}):e===eC.TRANSPORT.OPENAPI?i.setFieldsValue({url:void 0,command:void 0,args:void 0,env_json:void 0,stdio_config:void 0}):i.setFieldsValue({spec_path:void 0,command:void 0,args:void 0,env_json:void 0,stdio_config:void 0}),(0,eC.isHeldOAuthTokenStale)(i.getFieldsValue(!0),eh.current)&&eL()},children:[(0,t.jsx)(eb.Select.Option,{value:"http",children:"Streamable HTTP (Recommended)"}),(0,t.jsx)(eb.Select.Option,{value:"sse",children:"Server-Sent Events (SSE)"}),(0,t.jsx)(eb.Select.Option,{value:"stdio",children:"Standard Input/Output (stdio)"}),(0,t.jsx)(eb.Select.Option,{value:eC.TRANSPORT.OPENAPI,children:"OpenAPI Spec"})]})}),!D&&!B&&(0,t.jsx)($.Form.Item,{label:"MCP Server URL",name:"url",rules:[{required:!0,message:"Please enter a server URL"},{validator:(e,t)=>eA(t)}],children:(0,t.jsx)(W.Input,{placeholder:"https://your-mcp-server.com",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),B&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["OpenAPI Spec URL",(0,t.jsx)(ev.Tooltip,{title:"URL to an OpenAPI specification (JSON or YAML). MCP tools will be automatically generated from the API endpoints defined in the spec.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"spec_path",rules:[{required:!0,message:"Please enter an OpenAPI spec URL"}],children:(0,t.jsx)(W.Input,{placeholder:"https://petstore3.swagger.io/api/v3/openapi.json",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Max Concurrent Requests (optional)",(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tool calls LiteLLM will run against this server at the same time. Additional calls wait for a free slot. Leave blank for no limit.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:"max_concurrent_requests",children:(0,t.jsx)(ey.InputNumber,{min:1,precision:0,placeholder:"e.g. 10",style:{width:"100%"},className:"rounded-lg"})}),!D&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)($.Form.Item,{label:"Authentication",name:"auth_type",rules:[{required:!0}],children:(0,t.jsxs)(eb.Select,{virtual:!1,children:[(0,t.jsx)(eb.Select.Option,{value:"none",children:"None"}),(0,t.jsx)(eb.Select.Option,{value:"api_key",children:"API Key"}),(0,t.jsx)(eb.Select.Option,{value:"bearer_token",children:"Bearer Token"}),(0,t.jsx)(eb.Select.Option,{value:"token",children:"Token"}),(0,t.jsx)(eb.Select.Option,{value:"basic",children:"Basic Auth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2",children:"OAuth"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_token_exchange",children:"OAuth Token Exchange (OBO)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth2_id_jag",children:"ID-JAG (Okta Cross App Access)"}),(0,t.jsx)(eb.Select.Option,{value:"aws_sigv4",children:"AWS SigV4 (Bedrock AgentCore MCPs)"}),(0,t.jsx)(eb.Select.Option,{value:"true_passthrough",children:"True Passthrough (no LiteLLM auth)"}),(0,t.jsx)(eb.Select.Option,{value:"oauth_delegate",children:"OAuth Delegate (client-supplied upstream token)"})]})}),(0,t.jsx)(eJ,{authType:z}),(0,t.jsx)(e0,{authType:z,oauthFlow:{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef},isEditing:!0,savedAuthType:e.auth_type,removeStoredApp:_,onRemoveStoredAppChange:w,appMayNotMatchUpstream:k})]}),D&&(0,t.jsxs)("div",{className:"rounded-lg border border-gray-200 p-4 space-y-4",children:[(0,t.jsx)("p",{className:"text-sm text-gray-600",children:"Configure the stdio transport used to launch the MCP server process. You can either fill in the fields below or paste a JSON configuration."}),(0,t.jsx)($.Form.Item,{label:"Command",name:"command",rules:[{required:!0,message:"Please enter a command for stdio transport"}],children:(0,t.jsx)(W.Input,{placeholder:"e.g., npx",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:"Args",name:"args",children:(0,t.jsx)(eb.Select,{mode:"tags",size:"large",tokenSeparators:[","],placeholder:"Add args (press enter or comma)",className:"rounded-lg"})}),(0,t.jsx)($.Form.Item,{label:"Environment (JSON object)",name:"env_json",rules:[{validator:(e,t)=>{if(!t)return Promise.resolve();try{let e=JSON.parse(t);if(e&&"object"==typeof e&&!Array.isArray(e))return Promise.resolve();return Promise.reject(Error("Env must be a JSON object"))}catch{return Promise.reject(Error("Please enter valid JSON"))}}}],children:(0,t.jsx)(W.Input.TextArea,{rows:6,className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500 font-mono text-sm",placeholder:`{ + "KEY": "value" +}`})}),(0,t.jsx)(tx,{isVisible:!0,required:!1})]}),!D&&q&&(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["Authentication Value",(0,t.jsx)(ev.Tooltip,{title:"Token, password, or header value to send with each request for the selected auth type.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","auth_value"],rules:[{validator:(e,t)=>t&&"string"==typeof t&&""===t.trim()?Promise.reject(Error("Authentication value cannot be empty")):Promise.resolve()}],children:(0,t.jsx)(W.Input.Password,{placeholder:"Enter token or secret (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),!D&&K&&(0,t.jsxs)(t.Fragment,{children:[!Q&&!X&&(0,t.jsx)(tp.Alert,{type:"warning",showIcon:!0,className:"mb-4 rounded-lg",message:"This server has no OAuth flow set",description:"Choose Machine-to-Machine (M2M) or Interactive (PKCE) so LiteLLM authenticates it the way you intend, then save. Until it is set, LiteLLM falls back to interactive per-user auth and treats a machine-to-machine credential shape conservatively."}),(0,t.jsx)(eK,{isM2M:Z,isEditing:!0,oauthFlow:{startOAuthFlow:ex,status:ep,error:eg,tokenResponse:ef}})]}),!D&&G&&(0,t.jsx)(e4,{isEditing:!0}),!D&&Y&&(0,t.jsx)(e6,{isEditing:!0}),!D&&J&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"text-sm text-gray-500 mb-2",children:["For MCP servers hosted on AWS Bedrock AgentCore."," ",(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/mcp_aws_sigv4",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700",children:"View docs →"})]}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Region",(0,t.jsx)(ev.Tooltip,{title:"AWS region for SigV4 signing (e.g., us-east-1)",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_region_name"],rules:[],children:(0,t.jsx)(W.Input,{placeholder:"us-east-1 (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Service Name",(0,t.jsx)(ev.Tooltip,{title:"AWS service name for SigV4 signing. Defaults to 'bedrock-agentcore'.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_service_name"],children:(0,t.jsx)(W.Input,{placeholder:"bedrock-agentcore (leave blank to keep existing)",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Access Key ID",(0,t.jsx)(ev.Tooltip,{title:"Optional. If not provided, falls back to the boto3 credential chain (IAM role, env vars, etc.).",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_access_key_id"],rules:[],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Secret Access Key",(0,t.jsx)(ev.Tooltip,{title:"Optional. Required if AWS Access Key ID is provided.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_secret_access_key"],rules:[],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Token",(0,t.jsx)(ev.Tooltip,{title:"Optional. Only needed for temporary STS credentials.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_token"],children:(0,t.jsx)(W.Input.Password,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Role ARN",(0,t.jsx)(ev.Tooltip,{title:"Optional. IAM role ARN to assume via STS before signing. If set, LiteLLM calls sts:AssumeRole to get temporary credentials.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_role_name"],children:(0,t.jsx)(W.Input,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})}),(0,t.jsx)($.Form.Item,{label:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:["AWS Session Name",(0,t.jsx)(ev.Tooltip,{title:"Optional. Session name for the AssumeRole call — appears in CloudTrail logs. Auto-generated if omitted.",children:(0,t.jsx)(eN.InfoCircleOutlined,{className:"ml-2 text-blue-400 hover:text-blue-600 cursor-help"})})]}),name:["credentials","aws_session_name"],children:(0,t.jsx)(W.Input,{placeholder:"Leave blank to keep existing",className:"rounded-lg border-gray-300 focus:border-blue-500 focus:ring-blue-500"})})]}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(tZ,{})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(tb,{availableAccessGroups:n,mcpServer:e,searchValue:f,setSearchValue:j,getAccessGroupOptions:()=>{let e=n.map(e=>({value:e,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:e})]})}));return f&&!n.some(e=>e.toLowerCase().includes(f.toLowerCase()))&&e.push({value:f,label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{className:"font-medium",children:f}),(0,t.jsx)("span",{className:"text-gray-400 text-xs ml-1",children:"create new group"})]})}),e}})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(th,{accessToken:s,formValues:{server_id:e.server_id,server_name:es??e.server_name,url:ee??e.url,spec_path:et??e.spec_path,transport:V??e.transport,auth_type:er??e.auth_type,mcp_info:e.mcp_info,oauth_flow_type:Q??(0,eC.oauth2FlowToFormValue)(e.oauth2_flow)??eC.OAUTH_FLOW.INTERACTIVE,static_headers:el??e.static_headers,credentials:ea,issuer:en??e.issuer,authorization_url:ei??e.authorization_url,token_url:eo??e.token_url,registration_url:ec??e.registration_url},allowedTools:T,existingAllowedTools:eu,hasToolAllowlistInteraction:A,isEditMode:!0,onAllowedToolsChange:S,onToolAllowlistInteraction:()=>I(!0),toolNameToDisplayName:O,toolNameToDescription:M,onToolNameToDisplayNameChange:P,onToolNameToDescriptionChange:F,externalTools:d,externalIsLoading:m,externalError:x,externalCanFetch:!0})}),(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(eQ.Button,{onClick:l,children:"Cancel"}),(0,t.jsx)(H.Button,{type:"submit",children:"Save Changes"})]})]})}),(0,t.jsx)(t3.TabPanel,{children:(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(tr,{value:o,onChange:c,tools:d,disabled:m}),(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(eQ.Button,{onClick:l,children:"Cancel"}),(0,t.jsx)(H.Button,{onClick:()=>i.submit(),children:"Save Changes"})]})]})})]})]})},sH=({costConfig:e})=>{let s=e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null,r=e?.tool_name_to_cost_per_query&&Object.keys(e.tool_name_to_cost_per_query).length>0;return s||r?(0,t.jsx)("div",{className:"mt-6 border-t border-border pt-6",children:(0,t.jsxs)("div",{className:"space-y-4",children:[s&&e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Default Cost per Query"}),(0,t.jsxs)("div",{className:"font-mono text-sm",children:["$",e.default_cost_per_query.toFixed(4)]})]}),r&&e?.tool_name_to_cost_per_query&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Tool-Specific Costs"}),(0,t.jsx)("div",{className:"mt-2 space-y-2",children:Object.entries(e.tool_name_to_cost_per_query).map(([e,s])=>null!=s&&(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted p-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:e}),(0,t.jsxs)("p",{className:"font-mono text-sm",children:["$",s.toFixed(4)," per query"]})]},e))})]}),(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-border bg-muted p-4",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Cost Summary:"}),(0,t.jsxs)("div",{className:"mt-2 space-y-1",children:[s&&e?.default_cost_per_query!==void 0&&e?.default_cost_per_query!==null&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• Default cost: $",e.default_cost_per_query.toFixed(4)," per query"]}),r&&e?.tool_name_to_cost_per_query&&(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["• ",Object.keys(e.tool_name_to_cost_per_query).length," tool(s) with custom pricing"]})]})]})]})}):(0,t.jsx)("div",{className:"mt-6 border-t border-border pt-6",children:(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsx)("div",{className:"rounded-lg border border-border bg-muted p-4",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"No cost configuration set for this server. Tool calls will be charged at $0.00 per tool call."})})})})},sD=({mcpServer:e,onBack:s,isEditing:r,isProxyAdmin:l,accessToken:a,userRole:o,userID:c,availableAccessGroups:u,initialTabIndex:m=0})=>{let h=function(e,t){if(!e)return!1;let s=(0,eR.getSecureItem)(sz);if(!s)return!1;try{return JSON.parse(s)?.serverId===t}catch{return!1}}(l,e.server_id),[x,g]=(0,p.useState)(r||h),[f,j]=(0,p.useState)(!1),[v,b]=(0,p.useState)({}),[y,_]=(0,p.useState)(h?2:m),N=e.url??"",{maskedUrl:w,hasToken:C}=N?eS(N):{maskedUrl:"—",hasToken:!1},T=(e,t)=>e?C?t?e:w:e:"—",S=async(e,t)=>{await (0,ed.copyToClipboard)(e)&&(b(e=>({...e,[t]:!0})),setTimeout(()=>{b(e=>({...e,[t]:!1}))},2e3))},A=e=>(0,t.jsx)(n.Badge,{variant:"outline",children:e.toUpperCase()}),I=e=>(0,t.jsx)(n.Badge,{variant:"outline",children:e});return(0,t.jsxs)("div",{className:"max-w-full p-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsxs)(i.Button,{variant:"ghost",className:"mb-4",onClick:s,children:[(0,t.jsx)(sj.ArrowLeft,{}),"Back to All Servers"]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold",children:e.server_name||e.alias||"Unnamed Server"}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":"Copy server name",onClick:()=>S(e.server_name||e.alias,"mcp-server_name"),children:v["mcp-server_name"]?(0,t.jsx)(k.CheckIcon,{size:12}):(0,t.jsx)(se.CopyIcon,{size:12})}),e.alias&&e.server_name&&e.alias!==e.server_name&&(0,t.jsx)(n.Badge,{variant:"secondary",className:"ml-2 font-mono",children:e.alias})]}),(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-1.5",children:[(0,t.jsx)("p",{className:"font-mono text-xs text-muted-foreground",children:e.server_id}),(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":"Copy server id",onClick:()=>S(e.server_id,"mcp-server-id"),children:v["mcp-server-id"]?(0,t.jsx)(k.CheckIcon,{size:10}):(0,t.jsx)(se.CopyIcon,{size:10})})]}),e.description&&(0,t.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:e.description})]}),(0,t.jsxs)(d.Tabs,{value:String(y),onValueChange:e=>_(Number(e)),children:[(0,t.jsxs)(d.TabsList,{className:"mb-4",children:[(0,t.jsx)(d.TabsTrigger,{value:"0",className:"flex-none",children:"Overview"}),(0,t.jsx)(d.TabsTrigger,{value:"1",className:"flex-none",children:"MCP Tools"}),l&&(0,t.jsx)(d.TabsTrigger,{value:"2",className:"flex-none",children:"Settings"})]}),(0,t.jsxs)(d.TabsContent,{value:"0",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[(0,t.jsxs)(te.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Transport"}),(0,t.jsx)("div",{className:"mt-3",children:A((0,eC.handleTransport)(e.transport??void 0,e.spec_path??void 0))})]}),(0,t.jsxs)(te.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Authentication"}),(0,t.jsx)("div",{className:"mt-3",children:I((0,eC.handleAuth)(e.auth_type??void 0))})]}),(0,t.jsxs)(te.Card,{className:"p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Host URL"}),(0,t.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,t.jsx)("p",{className:"overflow-wrap-anywhere font-mono text-sm break-all",children:T(e.url,f)}),C&&l&&(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":f?"Hide full URL":"Show full URL",onClick:()=>j(!f),children:f?(0,t.jsx)(sb.EyeOff,{}):(0,t.jsx)(sv.Eye,{})})]})]})]}),(0,t.jsxs)(te.Card,{className:"mt-4 p-4",children:[(0,t.jsx)("p",{className:"text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Cost Configuration"}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(sH,{costConfig:e.mcp_info?.mcp_server_cost_info})})]})]}),(0,t.jsx)(d.TabsContent,{value:"1",children:(0,t.jsx)(sL,{serverId:e.server_id,accessToken:a,auth_type:e.auth_type,oauth2_flow:e.oauth2_flow,delegate_auth_to_upstream:e.delegate_auth_to_upstream,dcr_bridge:e.dcr_bridge,tokenUrl:e.token_url,userRole:o,userID:c,serverAlias:e.alias,extraHeaders:e.extra_headers})}),(0,t.jsx)(d.TabsContent,{value:"2",children:(0,t.jsxs)(te.Card,{className:"p-6",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsx)("h2",{className:"text-lg font-medium",children:"MCP Server Settings"}),x?null:(0,t.jsx)(i.Button,{variant:"outline",onClick:()=>g(!0),children:"Edit Settings"})]}),x?(0,t.jsx)(sV,{mcpServer:e,accessToken:a,userID:c,onCancel:()=>g(!1),onSuccess:e=>{g(!1),s()},availableAccessGroups:u}):(0,t.jsxs)("div",{className:"divide-y divide-border",children:[(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Server Name"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.server_name||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Alias"}),(0,t.jsx)("div",{className:"col-span-2 font-mono text-sm",children:e.alias||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Description"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.description||(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"URL"}),(0,t.jsxs)("div",{className:"col-span-2 flex items-center gap-2 font-mono text-sm break-all",children:[T(e.url,f),C&&(0,t.jsx)(i.Button,{variant:"ghost",size:"icon-sm","aria-label":f?"Hide full URL":"Show full URL",onClick:()=>j(!f),children:f?(0,t.jsx)(sb.EyeOff,{}):(0,t.jsx)(sv.Eye,{})})]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Transport"}),(0,t.jsx)("div",{className:"col-span-2",children:A((0,eC.handleTransport)(e.transport,e.spec_path))})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Authentication"}),(0,t.jsx)("div",{className:"col-span-2",children:I((0,eC.handleAuth)(e.auth_type))})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Extra Headers"}),(0,t.jsx)("div",{className:"col-span-2 text-sm",children:e.extra_headers&&e.extra_headers.length>0?e.extra_headers.join(", "):(0,t.jsx)("span",{className:"text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Allow All Keys"}),(0,t.jsx)("div",{className:"col-span-2",children:e.allow_all_keys?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Network Access"}),(0,t.jsx)("div",{className:"col-span-2",children:e.available_on_public_internet?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Public"]}):(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-orange-500"}),"Internal only"]})})]}),"oauth2"===(0,eC.handleAuth)(e.auth_type)&&(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Delegate Auth to Upstream"}),(0,t.jsx)("div",{className:"col-span-2",children:e.delegate_auth_to_upstream?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled (PKCE passthrough)"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),"oauth2"!==(0,eC.handleAuth)(e.auth_type)&&Array.isArray(e.extra_headers)&&e.extra_headers.some(e=>"string"==typeof e&&"authorization"===e.toLowerCase())&&(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"OAuth Pass-through"}),(0,t.jsx)("div",{className:"col-span-2",children:e.oauth_passthrough?(0,t.jsxs)(n.Badge,{variant:"outline",children:[(0,t.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-green-500"}),"Enabled"]}):(0,t.jsx)(n.Badge,{variant:"outline",children:"Disabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Access Groups"}),(0,t.jsx)("div",{className:"col-span-2",children:e.mcp_access_groups&&e.mcp_access_groups.length>0?(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.mcp_access_groups.map((e,s)=>(0,t.jsx)(n.Badge,{variant:"secondary",children:"string"==typeof e?e:e?.name??""},s))}):(0,t.jsx)("span",{className:"text-sm text-muted-foreground",children:"—"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Allowed Tools"}),(0,t.jsx)("div",{className:"col-span-2",children:e.allowed_tools&&e.allowed_tools.length>0?(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.allowed_tools.map((e,s)=>(0,t.jsx)(n.Badge,{variant:"secondary",className:"font-mono",children:e},s))}):(0,t.jsx)(n.Badge,{variant:"outline",children:"All tools enabled"})})]}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4 py-3",children:[(0,t.jsx)("p",{className:"text-sm font-medium text-muted-foreground",children:"Cost"}),(0,t.jsx)("div",{className:"col-span-2",children:(0,t.jsx)(sH,{costConfig:e.mcp_info?.mcp_server_cost_info})})]})]})]})})]})]})},sB=(0,v.createQueryKeys)("mcpSemanticFilterSettings"),sq=(0,v.createQueryKeys)("mcpSemanticFilterSettings");var s$=e.i(178654),sW=e.i(621192),sK=e.i(981339),sG=e.i(850627),sY=e.i(750113),sJ=e.i(245704),sQ=e.i(987432),sZ=e.i(695411),sX=e.i(875475),sX=sX,s0=e.i(992619);function s2({accessToken:e,testQuery:s,setTestQuery:r,testModel:l,setTestModel:a,isTesting:n,onTest:o,filterEnabled:c,testResult:u,testError:m,curlCommand:h}){let x=s&&l&&c,p=n||!x;return(0,t.jsxs)(te.Card,{className:"mb-4",children:[(0,t.jsx)(te.CardHeader,{children:(0,t.jsx)(te.CardTitle,{children:"Test Configuration"})}),(0,t.jsx)(te.CardContent,{children:(0,t.jsxs)(d.Tabs,{defaultValue:"test",children:[(0,t.jsxs)(d.TabsList,{children:[(0,t.jsx)(d.TabsTrigger,{value:"test",className:"flex-none",children:"Test"}),(0,t.jsx)(d.TabsTrigger,{value:"api",className:"flex-none",children:"API Usage"})]}),(0,t.jsx)(d.TabsContent,{value:"test",children:(0,t.jsxs)("div",{className:"flex w-full flex-col gap-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2 flex items-center gap-1.5 font-medium",children:[(0,t.jsx)(sX.default,{className:"size-4"})," Test Query"]}),(0,t.jsx)(td.Textarea,{className:"field-sizing-fixed",placeholder:"Enter a test query to see which tools would be selected...",value:s,onChange:e=>r(e.target.value),rows:4,disabled:n})]}),(0,t.jsx)("div",{children:(0,t.jsx)(s0.default,{accessToken:e||"",value:l,onChange:a,disabled:n,showLabel:!0,labelText:"Select Model"})}),(0,t.jsxs)(i.Button,{className:"w-full",onClick:o,disabled:p,children:[(0,t.jsx)(sX.default,{}),"Test Filter"]}),!c&&(0,t.jsxs)(eY.Alert,{children:[(0,t.jsx)(e7.Info,{}),(0,t.jsx)(eY.AlertTitle,{children:"Semantic filtering is disabled"}),(0,t.jsx)(eY.AlertDescription,{children:"Enable semantic filtering and save settings to test the filter."})]}),m&&(0,t.jsxs)(eY.Alert,{variant:"destructive",className:"mb-4",children:[(0,t.jsx)(ta.CircleAlert,{}),(0,t.jsx)(eY.AlertTitle,{children:"Semantic filtering did not run"}),(0,t.jsx)(eY.AlertDescription,{children:m})]}),u&&(0,t.jsxs)("div",{children:[(0,t.jsx)("h5",{className:"mb-2 text-base font-medium",children:"Results"}),(0,t.jsxs)(eY.Alert,{className:"mb-4",children:[(0,t.jsx)(e7.Info,{}),(0,t.jsxs)(eY.AlertTitle,{children:[u.selectedTools," of ",u.totalTools," tools selected"]}),(0,t.jsxs)(eY.AlertDescription,{children:[u.totalTools-u.selectedTools," tools filtered out"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-2 block font-medium",children:"Selected Tools:"}),(0,t.jsx)("ul",{className:"m-0 list-disc pl-5",children:u.tools.map((e,s)=>(0,t.jsx)("li",{className:"mb-1",children:(0,t.jsx)("span",{children:e})},s))}),u.selectedTools>u.tools.length&&(0,t.jsxs)("p",{className:"mt-2 block text-sm text-muted-foreground",children:["+",u.selectedTools-u.tools.length," more selected tools not shown"]})]})]})]})}),(0,t.jsx)(d.TabsContent,{value:"api",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,t.jsx)(st.Code,{className:"size-4"}),(0,t.jsx)("p",{className:"font-medium",children:"API Usage"})]}),(0,t.jsx)("p",{className:"mb-2 block text-sm text-muted-foreground",children:"Use this curl command to test the semantic filter with your current configuration."}),(0,t.jsx)("p",{className:"mb-2 block font-medium",children:"Response headers to check:"}),(0,t.jsxs)("ul",{className:"mt-0 mr-0 mb-3 ml-0 list-disc pl-5",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("span",{children:"x-litellm-semantic-filter: shows total tools → selected tools"}),(0,t.jsx)("span",{className:"block text-sm text-muted-foreground",children:"Example: 10→3"})]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("span",{children:"x-litellm-semantic-filter-tools: CSV of selected tool names"}),(0,t.jsx)("span",{className:"block text-sm text-muted-foreground",children:"Example: wikipedia-fetch,github-search,slack-post"})]})]}),(0,t.jsx)("pre",{className:"m-0 overflow-auto rounded-sm bg-muted p-3 text-xs",children:h})]})})]})})]})}let s1=async({accessToken:e,testModel:t,testQuery:s,setIsTesting:r,setTestResult:l,setTestError:a})=>{if(!s||!t||!e)return void N.default.error("Please enter a query and select a model");r(!0),l(null),a(null);try{let{headers:r}=await (0,b.testMCPSemanticFilter)(e,t,s),a=(e=>{if(!e.filter)return null;let[t,s]=e.filter.split("->").map(Number);return{totalTools:t,selectedTools:s,tools:e.tools?e.tools.split(",").map(e=>e.trim()):[]}})(r);if(!a)return void N.default.warning("Semantic filter is not enabled or no tools were filtered");l(a),N.default.success("Semantic filter test completed successfully")}catch(e){console.error("Test failed:",e),a(e instanceof Error&&e.message?e.message:"Failed to test semantic filter"),N.default.error("Failed to test semantic filter")}finally{r(!1)}};function s4({accessToken:e}){var s;let r,{data:l,isLoading:a,isError:n,error:i}=(()=>{let{accessToken:e}=(0,y.default)();return(0,g.useQuery)({queryKey:sB.list({}),queryFn:async()=>await (0,b.getMCPSemanticFilterSettings)(e),enabled:!!e,staleTime:36e5,gcTime:36e5})})(),{mutate:o,isPending:c,error:d}=(s=e||"",r=(0,j.useQueryClient)(),(0,sy.useMutation)({mutationFn:async e=>{if(!s)throw Error("Access token is required");return(0,b.updateMCPSemanticFilterSettings)(s,e)},onSuccess:()=>{r.invalidateQueries({queryKey:sq.all})}})),[u]=$.Form.useForm(),[m,h]=(0,p.useState)(!1),[x,f]=(0,p.useState)(!1),[v,_]=(0,p.useState)([]),[w,k]=(0,p.useState)(!0),[C,T]=(0,p.useState)(""),[S,A]=(0,p.useState)("gpt-4o"),[I,O]=(0,p.useState)(null),[P,M]=(0,p.useState)(null),[F,E]=(0,p.useState)(!1),L=l?.field_schema,R=l?.values??{};(0,p.useEffect)(()=>{(async()=>{if(e)try{k(!0);let t=(await (0,sZ.fetchAvailableModels)(e)).filter(e=>"embedding"===e.mode);_(t)}catch(e){console.error("Error fetching embedding models:",e)}finally{k(!1)}})()},[e]),(0,p.useEffect)(()=>{R&&(u.setFieldsValue({enabled:R.enabled??!1,embedding_model:R.embedding_model??"text-embedding-3-small",top_k:R.top_k??10,similarity_threshold:R.similarity_threshold??.3}),f(!1))},[R,u]);let U=async()=>{try{let e=await u.validateFields();o(e,{onSuccess:()=>{f(!1),h(!0),setTimeout(()=>h(!1),3e3),N.default.success("Settings updated successfully. Changes will be applied across all pods within 10 seconds.")},onError:e=>{N.default.fromBackend(e)}})}catch(e){console.error("Form validation failed:",e)}},z=async()=>{e&&await s1({accessToken:e,testModel:S,testQuery:C,setIsTesting:E,setTestResult:O,setTestError:M})};return e?(0,t.jsx)("div",{style:{width:"100%"},children:a?(0,t.jsx)(sK.Skeleton,{active:!0}):n?(0,t.jsx)(tp.Alert,{type:"error",message:"Could not load MCP Semantic Filter settings",description:i instanceof Error?i.message:void 0,style:{marginBottom:24}}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tp.Alert,{type:"info",message:"Semantic Tool Filtering",description:"Filter MCP tools semantically based on query relevance. This reduces context window size and improves tool selection accuracy. Click 'Save Settings' to apply changes across all pods (takes effect within 10 seconds).",showIcon:!0,style:{marginBottom:24}}),m&&(0,t.jsx)(tp.Alert,{type:"success",message:"Settings saved successfully",icon:(0,t.jsx)(sJ.CheckCircleOutlined,{}),showIcon:!0,closable:!0,style:{marginBottom:16}}),d&&(0,t.jsx)(tp.Alert,{type:"error",message:"Could not update settings",description:d instanceof Error?d.message:void 0,style:{marginBottom:16}}),(0,t.jsxs)(sW.Row,{gutter:24,children:[(0,t.jsx)(s$.Col,{xs:24,lg:12,children:(0,t.jsxs)($.Form,{form:u,layout:"vertical",disabled:c,onValuesChange:()=>{f(!0)},children:[(0,t.jsxs)(t5.Card,{style:{marginBottom:16},children:[(0,t.jsx)($.Form.Item,{name:"enabled",label:(0,t.jsxs)(tg.Space,{children:[(0,t.jsx)(tG.Typography.Text,{strong:!0,children:"Enable Semantic Filtering"}),(0,t.jsx)(ev.Tooltip,{title:"When enabled, only the most relevant MCP tools will be included in requests based on semantic similarity",children:(0,t.jsx)(sY.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),valuePropName:"checked",children:(0,t.jsx)(eV.Switch,{disabled:c})}),(0,t.jsx)(tG.Typography.Text,{type:"secondary",style:{display:"block",marginTop:-16,marginBottom:16},children:L?.properties?.enabled?.description})]}),(0,t.jsxs)(t5.Card,{title:"Configuration",style:{marginBottom:16},children:[(0,t.jsx)($.Form.Item,{name:"embedding_model",label:(0,t.jsxs)(tg.Space,{children:[(0,t.jsx)(tG.Typography.Text,{strong:!0,children:"Embedding Model"}),(0,t.jsx)(ev.Tooltip,{title:"The model used to generate embeddings for semantic matching",children:(0,t.jsx)(sY.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(eb.Select,{options:v.map(e=>({label:e.model_group,value:e.model_group})),placeholder:w?"Loading models...":"Select embedding model",showSearch:!0,disabled:c||w,loading:w,notFoundContent:w?"Loading...":"No embedding models available"})}),(0,t.jsx)($.Form.Item,{name:"top_k",label:(0,t.jsxs)(tg.Space,{children:[(0,t.jsx)(tG.Typography.Text,{strong:!0,children:"Top K Results"}),(0,t.jsx)(ev.Tooltip,{title:"Maximum number of tools to return after filtering",children:(0,t.jsx)(sY.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(ey.InputNumber,{min:1,max:100,style:{width:"100%"},disabled:c})}),(0,t.jsx)($.Form.Item,{name:"similarity_threshold",label:(0,t.jsxs)(tg.Space,{children:[(0,t.jsx)(tG.Typography.Text,{strong:!0,children:"Similarity Threshold"}),(0,t.jsx)(ev.Tooltip,{title:"Minimum similarity score (0-1) for a tool to be included",children:(0,t.jsx)(sY.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,t.jsx)(sG.Slider,{min:0,max:1,step:.05,marks:{0:"0.0",.3:"0.3",.5:"0.5",.7:"0.7",1:"1.0"},disabled:c})})]}),(0,t.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:8},children:(0,t.jsx)(eQ.Button,{type:"primary",icon:(0,t.jsx)(sQ.SaveOutlined,{}),onClick:U,loading:c,disabled:!x,children:"Save Settings"})})]})}),(0,t.jsx)(s$.Col,{xs:24,lg:12,children:(0,t.jsx)(s2,{accessToken:e,testQuery:C,setTestQuery:T,testModel:S,setTestModel:A,isTesting:F,onTest:z,filterEnabled:!!R.enabled,testResult:I,testError:P,curlCommand:`curl --location 'http://localhost:4000/v1/responses' \\ +--header 'Content-Type: application/json' \\ +--header 'Authorization: Bearer sk-1234' \\ +--data '{ + "model": "${S}", + "input": [ + { + "role": "user", + "content": "${C||"Your query here"}", + "type": "message" + } + ], + "tools": [ + { + "type": "mcp", + "server_url": "litellm_proxy", + "require_approval": "never" + } + ], + "tool_choice": "required" +}'`})})]})]})}):(0,t.jsx)("div",{className:"p-6 text-center text-gray-500",children:"Please log in to configure semantic filter settings."})}var s5=e.i(251854),s5=s5,s3=e.i(107233),s6=e.i(37727),s7=e.i(541202);let s8=({accessToken:e})=>{let s,[r,l]=(0,p.useState)(!0),[a,o]=(0,p.useState)(!1),[c,d]=(0,p.useState)([]),[u,h]=(0,p.useState)(null),[x,g]=(0,p.useState)("");(0,p.useEffect)(()=>{f(),j()},[e]);let f=async()=>{if(e){l(!0);try{for(let t of(await (0,b.getGeneralSettingsCall)(e)))"mcp_internal_ip_ranges"===t.field_name&&t.field_value&&d(t.field_value)}catch(e){console.error("Failed to load MCP network settings:",e)}finally{l(!1)}}},j=async()=>{if(!e)return;let t=await (0,b.fetchMCPClientIp)(e);t&&h(t)},v=async()=>{if(e){o(!0);try{c.length>0?await (0,b.updateConfigFieldSetting)(e,"mcp_internal_ip_ranges",c):await (0,b.deleteConfigFieldSetting)(e,"mcp_internal_ip_ranges")}catch(e){console.error("Failed to save MCP network settings:",e)}finally{o(!1)}}},y=()=>{let e=x.split(",").map(e=>e.trim()).filter(e=>""!==e&&!c.includes(e));e.length>0&&d([...c,...e]),g("")};if(r)return(0,t.jsx)("div",{className:"flex justify-center py-12",children:(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"})});let _=u?4!==(s=u.split(".")).length?u+"/32":`${s[0]}.${s[1]}.${s[2]}.0/24`:null;return(0,t.jsxs)("div",{className:"space-y-6 p-4",children:[(0,t.jsx)(s7.DeprecationBanner,{featureName:"MCP Network Settings and the internal-network-only flag"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-lg font-semibold",children:"Private IP Ranges"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:'Define which IP ranges are part of your private network. Callers from these IPs can see all MCP servers. Callers from any other IP can only see servers marked "Available on Public Internet".'})]}),(0,t.jsxs)(te.Card,{className:"p-6",children:[u&&(0,t.jsxs)("div",{className:"mb-4 rounded-lg bg-muted p-3",children:[(0,t.jsxs)("p",{className:"text-sm",children:["Your current IP: ",(0,t.jsx)("span",{className:"font-mono font-medium",children:u})]}),_&&!c.includes(_)&&(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm",children:"Suggested range: "}),(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",className:"font-mono",onClick:()=>{!c.includes(_)&&d([...c,_])},children:[(0,t.jsx)(s3.Plus,{}),_]})]})]}),(0,t.jsx)("div",{className:"mb-2 flex items-center",children:(0,t.jsx)("p",{className:"text-sm font-medium",children:"Your Private Network Ranges"})}),c.length>0&&(0,t.jsx)("div",{className:"mb-2 flex flex-wrap gap-1.5",children:c.map(e=>(0,t.jsxs)(n.Badge,{variant:"secondary",className:"font-mono",children:[e,(0,t.jsx)("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>d(c.filter(t=>t!==e)),className:"ml-1 cursor-pointer",children:(0,t.jsx)(s6.X,{className:"size-3"})})]},e))}),(0,t.jsx)(tc.Input,{value:x,placeholder:"Leave empty to use defaults: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8",onChange:e=>g(e.target.value),onBlur:y,onKeyDown:e=>{("Enter"===e.key||","===e.key)&&(e.preventDefault(),y())}}),(0,t.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Enter CIDR ranges (e.g., 10.0.0.0/8). When empty, standard private IP ranges are used."})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsxs)(i.Button,{onClick:v,disabled:a,children:[(0,t.jsx)(s5.default,{}),"Save"]})})]})};var s9=e.i(776639),re=e.i(302747);let rt=["bg-blue-500","bg-emerald-500","bg-amber-500","bg-red-500","bg-violet-500","bg-pink-500","bg-cyan-500","bg-lime-500"],rs=({isVisible:e,onClose:s,onSelectServer:r,onCustomServer:l,accessToken:n})=>{let[c,d]=(0,p.useState)([]),[u,m]=(0,p.useState)([]),[h,x]=(0,p.useState)(!1),[g,f]=(0,p.useState)(null),[j,v]=(0,p.useState)(""),[y,_]=(0,p.useState)("All");(0,p.useEffect)(()=>{e&&n&&(x(!0),f(null),(0,b.fetchDiscoverableMCPServers)(n).then(e=>{d(e.servers||[]),m(e.categories||[])}).catch(e=>{f(e.message||"Failed to load MCP servers")}).finally(()=>{x(!1)}))},[e,n]),(0,p.useEffect)(()=>{e&&(v(""),_("All"))},[e]);let N=(0,p.useMemo)(()=>{let e=c;if("All"!==y&&(e=e.filter(e=>e.category===y)),j.trim()){let t=j.toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.title.toLowerCase().includes(t)||e.description.toLowerCase().includes(t))}return e},[c,y,j]),w=(0,p.useMemo)(()=>{let e={};for(let t of N){let s=t.category||"Other";e[s]||(e[s]=[]),e[s].push(t)}return e},[N]);return(0,t.jsx)(s9.Dialog,{open:e,onOpenChange:e=>!e&&s(),children:(0,t.jsxs)(s9.DialogContent,{className:"sm:max-w-[1000px]",children:[(0,t.jsx)(s9.DialogHeader,{children:(0,t.jsxs)("div",{className:"flex items-center justify-between border-b border-border pb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-3",children:[(0,t.jsx)("img",{src:(0,s_.resolveLogoSrc)(t1),alt:"MCP Logo",className:"mr-2 size-5 object-contain"}),(0,t.jsx)(s9.DialogTitle,{className:"text-xl font-semibold",children:"Add MCP Server"})]}),(0,t.jsx)(i.Button,{variant:"link",size:"sm",className:"mr-8",onClick:l,children:"+ Custom Server"})]})}),(0,t.jsxs)("div",{className:"max-h-[70vh] overflow-y-auto",children:[(0,t.jsx)("div",{className:"mb-3 flex flex-wrap gap-1.5",children:["All",...u].map(e=>{let s=y===e;return(0,t.jsx)(i.Button,{size:"sm",variant:s?"default":"outline",onClick:()=>_(e),children:e},e)})}),(0,t.jsxs)(o.InputGroup,{className:"mb-4 w-full",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search servers...",value:j,onChange:e=>v(e.target.value)})]}),h&&(0,t.jsx)("div",{className:"flex flex-col gap-1",children:Array.from({length:8}).map((e,s)=>(0,t.jsx)(re.Skeleton,{className:"h-9 rounded-md"},s))}),g&&(0,t.jsx)("div",{className:"py-8 text-center text-muted-foreground",children:(0,t.jsxs)("p",{className:"text-sm",children:["Failed to load servers: ",g]})}),!h&&!g&&0===N.length&&(0,t.jsx)("div",{className:"py-8 text-center text-muted-foreground",children:(0,t.jsxs)("p",{className:"text-sm",children:["No servers found."," ",(0,t.jsx)(i.Button,{variant:"link",size:"sm",onClick:l,children:"Add a custom server"})]})}),!h&&!g&&Object.entries(w).map(([e,s])=>(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("div",{className:"mb-1 border-b border-border py-1.5 text-[11px] font-medium tracking-wider text-muted-foreground uppercase",children:e}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-4",children:s.map(e=>{var s;let l,a,n=(l=(s=e.title||e.name).charAt(0).toUpperCase(),a=s.split("").reduce((e,t)=>e+t.charCodeAt(0),0)%rt.length,{initial:l,backgroundClass:rt[a]});return(0,t.jsxs)("div",{onClick:()=>r(e),className:"flex cursor-pointer items-center rounded-md px-2.5 py-2 transition-colors hover:bg-accent",children:[e.icon_url?(0,t.jsx)("img",{src:(0,s_.resolveLogoSrc)(e.icon_url),alt:e.title,className:"mr-3 size-5 shrink-0 object-contain",onError:e=>{let t=e.currentTarget;t.style.display="none";let s=t.nextElementSibling;s&&(s.style.display="flex")}}):null,(0,t.jsx)("div",{className:(0,ec.cn)("mr-3 size-5 shrink-0 items-center justify-center rounded-sm text-[11px] font-semibold text-white",n.backgroundClass,e.icon_url?"hidden":"flex"),children:n.initial}),(0,t.jsx)("span",{className:"flex-1 truncate text-sm",children:e.title||e.name}),(0,t.jsx)("span",{className:"ml-2 shrink-0 text-sm text-muted-foreground",children:"›"})]},e.name)})})]},e))]})]})})};var rr=e.i(611052),rl=e.i(262218);let{Text:ra,Title:rn}=tG.Typography,ri=({server:e,open:s,accessToken:r,onClose:l,onSaved:a})=>{let[n]=$.Form.useForm(),{data:i,isLoading:o,isError:c}=(0,g.useQuery)({queryKey:["mcpUserEnvVars",e?.server_id],queryFn:()=>(0,b.getMCPUserEnvVars)(r,e.server_id),enabled:s&&!!e&&!!r}),d=(0,sy.useMutation)({mutationFn:t=>(0,b.storeMCPUserEnvVars)(r,e.server_id,t),onSuccess:e=>{N.default.success("Credentials saved"),a?.(e),l()},onError:e=>{N.default.fromBackend(`Failed to save env vars: ${e instanceof Error?e.message:String(e)}`)}}),u=e?.server_name||e?.alias||e?.server_id||"MCP Server",m=i?.required??[],h=d.isPending;return(0,t.jsx)(q.Modal,{open:s,onCancel:l,footer:null,width:520,destroyOnHidden:!0,afterOpenChange:e=>{e&&n.resetFields()},title:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(rn,{level:5,style:{margin:0},children:"Set your credentials"}),(0,t.jsx)(rl.Tag,{color:"blue",children:"Per-user"})]}),(0,t.jsx)(ra,{type:"secondary",className:"text-xs",children:u})]}),children:(0,t.jsx)("div",{className:"space-y-4 mt-2",children:o?(0,t.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,t.jsx)(G.Spin,{})}):c?(0,t.jsx)(tp.Alert,{type:"error",showIcon:!0,message:"Failed to load env vars"}):0===m.length?(0,t.jsx)(tp.Alert,{type:"info",showIcon:!0,message:"No per-user fields configured for this server."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(ra,{className:"text-sm text-gray-600 block",children:"These values are private to you. Your admin configured this MCP server to require these per-user credentials. Saved values are never shown back; leave an already-set field blank to keep it, or enter a value to set or change it."}),(0,t.jsxs)($.Form,{form:n,layout:"vertical",onFinish:t=>{if(!e||!r)return;let s={};for(let[e,r]of Object.entries(t))s[e]=(r??"").trim();d.mutate(s)},disabled:h,children:[m.map(e=>(0,t.jsx)($.Form.Item,{name:e.name,label:(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"font-mono text-sm font-semibold",children:e.name}),e.is_set&&(0,t.jsx)(rl.Tag,{color:"green",children:"Set"})]}),extra:e.description||void 0,rules:e.is_set?void 0:[{required:!0,message:`${e.name} is required`}],children:(0,t.jsx)(W.Input.Password,{placeholder:e.is_set?"Enter a new value to overwrite":e.description||`Enter your ${e.name}`,visibilityToggle:!0})},e.name)),(0,t.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-2 border-t border-gray-100",children:[(0,t.jsx)(eQ.Button,{onClick:l,disabled:h,children:"Cancel"}),(0,t.jsx)(eQ.Button,{type:"primary",htmlType:"submit",loading:h,children:"Save Credentials"})]})]})]})})})},ro=[{value:"created_desc",label:"Recently created"},{value:"updated_desc",label:"Recently updated"},{value:"name_asc",label:"Name (A→Z)"},{value:"health",label:"Health (unhealthy first)"}],rc={unhealthy:0,unknown:1,healthy:2},rd=()=>{try{let e=(0,eR.getSecureItem)(sA.TOOLS_OAUTH_UI_STATE_KEY);if(!e)return null;return JSON.parse(e)?.serverId??null}catch{return null}},ru=({accessToken:e,userRole:r,userID:v})=>{let{data:w,isLoading:k,refetch:C}=(0,f.useMCPServers)(),{data:T,isLoading:S,recheckServerHealth:A,recheckingServerIds:I}=(()=>{let{accessToken:e}=(0,y.default)(),t=(0,j.useQueryClient)(),[s,r]=(0,p.useState)(new Set),l=(0,g.useQuery)({queryKey:_.lists(),queryFn:async()=>await (0,b.fetchMCPServerHealth)(e),enabled:!!e,refetchInterval:3e4}),a=(0,p.useCallback)(async s=>{if(e){r(e=>new Set(e).add(s));try{let r=await (0,b.fetchMCPServerHealth)(e,[s]);t.setQueriesData({queryKey:_.lists()},e=>e?e.map(e=>r.find(t=>t.server_id===e.server_id)??e):r)}finally{r(e=>{let t=new Set(e);return t.delete(s),t})}}},[e,t]);return{...l,recheckServerHealth:a,recheckingServerIds:s}})(),O=(0,p.useMemo)(()=>{if(!w)return[];if(!T)return w;let e=new Map(T.map(e=>[e.server_id,e.status]));return w.map(t=>{let s=e.get(t.server_id);return{...t,status:s||t.status}})},[w,T]),[P,M]=(0,p.useState)(null),[F,E]=(0,p.useState)(!1),[L,R]=(0,p.useState)(rd),[U,z]=(0,p.useState)(L),[H,D]=(0,p.useState)(!1),[B,q]=(0,p.useState)("all"),[$,W]=(0,p.useState)("all"),[K,G]=(0,p.useState)([]),[Y,J]=(0,p.useState)(!1),[Q,Z]=(0,p.useState)(!1),[X,ee]=(0,p.useState)(null),[et,es]=(0,p.useState)(!1),[er,el]=(0,p.useState)(null),[ea,en]=(0,p.useState)(null),[ei,eo]=(0,p.useState)(()=>new URLSearchParams(window.location.search).get("fill_env_vars")),[ec,ed]=(0,p.useState)(""),[eu,em]=(0,p.useState)("created_desc"),eh="Internal User"===r,{data:ex,refetch:ep}=(0,g.useQuery)({queryKey:["mcpUserEnvVarStatus"],queryFn:()=>(0,b.listMCPUserEnvVarStatus)(e),enabled:!!e}),eg=(0,p.useMemo)(()=>{let e={};for(let t of ex??[])e[t.server_id]=(t.required??[]).filter(e=>!e.is_set).map(e=>e.name);return e},[ex]);(0,p.useEffect)(()=>{if(!ei)return;let e=new URLSearchParams(window.location.search);if(!e.has("fill_env_vars"))return;e.delete("fill_env_vars");let t=e.toString(),s=window.location.pathname+(t?`?${t}`:"")+window.location.hash;window.history.replaceState({},"",s)},[ei]);let ef=(0,p.useMemo)(()=>ei?O.find(e=>e.server_id===ei)??null:null,[ei,O]),ev=ea??ef;(0,p.useEffect)(()=>{try{let e=(0,eR.getSecureItem)("litellm-mcp-oauth-edit-state");if(!e)return;let t=JSON.parse(e);t?.serverId&&(z(t.serverId),D(!0))}catch(e){console.error("Failed to restore MCP edit view state",e)}},[]),(0,p.useEffect)(()=>{try{window.sessionStorage.removeItem(sA.TOOLS_OAUTH_UI_STATE_KEY)}catch{}},[]);let eb=p.default.useMemo(()=>{if(!O)return[];let e=new Set,t=[];return O.forEach(s=>{s.teams&&s.teams.forEach(s=>{let r=s.team_id;e.has(r)||(e.add(r),t.push(s))})}),t},[O]),ey=p.default.useMemo(()=>({all:eh?"All Available Servers":"All Servers",personal:"Personal",...Object.fromEntries(eb.map(e=>[e.team_id,e.team_alias||e.team_id]))}),[eh,eb]),e_=p.default.useMemo(()=>O?Array.from(new Set(O.flatMap(e=>e.mcp_access_groups).filter(e=>null!=e))):[],[O]),eN=p.default.useMemo(()=>({all:"All Access Groups",...Object.fromEntries(e_.map(e=>[e,e]))}),[e_]),ew=(0,p.useCallback)((e,t)=>{if(!O)return G([]);let s=O;"personal"===e?G([]):("all"!==e&&(s=s.filter(t=>t.teams?.some(t=>t.team_id===e))),"all"!==t&&(s=s.filter(e=>e.mcp_access_groups?.some(e=>"string"==typeof e?e===t:e&&e.name===t))),G([...s].sort((e,t)=>e.created_at||t.created_at?e.created_at?t.created_at?new Date(t.created_at).getTime()-new Date(e.created_at).getTime():-1:1:0)))},[O]);(0,p.useEffect)(()=>{ew(B,$)},[O,B,$,ew]);let ek=(0,p.useMemo)(()=>{let e=ec.trim().toLowerCase();return[...e?K.filter(t=>{let s=(t.server_name||"").toLowerCase(),r=(t.alias||"").toLowerCase(),l=(t.url||"").toLowerCase(),a=t.server_id.toLowerCase();return s.includes(e)||r.includes(e)||l.includes(e)||a.includes(e)}):K].sort((e,t)=>((e,t,s)=>{switch(s){case"name_asc":{let s=(e.server_name||e.alias||e.server_id).toLowerCase(),r=(t.server_name||t.alias||t.server_id).toLowerCase();return s.localeCompare(r)}case"updated_desc":{let s=e.updated_at?new Date(e.updated_at).getTime():0;return(t.updated_at?new Date(t.updated_at).getTime():0)-s}case"health":{let s=rc[e.status??"unknown"]??1,r=rc[t.status??"unknown"]??1;if(s!==r)return s-r;let l=e.created_at?new Date(e.created_at).getTime():0;return(t.created_at?new Date(t.created_at).getTime():0)-l}default:{let s=e.created_at?new Date(e.created_at).getTime():0;return(t.created_at?new Date(t.created_at).getTime():0)-s}}})(e,t,eu))},[K,ec,eu]),eC=async()=>{if(null!=P&&null!=e)try{es(!0),await (0,b.deleteMCPServer)(e,P),N.default.success("Deleted MCP Server successfully"),U===P&&(D(!1),z(null)),C()}catch(e){console.error("Error deleting the mcp server:",e)}finally{es(!1),E(!1),M(null)}},eT=P?(w||[]).find(e=>e.server_id===P):null,eS=p.default.useMemo(()=>K.find(e=>e.server_id===U)||{server_id:"",server_name:"",alias:"",url:"",transport:"",auth_type:"",created_at:"",created_by:"",updated_at:"",updated_by:""},[K,U]),eA=p.default.useCallback(()=>{D(!1),z(null),R(null),C()},[C]);return e&&r&&v?(0,t.jsx)(u.TooltipProvider,{children:(0,t.jsxs)("div",{className:"h-full w-full p-6",children:[(0,t.jsx)(h.AlertDialog,{open:F,onOpenChange:e=>!e&&void(E(!1),M(null)),children:(0,t.jsxs)(h.AlertDialogContent,{children:[(0,t.jsx)(h.AlertDialogHeader,{children:(0,t.jsx)(h.AlertDialogTitle,{children:"Delete MCP Server?"})}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"This action is permanent and cannot be undone. All associated configurations will be removed."}),eT&&(0,t.jsxs)("dl",{className:"mt-3 space-y-1 rounded-lg border border-border bg-muted p-4",children:[eT.server_name&&(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"Name"}),(0,t.jsx)("dd",{className:"text-sm font-semibold",children:eT.server_name})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"ID"}),(0,t.jsx)("dd",{className:"font-mono text-xs",children:eT.server_id})]}),eT.url&&(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("dt",{className:"text-sm text-muted-foreground",children:"URL"}),(0,t.jsx)("dd",{className:"font-mono text-xs break-all",children:eT.url})]})]})]}),(0,t.jsxs)(h.AlertDialogFooter,{children:[(0,t.jsx)(h.AlertDialogCancel,{disabled:et,children:"Cancel"}),(0,t.jsx)(i.Button,{variant:"destructive",disabled:et,onClick:eC,children:et?"Deleting...":"Delete"})]})]})}),(0,t.jsx)(t4,{userRole:r,userID:v,accessToken:e,onCreateSuccess:e=>{G(t=>[...t,e]),J(!1),C()},isModalVisible:Y,setModalVisible:J,availableAccessGroups:e_,prefillData:X,onBackToDiscovery:()=>{J(!1),ee(null),Z(!0)}}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold",children:"MCP Servers"}),K.length>0&&(0,t.jsx)(n.Badge,{variant:"secondary",children:K.length})]}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Configure and manage your MCP servers"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.isAdminRole)(r)&&(0,t.jsx)(i.Button,{className:"shrink-0",onClick:()=>Z(!0),children:"+ Add New MCP Server"}),!(0,s.isAdminRole)(r)&&(0,t.jsx)(i.Button,{className:"shrink-0",onClick:()=>{ee(null),J(!0)},variant:"secondary",children:"+ Submit MCP Server"})]})]}),(0,t.jsx)(rs,{isVisible:Q,onClose:()=>Z(!1),onSelectServer:e=>{ee(e),Z(!1),J(!0)},onCustomServer:()=>{ee(null),Z(!1),J(!0)},accessToken:e}),(0,t.jsxs)(d.Tabs,{defaultValue:"servers",className:"mt-2 w-full",children:[(0,t.jsxs)(d.TabsList,{variant:"line",className:"h-auto w-full justify-start rounded-none border-b p-0",children:[(0,t.jsx)(d.TabsTrigger,{value:"servers",className:"flex-none rounded-none px-4 py-2",children:"All Servers"}),(0,t.jsx)(d.TabsTrigger,{value:"toolsets",className:"flex-none rounded-none px-4 py-2",children:"Toolsets"}),(0,t.jsx)(d.TabsTrigger,{value:"connect",className:"flex-none rounded-none px-4 py-2",children:"Connect"}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsTrigger,{value:"semantic-filter",className:"flex-none rounded-none px-4 py-2",children:"Semantic Filter"}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsTrigger,{value:"network-settings",className:"flex-none rounded-none px-4 py-2",children:"Network Settings"}),(0,s.isAdminRole)(r)&&(0,t.jsxs)(d.TabsTrigger,{value:"submitted",className:"flex-none gap-2 rounded-none px-4 py-2",children:["Submitted MCPs ",(0,t.jsx)(x.default,{})]})]}),(0,t.jsx)(d.TabsContent,{value:"servers",children:U?(0,t.jsx)(sD,{mcpServer:eS,onBack:eA,isProxyAdmin:(0,s.isAdminRole)(r),isEditing:H,accessToken:e,userID:v,userRole:r,availableAccessGroups:e_,initialTabIndex:+(U===L)},U):(0,t.jsxs)("div",{className:"w-full h-full",children:[(0,t.jsx)("div",{className:"w-full",children:(0,t.jsx)("div",{className:"flex flex-col space-y-4",children:(0,t.jsxs)("div",{className:"flex items-center gap-6 rounded-lg border border-border bg-card px-4 py-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium whitespace-nowrap text-muted-foreground",children:"Team"}),(0,t.jsxs)(c.Select,{items:ey,value:B,onValueChange:e=>{var t;q(t=e??"all"),ew(t,$)},children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsxs)(c.SelectContent,{children:[(0,t.jsx)(c.SelectItem,{value:"all",children:eh?"All Available Servers":"All Servers"}),(0,t.jsx)(c.SelectItem,{value:"personal",children:"Personal"}),eb.map(e=>(0,t.jsx)(c.SelectItem,{value:e.team_id,children:e.team_alias||e.team_id},e.team_id))]})]})]}),(0,t.jsx)("div",{className:"h-6 w-px bg-border"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("p",{className:"flex items-center text-sm font-medium whitespace-nowrap text-muted-foreground",children:["Access Group",(0,t.jsxs)(u.Tooltip,{children:[(0,t.jsx)(u.TooltipTrigger,{render:(0,t.jsx)(l,{className:"ml-1 size-3.5 text-muted-foreground","aria-label":"About access groups"})}),(0,t.jsx)(u.TooltipContent,{children:"An MCP Access Group is a set of users or teams that have permission to access specific MCP servers. Use access groups to control and organize who can connect to which servers."})]})]}),(0,t.jsxs)(c.Select,{items:eN,value:$,onValueChange:e=>{var t;W(t=e??"all"),ew(B,t)},children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsxs)(c.SelectContent,{children:[(0,t.jsx)(c.SelectItem,{value:"all",children:"All Access Groups"}),e_.map(e=>(0,t.jsx)(c.SelectItem,{value:e,children:e},e))]})]})]})]})})}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3",children:[(0,t.jsxs)(o.InputGroup,{className:"max-w-80",children:[(0,t.jsx)(o.InputGroupAddon,{children:(0,t.jsx)(a.Search,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(o.InputGroupInput,{placeholder:"Search by name, alias, URL, or ID",value:ec,onChange:e=>ed(e.target.value)})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("p",{className:"text-sm font-medium whitespace-nowrap text-muted-foreground",children:"Sort"}),(0,t.jsxs)(c.Select,{items:ro,value:eu,onValueChange:e=>em(e??"created_desc"),children:[(0,t.jsx)(c.SelectTrigger,{className:"w-55",children:(0,t.jsx)(c.SelectValue,{})}),(0,t.jsx)(c.SelectContent,{children:ro.map(e=>(0,t.jsx)(c.SelectItem,{value:e.value,children:e.label},e.value))})]})]}),(0,t.jsxs)("div",{className:"ml-auto text-xs text-muted-foreground",children:[ek.length," of ",K.length," servers"]})]}),(0,t.jsx)("div",{className:"mt-4 w-full",children:k?(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-card p-12",children:[(0,t.jsx)(m.UiLoadingSpinner,{className:"size-6 text-muted-foreground"}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading MCP servers..."})]}):0===ek.length?(0,t.jsx)("div",{className:"rounded-lg border border-dashed border-border bg-card p-12 text-center",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:0===K.length?"No MCP servers configured. Click '+ Add New MCP Server' to get started.":"No servers match the current filters or search."})}):(0,t.jsx)("div",{"data-testid":"mcp-servers-grid",className:"grid auto-rows-fr grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",children:ek.map(e=>(0,t.jsx)(sf,{server:e,missingUserFields:eg[e.server_id],isLoadingHealth:S,isRechecking:I?.has(e.server_id),onClick:()=>{z(e.server_id),D(!0)},onRecheckHealth:A?()=>A(e.server_id):void 0,onByokConnect:e.is_byok?()=>el(e):void 0,onOpenFillFields:()=>en(e),onDelete:(0,s.isAdminRole)(r)?()=>{M(e.server_id),E(!0)}:void 0},e.server_id))})})]})}),(0,t.jsx)(d.TabsContent,{value:"toolsets",children:(0,t.jsx)(ej,{accessToken:e,userRole:r})}),(0,t.jsx)(d.TabsContent,{value:"connect",children:(0,t.jsx)(sd,{})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"semantic-filter",children:(0,t.jsx)(s4,{accessToken:e})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"network-settings",children:(0,t.jsx)(s8,{accessToken:e})}),(0,s.isAdminRole)(r)&&(0,t.jsx)(d.TabsContent,{value:"submitted",children:(0,t.jsx)(V,{accessToken:e})})]}),er&&(0,t.jsx)(rr.ByokCredentialModal,{server:er,open:!!er,onClose:()=>el(null),onSuccess:e=>{C(),el(null)}}),(0,t.jsx)(ri,{server:ev,open:!!ev,accessToken:e,onClose:()=>{en(null),eo(null)},onSaved:()=>{ep()}})]})}):(0,t.jsx)("div",{className:"p-6 text-center text-gray-500",children:"Missing required authentication parameters."})};e.s(["default",0,function(){let{accessToken:e,userRole:s,userId:r}=(0,y.default)();return(0,t.jsx)(ru,{accessToken:e,userRole:s,userID:r})}],366321)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0ga80_i1un77z.js b/litellm/proxy/_experimental/out/_next/static/chunks/0ga80_i1un77z.js deleted file mode 100644 index 9c9307d7058..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0ga80_i1un77z.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,309426,e=>{"use strict";var t=e.i(290571),l=e.i(444755),a=e.i(673706),s=e.i(271645),i=e.i(46757);let r=(0,a.makeClassName)("Col"),n=s.default.forwardRef((e,a)=>{let n,o,d,c,{numColSpan:u=1,numColSpanSm:m,numColSpanMd:g,numColSpanLg:p,children:h,className:x}=e,y=(0,t.__rest)(e,["numColSpan","numColSpanSm","numColSpanMd","numColSpanLg","children","className"]),b=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"";return s.default.createElement("div",Object.assign({ref:a,className:(0,l.tremorTwMerge)(r("root"),(n=b(u,i.colSpan),o=b(m,i.colSpanSm),d=b(g,i.colSpanMd),c=b(p,i.colSpanLg),(0,l.tremorTwMerge)(n,o,d,c)),x)},y),h)});n.displayName="Col",e.s(["Col",0,n],309426)},510674,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(431703),i=e.i(135214),r=e.i(708347);let n=(0,l.createQueryKeys)("projects"),o=[...r.all_admin_roles,...r.internalUserRoles],d=async e=>{let t=(0,a.getProxyBaseUrl)(),l=`${t}/project/list`,i=await fetch(l,{method:"GET",headers:{[(0,a.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let e=await i.json(),t=(0,s.deriveErrorMessage)(e);throw(0,a.handleError)(t),Error(t)}return i.json()};e.s(["projectKeys",0,n,"useProjects",0,()=>{let{accessToken:e,userRole:l}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list({}),queryFn:async()=>d(e),enabled:!!e&&o.includes(l)})}])},557662,e=>{"use strict";let t={src:e.i(196361).default,width:823,height:807,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABCUlEQVR42k2Ov0sCYRjH3/f09c68NOuiLg+NvMM6qIaIhgKDlgbBBiH7ARbkFAr+wEFwUBzUSRwUN3+Am4Kbg4sIIg4iOugiguDm5F/gvaLiF57l83yf5/sFYC0VQdJJnS0bObUkSCgnwa4ggPD94O57KkYX46vw/HVftECMNzKRJ2JL8A+KekelfO6s1Y3utl6hNayWahmlznIfhQbv6V4oGP6aOrvtCIFRnH1LKQmkBC7G7BtehmZWzY0NRxEAEo7Dhz/MvrT3P6BvCk5irDVJQURhAx5aKpzh7Pkm7+2BZ1p4YeT0MYIy5Dx6/P+UrvAXFml0TyqjeVtUytsrGX6rac6ew+YNXwKfsTPy4XOyEQAAAABJRU5ErkJggg=="},l={src:e.i(614148).default,width:600,height:450,blurWidth:0,blurHeight:0},a={src:e.i(858236).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqklEQVR42mXOzQqCQBQF4NG8PVKLalNRrxW01EgUghZm4Tu0aV3gopBCaDDoh8LMyubaCzQzLj2c1fk2h/zwyZvjI8NTmtMXHj94yfBG5JqE0WrsDWyv70eLGOkbrwJotG316lDVeJvd2pouE3YW4M4nAEBkADTD1eOvBNPUFUUpQAMwplbK7gJsa6hWVG58bXTam0OAmAjYBT63kWk4Myeke2TiJynulvsHOZp6y2XrD90AAAAASUVORK5CYII="},s={src:e.i(508296).default,width:180,height:180,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvXivVvITItyZVvSwKFmDRbjjPYDB/SutONn6fiaaH/9k="},i={src:e.i(324755).default,width:48,height:48,blurWidth:0,blurHeight:0},r={src:e.i(475151).default,width:14,height:16,blurWidth:0,blurHeight:0},n={src:e.i(274286).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA/ElEQVR42m3Pz0vCUADA8ed7a3uBjb0sx5C1Ri1oIDJSKEdJgyEFtbwFgScpsGNR1CmyS0Ho0ZOggv+A4F3B30f9HwRRwYMICupNPPg5fa9fANazLQtCtC0jdGbSdFSmN6+Ry/tIHd/+w52jOwyRCDRZL+UJ6eREdXauR0dq8HtiBl7mD25r+MtyLfBO+Fpm19UXTsJ17LnPWhyf+rNvVWOiu38j+Zrgk/CNuHDYtfsiRUa1khYnpH9Y0viQtIGxf1oGfsVoFxzOYULR51f+p6lifo09wdjs0hvuvbKkAhDF7GkUFYpgnLhg8DPtOAghOfAGiWRs2KBz/dqKBVIdOzeF2+/ZAAAAAElFTkSuQmCC"},o={src:e.i(436494).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAnElEQVR42oXOsQqCUACF4ftWvUFbBFFzQSVRLQ5RmRDkUJFTIUFNEQgNDWFTNURjgyAiOgiiCF7FQRCcVFQQJ1H4t284B1gwzA0UAS/A2+N7pp8nmrne3yynJ6Cp3mBBoARZbfcqjVZ3tkSwlSw7QFHc5gitI+M1delM8LhafyhKNjCN4PPjsR2Fk8f59jDd7JnXHxp+Oh5zVsmrCGlHlzZm+jq8AAAAAElFTkSuQmCC"},d={src:e.i(204086).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhElEQVR42oWPuw0DIRBEr6g7aIGQAAQSEiTk1EAHVILogIQAQUPOxoKT5cSfYDbYedqdOc7zfFzXhU9a3vHNfGkDhBB472GMQQgB1lo45/Z+A4wx9N6Rc8acE7VWpJRuYI0YI1prW6UUjDHAOb9fLEAIAaXUPi2lhNYalNJ3hp8h/9V8AqCAe6iqrOaAAAAAAElFTkSuQmCC"},c={src:e.i(531150).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA40lEQVR42lWOvesBcQDGz0/9VmUl/4lSyqaUic5gM0jKSBlISgaXwWCwGc7gFPKeIikUMXAldec9Wdx5uft+v3KFMzzL8/k89WAIIUweyLG6W9tRFNmKGUHw9wMfAvgfDBfWddWbv5aNE5Gtmr9LiBSNzgq3uQv7UKzY2tZ9uXvfl/4IxxOvyeZn/niyQkWJJkXTjB7ez2oJHk6cNpzo5ohUjeTHRICnSScEQPliGIKistef23FPYUNSo6CwJHGw6xgQggpJEBYZ12UQiY2njOnCPVSv528oCWDbNopMySIv5XkCtum3l9/HqzEAAAAASUVORK5CYII="},u=[{id:"arize",displayName:"Arize",logo:t.src,supports_key_team_logging:!0,dynamic_params:{arize_api_key:"password",arize_space_id:"password"},description:"Arize Logging Integration"},{id:"braintrust",displayName:"Braintrust",logo:a.src,supports_key_team_logging:!1,dynamic_params:{braintrust_api_key:"password",braintrust_project_name:"text"},description:"Braintrust Logging Integration"},{id:"custom_callback_api",displayName:"Custom Callback API",supports_key_team_logging:!0,dynamic_params:{custom_callback_api_url:"text",custom_callback_api_headers:"text"},description:"Custom Callback API Logging Integration"},{id:"galileo",displayName:"Galileo",logo:i.src,supports_key_team_logging:!1,dynamic_params:{GALILEO_API_KEY:"password",GALILEO_PROJECT_ID:"text",GALILEO_LOG_STREAM_ID:"text",GALILEO_BASE_URL:"text",GALILEO_USERNAME:"text",GALILEO_PASSWORD:"password"},description:"Galileo AI Observability Integration"},{id:"datadog",displayName:"Datadog",logo:s.src,supports_key_team_logging:!1,dynamic_params:{dd_api_key:"password",dd_site:"text"},description:"Datadog Logging Integration"},{id:"lago",displayName:"Lago",logo:r.src,supports_key_team_logging:!1,dynamic_params:{lago_api_url:"text",lago_api_key:"password"},description:"Lago Billing Logging Integration"},{id:"langfuse",displayName:"Langfuse",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v2 Logging Integration"},{id:"langfuse_otel",displayName:"Langfuse OTEL",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v3 OTEL Logging Integration"},{id:"langsmith",displayName:"LangSmith",logo:o.src,supports_key_team_logging:!0,dynamic_params:{langsmith_api_key:"password",langsmith_project:"text",langsmith_base_url:"text",langsmith_sampling_rate:"number"},description:"Langsmith Logging Integration"},{id:"openmeter",displayName:"OpenMeter",logo:d.src,supports_key_team_logging:!1,dynamic_params:{openmeter_api_key:"password",openmeter_base_url:"text"},description:"OpenMeter Logging Integration"},{id:"otel",displayName:"Open Telemetry",logo:c.src,supports_key_team_logging:!1,dynamic_params:{otel_endpoint:"text",otel_headers:"text"},description:"OpenTelemetry Logging Integration"},{id:"s3",displayName:"S3",logo:l.src,supports_key_team_logging:!1,dynamic_params:{s3_bucket_name:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"S3 Bucket (AWS) Logging Integration"},{id:"SQS",displayName:"SQS",logo:l.src,supports_key_team_logging:!1,dynamic_params:{sqs_queue_url:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"SQS Queue (AWS) Logging Integration"}],m=u.reduce((e,t)=>(e[t.displayName]=t,e),{}),g=u.reduce((e,t)=>(e[t.displayName]=t.id,e),{}),p=u.reduce((e,t)=>(e[t.id]=t.displayName,e),{});e.s(["callbackInfo",0,m,"callback_map",0,g,"mapDisplayToInternalNames",0,e=>e.map(e=>g[e]||e),"mapInternalToDisplayNames",0,e=>e.map(e=>p[e]||e),"reverse_callback_map",0,p],557662)},810757,477386,e=>{"use strict";var t=e.i(271645);let l=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}))});e.s(["CogIcon",0,l],810757);let a=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"}))});e.s(["BanIcon",0,a],477386)},207082,e=>{"use strict";var t=e.i(619273),l=e.i(266027),a=e.i(243652),s=e.i(602869),i=e.i(431703),r=e.i(135214);let n=(0,a.createQueryKeys)("keys"),o=async(e,t,l,a={})=>{try{let r=(0,s.getProxyBaseUrl)(),n=new URLSearchParams(Object.entries({team_id:a.teamID,project_id:a.projectID,agent_id:a.agentID,organization_id:a.organizationID,key_alias:a.selectedKeyAlias,key_hash:a.keyHash,user_id:a.userID,page:t,size:l,sort_by:a.sortBy,sort_order:a.sortOrder,expand:a.expand,status:a.status,return_full_object:"true",include_team_keys:"true",include_created_by_keys:"true",substring_matching:"true"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),o=`${r?`${r}/key/list`:"/key/list"}?${n}`,d=await fetch(o,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!d.ok){let e=await d.json(),t=(0,i.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await d.json()}catch(e){throw console.error("Failed to list keys:",e),e}},d=(0,a.createQueryKeys)("deletedKeys");e.s(["keyKeys",0,n,"useDeletedKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:d.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,{...s,status:"deleted"}),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})},"useKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:n.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,s),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})}])},552130,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select agents",disabled:d=!1})=>{let[c,u]=(0,l.useState)([]),[m,g]=(0,l.useState)([]),[p,h]=(0,l.useState)(!1);(0,l.useEffect)(()=>{(async()=>{if(n){h(!0);try{let e=await (0,s.getAgentsList)(n),t=e?.agents||[];u(t);let l=new Set;t.forEach(e=>{let t=e.agent_access_groups;t&&Array.isArray(t)&&t.forEach(e=>l.add(e))}),g(Array.from(l))}catch(e){console.error("Error fetching agents:",e)}finally{h(!1)}}})()},[n]);let x=[...m.map(e=>({label:e,value:`group:${e}`,isAccessGroup:!0,searchText:`${e} Access Group`})),...c.map(e=>({label:`${e.agent_name||e.agent_id}`,value:e.agent_id,isAccessGroup:!1,searchText:`${e.agent_name||e.agent_id} ${e.agent_id} Agent`}))],y=[...i?.agents||[],...(i?.accessGroups||[]).map(e=>`group:${e}`)];return(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:o,onChange:t=>{e({agents:t.filter(e=>!e.startsWith("group:")),accessGroups:t.filter(e=>e.startsWith("group:")).map(e=>e.replace("group:",""))})},value:y,loading:p,className:r,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:d,filterOption:(e,t)=>(x.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:x.map(e=>(0,t.jsx)(a.Select.Option,{value:e.value,label:e.label,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:e.isAccessGroup?"#52c41a":"#722ed1",flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:e.isAccessGroup?"#52c41a":"#722ed1",fontSize:"12px",fontWeight:500,opacity:.8},children:e.isAccessGroup?"Access Group":"Agent"})]})},e.value))})})}])},9314,645526,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(981339);e.i(247167);var s=e.i(931067),i=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.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.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 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 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.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.9-1.7-203.3 89.2-203.3 199.9 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.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};var n=e.i(9583),o=i.forwardRef(function(e,t){return i.createElement(n.default,(0,s.default)({},e,{ref:t,icon:r}))});e.s(["TeamOutlined",0,o],645526);var d=e.i(599724),c=e.i(263147);e.s(["default",0,({value:e,onChange:s,placeholder:i="Select access groups",disabled:r=!1,style:n,className:u,showLabel:m=!1,labelText:g="Access Group",allowClear:p=!0})=>{let{data:h,isLoading:x,isError:y}=(0,c.useAccessGroups)();if(x)return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(a.Skeleton.Input,{active:!0,block:!0,style:{height:32,...n}})]});let b=(h??[]).map(e=>({label:(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-medium",children:e.access_group_name})," ",(0,t.jsxs)("span",{className:"text-gray-400 text-xs",children:["(",e.access_group_id,")"]})]}),value:e.access_group_id,selectedLabel:e.access_group_name,searchText:`${e.access_group_name} ${e.access_group_id}`}));return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(l.Select,{mode:"multiple",value:e,placeholder:i,onChange:s,disabled:r,allowClear:p,showSearch:!0,style:{width:"100%",...n},className:`rounded-md ${u??""}`,notFoundContent:y?(0,t.jsx)("span",{className:"text-red-500",children:"Failed to load access groups"}):"No access groups found",filterOption:(e,t)=>(b.find(e=>e.value===t?.value)?.searchText??"").toLowerCase().includes(e.toLowerCase()),optionLabelProp:"selectedLabel",options:b.map(e=>({label:e.label,value:e.value,selectedLabel:e.selectedLabel}))})]})}],9314)},392110,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(592968),i=e.i(312361),r=e.i(790848),n=e.i(536916),o=e.i(808613),d=e.i(827252),c=e.i(779241);let{Option:u}=a.Select;e.s(["default",0,({form:e,autoRotationEnabled:m,onAutoRotationChange:g,rotationInterval:p,onRotationIntervalChange:h,isCreateMode:x=!1,neverExpire:y=!1,onNeverExpireChange:b})=>{let f=p&&!["7d","30d","90d","180d","365d"].includes(p),[j,_]=(0,l.useState)(f),[v,A]=(0,l.useState)(f?p:"");return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Key Expiry Settings"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Expire Key"}),(0,t.jsx)(s.Tooltip,{title:"Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to keep the current expiry unchanged.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})}),!x&&b&&(0,t.jsx)(n.Checkbox,{checked:y,onChange:t=>{let l=t.target.checked;b(l),l&&(e&&"function"==typeof e.setFieldValue?e.setFieldValue("duration",""):e&&"function"==typeof e.setFieldsValue&&e.setFieldsValue({duration:""}))},className:"ml-2 text-sm font-normal text-gray-600",children:"Never Expire"})]}),(0,t.jsx)(o.Form.Item,{name:"duration",noStyle:!0,initialValue:"",children:(0,t.jsx)(c.TextInput,{placeholder:x?"e.g., 30d or leave empty to never expire":"e.g., 30d",className:"w-full",disabled:!x&&y})})]})]}),(0,t.jsx)(i.Divider,{}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Auto-Rotation Settings"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Enable Auto-Rotation"}),(0,t.jsx)(s.Tooltip,{title:"Key will automatically regenerate at the specified interval for enhanced security.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsx)(r.Switch,{checked:m,onChange:g,size:"default",className:m?"":"bg-gray-400"})]}),m&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Rotation Interval"}),(0,t.jsx)(s.Tooltip,{title:"How often the key should be automatically rotated. Choose the interval that best fits your security requirements.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(a.Select,{value:j?"custom":p,onChange:e=>{"custom"===e?_(!0):(_(!1),A(""),h(e))},className:"w-full",placeholder:"Select interval",children:[(0,t.jsx)(u,{value:"7d",children:"7 days"}),(0,t.jsx)(u,{value:"30d",children:"30 days"}),(0,t.jsx)(u,{value:"90d",children:"90 days"}),(0,t.jsx)(u,{value:"180d",children:"180 days"}),(0,t.jsx)(u,{value:"365d",children:"365 days"}),(0,t.jsx)(u,{value:"custom",children:"Custom interval"})]}),j&&(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(c.TextInput,{value:v,onChange:e=>{let t=e.target.value;A(t),h(t)},placeholder:"e.g., 1s, 5m, 2h, 14d"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Supported formats: seconds (s), minutes (m), hours (h), days (d)"})]})]})]})]}),m&&(0,t.jsx)("div",{className:"bg-blue-50 p-3 rounded-md text-sm text-blue-700",children:"When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period."})]})]})}])},844565,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select pass through routes",disabled:d=!1,teamId:c})=>{let[u,m]=(0,l.useState)([]),[g,p]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{(async()=>{if(n){p(!0);try{let e=await (0,s.getPassThroughEndpointsCall)(n,c);if(e.endpoints){let t=e.endpoints.flatMap(e=>{let t=e.path,l=e.methods;return l&&l.length>0?l.map(e=>({label:`${e} ${t}`,value:t})):[{label:t,value:t}]});m(t)}}catch(e){console.error("Error fetching pass through routes:",e)}finally{p(!1)}}})()},[n,c]),(0,t.jsx)(a.Select,{mode:"tags",placeholder:o,onChange:e,value:i,loading:g,className:r,allowClear:!0,options:u,optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:d})}])},939510,e=>{"use strict";var t=e.i(843476),l=e.i(808613),a=e.i(199133),s=e.i(592968),i=e.i(827252);let{Option:r}=a.Select;e.s(["default",0,({type:e,name:n,showDetailedDescriptions:o=!0,className:d="",initialValue:c=null,form:u,onChange:m})=>{let g=e.toUpperCase(),p=e.toLowerCase(),h=`Select 'guaranteed_throughput' to prevent overallocating ${g} limit when the key belongs to a Team with specific ${g} limits.`;return(0,t.jsx)(l.Form.Item,{label:(0,t.jsxs)("span",{children:[g," Rate Limit Type"," ",(0,t.jsx)(s.Tooltip,{title:h,children:(0,t.jsx)(i.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:n,initialValue:c,className:d,children:(0,t.jsx)(a.Select,{defaultValue:o?"default":void 0,placeholder:"Select rate limit type",style:{width:"100%"},optionLabelProp:o?"label":void 0,onChange:e=>{u&&u.setFieldValue(n,e),m&&m(e)},children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",label:"Default",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Default"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Best effort throughput - no error if we're overallocating ",p," (Team/Key Limits checked at runtime)."]})]})}),(0,t.jsx)(r,{value:"guaranteed_throughput",label:"Guaranteed throughput",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Guaranteed throughput"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Guaranteed throughput - raise an error if we're overallocating ",p," (also checks model-specific limits)"]})]})}),(0,t.jsx)(r,{value:"dynamic",label:"Dynamic",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Dynamic"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["If the key has a set ",g," (e.g. 2 ",g,") and there are no 429 errors, it can dynamically exceed the limit when the model being called is not erroring."]})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",children:"Best effort throughput"}),(0,t.jsx)(r,{value:"guaranteed_throughput",children:"Guaranteed throughput"}),(0,t.jsx)(r,{value:"dynamic",children:"Dynamic"})]})})})}])},363256,e=>{"use strict";var t=e.i(843476),l=e.i(199133);let{Text:a}=e.i(898586).Typography;e.s(["default",0,({organizations:e,value:s,onChange:i,disabled:r,loading:n,style:o})=>(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"All Organizations",value:s,onChange:i,disabled:r,loading:n,allowClear:!0,style:{minWidth:280,...o},filterOption:(t,l)=>{if(!l)return!1;let a=e?.find(e=>e.organization_id===l.key);if(!a)return!1;let s=t.toLowerCase().trim(),i=(a.organization_alias||"").toLowerCase(),r=(a.organization_id||"").toLowerCase();return i.includes(s)||r.includes(s)},children:e?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.organization_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,t.jsxs)(a,{type:"secondary",children:["(",e.organization_id,")"]})]},e.organization_id))})])},128233,319312,833400,e=>{"use strict";var t=e.i(843476),l=e.i(464571),a=e.i(199133),s=e.i(592968),i=e.i(425063),r=e.i(107233),n=e.i(37727),o=e.i(271645);e.s(["BudgetFallbacksEditor",0,function({value:e,onChange:d,availableModels:c}){let[u,m]=(0,o.useState)(()=>{let t;return 0===(t=Object.keys(e)).length?[]:t.map((t,l)=>({id:String(l+1),primaryModel:t,fallbackModels:e[t]}))}),g=e=>{m(e),d(Object.fromEntries(e.filter(e=>null!==e.primaryModel&&e.fallbackModels.length>0).map(e=>[e.primaryModel,e.fallbackModels])))},p=()=>{g([...u,{id:Date.now().toString(),primaryModel:null,fallbackModels:[]}])},h=(e,t)=>{g(u.map(l=>l.id===e?{...l,...t}:l))},x=new Set(u.map(e=>e.primaryModel).filter(Boolean));return 0===u.length?(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),u.map(e=>{let l=c.filter(t=>t===e.primaryModel||!x.has(t)),r=c.filter(t=>t!==e.primaryModel);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void g(u.filter(e=>e.id!==t))},className:"absolute top-2 right-2 text-gray-400 hover:text-red-500 transition-colors p-1",children:(0,t.jsx)(n.X,{className:"w-4 h-4"})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Primary Model"}),(0,t.jsx)(a.Select,{className:"w-full",placeholder:"Select model",value:e.primaryModel,onChange:t=>{let l=e.fallbackModels.filter(e=>e!==t);h(e.id,{primaryModel:t,fallbackModels:l})},showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:l.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body})]}),(0,t.jsx)("div",{className:"flex items-center justify-center -my-1 mb-2",children:(0,t.jsxs)("div",{className:"bg-amber-50 text-amber-600 px-3 py-0.5 rounded-full text-[10px] font-bold border border-amber-100 flex items-center gap-1",children:[(0,t.jsx)(i.ArrowDown,{className:"w-3 h-3"}),"IF BUDGET EXCEEDED, TRY"]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Fallback Models"}),(0,t.jsx)(a.Select,{mode:"multiple",className:"w-full",placeholder:e.primaryModel?"Select fallback models":"Select a primary model first",value:e.fallbackModels,onChange:t=>h(e.id,{fallbackModels:t}),disabled:!e.primaryModel,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:r.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(s.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})}),e.fallbackModels.length>1&&(0,t.jsx)("div",{className:"text-[10px] text-gray-400 mt-1 ml-1",children:"Tried in order; first model still within its own budget is used"})]})]},e.id)}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]})}],128233);var d=e.i(28651);let c=[{value:"1h",label:"Hourly",resetHint:"Resets every hour"},{value:"24h",label:"Daily",resetHint:"Resets daily at midnight UTC"},{value:"7d",label:"Weekly",resetHint:"Resets every Sunday at midnight UTC"},{value:"30d",label:"Monthly",resetHint:"Resets on the 1st of every month at midnight UTC"}];e.s(["BudgetWindowsEditor",0,function({value:e,onChange:s}){let i=(t,l,a)=>{s(e.map((e,s)=>s===t?{...e,[l]:a}:e))};return(0,t.jsxs)("div",{children:[e.map((r,n)=>{let o=c.find(e=>e.value===r.budget_duration)?.resetHint;return(0,t.jsxs)("div",{style:{marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsx)(a.Select,{value:r.budget_duration,onChange:e=>i(n,"budget_duration",e),style:{width:130},options:c.map(e=>({value:e.value,label:e.label}))}),(0,t.jsx)(d.InputNumber,{step:.01,min:0,precision:2,value:r.max_budget??void 0,onChange:e=>i(n,"max_budget",e??null),placeholder:"Max spend ($)",style:{width:160},prefix:"$"}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{s(e.filter((e,t)=>t!==n))},style:{padding:"0 4px"},children:"✕"})]}),o&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#888",marginTop:3,marginLeft:2},children:["↻ ",o]})]},n)}),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),s([...e,{budget_duration:"24h",max_budget:null}])},children:"+ Add Budget Window"})]})}],319312);var u=e.i(311451);let m=0,g=()=>`tag-row-${m++}`;e.s(["TagRateLimitEditor",0,function({value:e,onChange:a}){let s=(t,l,s)=>{a(e.map((e,a)=>a===t?{...e,[l]:s}:e))};return(0,t.jsxs)("div",{children:[e.map((i,r)=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12},children:[(0,t.jsx)(u.Input,{value:i.tag,onChange:e=>s(r,"tag",e.target.value),placeholder:"Tag (e.g. cell-1)",style:{width:180}}),(0,t.jsx)(d.InputNumber,{min:0,value:i.rpm_limit??void 0,onChange:e=>s(r,"rpm_limit",e??null),placeholder:"RPM",style:{width:120}}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{a(e.filter((e,t)=>t!==r))},style:{padding:"0 4px"},children:"✕"})]},i.id)),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),a([...e,{id:g(),tag:"",rpm_limit:null}])},children:"+ Add Tag Limit"})]})},"tagLimitsToRows",0,e=>{let t=(e=>{if(!e||"object"!=typeof e)return{};let t={};return Object.entries(e).forEach(([e,l])=>{"number"==typeof l&&(t[e]=l)}),t})(e);return Object.keys(t).map(e=>({id:g(),tag:e,rpm_limit:t[e]}))},"tagRowsToLimits",0,e=>{let t={};return e.forEach(({tag:e,rpm_limit:l})=>{let a=e.trim();a&&"number"==typeof l&&(t[a]=l)}),{tag_rpm_limit:t}}],833400)},109034,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(135214);let i=(0,l.createQueryKeys)("tags");e.s(["useTags",0,()=>{let{accessToken:e,userId:l,userRole:r}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,a.tagListCall)(e),enabled:!!(e&&l&&r)})}])},533882,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(250980),s=e.i(797672),i=e.i(68155),r=e.i(304967),n=e.i(629569),o=e.i(599724),d=e.i(269200),c=e.i(427612),u=e.i(64848),m=e.i(942232),g=e.i(496020),p=e.i(977572),h=e.i(992619),x=e.i(727749);e.s(["default",0,({accessToken:e,initialModelAliases:y={},onAliasUpdate:b,showExampleConfig:f=!0})=>{let[j,_]=(0,l.useState)([]),[v,A]=(0,l.useState)({aliasName:"",targetModel:""}),[w,k]=(0,l.useState)(null);(0,l.useEffect)(()=>{_(Object.entries(y).map(([e,t],l)=>({id:`${l}-${e}`,aliasName:e,targetModel:t})))},[y]);let N=()=>{if(!w)return;if(!w.aliasName||!w.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.id!==w.id&&e.aliasName===w.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=j.map(e=>e.id===w.id?w:e);_(e),k(null);let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias updated successfully")},S=()=>{k(null)},C=j.reduce((e,t)=>(e[t.aliasName]=t.targetModel,e),{});return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Add New Alias"}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Alias Name"}),(0,t.jsx)("input",{type:"text",value:v.aliasName,onChange:e=>A({...v,aliasName:e.target.value}),placeholder:"e.g., gpt-4o",className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Target Model"}),(0,t.jsx)(h.default,{accessToken:e,value:v.targetModel,placeholder:"Select target model",onChange:e=>A({...v,targetModel:e}),showLabel:!1})]}),(0,t.jsx)("div",{className:"flex items-end",children:(0,t.jsxs)("button",{onClick:()=>{if(!v.aliasName||!v.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.aliasName===v.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=[...j,{id:`${Date.now()}-${v.aliasName}`,aliasName:v.aliasName,targetModel:v.targetModel}];_(e),A({aliasName:"",targetModel:""});let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias added successfully")},disabled:!v.aliasName||!v.targetModel,className:`flex items-center px-4 py-2 rounded-md text-sm ${!v.aliasName||!v.targetModel?"bg-gray-300 text-gray-500 cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700"}`,children:[(0,t.jsx)(a.PlusCircleIcon,{className:"w-4 h-4 mr-1"}),"Add Alias"]})})]})]}),(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Manage Existing Aliases"}),(0,t.jsx)("div",{className:"rounded-lg custom-border relative mb-6",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)(d.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,t.jsx)(c.TableHead,{children:(0,t.jsxs)(g.TableRow,{children:[(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Alias Name"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Target Model"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Actions"})]})}),(0,t.jsxs)(m.TableBody,{children:[j.map(l=>(0,t.jsx)(g.TableRow,{className:"h-8",children:w&&w.id===l.id?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)("input",{type:"text",value:w.aliasName,onChange:e=>k({...w,aliasName:e.target.value}),className:"w-full px-2 py-1 border border-gray-300 rounded-md text-sm"})}),(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)(h.default,{accessToken:e,value:w.targetModel,onChange:e=>k({...w,targetModel:e}),showLabel:!1,style:{height:"32px"}})}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:N,className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:"Save"}),(0,t.jsx)("button",{onClick:S,className:"text-xs bg-gray-50 text-gray-600 px-2 py-1 rounded-sm hover:bg-gray-100",children:"Cancel"})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-900",children:l.aliasName}),(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-500",children:l.targetModel}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>{k({...l})},className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:(0,t.jsx)(s.PencilIcon,{className:"w-3 h-3"})}),(0,t.jsx)("button",{onClick:()=>{var e;let t,a;return e=l.id,_(t=j.filter(t=>t.id!==e)),a={},void(t.forEach(e=>{a[e.aliasName]=e.targetModel}),b&&b(a),x.default.success("Alias deleted successfully"))},className:"text-xs bg-red-50 text-red-600 px-2 py-1 rounded-sm hover:bg-red-100",children:(0,t.jsx)(i.TrashIcon,{className:"w-3 h-3"})})]})})]})},l.id)),0===j.length&&(0,t.jsx)(g.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:3,className:"py-0.5 text-sm text-gray-500 text-center",children:"No aliases added yet. Add a new alias above."})})]})]})})}),f&&(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(n.Title,{className:"mb-4",children:"Configuration Example"}),(0,t.jsx)(o.Text,{className:"text-gray-600 mb-4",children:"Here's how your current aliases would look in the config:"}),(0,t.jsx)("div",{className:"bg-gray-100 rounded-lg p-4 font-mono text-sm",children:(0,t.jsxs)("div",{className:"text-gray-700",children:["model_aliases:",0===Object.keys(C).length?(0,t.jsxs)("span",{className:"text-gray-500",children:[(0,t.jsx)("br",{}),"  # No aliases configured yet"]}):Object.entries(C).map(([e,l])=>(0,t.jsxs)("span",{children:[(0,t.jsx)("br",{}),'  "',e,'": "',l,'"']},e))]})})]})]})}])},266484,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(592968),s=e.i(312361),i=e.i(827252),r=e.i(994388),n=e.i(304967),o=e.i(779241),d=e.i(988297),c=e.i(68155),u=e.i(810757),m=e.i(477386),g=e.i(557662),p=e.i(174553),h=e.i(435451);let{Option:x}=l.Select;e.s(["default",0,({value:e=[],onChange:y,disabledCallbacks:b=[],onDisabledCallbacksChange:f})=>{let j=Object.entries(g.callbackInfo).filter(([e,t])=>t.supports_key_team_logging).map(([e,t])=>e),_=Object.keys(g.callbackInfo),v=e=>{y?.(e)},A=(t,l,a)=>{let s=[...e];if("callback_name"===l){let e=g.callback_map[a]||a;s[t]={...s[t],[l]:e,callback_vars:{}}}else s[t]={...s[t],[l]:a};v(s)},w=(t,l,a)=>{let s=[...e];s[t]={...s[t],callback_vars:{...s[t].callback_vars,[l]:a}},v(s)};return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(m.BanIcon,{className:"w-5 h-5 text-red-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Disabled Callbacks"}),(0,t.jsx)(a.Tooltip,{title:"Select callbacks to disable for this key. Disabled callbacks will not receive any logging data.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Disabled Callbacks"}),(0,t.jsx)(l.Select,{mode:"multiple",placeholder:"Select callbacks to disable",value:b,onChange:e=>{let t=(0,g.mapDisplayToInternalNames)(e);f?.(t)},style:{width:"100%"},optionLabelProp:"label",children:_.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Select callbacks that should be disabled for this key. These callbacks will not receive any logging data."})]})]}),(0,t.jsx)(s.Divider,{}),(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(u.CogIcon,{className:"w-5 h-5 text-blue-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Logging Integrations"}),(0,t.jsx)(a.Tooltip,{title:"Configure callback logging integrations for this team.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsx)(r.Button,{variant:"secondary",onClick:()=>{v([...e,{callback_name:"",callback_type:"success",callback_vars:{}}])},icon:d.PlusIcon,size:"sm",className:"hover:border-blue-400 hover:text-blue-500",type:"button",children:"Add Integration"})]}),(0,t.jsx)("div",{className:"space-y-4",children:e.map((s,i)=>{let d=s.callback_name?Object.entries(g.callback_map).find(([e,t])=>t===s.callback_name)?.[0]:void 0;return(0,t.jsxs)(n.Card,{className:"border border-gray-200 shadow-xs hover:shadow-md transition-shadow duration-200",decoration:"top",decorationColor:"blue",children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[d&&(0,t.jsx)(p.Logo,{src:g.callbackInfo[d]?.logo,label:d,className:"w-5 h-5 object-contain"}),(0,t.jsxs)("span",{className:"text-sm font-medium",children:[d||"New Integration"," Configuration"]})]}),(0,t.jsx)(r.Button,{variant:"light",onClick:()=>{v(e.filter((e,t)=>t!==i))},icon:c.TrashIcon,size:"xs",color:"red",className:"hover:bg-red-50",type:"button",children:"Remove"})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Integration Type"}),(0,t.jsx)(l.Select,{value:d,placeholder:"Select integration",onChange:e=>A(i,"callback_name",e),className:"w-full",optionLabelProp:"label",children:j.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Event Type"}),(0,t.jsxs)(l.Select,{value:s.callback_type,onChange:e=>A(i,"callback_type",e),className:"w-full",children:[(0,t.jsx)(x,{value:"success",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"Success Only"})]})}),(0,t.jsx)(x,{value:"failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-red-500 rounded-full"}),(0,t.jsx)("span",{children:"Failure Only"})]})}),(0,t.jsx)(x,{value:"success_and_failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"Success & Failure"})]})})]})]})]}),((e,l)=>{if(!e.callback_name)return null;let a=Object.entries(g.callback_map).find(([t,l])=>l===e.callback_name)?.[0];if(!a)return null;let s=g.callbackInfo[a]?.dynamic_params||{};return 0===Object.keys(s).length?null:(0,t.jsxs)("div",{className:"mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-4",children:[(0,t.jsx)("div",{className:"w-3 h-3 bg-blue-100 rounded-full flex items-center justify-center",children:(0,t.jsx)("div",{className:"w-1.5 h-1.5 bg-blue-500 rounded-full"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Integration Parameters"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:Object.entries(s).map(([a,s])=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 capitalize flex items-center space-x-1",children:[(0,t.jsx)("span",{children:a.replace(/_/g," ")}),"password"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Sensitive"}),"number"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Number"})]}),"number"===s&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:"Value must be between 0 and 1"}),"number"===s?(0,t.jsx)(h.default,{step:.01,width:400,placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)}):(0,t.jsx)(o.TextInput,{type:"password"===s?"password":"text",placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)})]},a))})]})})(s,i)]})]},i)})}),0===e.length&&(0,t.jsxs)("div",{className:"text-center py-12 text-gray-500 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50",children:[(0,t.jsx)(u.CogIcon,{className:"w-12 h-12 text-gray-300 mb-3 mx-auto"}),(0,t.jsx)("div",{className:"text-base font-medium mb-1",children:"No logging integrations configured"}),(0,t.jsx)("div",{className:"text-sm text-gray-400",children:'Click "Add Integration" to configure logging for this team'})]})]})}])},651904,e=>{"use strict";var t=e.i(843476),l=e.i(599724),a=e.i(266484);e.s(["default",0,function({value:e,onChange:s,premiumUser:i=!1,disabledCallbacks:r=[],onDisabledCallbacksChange:n}){return i?(0,t.jsx)(a.default,{value:e,onChange:s,disabledCallbacks:r,onDisabledCallbacksChange:n}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-3",children:[(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ langfuse-logging"}),(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ datadog-logging"})]}),(0,t.jsx)("div",{className:"p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)(l.Text,{className:"text-sm text-yellow-800",children:["Setting Key/Team logging settings is a LiteLLM Enterprise feature. Global Logging Settings are available for all free users. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"}),"."]})})]})}])},460285,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(404206),s=e.i(723731),i=e.i(653824),r=e.i(881073),n=e.i(197647),o=e.i(343488),d=e.i(602869),c=e.i(158392),u=e.i(419470),m=e.i(695411);let g=(0,l.forwardRef)(({accessToken:e,value:g,onChange:p,modelData:h},x)=>{let[y,b]=(0,l.useState)({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),[f,j]=(0,l.useState)([]),[_,v]=(0,l.useState)([]),[A,w]=(0,l.useState)([]),[k,N]=(0,l.useState)([]),[S,C]=(0,l.useState)({}),[I,T]=(0,l.useState)({}),L=(0,l.useRef)(!1),E=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=g?.router_settings?JSON.stringify({routing_strategy:g.router_settings.routing_strategy,fallbacks:g.router_settings.fallbacks,enable_tag_filtering:g.router_settings.enable_tag_filtering}):null;if(L.current&&e===E.current){L.current=!1;return}if(L.current&&e!==E.current&&(L.current=!1),e!==E.current)if(E.current=e,g?.router_settings){let e=g.router_settings,{fallbacks:t,...l}=e;b({routerSettings:l,selectedStrategy:e.routing_strategy||null,enableTagFiltering:e.enable_tag_filtering??!1});let a=e.fallbacks||[];j(a),v(a&&0!==a.length?a.map((e,t)=>{let[l,a]=Object.entries(e)[0];return{id:(t+1).toString(),primaryModel:l||null,fallbackModels:a||[]}}):[{id:"1",primaryModel:null,fallbackModels:[]}])}else b({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),j([]),v([{id:"1",primaryModel:null,fallbackModels:[]}])},[g]),(0,l.useEffect)(()=>{e&&(0,d.getRouterSettingsCall)(e).then(e=>{if(e.fields){let t={};e.fields.forEach(e=>{t[e.field_name]={ui_field_name:e.ui_field_name,field_description:e.field_description,options:e.options,link:e.link}}),C(t);let l=e.fields.find(e=>"routing_strategy"===e.field_name);l?.options&&N(l.options),e.routing_strategy_descriptions&&T(e.routing_strategy_descriptions)}})},[e]),(0,l.useEffect)(()=>{e&&(async()=>{try{let t=await (0,m.fetchAvailableModels)(e);w(t)}catch(e){console.error("Error fetching model info for fallbacks:",e)}})()},[e]);let O=()=>{let e=new Set(["allowed_fails","cooldown_time","num_retries","timeout","retry_after"]),t=new Set(["model_group_alias","retry_policy"]),l=Object.fromEntries(Object.entries({...y.routerSettings,enable_tag_filtering:y.enableTagFiltering,routing_strategy:y.selectedStrategy,fallbacks:f.length>0?f:null}).map(([l,a])=>{if("routing_strategy_args"!==l&&"routing_strategy"!==l&&"enable_tag_filtering"!==l&&"fallbacks"!==l){let s=document.querySelector(`input[name="${l}"]`);if(s){if(void 0!==s.value&&""!==s.value){let i=((l,a,s)=>{if(null==a)return s;let i=String(a).trim();if(""===i||"null"===i.toLowerCase())return null;if(e.has(l)){let e=Number(i);return Number.isNaN(e)?s:e}if(t.has(l)){if(""===i)return null;try{return JSON.parse(i)}catch{return s}}return"true"===i.toLowerCase()||"false"!==i.toLowerCase()&&i})(l,s.value,a);return[l,i]}return[l,null]}}else if("routing_strategy"===l)return[l,y.selectedStrategy];else if("enable_tag_filtering"===l)return[l,y.enableTagFiltering];else if("fallbacks"===l)return[l,f.length>0?f:null];else if("routing_strategy_args"===l&&"latency-based-routing"===y.selectedStrategy){let e=document.querySelector('input[name="lowest_latency_buffer"]'),t=document.querySelector('input[name="ttl"]'),l={};return e?.value&&(l.lowest_latency_buffer=Number(e.value)),t?.value&&(l.ttl=Number(t.value)),["routing_strategy_args",Object.keys(l).length>0?l:null]}return[l,a]}).filter(e=>null!=e)),a=(e,t=!1)=>null==e||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length||t&&("number"!=typeof e||Number.isNaN(e))?null:e;return{routing_strategy:a(l.routing_strategy),allowed_fails:a(l.allowed_fails,!0),cooldown_time:a(l.cooldown_time,!0),num_retries:a(l.num_retries,!0),timeout:a(l.timeout,!0),retry_after:a(l.retry_after,!0),fallbacks:f.length>0?f:null,context_window_fallbacks:a(l.context_window_fallbacks),retry_policy:a(l.retry_policy),model_group_alias:a(l.model_group_alias),enable_tag_filtering:y.enableTagFiltering,routing_strategy_args:a(l.routing_strategy_args)}},F=(0,o.useDebouncedCallback)(()=>{p&&(L.current=!0,p({router_settings:O()}))},{wait:100});(0,l.useEffect)(()=>{p&&F()},[y,f]);let M=Array.from(new Set(A.map(e=>e.model_group))).sort();return((0,l.useImperativeHandle)(x,()=>({getValue:()=>({router_settings:O()})})),e)?(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)(i.TabGroup,{className:"w-full",children:[(0,t.jsxs)(r.TabList,{variant:"line",defaultValue:"1",className:"px-8 pt-4",children:[(0,t.jsx)(n.Tab,{value:"1",children:"Loadbalancing"}),(0,t.jsx)(n.Tab,{value:"2",children:"Fallbacks"})]}),(0,t.jsxs)(s.TabPanels,{className:"px-8 py-6",children:[(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(c.default,{value:y,onChange:b,routerFieldsMetadata:S,availableRoutingStrategies:k,routingStrategyDescriptions:I})}),(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(u.FallbackSelectionForm,{groups:_,onGroupsChange:e=>{v(e),j(e.filter(e=>e.primaryModel&&e.fallbackModels.length>0).map(e=>({[e.primaryModel]:e.fallbackModels})))},availableModels:M,maxGroups:5})})]})]})}):null});g.displayName="RouterSettingsAccordion",e.s(["default",0,g])},575260,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(482725),s=e.i(56456);e.s(["default",0,({projects:e,value:i,onChange:r,disabled:n,loading:o,teamId:d})=>{let c=d?e?.filter(e=>e.team_id===d):e;return(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"Search or select a project",value:i,onChange:r,disabled:n,loading:o,allowClear:!0,notFoundContent:o?(0,t.jsx)(a.Spin,{indicator:(0,t.jsx)(s.LoadingOutlined,{spin:!0}),size:"small"}):void 0,filterOption:(e,t)=>{if(!t)return!1;let l=c?.find(e=>e.project_id===t.key);if(!l)return!1;let a=e.toLowerCase().trim(),s=(l.project_alias||"").toLowerCase(),i=(l.project_id||"").toLowerCase();return s.includes(a)||i.includes(a)},optionFilterProp:"children",children:!o&&c?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.project_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.project_alias||e.project_id})," ",(0,t.jsxs)("span",{className:"text-gray-500",children:["(",e.project_id,")"]})]},e.project_id))})}])},364769,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(237016),s=e.i(464571),i=e.i(888259);e.s(["default",0,({apiKey:e})=>{let[r,n]=(0,l.useState)(!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2",children:["Please save this secret key somewhere safe and accessible. For security reasons,"," ",(0,t.jsx)("b",{children:"you will not be able to view it again"})," through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-3 mb-1",children:"Virtual Key:"}),(0,t.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,t.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal",margin:0},children:e})}),(0,t.jsx)(a.CopyToClipboard,{text:e,onCopy:()=>{n(!0),i.default.success("Key copied to clipboard"),setTimeout(()=>n(!1),2e3)},children:(0,t.jsx)(s.Button,{type:"primary",style:{marginTop:12},children:r?"Copied!":"Copy Virtual Key"})})]})}])},702597,e=>{"use strict";var t=e.i(843476),l=e.i(207082),a=e.i(109799),s=e.i(510674),i=e.i(109034),r=e.i(292639),n=e.i(135214),o=e.i(500330),d=e.i(827252),c=e.i(912598),u=e.i(677667),m=e.i(130643),g=e.i(898667),p=e.i(994388),h=e.i(309426),x=e.i(350967),y=e.i(599724),b=e.i(779241),f=e.i(629569),j=e.i(464571),_=e.i(808613),v=e.i(311451),A=e.i(212931),w=e.i(91739),k=e.i(199133),N=e.i(790848),S=e.i(262218),C=e.i(592968),I=e.i(898586),T=e.i(343488),L=e.i(741466),E=e.i(271645),O=e.i(708347),F=e.i(552130),M=e.i(557662),R=e.i(9314),B=e.i(860585),P=e.i(82946),D=e.i(392110),U=e.i(533882),z=e.i(844565),V=e.i(651904),K=e.i(939510),G=e.i(460285),Q=e.i(663435),W=e.i(363256),H=e.i(575260),q=e.i(371455),J=e.i(128233),$=e.i(319312),Y=e.i(833400),X=e.i(355619),Z=e.i(75921),ee=e.i(234713),et=e.i(390605),el=e.i(727749),ea=e.i(602869),es=e.i(364769),ei=e.i(435451),er=e.i(916940);let{Option:en}=k.Select,eo=async(e,t,l,a)=>{try{if(null===e||null===t)return[];if(null!==l)return(await (0,ea.modelAvailableCall)(l,e,t,!0,a,!0)).data.map(e=>e.id);return[]}catch(e){return console.error("Error fetching user models:",e),[]}},ed=async(e,t,l,a)=>{try{if(null===e||null===t)return;if(null!==l){let s=(await (0,ea.modelAvailableCall)(l,e,t)).data.map(e=>e.id);a(s)}}catch(e){console.error("Error fetching user models:",e)}};e.s(["default",0,({team:e,teams:ec,data:eu,addKey:em,autoOpenCreate:eg,prefillData:ep})=>{let{accessToken:eh,userId:ex,userRole:ey,premiumUser:eb}=(0,n.default)(),ef=eb||null!=ey&&O.rolesWithWriteAccess.includes(ey),{data:ej,isLoading:e_}=(0,a.useOrganizations)(),{data:ev,isLoading:eA}=(0,s.useProjects)(),{data:ew}=(0,r.useUISettings)(),{data:ek}=(0,i.useTags)(),eN=!!ew?.values?.enable_projects_ui,eS=!!ew?.values?.disable_custom_api_keys,eC=ek?Object.values(ek).map(e=>({value:e.name,label:e.name})):[],eI=(0,c.useQueryClient)(),[eT]=_.Form.useForm(),[eL,eE]=(0,E.useState)(!1),[eO,eF]=(0,E.useState)(null),[eM,eR]=(0,E.useState)(null),[eB,eP]=(0,E.useState)([]),[eD,eU]=(0,E.useState)([]),[ez,eV]=(0,E.useState)("you"),[eK,eG]=(0,E.useState)(!1),[eQ,eW]=(0,E.useState)(null),[eH,eq]=(0,E.useState)([]),[eJ,e$]=(0,E.useState)([]),[eY,eX]=(0,E.useState)([]),[eZ,e0]=(0,E.useState)([]),[e1,e4]=(0,E.useState)(e),[e2,e3]=(0,E.useState)(null),[e6,e5]=(0,E.useState)(null),[e7,e8]=(0,E.useState)(!1),[e9,te]=(0,E.useState)(null),[tt,tl]=(0,E.useState)({}),[ta,ts]=(0,E.useState)([]),[ti,tr]=(0,E.useState)(!1),[tn,to]=(0,E.useState)([]),[td,tc]=(0,E.useState)([]),[tu,tm]=(0,E.useState)("llm_api"),[tg,tp]=(0,E.useState)({}),[th,tx]=(0,E.useState)(!1),[ty,tb]=(0,E.useState)("30d"),[tf,tj]=(0,E.useState)(null),[t_,tv]=(0,E.useState)([]),[tA,tw]=(0,E.useState)([]),[tk,tN]=(0,E.useState)({}),[tS,tC]=(0,E.useState)(0),[tI,tT]=(0,E.useState)(0),[tL,tE]=(0,E.useState)([]),[tO,tF]=(0,E.useState)(null),tM=_.Form.useWatch("models",eT)??[],tR=()=>{eE(!1),eT.resetFields(),e0([]),tc([]),tm("llm_api"),tp({}),tx(!1),tb("30d"),tj(null),tT(e=>e+1),tF(null),e3(null),e5(null),tv([]),tw([]),tN({}),tC(e=>e+1)},tB=()=>{eE(!1),eF(null),e4(null),eT.resetFields(),e0([]),tc([]),tm("llm_api"),tp({}),tx(!1),tb("30d"),tj(null),tT(e=>e+1),tF(null),e3(null),e5(null),tv([]),tw([]),tN({}),tC(e=>e+1)};(0,E.useEffect)(()=>{ex&&ey&&eh&&ed(ex,ey,eh,eP)},[eh,ex,ey]),(0,E.useEffect)(()=>{eh&&(0,ea.getAgentsList)(eh).then(e=>tE(e?.agents||[])).catch(()=>tE([]))},[eh]),(0,E.useEffect)(()=>{let e=async()=>{try{let e=(await (0,ea.getPoliciesList)(eh)).policies.map(e=>e.policy_name);e$(e)}catch(e){console.error("Failed to fetch policies:",e)}},t=async()=>{try{let e=await (0,ea.getPromptsList)(eh);eX(e.prompts.map(e=>e.prompt_id))}catch(e){console.error("Failed to fetch prompts:",e)}};(async()=>{try{let e=(await (0,ea.getGuardrailsList)(eh)).guardrails.map(e=>e.guardrail_name);eq(e)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),e(),t()},[eh]),(0,E.useEffect)(()=>{(async()=>{try{if(eh){let e=sessionStorage.getItem("possibleUserRoles");if(e)tl(JSON.parse(e));else{let e=await (0,ea.getPossibleUserRoles)(eh);sessionStorage.setItem("possibleUserRoles",JSON.stringify(e)),tl(e)}}}catch(e){console.error("Error fetching possible user roles:",e)}})()},[eh]),(0,E.useEffect)(()=>{if(eg&&!eK&&ec&&ey&&O.rolesWithWriteAccess.includes(ey)&&(eE(!0),eG(!0),ep)){if(ep.owned_by&&("another_user"===ep.owned_by&&"Admin"!==ey?eV("you"):eV(ep.owned_by)),ep.team_id){let e=ec?.find(e=>e.team_id===ep.team_id)||null;e&&(e4(e),eT.setFieldsValue({team_id:ep.team_id}))}ep.key_alias&&eT.setFieldsValue({key_alias:ep.key_alias}),ep.models&&ep.models.length>0&&eW(ep.models),ep.key_type&&(tm(ep.key_type),eT.setFieldsValue({key_type:ep.key_type}))}},[eg,ep,ec,eK,eT,ey]);let tP=eD.includes("no-default-models")&&!e1,tD=async e=>{try{let t,a=e?.key_alias??"",s=e?.team_id??null;if((eu?.filter(e=>e.team_id===s).map(e=>e.key_alias)??[]).includes(a))throw Error(`Key alias ${a} already exists for team with ID ${s}, please provide another key alias`);if(el.default.info("Making API Call"),eE(!0),"you"===ez)e.user_id=ex;else if("agent"===ez){if(!tO)return void el.default.fromBackend("Please select an agent");e.agent_id=tO}let i={};try{i=JSON.parse(e.metadata||"{}")}catch(e){console.error("Error parsing metadata:",e)}if("service_account"===ez&&(i.service_account_id=e.key_alias),eZ.length>0&&(i={...i,logging:eZ.filter(e=>e.callback_name)}),td.length>0){let e=(0,M.mapDisplayToInternalNames)(td);i={...i,litellm_disabled_callbacks:e}}if(th&&(e.auto_rotate=!0,e.rotation_interval=ty),e.duration&&""!==e.duration.trim()||(e.duration=null),e.metadata=JSON.stringify(i),e.disable_global_guardrails||delete e.disable_global_guardrails,e.allowed_vector_store_ids&&e.allowed_vector_store_ids.length>0&&(e.object_permission={vector_stores:e.allowed_vector_store_ids},delete e.allowed_vector_store_ids),e.allowed_mcp_servers_and_groups&&(e.allowed_mcp_servers_and_groups.servers?.length>0||e.allowed_mcp_servers_and_groups.accessGroups?.length>0||e.allowed_mcp_servers_and_groups.toolsets?.length>0)){e.object_permission||(e.object_permission={});let{servers:t,accessGroups:l,toolsets:a}=e.allowed_mcp_servers_and_groups;t&&t.length>0&&(e.object_permission.mcp_servers=t),l&&l.length>0&&(e.object_permission.mcp_access_groups=l),a&&a.length>0&&(e.object_permission.mcp_toolsets=a),delete e.allowed_mcp_servers_and_groups}let r=e.mcp_tool_permissions||{};if(Object.keys(r).length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_tool_permissions=r),delete e.mcp_tool_permissions,e.allowed_mcp_access_groups&&e.allowed_mcp_access_groups.length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_access_groups=e.allowed_mcp_access_groups,delete e.allowed_mcp_access_groups),e.allowed_agents_and_groups&&(e.allowed_agents_and_groups.agents?.length>0||e.allowed_agents_and_groups.accessGroups?.length>0)){e.object_permission||(e.object_permission={});let{agents:t,accessGroups:l}=e.allowed_agents_and_groups;t&&t.length>0&&(e.object_permission.agents=t),l&&l.length>0&&(e.object_permission.agent_access_groups=l),delete e.allowed_agents_and_groups}Object.keys(tg).length>0&&(e.aliases=JSON.stringify(tg)),tf?.router_settings&&Object.values(tf.router_settings).some(e=>null!=e&&""!==e)&&(e.router_settings=tf.router_settings);let n=t_.filter(e=>e.budget_duration&&null!==e.max_budget&&void 0!==e.max_budget);n.length>0&&(e.budget_limits=n);let{tag_rpm_limit:o}=(0,Y.tagRowsToLimits)(tA);Object.keys(o).length>0&&(e.tag_rpm_limit=o),Object.keys(tk).length>0&&(e.budget_fallbacks=tk),t="service_account"===ez?await (0,ea.keyCreateServiceAccountCall)(eh,e):await (0,ea.keyCreateCall)(eh,ex,e),em(t),eI.invalidateQueries({queryKey:l.keyKeys.lists()}),eF(t.key),eR(t.soft_budget),el.default.success("Virtual Key Created"),eT.resetFields(),tv([]),tw([]),tN({}),tC(e=>e+1),localStorage.removeItem("userData"+ex)}catch(t){let e=(e=>{let t;if(!(t=!e||"object"!=typeof e||e instanceof Error?String(e):JSON.stringify(e)).includes("/key/generate")&&!t.includes("KeyManagementRoutes.KEY_GENERATE"))return`Error creating the key: ${e}`;let l=t;try{if(!e||"object"!=typeof e||e instanceof Error){let e=t.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]),a=t?.error||t;a?.message&&(l=a.message)}}else{let t=e?.error||e;t?.message&&(l=t.message)}}catch(e){}return t.includes("team_member_permission_error")||l.includes("Team member does not have permissions")?"Team member does not have permission to generate key for this team. Ask your proxy admin to configure the team member permission settings.":`Error creating the key: ${e}`})(t);el.default.fromBackend(e)}};(0,E.useEffect)(()=>{if(e6){let e=ev?.find(e=>e.project_id===e6);eU(e?.models??[]),eT.setFieldValue("models",[]);return}ex&&ey&&eh&&eo(ex,ey,eh,e1?.team_id??null).then(e=>{eU((0,X.excludeProxyWideSentinel)(Array.from(new Set([...e1?.models??[],...e]))))}),eQ||eT.setFieldValue("models",[]),eT.setFieldValue("allowed_mcp_servers_and_groups",{servers:[],accessGroups:[]})},[e1,e6,eh,ex,ey,eT]),(0,E.useEffect)(()=>{if(!eQ||0===eQ.length||!eD||0===eD.length)return;let e=eQ.filter(e=>eD.includes(e));e.length>0&&eT.setFieldsValue({models:e}),eW(null)},[eQ,eD,eT]),(0,E.useEffect)(()=>{if(!e6||!ec)return;let e=ev?.find(e=>e.project_id===e6);if(!e?.team_id||e1?.team_id===e.team_id)return;let t=ec.find(t=>t.team_id===e.team_id)||null;t&&(e4(t),eT.setFieldValue("team_id",t.team_id))},[ec,e6,ev]);let tU=async e=>{if(!e)return void ts([]);tr(!0);try{let t=new URLSearchParams;if(t.append("user_email",e),null==eh)return;let l=(await (0,ea.userFilterUICall)(eh,t)).map(e=>({label:`${e.user_email} (${e.user_id})`,value:e.user_id,user:e}));ts(l)}catch(e){console.error("Error fetching users:",e),el.default.fromBackend("Failed to search for users")}finally{tr(!1)}},tz=(0,T.useDebouncedCallback)(e=>tU(e),{wait:L.DEBOUNCE_WAIT_MS});return(0,t.jsxs)("div",{children:[ey&&O.rolesWithWriteAccess.includes(ey)&&(0,t.jsx)(p.Button,{className:"mx-auto",onClick:()=>eE(!0),"data-testid":"create-key-button",children:"+ Create New Key"}),(0,t.jsx)(A.Modal,{open:eL,width:1e3,footer:null,onOk:tR,onCancel:tB,children:(0,t.jsxs)(_.Form,{form:eT,onFinish:tD,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Ownership"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Owned By"," ",(0,t.jsx)(C.Tooltip,{title:"Select who will own this Virtual Key",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),className:"mb-4",children:(0,t.jsxs)(w.Radio.Group,{onChange:e=>eV(e.target.value),value:ez,children:[(0,t.jsx)(w.Radio,{value:"you",children:"You"}),(0,t.jsx)(w.Radio,{value:"service_account",children:"Service Account"}),"Admin"===ey&&(0,t.jsx)(w.Radio,{value:"another_user",children:"Another User"}),(0,t.jsxs)(w.Radio,{value:"agent",children:["Agent ",(0,t.jsx)(S.Tag,{color:"purple",children:"New"})]})]})}),"another_user"===ez&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["User ID"," ",(0,t.jsx)(C.Tooltip,{title:"The user who will own this key and be responsible for its usage",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"user_id",className:"mt-4",rules:[{required:"another_user"===ez,message:"Please input the user ID of the user you are assigning the key to"}],children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",marginBottom:"8px"},children:[(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Type email to search for users",filterOption:!1,onSearch:tz,onSelect:(e,t)=>{let l;return l=t.user,void eT.setFieldsValue({user_id:l.user_id})},options:ta,loading:ti,allowClear:!0,style:{width:"100%"},notFoundContent:ti?"Searching...":"No users found"}),(0,t.jsx)(j.Button,{onClick:()=>e8(!0),style:{marginLeft:"8px"},children:"Create User"})]}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Search by email to find users"})]})}),"agent"===ez&&(0,t.jsxs)("div",{className:"mt-4 p-4 bg-purple-50 border border-purple-200 rounded-md",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Select Agent ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Select an agent",style:{width:"100%"},value:tO,onChange:e=>tF(e),filterOption:(e,t)=>t?.label?.toLowerCase().includes(e.toLowerCase()),options:tL.map(e=>({label:e.agent_name||e.agent_id,value:e.agent_id}))}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-2",children:"This key will be used by the selected agent to make requests to LiteLLM"})]}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Organization"," ",(0,t.jsx)(C.Tooltip,{title:"The organization this key belongs to. Selecting an organization filters the available teams.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",className:"mt-4",children:(0,t.jsx)(W.default,{organizations:ej,loading:e_,disabled:"Admin"!==ey,onChange:e=>{e3(e||null),e4(null),e5(null),eT.setFieldValue("team_id",void 0),eT.setFieldValue("project_id",void 0)}})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Team"," ",(0,t.jsx)(C.Tooltip,{title:"The team this key belongs to, which determines available models and budget limits",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"team_id",initialValue:e?e.team_id:null,className:"mt-4",rules:[{required:"service_account"===ez,message:"Please select a team for the service account"}],help:"service_account"===ez?"required":"",children:(0,t.jsx)(Q.default,{disabled:null!==e6,organizationId:e2,onTeamSelect:e=>{e4(e),e5(null),eT.setFieldValue("project_id",void 0),e?.organization_id?(e3(e.organization_id),eT.setFieldValue("organization_id",e.organization_id)):e||(e3(null),eT.setFieldValue("organization_id",void 0))}})}),eN&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Project"," ",(0,t.jsx)(C.Tooltip,{title:"Assign this key to a project. Selecting a project will lock the team to the project's team.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"project_id",className:"mt-4",children:(0,t.jsx)(H.default,{projects:ev,teamId:e1?.team_id,loading:eA||!ec,onChange:e=>{if(!e){e5(null),e4(null),eT.setFieldValue("team_id",void 0);return}e5(e)}})})]}),tP&&(0,t.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,t.jsx)(y.Text,{className:"text-blue-800 text-sm",children:"Please select a team to continue configuring your Virtual Key. If you do not see any teams, please contact your Proxy Admin to either provide you with access to models or to add you to a team."})}),!tP&&(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Details"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["you"===ez||"another_user"===ez?"Key Name":"Service Account ID"," ",(0,t.jsx)(C.Tooltip,{title:"you"===ez||"another_user"===ez?"A descriptive name to identify this key":"Unique identifier for this service account",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_alias",rules:[{required:!0,message:`Please input a ${"you"===ez?"key name":"service account ID"}`}],help:"required",children:(0,t.jsx)(b.TextInput,{placeholder:""})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Models"," ",(0,t.jsx)(C.Tooltip,{title:"Select which models this key can access. Choose 'All Team Models' to grant access to all models available to the team. Leave empty to allow access to all models.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",rules:[],help:"management"===tu||"read_only"===tu?"Models field is disabled for this key type":"optional - leave empty to allow access to all models",className:"mt-4",children:(0,t.jsxs)(k.Select,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},disabled:"management"===tu||"read_only"===tu,onChange:e=>{e.includes("all-team-models")?eT.setFieldsValue({models:["all-team-models"]}):e.includes("all-proxy-models")&&eT.setFieldsValue({models:["all-proxy-models"]})},children:[!e6&&e1&&(0,t.jsx)(en,{value:"all-team-models",children:"All Team Models"},"all-team-models"),!e6&&!e1&&(0,t.jsx)(en,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),eD.map(e=>(0,t.jsx)(en,{value:e,disabled:(0,X.hasAllModelsSentinel)(tM),children:(0,X.getModelDisplayName)(e)},e))]})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Key Type"," ",(0,t.jsx)(C.Tooltip,{title:"Select the type of key to determine what routes and operations this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_type",initialValue:"llm_api",className:"mt-4",children:(0,t.jsxs)(k.Select,{defaultValue:"llm_api",placeholder:"Select key type",style:{width:"100%"},optionLabelProp:"label",onChange:e=>{tm(e),("management"===e||"read_only"===e)&&eT.setFieldsValue({models:[]})},children:[(0,t.jsx)(en,{value:"llm_api",label:"AI APIs",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"AI APIs"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only AI API routes (chat/completions, embeddings, etc.)"})]})}),(0,t.jsx)(en,{value:"management",label:"Management",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Management"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only management routes (user/team/key management)"})]})}),(0,t.jsx)(en,{value:"default",label:"Full Access",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Full Access"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call all routes (AI APIs, Management, and read-only)"})]})})]})})]}),!tP&&(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)(f.Title,{className:"m-0",children:"Optional Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Max Budget (USD)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum amount in USD this key can spend. When reached, the key will be blocked from making further requests",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"max_budget",help:`Budget cannot exceed team max budget: $${e?.max_budget!==null&&e?.max_budget!==void 0?e?.max_budget:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.max_budget&&l>e.max_budget)throw Error(`Budget cannot exceed team max budget: $${(0,o.formatNumberWithCommas)(e.max_budget,4)}`)}}],children:(0,t.jsx)(ei.default,{step:.01,precision:2,width:200})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Reset Budget"," ",(0,t.jsx)(C.Tooltip,{title:"How often the budget should reset. For example, setting 'daily' will reset the budget every 24 hours",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"budget_duration",help:`Team Reset Budget: ${e?.budget_duration!==null&&e?.budget_duration!==void 0?e?.budget_duration:"None"}`,children:(0,t.jsx)(B.default,{onChange:e=>eT.setFieldValue("budget_duration",e)})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Windows"," ",(0,t.jsx)(C.Tooltip,{title:"Set multiple independent budget windows (e.g., hourly $10 AND monthly $200). Each window tracks spend separately and resets on its own schedule.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)($.BudgetWindowsEditor,{value:t_,onChange:tv})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Fallbacks"," ",(0,t.jsx)(C.Tooltip,{title:"When a model exceeds its per-model budget (model_max_budget), requests automatically reroute to fallback models instead of failing. Configure per-model budgets in Advanced Settings.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(J.BudgetFallbacksEditor,{value:tk,onChange:tN,availableModels:eD},tS)}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Tokens per minute Limit (TPM)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum number of tokens this key can process per minute. Helps control usage and costs",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tpm_limit",help:`TPM cannot exceed team TPM limit: ${e?.tpm_limit!==null&&e?.tpm_limit!==void 0?e?.tpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.tpm_limit&&l>e.tpm_limit)throw Error(`TPM limit cannot exceed team TPM limit: ${e.tpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"tpm",name:"tpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Requests per minute Limit (RPM)"," ",(0,t.jsx)(C.Tooltip,{title:"Maximum number of API requests this key can make per minute. Helps prevent abuse and manage load",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"rpm_limit",help:`RPM cannot exceed team RPM limit: ${e?.rpm_limit!==null&&e?.rpm_limit!==void 0?e?.rpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.rpm_limit&&l>e.rpm_limit)throw Error(`RPM limit cannot exceed team RPM limit: ${e.rpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"rpm",name:"rpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Per-Tag Rate Limits"," ",(0,t.jsx)(C.Tooltip,{title:"Scope rate limits to a request tag so each tag (e.g. a cell or group) gets its own RPM counter. Requests without a matching tag fall back to the key-level limit.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(Y.TagRateLimitEditor,{value:tA,onChange:tw})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Throttle on budget exceeded"," ",(0,t.jsx)(C.Tooltip,{title:"When this key exceeds its max budget, throttle its TPM/RPM to the globally configured percentage instead of blocking access entirely. Requires budget_exceeded_throttle_percentage in litellm_settings and a TPM/RPM limit on the key.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"throttle_on_budget_exceeded",valuePropName:"checked",children:(0,t.jsx)(N.Switch,{checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Guardrails"," ",(0,t.jsx)(C.Tooltip,{title:"Apply safety guardrails to this key to filter content or enforce policies",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-4",help:ef?"Select existing guardrails or enter new ones":"Premium feature - Upgrade to set guardrails by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!ef,placeholder:ef?"Select or enter guardrails":"Premium feature - Upgrade to set guardrails by key",options:eH.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,t.jsx)(C.Tooltip,{title:"When enabled, this key will bypass any guardrails configured to run on every request (global guardrails)",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:ef?"Bypass global guardrails for this key":"Premium feature - Upgrade to disable global guardrails by key",children:(0,t.jsx)(N.Switch,{disabled:!ef,checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Policies"," ",(0,t.jsx)(C.Tooltip,{title:"Apply policies to this key to control guardrails and other settings",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-4",help:eb?"Select existing policies or enter new ones":"Premium feature - Upgrade to set policies by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter policies":"Premium feature - Upgrade to set policies by key",options:eJ.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Prompts"," ",(0,t.jsx)(C.Tooltip,{title:"Allow this key to use specific prompt templates",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/prompt_management",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"prompts",className:"mt-4",help:eb?"Select existing prompts or enter new ones":"Premium feature - Upgrade to set prompts by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter prompts":"Premium feature - Upgrade to set prompts by key",options:eY.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Access Groups"," ",(0,t.jsx)(C.Tooltip,{title:"Assign access groups to this key. Access groups control which models, MCP servers, and agents this key can use",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-4",help:"Select access groups to assign to this key",children:(0,t.jsx)(R.default,{placeholder:"Select access groups (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Pass Through Routes"," ",(0,t.jsx)(C.Tooltip,{title:"Allow this key to use specific pass through routes",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/pass_through",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"allowed_passthrough_routes",className:"mt-4",help:eb?"Select existing pass through routes or enter new ones":"Premium feature - Upgrade to set pass through routes by key",children:(0,t.jsx)(z.default,{accessToken:eh,placeholder:eb?"Select or enter pass through routes":"Premium feature - Upgrade to set pass through routes by key",disabled:!eb,teamId:e1?e1.team_id:null})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,t.jsx)(C.Tooltip,{title:"Select which vector stores this key can access. If none selected, the key will have access to all available vector stores",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-4",help:"Select vector stores this key can access. Leave empty for access to all vector stores",children:(0,t.jsx)(er.default,{onChange:e=>eT.setFieldValue("allowed_vector_store_ids",e),value:eT.getFieldValue("allowed_vector_store_ids"),accessToken:eh,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Metadata"," ",(0,t.jsx)(C.Tooltip,{title:"JSON object with additional information about this key. Used for tracking or custom logic",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"metadata",className:"mt-4",children:(0,t.jsx)(v.Input.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Tags"," ",(0,t.jsx)(C.Tooltip,{title:"Tags for tracking spend and/or doing tag-based routing. Used for analytics and filtering",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tags",className:"mt-4",help:"Tags for tracking spend and/or doing tag-based routing.",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter tags",tokenSeparators:[","],options:eC})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"MCP Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,t.jsx)(C.Tooltip,{title:"Select which MCP servers or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",help:"Select MCP servers or access groups this key can access",children:(0,t.jsx)(Z.default,{onChange:e=>eT.setFieldValue("allowed_mcp_servers_and_groups",e),value:eT.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:eh,teamId:e1?.team_id??null,placeholder:"Select MCP servers or access groups (optional)",allowNoMcpServers:!0})}),(0,t.jsx)(_.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,t.jsx)(v.Input,{type:"hidden"})}),(0,t.jsx)(_.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.allowed_mcp_servers_and_groups!==t.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==t.mcp_tool_permissions,children:()=>(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(et.default,{accessToken:eh,selectedServers:(eT.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[]).filter(e=>e!==ee.NO_MCP_SERVERS_SENTINEL),toolPermissions:eT.getFieldValue("mcp_tool_permissions")||{},onChange:e=>eT.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Agent Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Agents"," ",(0,t.jsx)(C.Tooltip,{title:"Select which agents or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",help:"Select agents or access groups this key can access",children:(0,t.jsx)(F.default,{onChange:e=>eT.setFieldValue("allowed_agents_and_groups",e),value:eT.getFieldValue("allowed_agents_and_groups"),accessToken:eh,placeholder:"Select agents or access groups (optional)"})})})]}),eb?(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eZ,onChange:e0,premiumUser:!0,disabledCallbacks:td,onDisabledCallbacksChange:tc})})})]}):(0,t.jsx)(C.Tooltip,{title:(0,t.jsxs)("span",{children:["Key-level logging settings is an enterprise feature, get in touch -",(0,t.jsx)("a",{href:"https://www.litellm.ai/enterprise",target:"_blank",children:"https://www.litellm.ai/enterprise"})]}),placement:"top",children:(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsx)("div",{style:{opacity:.5},children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eZ,onChange:e0,premiumUser:!1,disabledCallbacks:td,onDisabledCallbacksChange:tc})})})]})}),(0,t.jsx)("div",{style:{position:"absolute",inset:0,cursor:"not-allowed"}})]})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Router Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4 w-full",children:(0,t.jsx)(G.default,{accessToken:eh||"",value:tf||void 0,onChange:tj,modelData:eB.length>0?{data:eB.map(e=>({model_name:e}))}:void 0},tI)})})]},`router-settings-accordion-${tI}`),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Model Aliases"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)(y.Text,{className:"text-sm text-gray-600 mb-4",children:"Create custom aliases for models that can be used in API calls. This allows you to create shortcuts for specific models."}),(0,t.jsx)(U.default,{accessToken:eh,initialModelAliases:tg,onAliasUpdate:tp,showExampleConfig:!1})]})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Key Lifecycle"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(D.default,{form:eT,autoRotationEnabled:th,onAutoRotationChange:tx,rotationInterval:ty,onRotationIntervalChange:tb,isCreateMode:!0})})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("b",{children:"Advanced Settings"}),(0,t.jsx)(C.Tooltip,{title:(0,t.jsxs)("span",{children:["Learn more about advanced settings in our"," ",(0,t.jsx)("a",{href:ea.proxyBaseUrl?`${ea.proxyBaseUrl}/#/key%20management/generate_key_fn_key_generate_post`:"/#/key%20management/generate_key_fn_key_generate_post",target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 hover:text-blue-300",children:"documentation"})]}),children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-300 cursor-help"})})]})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(P.default,{schemaComponent:"GenerateKeyRequest",form:eT,excludedFields:["key_alias","team_id","organization_id","models","duration","metadata","tags","guardrails","max_budget","budget_duration","tpm_limit","rpm_limit",...eS?["key"]:[]]})})]})]})]})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(j.Button,{htmlType:"submit",disabled:tP,style:{opacity:tP?.5:1},children:"Create Key"})})]})}),e7&&(0,t.jsx)(A.Modal,{title:"Create New User",open:e7,onCancel:()=>e8(!1),footer:null,width:800,children:(0,t.jsx)(q.CreateUserButton,{userID:ex,accessToken:eh,teams:ec,possibleUIRoles:tt,onUserCreated:e=>{te(e),eT.setFieldsValue({user_id:e}),e8(!1)},isEmbedded:!0})}),eO&&(0,t.jsx)(A.Modal,{open:eL,onOk:tR,onCancel:tB,footer:null,children:(0,t.jsxs)(x.Grid,{numItems:1,className:"gap-2 w-full",children:[(0,t.jsx)(f.Title,{children:"Save your Key"}),(0,t.jsx)(h.Col,{numColSpan:1,children:null!=eO?(0,t.jsx)(es.default,{apiKey:eO}):(0,t.jsx)(y.Text,{children:"Key being created, this might take 30s"})})]})})]})},"fetchTeamModels",0,eo,"fetchUserModels",0,ed],702597)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0gylheyn-59ow.js b/litellm/proxy/_experimental/out/_next/static/chunks/0gylheyn-59ow.js deleted file mode 100644 index a2aed590fc0..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0gylheyn-59ow.js +++ /dev/null @@ -1,8 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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 l=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}));l.displayName="TableHeader";let o=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}));o.displayName="TableBody";let i=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}));i.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,o,"TableCell",0,d,"TableFooter",0,i,"TableHead",0,u,"TableHeader",0,l,"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),l=e.i(552245),o=e.i(405005),i=e.i(209407);let s={...o.popupStateMapping,...i.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:a,className:n,style:o,forceRender:i=!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,l.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:i||!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:o,disabled:i=!1,nativeButton:s=!0,...u}=e,{store:g}=(0,r.useDialogRootContext)(),m=g.useState("open"),{getButtonProps:f,buttonRef:b}=(0,d.useButton)({disabled:i,native:s});return(0,l.useRenderElement)("button",e,{state:{disabled:i},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:o,id:i,...s}=e,{store:u}=(0,r.useDialogRootContext)(),d=(0,m.useBaseUiId)(i);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,l.useRenderElement)("p",e,{ref:t,props:[{id:d},s]})});e.s(["DialogDescription",0,f],209793);var b=e.i(61487);let x=((t={}).nestedDialogs="--nested-dialogs",t),h=((a={})[a.open=o.CommonPopupDataAttributes.open]="open",a[a.closed=o.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=o.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=o.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var y=e.i(733332);let C=n.createContext(void 0);function v(){let e=n.useContext(C);if(void 0===e)throw Error((0,y.default)(26));return e}e.s(["DialogPortalContext",0,C,"useDialogPortalContext",0,v],625834);var S=e.i(137584),w=e.i(673327),$=e.i(264111),D=e.i(843476);let j={...o.popupStateMapping,...i.transitionStatusMapping,nestedDialogOpen:e=>e?{[h.nestedDialogOpen]:""}:null},R=n.forwardRef(function(e,t){let{render:a,className:n,style:o,finalFocus:i,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"),h=d.useState("mounted"),y=d.useState("nested"),C=d.useState("nestedOpenDialogCount"),R=d.useState("open"),O=d.useState("openMethod"),N=d.useState("titleElementId"),k=d.useState("transitionStatus"),E=d.useState("role"),M=g.useState("floatingId"),P=u.id??M;v(),(0,S.useOpenChangeComplete)({open:R,ref:d.context.popupRef,onComplete(){R&&d.context.onOpenChangeComplete?.(!0)}});let T=void 0===s?(0,$.createDefaultInitialFocus)(d.context.popupRef):s,A=d.useStateSetter("popupElement"),I=(0,l.useRenderElement)("div",e,{state:{open:R,nested:y,transitionStatus:k,nestedDialogOpen:C>0},props:[m,{id:P,"aria-labelledby":N??void 0,"aria-describedby":c??void 0,role:E,...$.FOCUSABLE_POPUP_PROPS,hidden:!h,onKeyDown(e){w.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[x.nestedDialogs]:C}},u],ref:[t,d.context.popupRef,A],stateAttributesMapping:j});return(0,D.jsx)(b.FloatingFocusManager,{context:g,openInteractionType:O,disabled:!h,closeOnFocusOut:!p,initialFocus:T,returnFocus:i,modal:!1!==f,restoreFocus:"popup",children:I})});e.s(["DialogPopup",0,R],784324);var O=e.i(144394),N=e.i(726674),k=e.i(426);let E=n.forwardRef(function(e,t){let{keepMounted:a=!1,...n}=e,{store:l}=(0,r.useDialogRootContext)(),o=l.useState("mounted"),i=l.useState("modal"),s=l.useState("open");return o||a?(0,D.jsx)(C.Provider,{value:a,children:(0,D.jsxs)(N.FloatingPortal,{ref:t,...n,children:[o&&!0===i&&(0,D.jsx)(k.InternalBackdrop,{ref:l.context.internalBackdropRef,inert:(0,O.inertValue)(!s)}),e.children]})}):null});e.s(["DialogPortal",0,E],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),n=e.i(956789),r=e.i(17989),l=e.i(647554),o=e.i(675606),i=e.i(56434),s=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:o,isDrawer:i}){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,x]=t.useState(0),h=0===m,y=(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,l.getTarget)(t);return!!h&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,l.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:h});(0,a.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{f(e),x(t)}),e.useContextCallback("onNestedDialogClose",()=>{f(0),x(0)}),t.useEffect(()=>(o?.onNestedDialogOpen&&u&&o.onNestedDialogOpen(m+1,b+ +!!i),o?.onNestedDialogClose&&!u&&o.onNestedDialogClose(),()=>{o?.onNestedDialogClose&&u&&o.onNestedDialogClose()}),[i,u,m,b,o]);let C=y.reference??n.EMPTY_OBJECT,v=y.trigger??n.EMPTY_OBJECT,S=y.floating??n.EMPTY_OBJECT;return(0,s.usePopupInteractionProps)(e,{activeTriggerProps:C,inactiveTriggerProps:v,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:l}=(0,s.useOpenStateTransitions)(r,a),u=t.useCallback(()=>{a.setOpen(!1,(0,o.createChangeEventDetails)(i.REASONS.imperativeAction))},[a]);t.useImperativeHandle(n,()=>({unmount:l,close:u}),[l,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),n=e.i(67530),r=e.i(108821),l=e.i(616269),o=e.i(301252),i=e.i(116786),s=e.i(990627),u=e.i(264111);let d={...i.popupStoreSelectors,modal:(0,l.createSelector)(e=>e.modal),nested:(0,l.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,l.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,l.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,l.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,l.createSelector)(e=>e.openMethod),descriptionElementId:(0,l.createSelector)(e=>e.descriptionElementId),titleElementId:(0,l.createSelector)(e=>e.titleElementId),viewportElement:(0,l.createSelector)(e=>e.viewportElement),role:(0,l.createSelector)(e=>e.role)};class c extends o.ReactStore{constructor(e,a,n=!1){const r=new s.PopupTriggerMap,l=function(e={}){return{...(0,i.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);l.floatingRootContext=(0,i.createPopupFloatingRootContext)(r,a,n),super(l,{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,l="dialog"){let{children:o,open:i,defaultOpen:s=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:g=!1,modal:m=!0,actionsRef:f,handle:b,triggerId:x,defaultTriggerId:h=null}=e,y="alert-dialog"===l,C=(0,r.useDialogRootContext)(!0),v={modal:!!y||m,disablePointerDismissal:y||g,nested:!!C,role:y?"alertdialog":"dialog"},S=c.useStore(b?.store,{open:s,openProp:i,activeTriggerId:h,triggerIdProp:x,...v});(0,a.useOnFirstRender)(()=>{let e=void 0===i&&!1===S.state.open&&!0===s?{open:!0,activeTriggerId:h}:null;y?S.update(e?{...v,...e}:v):e&&S.update(e)}),S.useControlledProp("openProp",i),S.useControlledProp("triggerIdProp",x),S.useSyncedValues(v),S.useContextCallback("onOpenChange",u),S.useContextCallback("onOpenChangeComplete",d);let w=S.useState("open"),$=S.useState("mounted"),D=S.useState("payload");(0,n.useDialogRoot)({store:S,actionsRef:f});let j=t.useMemo(()=>({store:S}),[S]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:j,children:[(w||$)&&(0,p.jsx)(n.DialogInteractions,{store:S,parentContext:C?.store.context,isDrawer:"drawer"===l}),"function"==typeof o?o({payload:D}):o]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),n=e.i(552245),r=e.i(405005),l=e.i(209407),o=e.i(108821),i=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,...l.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:l,children:s,...d}=e,c=(0,i.useDialogPortalContext)(),{store:p}=(0,o.useDialogRootContext)(),g=p.useState("open"),m=p.useState("nested"),f=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),x=p.useState("mounted"),h=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||x,state:{open:g,nested:m,transitionStatus:f,nestedDialogOpen:b>0},ref:[t,h],stateAttributesMapping:u,props:[{role:"presentation",hidden:!x,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 l=t.forwardRef(function(e,t){let{render:l,className:o,style:i,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,l],77173);var o=e.i(733332),i=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,l){let{render:g,className:m,style:f,disabled:b=!1,nativeButton:x=!0,id:h,payload:y,handle:C,...v}=e,S=(0,a.useDialogRootContext)(!0),w=C?.store??S?.store;if(!w)throw Error((0,o.default)(79));let $=(0,r.useBaseUiId)(h),D=w.useState("floatingRootContext"),j=w.useState("isOpenedByTrigger",$),R=w.useState("triggerPopupId",$),O=t.useRef(null),{registerTrigger:N,isMountedByThisTrigger:k}=(0,d.useTriggerDataForwarding)($,O,w,{payload:y}),{getButtonProps:E,buttonRef:M}=(0,i.useButton)({disabled:b,native:x}),P=(0,c.useClick)(D,{enabled:null!=D}),T=(0,p.useOpenMethodTriggerProps)(()=>w.select("open"),e=>{w.set("openMethod",e)}),A=w.useState("triggerProps",k);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:j},ref:[M,l,N,O],props:[P.reference,A,T,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:$,"aria-haspopup":"dialog","aria-expanded":j,"aria-controls":R},v,E],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}])},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),l=e.i(264951),o=e.i(271645),i=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",()=>l.DialogPortal,"Root",0,function(e){let t=o.useContext(i.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)},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)},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])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},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 l=e=>{let{prefixCls:n,className:r,style:l,size:o,shape:i}=e,s=(0,a.default)({[`${n}-lg`]:"large"===o,[`${n}-sm`]:"small"===o}),u=(0,a.default)({[`${n}-circle`]:"circle"===i,[`${n}-square`]:"square"===i,[`${n}-round`]:"round"===i}),d=t.useMemo(()=>"number"==typeof o?{width:o,height:o,lineHeight:`${o}px`}:{},[o]);return t.createElement("span",{className:(0,a.default)(n,s,u,r),style:Object.assign(Object.assign({},d),l)})};e.i(296059);var o=e.i(694758),i=e.i(915654),s=e.i(246422),u=e.i(838378);let d=new o.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,i.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)),x=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:n,skeletonParagraphCls:r,skeletonButtonCls:l,skeletonInputCls:o,skeletonImageCls:i,controlHeight:s,controlHeightLG:u,controlHeightSM:c,gradientFromColor:x,padding:h,marginSM:y,borderRadius:C,titleHeight:v,blockRadius:S,paragraphLiHeight:w,controlHeightXS:$,paragraphMarginTop:D}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:h,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:x},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:v,background:x,borderRadius:S,[`+ ${r}`]:{marginBlockStart:c}},[r]:{padding:0,"> li":{width:"100%",height:w,listStyle:"none",background:x,borderRadius:S,"+ li":{marginBlockStart:$}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${r} > li`]:{borderRadius:C}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:y,[`+ ${r}`]:{marginBlockStart:D}}},[`${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:l,gradientFromColor:o,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:t,width:i(n).mul(2).equal(),minWidth:i(n).mul(2).equal()},b(n,i))},f(e,n,a)),{[`${a}-lg`]:Object.assign({},b(r,i))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(l,i))}),f(e,l,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:n,controlHeightLG:r,controlHeightSM:l}=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(l))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:n,controlHeightLG:r,controlHeightSM:l,gradientFromColor:o,calc:i}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:a},g(t,i)),[`${n}-lg`]:Object.assign({},g(r,i)),[`${n}-sm`]:Object.assign({},g(l,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:n,borderRadiusSM:r,calc:l}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:r},m(l(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},m(a)),{maxWidth:l(a).mul(4).equal(),maxHeight:l(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[l]:{width:"100%"},[o]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${n}, - ${r} > li, - ${a}, - ${l}, - ${o}, - ${i} - `]: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"]]}),h=e=>{let{prefixCls:n,className:r,style:l,rows:o=0}=e,i=Array.from({length:o}).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:l},i)},y=({prefixCls:e,className:n,width:r,style:l})=>t.createElement("h3",{className:(0,a.default)(e,n),style:Object.assign({width:r},l)});function C(e){return e&&"object"==typeof e?e:{}}let v=e=>{let{prefixCls:r,loading:o,className:i,rootClassName:s,style:u,children:d,avatar:c=!1,title:p=!0,paragraph:g=!0,active:m,round:f}=e,{getPrefixCls:b,direction:v,className:S,style:w}=(0,n.useComponentConfig)("skeleton"),$=b("skeleton",r),[D,j,R]=x($);if(o||!("loading"in e)){let e,n,r=!!c,o=!!p,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${$}-avatar`},o&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),C(c));e=t.createElement("div",{className:`${$}-header`},t.createElement(l,Object.assign({},a)))}if(o||d){let e,a;if(o){let a=Object.assign(Object.assign({prefixCls:`${$}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),C(p));e=t.createElement(y,Object.assign({},a))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${$}-paragraph`},(e={},r&&o||(e.width="61%"),!r&&o?e.rows=3:e.rows=2,e)),C(g));a=t.createElement(h,Object.assign({},n))}n=t.createElement("div",{className:`${$}-content`},e,a)}let b=(0,a.default)($,{[`${$}-with-avatar`]:r,[`${$}-active`]:m,[`${$}-rtl`]:"rtl"===v,[`${$}-round`]:f},S,i,s,j,R);return D(t.createElement("div",{className:b,style:Object.assign(Object.assign({},w),u)},e,n))}return null!=d?d:null};v.Button=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d=!1,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-button`,size:c},h))))},v.Avatar=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,shape:d="circle",size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls","className"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:c},h))))},v.Input=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-input`,size:c},h))))},v.Image=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s}=e,{getPrefixCls:u}=t.useContext(n.ConfigContext),d=u("skeleton",r),[c,p,g]=x(d),m=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:s},l,o,p,g);return c(t.createElement("div",{className:m},t.createElement("div",{className:(0,a.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`})))))},v.Node=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s,children:u}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),c=d("skeleton",r),[p,g,m]=x(c),f=(0,a.default)(c,`${c}-element`,{[`${c}-active`]:s},g,l,o,m);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${c}-image`,l),style:i},u)))},e.s(["default",0,v],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),l=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(n.add(a),l.current=a)}else n.remove(l.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 l=e<0?"-":"",o=Math.abs(e),i=o,s="";return o>=1e6?(i=o/1e6,s="M"):o>=1e3&&(i=o/1e3,s="K"),`${l}${i.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 l({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,l],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:r,tooltip:i,dataTestId:s}){let u=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":s,className:(0,n.cn)("whitespace-nowrap font-normal",o[e]),children:r});return i?(0,t.jsx)(l,{content:i,trigger:u}):u}],112179)},625901,e=>{"use strict";var t=e.i(266027),a=e.i(621482),n=e.i(912598),r=e.i(243652),l=e.i(602869),o=e.i(135214);let i=(0,r.createQueryKeys)("models"),s=(0,r.createQueryKeys)("modelHub"),u=(0,r.createQueryKeys)("allProxyModels");(0,r.createQueryKeys)("selectedTeamModels");let d=(0,r.createQueryKeys)("infiniteModels"),c=(0,r.createQueryKeys)("userModels"),p=new Set,g=e=>!!e?.litellm_params?.model?.startsWith("auto_router/"),m=e=>new Set(e.filter(g).map(e=>e.model_name).filter(e=>!!e)),f=e=>e.filter(g),b=async(e,t,a)=>{let n=await (0,l.modelInfoCall)(e,t,a,1,1e3),r=n?.total_pages??1;return[n,...await Promise.all(Array.from({length:Math.max(0,r-1)},(n,r)=>(0,l.modelInfoCall)(e,t,a,r+2,1e3)))].flatMap(e=>e?.data??[])},x=(e,t)=>i.list({filters:{scope:"autoRouters",...e&&{userId:e},...t&&{userRole:t}}});e.s(["useAllProxyModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:u.list({}),queryFn:async()=>await (0,l.modelAvailableCall)(e,a,n,!0,null,!0,!1,"expand"),enabled:!!(e&&a&&n)})},"useAutoRouterModelGroups",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)(),{data:r}=(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:m});return r??p},"useAutoRouters",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:f})},"useInfiniteModelInfo",0,(e=50,t)=>{let{accessToken:n,userId:r,userRole:i}=(0,o.default)();return(0,a.useInfiniteQuery)({queryKey:d.list({filters:{...r&&{userId:r},...i&&{userRole:i},size:e,...t&&{search:t}}}),queryFn:async({pageParam:a})=>await (0,l.modelInfoCall)(n,r,i,a,e,t),initialPageParam:1,getNextPageParam:e=>{if(e.current_page{let e=(0,n.useQueryClient)();return async()=>{await e.invalidateQueries({queryKey:i.lists()})}},"useModelHub",0,()=>{let{accessToken:e}=(0,o.default)();return(0,t.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,l.modelHubCall)(e),enabled:!!e})},"useModelsInfo",0,(e=1,a=50,n,r,s,u,d,c=!1)=>{let{accessToken:p,userId:g,userRole:m}=(0,o.default)();return(0,t.useQuery)({queryKey:i.list({filters:{...g&&{userId:g},...m&&{userRole:m},page:e,size:a,...n&&{search:n},...r&&{modelId:r},...s&&{teamId:s},...u&&{sortBy:u},...d&&{sortOrder:d},...c&&{excludeAutoRouters:"true"}}}),queryFn:async()=>await (0,l.modelInfoCall)(p,g,m,e,a,n,r,s,u,d,c),enabled:!!(p&&g&&m)})},"useUserModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:c.list({}),queryFn:async()=>(await (0,l.modelAvailableCall)(e,a,n)).data.map(e=>e.id),enabled:!!(e&&a&&n)})}])},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),l=[],o=[];return r.forEach(e=>{e.endsWith("/*")?l.push(e):o.push(e)}),[...l,...o]}}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("/*",""),l=t.filter(e=>e.startsWith(r+"/"));n.push(...l),a.push(e)}else n.push(e)}),[...a,...n].filter((e,t,a)=>a.indexOf(e)===t)}])},199931,e=>{"use strict";let t=(0,e.i(475254).default)("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]);e.s(["Waypoints",0,t],199931)},548151,200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(199931),r=e.i(625901),l=e.i(487486),o=e.i(115504);let i=new Set,s=(0,a.createContext)(i);function u(e){let t=(0,a.useContext)(s);return!!e&&t.has(e)}e.s(["AutoRouterIcon",0,function({size:e=12,className:a}){return(0,t.jsx)(n.Waypoints,{size:e,className:a,"aria-hidden":!0})},"AutoRouterModelGroupsProvider",0,function({children:e}){let a=(0,r.useAutoRouterModelGroups)();return(0,t.jsx)(s.Provider,{value:a,children:e})},"AutoRouterTag",0,function({modelGroup:e,className:a}){return u(e)?(0,t.jsxs)(l.Badge,{variant:"secondary",title:`Routed by auto-router "${e}"`,className:(0,o.cn)("gap-1.5 px-2.5 py-1 text-sm font-normal text-foreground",a),children:[(0,t.jsx)(n.Waypoints,{"aria-hidden":!0}),e]}):null},"useIsAutoRoutedModelGroup",0,u],548151);var d=e.i(581070);let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=e=>String(e).padStart(2,"0"),g=(e,t)=>"date"===t?`${c[e.getMonth()]} ${e.getDate()}, ${e.getFullYear()}`:`${c[e.getMonth()]} ${e.getDate()}, ${p(e.getHours())}:${p(e.getMinutes())}:${p(e.getSeconds())}`;e.s(["DateCell",0,function({value:e,precision:a="datetime",fallback:n="-"}){let r,l,o,i=e?new Date(e):null;return!i||Number.isNaN(i.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:n}):(0,t.jsx)(d.CellTooltip,{content:(r=Intl.DateTimeFormat().resolvedOptions().timeZone,l=`${c[i.getMonth()]} ${i.getDate()}, ${i.getFullYear()}`,o=`${p(i.getHours())}:${p(i.getMinutes())}:${p(i.getSeconds())}`,`${l}, ${o} (${r})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:g(i,a)})})},"formatCellDate",0,g],200208);var m=e.i(174886),f=e.i(500330);let b={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:n,copyable:r=!1,truncate:l=!0,fallback:i="-",tooltip:s,disabled:u=!1,dataTestId:c,className:p}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:i});let g=!!n&&!u,x=(0,o.cn)(b[a].base,g&&b[a].clickable,l&&"block max-w-[15ch] truncate",u&&"opacity-50",p),h=g?(0,t.jsx)("button",{type:"button",className:x,"data-testid":c,onClick:()=>n(e),children:e}):(0,t.jsx)("span",{className:x,"data-testid":c,children:e}),y=(0,t.jsx)(d.CellTooltip,{content:s??e,trigger:h});return r?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[y,(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,f.copyToClipboard)(e)},children:(0,t.jsx)(m.Copy,{className:"size-3"})})]}):y}],399536);var x=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:n,onClick:r,className:l,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!=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,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",l),children:[s,(0,t.jsx)(x.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",l),children:s})}],997422);let h={hasModelAccess:!1,label:"Management"},y={hasModelAccess:!1,label:"Read-only"},C={hasModelAccess:!1,label:"SCIM"},v={hasModelAccess:!0,label:null},S=e=>e.startsWith("/scim"),w=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?h:"read_only"===t?y:Array.isArray(e)&&0!==e.length?e.every(S)?C:w(e,"management_routes")?h:w(e,"info_routes")?y:v:v],146512)},622826,547227,964471,630500,e=>{"use strict";e.i(548151);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),l=e.i(487486);let o="all-proxy-models",i=e=>{if(e===o)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)(l.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)(l.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)(l.Badge,{variant:e===o?"secondary":"outline",children:i(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:i(e)},t))}),trigger:(0,a.jsxs)(l.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,l=t??n??null,o=null==t&&null!=n,i="number"==typeof l&&l>0,d=i?r/l*100:0,c=r>0?(0,s.getSpendString)(r,4):"$0.00",p=null===l?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(l)}${o?" (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})]}),i&&(0,a.jsx)(u.Meter,{value:r,max:l,"aria-valuetext":`${c} of $${(0,s.formatNumberWithCommas)(l)}`,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)},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/0hpbtid045pqt.js b/litellm/proxy/_experimental/out/_next/static/chunks/0hpbtid045pqt.js deleted file mode 100644 index 8e96393aca9..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0hpbtid045pqt.js +++ /dev/null @@ -1,10 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,266027,869230,254440,469637,e=>{"use strict";let t;var r=e.i(175555),i=e.i(273911),n=e.i(540143),s=e.i(286491),a=e.i(915823),l=e.i(793803),o=e.i(619273),c=e.i(180166),u=class extends a.Subscribable{constructor(e,t){super(),this.options=t,this.#e=e,this.#t=null,this.#r=(0,l.pendingThenable)(),this.bindMethods(),this.setOptions(t)}#e;#i=void 0;#n=void 0;#s=void 0;#a;#l;#r;#t;#o;#c;#u;#d;#h;#p;#f=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){1===this.listeners.size&&(this.#i.addObserver(this),d(this.#i,this.options)?this.#m():this.updateResult(),this.#g())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return h(this.#i,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return h(this.#i,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#y(),this.#i.removeObserver(this)}setOptions(e){let t=this.options,r=this.#i;if(this.options=this.#e.defaultQueryOptions(e),void 0!==this.options.enabled&&"boolean"!=typeof this.options.enabled&&"function"!=typeof this.options.enabled&&"boolean"!=typeof(0,o.resolveQueryBoolean)(this.options.enabled,this.#i))throw Error("Expected enabled to be a boolean or a callback that returns a boolean");this.#v(),this.#i.setOptions(this.options),t._defaulted&&!(0,o.shallowEqualObjects)(this.options,t)&&this.#e.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#i,observer:this});let i=this.hasListeners();i&&p(this.#i,r,this.options,t)&&this.#m(),this.updateResult(),i&&(this.#i!==r||(0,o.resolveQueryBoolean)(this.options.enabled,this.#i)!==(0,o.resolveQueryBoolean)(t.enabled,this.#i)||(0,o.resolveStaleTime)(this.options.staleTime,this.#i)!==(0,o.resolveStaleTime)(t.staleTime,this.#i))&&this.#$();let n=this.#R();i&&(this.#i!==r||(0,o.resolveQueryBoolean)(this.options.enabled,this.#i)!==(0,o.resolveQueryBoolean)(t.enabled,this.#i)||n!==this.#p)&&this.#O(n)}getOptimisticResult(e){var t,r;let i=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(i,e);return t=this,r=n,(0,o.shallowEqualObjects)(t.getCurrentResult(),r)||(this.#s=n,this.#l=this.options,this.#a=this.#i.state),n}getCurrentResult(){return this.#s}trackResult(e,t){return new Proxy(e,{get:(e,r)=>(this.trackProp(r),t?.(r),"promise"===r&&(this.trackProp("data"),this.options.experimental_prefetchInRender||"pending"!==this.#r.status||this.#r.reject(Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(e,r))})}trackProp(e){this.#f.add(e)}getCurrentQuery(){return this.#i}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),r=this.#e.getQueryCache().build(this.#e,t);return r.fetch().then(()=>this.createResult(r,t))}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#s))}#m(e){this.#v();let t=this.#i.fetch(this.options,e);return e?.throwOnError||(t=t.catch(o.noop)),t}#$(){this.#b();let e=(0,o.resolveStaleTime)(this.options.staleTime,this.#i);if(i.environmentManager.isServer()||this.#s.isStale||!(0,o.isValidTimeout)(e))return;let t=(0,o.timeUntilStale)(this.#s.dataUpdatedAt,e);this.#d=c.timeoutManager.setTimeout(()=>{this.#s.isStale||this.updateResult()},t+1)}#R(){return("function"==typeof this.options.refetchInterval?this.options.refetchInterval(this.#i):this.options.refetchInterval)??!1}#O(e){this.#y(),this.#p=e,!i.environmentManager.isServer()&&!1!==(0,o.resolveQueryBoolean)(this.options.enabled,this.#i)&&(0,o.isValidTimeout)(this.#p)&&0!==this.#p&&(this.#h=c.timeoutManager.setInterval(()=>{(this.options.refetchIntervalInBackground||r.focusManager.isFocused())&&this.#m()},this.#p))}#g(){this.#$(),this.#O(this.#R())}#b(){void 0!==this.#d&&(c.timeoutManager.clearTimeout(this.#d),this.#d=void 0)}#y(){void 0!==this.#h&&(c.timeoutManager.clearInterval(this.#h),this.#h=void 0)}createResult(e,t){let r,i=this.#i,n=this.options,a=this.#s,c=this.#a,u=this.#l,h=e!==i?e.state:this.#n,{state:m}=e,g={...m},b=!1;if(t._optimisticResults){let r=this.hasListeners(),a=!r&&d(e,t),l=r&&p(e,i,t,n);(a||l)&&(g={...g,...(0,s.fetchState)(m.data,e.options)}),"isRestoring"===t._optimisticResults&&(g.fetchStatus="idle")}let{error:y,errorUpdatedAt:v,status:$}=g;r=g.data;let R=!1;if(void 0!==t.placeholderData&&void 0===r&&"pending"===$){let e;a?.isPlaceholderData&&t.placeholderData===u?.placeholderData?(e=a.data,R=!0):e="function"==typeof t.placeholderData?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,void 0!==e&&($="success",r=(0,o.replaceData)(a?.data,e,t),b=!0)}if(t.select&&void 0!==r&&!R)if(a&&r===c?.data&&t.select===this.#o)r=this.#c;else try{this.#o=t.select,r=t.select(r),r=(0,o.replaceData)(a?.data,r,t),this.#c=r,this.#t=null}catch(e){this.#t=e}this.#t&&(y=this.#t,r=this.#c,v=Date.now(),$="error");let O="fetching"===g.fetchStatus,C="pending"===$,w="error"===$,E=C&&O,S=void 0!==r,k={status:$,fetchStatus:g.fetchStatus,isPending:C,isSuccess:"success"===$,isError:w,isInitialLoading:E,isLoading:E,data:r,dataUpdatedAt:g.dataUpdatedAt,error:y,errorUpdatedAt:v,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:O,isRefetching:O&&!C,isLoadingError:w&&!S,isPaused:"paused"===g.fetchStatus,isPlaceholderData:b,isRefetchError:w&&S,isStale:f(e,t),refetch:this.refetch,promise:this.#r,isEnabled:!1!==(0,o.resolveQueryBoolean)(t.enabled,e)};if(this.options.experimental_prefetchInRender){let t=void 0!==k.data,r="error"===k.status&&!t,n=e=>{r?e.reject(k.error):t&&e.resolve(k.data)},s=()=>{n(this.#r=k.promise=(0,l.pendingThenable)())},a=this.#r;switch(a.status){case"pending":e.queryHash===i.queryHash&&n(a);break;case"fulfilled":(r||k.data!==a.value)&&s();break;case"rejected":r&&k.error===a.reason||s()}}return k}updateResult(){let e=this.#s,t=this.createResult(this.#i,this.options);if(this.#a=this.#i.state,this.#l=this.options,void 0!==this.#a.data&&(this.#u=this.#i),(0,o.shallowEqualObjects)(t,e))return;this.#s=t;let r=()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,r="function"==typeof t?t():t;if("all"===r||!r&&!this.#f.size)return!0;let i=new Set(r??this.#f);return this.options.throwOnError&&i.add("error"),Object.keys(this.#s).some(t=>this.#s[t]!==e[t]&&i.has(t))};this.#C({listeners:r()})}#v(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#i)return;let t=this.#i;this.#i=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#g()}#C(e){n.notifyManager.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#s)}),this.#e.getQueryCache().notify({query:this.#i,type:"observerResultsUpdated"})})}};function d(e,t){return!1!==(0,o.resolveQueryBoolean)(t.enabled,e)&&void 0===e.state.data&&("error"!==e.state.status||!1!==(0,o.resolveQueryBoolean)(t.retryOnMount,e))||void 0!==e.state.data&&h(e,t,t.refetchOnMount)}function h(e,t,r){if(!1!==(0,o.resolveQueryBoolean)(t.enabled,e)&&"static"!==(0,o.resolveStaleTime)(t.staleTime,e)){let i="function"==typeof r?r(e):r;return"always"===i||!1!==i&&f(e,t)}return!1}function p(e,t,r,i){return(e!==t||!1===(0,o.resolveQueryBoolean)(i.enabled,e))&&(!r.suspense||"error"!==e.state.status)&&f(e,r)}function f(e,t){return!1!==(0,o.resolveQueryBoolean)(t.enabled,e)&&e.isStaleByTime((0,o.resolveStaleTime)(t.staleTime,e))}e.s(["QueryObserver",0,u],869230),e.i(247167);var m=e.i(271645),g=e.i(912598);e.i(843476);var b=m.createContext((t=!1,{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t})),y=m.createContext(!1);y.Provider;var v=e=>{if(e.suspense){let t=e=>"static"===e?e:Math.max(e??1e3,1e3),r=e.staleTime;e.staleTime="function"==typeof r?(...e)=>t(r(...e)):t(r),"number"==typeof e.gcTime&&(e.gcTime=Math.max(e.gcTime,1e3))}},$=(e,t)=>e.isLoading&&e.isFetching&&!t,R=(e,t)=>e?.suspense&&t.isPending,O=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function C(e,t,r){let s,a=m.useContext(y),l=m.useContext(b),c=(0,g.useQueryClient)(r),u=c.defaultQueryOptions(e);c.getDefaultOptions().queries?._experimental_beforeQuery?.(u);let d=c.getQueryCache().get(u.queryHash);u._optimisticResults=a?"isRestoring":"optimistic",v(u),s=d?.state.error&&"function"==typeof u.throwOnError?(0,o.shouldThrowError)(u.throwOnError,[d.state.error,d]):u.throwOnError,(u.suspense||u.experimental_prefetchInRender||s)&&!l.isReset()&&(u.retryOnMount=!1),m.useEffect(()=>{l.clearReset()},[l]);let h=!c.getQueryCache().get(u.queryHash),[p]=m.useState(()=>new t(c,u)),f=p.getOptimisticResult(u),C=!a&&!1!==e.subscribed;if(m.useSyncExternalStore(m.useCallback(e=>{let t=C?p.subscribe(n.notifyManager.batchCalls(e)):o.noop;return p.updateResult(),t},[p,C]),()=>p.getCurrentResult(),()=>p.getCurrentResult()),m.useEffect(()=>{p.setOptions(u)},[u,p]),R(u,f))throw O(u,p,l);if((({result:e,errorResetBoundary:t,throwOnError:r,query:i,suspense:n})=>e.isError&&!t.isReset()&&!e.isFetching&&i&&(n&&void 0===e.data||(0,o.shouldThrowError)(r,[e.error,i])))({result:f,errorResetBoundary:l,throwOnError:u.throwOnError,query:d,suspense:u.suspense}))throw f.error;if(c.getDefaultOptions().queries?._experimental_afterQuery?.(u,f),u.experimental_prefetchInRender&&!i.environmentManager.isServer()&&$(f,a)){let e=h?O(u,p,l):d?.promise;e?.catch(o.noop).finally(()=>{p.updateResult()})}return u.notifyOnChangeProps?f:p.trackResult(f)}e.s(["defaultThrowOnError",0,(e,t)=>void 0===t.state.data,"ensureSuspenseTimers",0,v,"fetchOptimistic",0,O,"shouldSuspend",0,R,"willFetch",0,$],254440),e.s(["useBaseQuery",0,C],469637),e.s(["useQuery",0,function(e,t){return C(e,u,t)}],266027)},243652,e=>{"use strict";e.s(["createQueryKeys",0,function(e){let t=[e];return{all:t,lists:()=>[...t,"list"],list:e=>[...t,"list",{params:e}],details:()=>[...t,"detail"],detail:e=>[...t,"detail",e]}}])},612256,e=>{"use strict";var t=e.i(602869),r=e.i(266027);let i=(0,e.i(243652).createQueryKeys)("uiConfig");e.s(["useUIConfig",0,()=>(0,r.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,t.getUiConfig)(),staleTime:864e5,gcTime:864e5})])},321836,e=>{"use strict";let t="litellm_return_url",r="redirect_to";function i(){return window.location.href}function n(){if("u"typeof document&&(document.cookie=`${t}=; path=/; max-age=0`)}catch(e){console.error("Failed to clear return URL cookie:",e)}}function a(){return new URLSearchParams(window.location.search).get(r)}function l(){let e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||"::1"===e||e.startsWith("127.")||e.endsWith(".local")}function o(e){if(!e)return!1;if(e.startsWith("/")&&!e.startsWith("//"))return!0;try{let t=new URL(e),r=window.location.hostname;if(t.hostname!==r)return!1;if(l())return!0;return t.origin===window.location.origin}catch{return!1}}e.s(["buildLoginUrlWithReturn",0,function(e,t){let n=t||i();if(!n||n.includes("/login"))return e;let s=e.includes("?")?"&":"?";return`${e}${s}${r}=${encodeURIComponent(n)}`},"clearStoredReturnUrl",0,s,"consumeReturnUrl",0,function(){let e=a();if(e){if(o(e))return s(),e;l()&&console.warn("[returnUrlUtils] Invalid return URL in params rejected:",e)}let t=n();if(t){if(o(t))return s(),t;l()&&console.warn("[returnUrlUtils] Invalid return URL in cookie rejected:",t)}return null},"getLoginUrl",0,function(e=""){return`${e}/ui/login/`},"getReturnUrl",0,function(){let e=a();if(e)return e;let t=n();return t||null},"isValidReturnUrl",0,o,"normalizeUrlForCompare",0,function(e){try{let t=new URL(e,window.location.origin),r=t.pathname;r.length>1&&r.endsWith("/")&&(r=r.slice(0,-1));let i=new URLSearchParams(t.search),n=new URLSearchParams;Array.from(i.entries()).sort(([e],[t])=>e.localeCompare(t)).forEach(([e,t])=>{n.append(e,t)});let s=n.toString(),a=t.hash||"";return`${t.origin}${r}${s?`?${s}`:""}${a}`}catch{return e}},"storeReturnUrl",0,function(){let e=i();e&&function(e,t,r=300){if("u"{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),i=e.i(242064),n=e.i(529681);let s=e=>{let{prefixCls:i,className:n,style:s,size:a,shape:l}=e,o=(0,r.default)({[`${i}-lg`]:"large"===a,[`${i}-sm`]:"small"===a}),c=(0,r.default)({[`${i}-circle`]:"circle"===l,[`${i}-square`]:"square"===l,[`${i}-round`]:"round"===l}),u=t.useMemo(()=>"number"==typeof a?{width:a,height:a,lineHeight:`${a}px`}:{},[a]);return t.createElement("span",{className:(0,r.default)(i,o,c,n),style:Object.assign(Object.assign({},u),s)})};e.i(296059);var a=e.i(694758),l=e.i(915654),o=e.i(246422),c=e.i(838378);let u=new a.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),d=e=>({height:e,lineHeight:(0,l.unit)(e)}),h=e=>Object.assign({width:e},d(e)),p=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},d(e)),f=e=>Object.assign({width:e},d(e)),m=(e,t,r)=>{let{skeletonButtonCls:i}=e;return{[`${r}${i}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${r}${i}-round`]:{borderRadius:t}}},g=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},d(e)),b=(0,o.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:i,skeletonParagraphCls:n,skeletonButtonCls:s,skeletonInputCls:a,skeletonImageCls:l,controlHeight:o,controlHeightLG:c,controlHeightSM:d,gradientFromColor:b,padding:y,marginSM:v,borderRadius:$,titleHeight:R,blockRadius:O,paragraphLiHeight:C,controlHeightXS:w,paragraphMarginTop:E}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:y,verticalAlign:"top",[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:b},h(o)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},h(c)),[`${r}-sm`]:Object.assign({},h(d))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[i]:{width:"100%",height:R,background:b,borderRadius:O,[`+ ${n}`]:{marginBlockStart:d}},[n]:{padding:0,"> li":{width:"100%",height:C,listStyle:"none",background:b,borderRadius:O,"+ li":{marginBlockStart:w}}},[`${n}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${i}, ${n} > li`]:{borderRadius:$}}},[`${t}-with-avatar ${t}-content`]:{[i]:{marginBlockStart:v,[`+ ${n}`]:{marginBlockStart:E}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:r,controlHeight:i,controlHeightLG:n,controlHeightSM:s,gradientFromColor:a,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:t,width:l(i).mul(2).equal(),minWidth:l(i).mul(2).equal()},g(i,l))},m(e,i,r)),{[`${r}-lg`]:Object.assign({},g(n,l))}),m(e,n,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},g(s,l))}),m(e,s,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:i,controlHeightLG:n,controlHeightSM:s}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:r},h(i)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},h(n)),[`${t}${t}-sm`]:Object.assign({},h(s))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:i,controlHeightLG:n,controlHeightSM:s,gradientFromColor:a,calc:l}=e;return{[i]:Object.assign({display:"inline-block",verticalAlign:"top",background:a,borderRadius:r},p(t,l)),[`${i}-lg`]:Object.assign({},p(n,l)),[`${i}-sm`]:Object.assign({},p(s,l))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:i,borderRadiusSM:n,calc:s}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:i,borderRadius:n},f(s(r).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},f(r)),{maxWidth:s(r).mul(4).equal(),maxHeight:s(r).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[s]:{width:"100%"},[a]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${i}, - ${n} > li, - ${r}, - ${s}, - ${a}, - ${l} - `]:Object.assign({},{background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:u,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"]]}),y=e=>{let{prefixCls:i,className:n,style:s,rows:a=0}=e,l=Array.from({length:a}).map((r,i)=>t.createElement("li",{key:i,style:{width:((e,t)=>{let{width:r,rows:i=2}=t;return Array.isArray(r)?r[e]:i-1===e?r:void 0})(i,e)}}));return t.createElement("ul",{className:(0,r.default)(i,n),style:s},l)},v=({prefixCls:e,className:i,width:n,style:s})=>t.createElement("h3",{className:(0,r.default)(e,i),style:Object.assign({width:n},s)});function $(e){return e&&"object"==typeof e?e:{}}let R=e=>{let{prefixCls:n,loading:a,className:l,rootClassName:o,style:c,children:u,avatar:d=!1,title:h=!0,paragraph:p=!0,active:f,round:m}=e,{getPrefixCls:g,direction:R,className:O,style:C}=(0,i.useComponentConfig)("skeleton"),w=g("skeleton",n),[E,S,k]=b(w);if(a||!("loading"in e)){let e,i,n=!!d,a=!!h,u=!!p;if(n){let r=Object.assign(Object.assign({prefixCls:`${w}-avatar`},a&&!u?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),$(d));e=t.createElement("div",{className:`${w}-header`},t.createElement(s,Object.assign({},r)))}if(a||u){let e,r;if(a){let r=Object.assign(Object.assign({prefixCls:`${w}-title`},!n&&u?{width:"38%"}:n&&u?{width:"50%"}:{}),$(h));e=t.createElement(v,Object.assign({},r))}if(u){let e,i=Object.assign(Object.assign({prefixCls:`${w}-paragraph`},(e={},n&&a||(e.width="61%"),!n&&a?e.rows=3:e.rows=2,e)),$(p));r=t.createElement(y,Object.assign({},i))}i=t.createElement("div",{className:`${w}-content`},e,r)}let g=(0,r.default)(w,{[`${w}-with-avatar`]:n,[`${w}-active`]:f,[`${w}-rtl`]:"rtl"===R,[`${w}-round`]:m},O,l,o,S,k);return E(t.createElement("div",{className:g,style:Object.assign(Object.assign({},C),c)},e,i))}return null!=u?u:null};R.Button=e=>{let{prefixCls:a,className:l,rootClassName:o,active:c,block:u=!1,size:d="default"}=e,{getPrefixCls:h}=t.useContext(i.ConfigContext),p=h("skeleton",a),[f,m,g]=b(p),y=(0,n.default)(e,["prefixCls"]),v=(0,r.default)(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:u},l,o,m,g);return f(t.createElement("div",{className:v},t.createElement(s,Object.assign({prefixCls:`${p}-button`,size:d},y))))},R.Avatar=e=>{let{prefixCls:a,className:l,rootClassName:o,active:c,shape:u="circle",size:d="default"}=e,{getPrefixCls:h}=t.useContext(i.ConfigContext),p=h("skeleton",a),[f,m,g]=b(p),y=(0,n.default)(e,["prefixCls","className"]),v=(0,r.default)(p,`${p}-element`,{[`${p}-active`]:c},l,o,m,g);return f(t.createElement("div",{className:v},t.createElement(s,Object.assign({prefixCls:`${p}-avatar`,shape:u,size:d},y))))},R.Input=e=>{let{prefixCls:a,className:l,rootClassName:o,active:c,block:u,size:d="default"}=e,{getPrefixCls:h}=t.useContext(i.ConfigContext),p=h("skeleton",a),[f,m,g]=b(p),y=(0,n.default)(e,["prefixCls"]),v=(0,r.default)(p,`${p}-element`,{[`${p}-active`]:c,[`${p}-block`]:u},l,o,m,g);return f(t.createElement("div",{className:v},t.createElement(s,Object.assign({prefixCls:`${p}-input`,size:d},y))))},R.Image=e=>{let{prefixCls:n,className:s,rootClassName:a,style:l,active:o}=e,{getPrefixCls:c}=t.useContext(i.ConfigContext),u=c("skeleton",n),[d,h,p]=b(u),f=(0,r.default)(u,`${u}-element`,{[`${u}-active`]:o},s,a,h,p);return d(t.createElement("div",{className:f},t.createElement("div",{className:(0,r.default)(`${u}-image`,s),style:l},t.createElement("svg",{viewBox:"0 0 1098 1024",xmlns:"http://www.w3.org/2000/svg",className:`${u}-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:`${u}-image-path`})))))},R.Node=e=>{let{prefixCls:n,className:s,rootClassName:a,style:l,active:o,children:c}=e,{getPrefixCls:u}=t.useContext(i.ConfigContext),d=u("skeleton",n),[h,p,f]=b(d),m=(0,r.default)(d,`${d}-element`,{[`${d}-active`]:o},p,s,a,f);return h(t.createElement("div",{className:m},t.createElement("div",{className:(0,r.default)(`${d}-image`,s),style:l},c)))},e.s(["default",0,R],185793)},560445,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(201072),i=e.i(726289),n=e.i(864517),s=e.i(562901),a=e.i(779573),l=e.i(343794),o=e.i(361275),c=e.i(244009),u=e.i(611935),d=e.i(763731),h=e.i(242064);e.i(296059);var p=e.i(915654),f=e.i(183293),m=e.i(246422);let g=(e,t,r,i,n)=>({background:e,border:`${(0,p.unit)(i.lineWidth)} ${i.lineType} ${t}`,[`${n}-icon`]:{color:r}}),b=(0,m.genStyleHooks)("Alert",e=>[(e=>{let{componentCls:t,motionDurationSlow:r,marginXS:i,marginSM:n,fontSize:s,fontSizeLG:a,lineHeight:l,borderRadiusLG:o,motionEaseInOutCirc:c,withDescriptionIconSize:u,colorText:d,colorTextHeading:h,withDescriptionPadding:p,defaultPadding:m}=e;return{[t]:Object.assign(Object.assign({},(0,f.resetComponent)(e)),{position:"relative",display:"flex",alignItems:"center",padding:m,wordWrap:"break-word",borderRadius:o,[`&${t}-rtl`]:{direction:"rtl"},[`${t}-content`]:{flex:1,minWidth:0},[`${t}-icon`]:{marginInlineEnd:i,lineHeight:0},"&-description":{display:"none",fontSize:s,lineHeight:l},"&-message":{color:h},[`&${t}-motion-leave`]:{overflow:"hidden",opacity:1,transition:`max-height ${r} ${c}, opacity ${r} ${c}, - padding-top ${r} ${c}, padding-bottom ${r} ${c}, - margin-bottom ${r} ${c}`},[`&${t}-motion-leave-active`]:{maxHeight:0,marginBottom:"0 !important",paddingTop:0,paddingBottom:0,opacity:0}}),[`${t}-with-description`]:{alignItems:"flex-start",padding:p,[`${t}-icon`]:{marginInlineEnd:n,fontSize:u,lineHeight:0},[`${t}-message`]:{display:"block",marginBottom:i,color:h,fontSize:a},[`${t}-description`]:{display:"block",color:d}},[`${t}-banner`]:{marginBottom:0,border:"0 !important",borderRadius:0}}})(e),(e=>{let{componentCls:t,colorSuccess:r,colorSuccessBorder:i,colorSuccessBg:n,colorWarning:s,colorWarningBorder:a,colorWarningBg:l,colorError:o,colorErrorBorder:c,colorErrorBg:u,colorInfo:d,colorInfoBorder:h,colorInfoBg:p}=e;return{[t]:{"&-success":g(n,i,r,e,t),"&-info":g(p,h,d,e,t),"&-warning":g(l,a,s,e,t),"&-error":Object.assign(Object.assign({},g(u,c,o,e,t)),{[`${t}-description > pre`]:{margin:0,padding:0}})}}})(e),(e=>{let{componentCls:t,iconCls:r,motionDurationMid:i,marginXS:n,fontSizeIcon:s,colorIcon:a,colorIconHover:l}=e;return{[t]:{"&-action":{marginInlineStart:n},[`${t}-close-icon`]:{marginInlineStart:n,padding:0,overflow:"hidden",fontSize:s,lineHeight:(0,p.unit)(s),backgroundColor:"transparent",border:"none",outline:"none",cursor:"pointer",[`${r}-close`]:{color:a,transition:`color ${i}`,"&:hover":{color:l}}},"&-close-text":{color:a,transition:`color ${i}`,"&:hover":{color:l}}}}})(e)],e=>({withDescriptionIconSize:e.fontSizeHeading3,defaultPadding:`${e.paddingContentVerticalSM}px 12px`,withDescriptionPadding:`${e.paddingMD}px ${e.paddingContentHorizontalLG}px`}));var y=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 v={success:r.default,info:a.default,error:i.default,warning:s.default},$=e=>{let{icon:r,prefixCls:i,type:n}=e,s=v[n]||null;return r?(0,d.replaceElement)(r,t.createElement("span",{className:`${i}-icon`},r),()=>({className:(0,l.default)(`${i}-icon`,r.props.className)})):t.createElement(s,{className:`${i}-icon`})},R=e=>{let{isClosable:r,prefixCls:i,closeIcon:s,handleClose:a,ariaProps:l}=e,o=!0===s||void 0===s?t.createElement(n.default,null):s;return r?t.createElement("button",Object.assign({type:"button",onClick:a,className:`${i}-close-icon`,tabIndex:0},l),o):null},O=t.forwardRef((e,r)=>{let{description:i,prefixCls:n,message:s,banner:a,className:d,rootClassName:p,style:f,onMouseEnter:m,onMouseLeave:g,onClick:v,afterClose:O,showIcon:C,closable:w,closeText:E,closeIcon:S,action:k,id:I}=e,j=y(e,["description","prefixCls","message","banner","className","rootClassName","style","onMouseEnter","onMouseLeave","onClick","afterClose","showIcon","closable","closeText","closeIcon","action","id"]),[x,Q]=t.useState(!1),T=t.useRef(null);t.useImperativeHandle(r,()=>({nativeElement:T.current}));let{getPrefixCls:U,direction:M,closable:q,closeIcon:N,className:B,style:L}=(0,h.useComponentConfig)("alert"),F=U("alert",n),[D,P,H]=b(F),A=t=>{var r;Q(!0),null==(r=e.onClose)||r.call(e,t)},z=t.useMemo(()=>void 0!==e.type?e.type:a?"warning":"info",[e.type,a]),W=t.useMemo(()=>"object"==typeof w&&!!w.closeIcon||!!E||("boolean"==typeof w?w:!1!==S&&null!=S||!!q),[E,S,w,q]),_=!!a&&void 0===C||C,K=(0,l.default)(F,`${F}-${z}`,{[`${F}-with-description`]:!!i,[`${F}-no-icon`]:!_,[`${F}-banner`]:!!a,[`${F}-rtl`]:"rtl"===M},B,d,p,H,P),G=(0,c.default)(j,{aria:!0,data:!0}),V=t.useMemo(()=>"object"==typeof w&&w.closeIcon?w.closeIcon:E||(void 0!==S?S:"object"==typeof q&&q.closeIcon?q.closeIcon:N),[S,w,q,E,N]),X=t.useMemo(()=>{let e=null!=w?w:q;if("object"==typeof e){let{closeIcon:t}=e;return y(e,["closeIcon"])}return{}},[w,q]);return D(t.createElement(o.default,{visible:!x,motionName:`${F}-motion`,motionAppear:!1,motionEnter:!1,onLeaveStart:e=>({maxHeight:e.offsetHeight}),onLeaveEnd:O},({className:r,style:n},a)=>t.createElement("div",Object.assign({id:I,ref:(0,u.composeRef)(T,a),"data-show":!x,className:(0,l.default)(K,r),style:Object.assign(Object.assign(Object.assign({},L),f),n),onMouseEnter:m,onMouseLeave:g,onClick:v,role:"alert"},G),_?t.createElement($,{description:i,icon:e.icon,prefixCls:F,type:z}):null,t.createElement("div",{className:`${F}-content`},s?t.createElement("div",{className:`${F}-message`},s):null,i?t.createElement("div",{className:`${F}-description`},i):null),k?t.createElement("div",{className:`${F}-action`},k):null,t.createElement(R,{isClosable:W,prefixCls:F,closeIcon:V,handleClose:A,ariaProps:X}))))});var C=e.i(278409),w=e.i(233848),E=e.i(487806),S=e.i(479671),k=e.i(480002),I=e.i(868917);let j=function(e){function r(){var e,t,i;return(0,C.default)(this,r),t=r,i=arguments,t=(0,E.default)(t),(e=(0,k.default)(this,(0,S.default)()?Reflect.construct(t,i||[],(0,E.default)(this).constructor):t.apply(this,i))).state={error:void 0,info:{componentStack:""}},e}return(0,I.default)(r,e),(0,w.default)(r,[{key:"componentDidCatch",value:function(e,t){this.setState({error:e,info:t})}},{key:"render",value:function(){let{message:e,description:r,id:i,children:n}=this.props,{error:s,info:a}=this.state,l=(null==a?void 0:a.componentStack)||null,o=void 0===e?(s||"").toString():e;return s?t.createElement(O,{id:i,type:"error",message:o,description:t.createElement("pre",{style:{fontSize:"0.9em",overflowX:"auto"}},void 0===r?l:r)}):n}}])}(t.Component);O.ErrorBoundary=j,e.s(["Alert",0,O],560445)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0iabn229p_bg9.js b/litellm/proxy/_experimental/out/_next/static/chunks/0iabn229p_bg9.js new file mode 100644 index 00000000000..61391992716 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0iabn229p_bg9.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,992156,e=>{"use strict";var s=e.i(843476),t=e.i(487074),a=e.i(560445),r=e.i(653496),l=e.i(271645),n=e.i(952571);e.i(32117);var i=e.i(591025),o=e.i(343053),d=e.i(594772),c=e.i(325738),u=e.i(973499),m=e.i(973706),h=e.i(515288),x=e.i(337822),p=e.i(677572),g=e.i(602869),f=e.i(500330);let j=e=>{let s=Math.abs(e);return`${e<0?"-":""}$${(0,f.formatNumberWithCommas)(s,s>0&&s<1?4:2)}`},v=e=>/claude|anthropic/i.test(e),b=()=>({alias:null,teamId:null,promptTokens:0,cacheReadTokens:0,cacheCreationTokens:0,realizedCachingSavings:0}),y=(e,s,t,a)=>({alias:e.alias??t,teamId:e.teamId??a,promptTokens:e.promptTokens+(s.prompt_tokens??0),cacheReadTokens:e.cacheReadTokens+(s.cache_read_input_tokens??0),cacheCreationTokens:e.cacheCreationTokens+(s.cache_creation_input_tokens??0),realizedCachingSavings:e.realizedCachingSavings+(s.prompt_caching_savings_spend??0)}),N=(e,s)=>s.reduce((e,s)=>({...e,[s]:0}),{date:e}),w=[{name:"Compression",color:"emerald"},{name:"Prompt caching",color:"blue"},{name:"Auto-router",color:"amber"}],k=w.map(e=>e.name),C=w.map(e=>e.color),_={by_tool:[],daily:[],start_date:null,end_date:null},T=e=>new Date(`${e}T00:00:00`).toLocaleDateString("en-US",{month:"short",day:"numeric"}),S=e=>e.toISOString().slice(0,10),A=({label:e,value:t,hint:a,info:r})=>(0,s.jsxs)(h.Card,{children:[(0,s.jsxs)(h.CardHeader,{className:"flex flex-row items-center justify-between space-y-0",children:[(0,s.jsx)(h.CardTitle,{className:"text-sm font-medium text-muted-foreground",children:e}),r&&(0,s.jsxs)(x.Popover,{children:[(0,s.jsx)(x.PopoverTrigger,{"aria-label":`How ${e.toLowerCase()} is calculated`,"data-testid":`summary-card-info-${e.toLowerCase().replace(/\s+/g,"-")}`,className:"cursor-pointer text-muted-foreground hover:text-foreground",children:(0,s.jsx)(n.Info,{className:"size-3.5"})}),(0,s.jsx)(x.PopoverContent,{align:"end",className:"w-64 text-sm text-muted-foreground",children:r})]})]}),(0,s.jsxs)(h.CardContent,{children:[(0,s.jsx)("p",{className:"text-2xl font-semibold text-foreground",children:t}),a&&(0,s.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:a})]})]}),P=({accessToken:e,activity:t})=>{let{dateValue:a,onDateChange:r,results:n,loading:x,isFetchingMore:v}=t,b=a.from??null,y=a.to??null,P=!!e&&!!b&&!!y,L=b&&y?`${S(b)}|${S(y)}`:"",[M,$]=(0,l.useState)(null);(0,l.useEffect)(()=>{if(!e||!b||!y)return;let s=!1;return(0,g.getToolSpend)(e,S(b),S(y)).then(e=>{s||$({key:L,data:e})}).catch(()=>{s||$({key:L,data:_})}),()=>{s=!0}},[e,b,y,L]);let R=M?.key===L?M.data:null,H=P&&null===R,F=(0,l.useMemo)(()=>n.reduce((e,s)=>e+(s.metrics.compression_savings_spend??0),0),[n]),B=(0,l.useMemo)(()=>n.reduce((e,s)=>e+(s.metrics.prompt_caching_savings_spend??0),0),[n]),I=(0,l.useMemo)(()=>n.reduce((e,s)=>e+(s.metrics.autorouter_savings_spend??0),0),[n]),z=(0,l.useMemo)(()=>n.reduce((e,s)=>e+(s.metrics.compression_saved_tokens??0),0),[n]),D=F+B+I,[O,q]=(0,l.useState)("cumulative"),E=(0,l.useMemo)(()=>[...n].sort((e,s)=>e.date.localeCompare(s.date)).map(e=>({date:T(e.date),Compression:e.metrics.compression_savings_spend??0,"Prompt caching":e.metrics.prompt_caching_savings_spend??0,"Auto-router":e.metrics.autorouter_savings_spend??0})),[n]),U=(0,l.useMemo)(()=>{let e;if("cumulative"!==O)return E;let s=b?T(`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`):"";return e=E.reduce((e,s)=>{let t=e[e.length-1];return[...e,{date:s.date,Compression:(t?.Compression??0)+s.Compression,"Prompt caching":(t?.["Prompt caching"]??0)+s["Prompt caching"],"Auto-router":(t?.["Auto-router"]??0)+s["Auto-router"]}]},[]),0===e.length?[...e]:[{date:s,Compression:0,"Prompt caching":0,"Auto-router":0},...e]},[O,E,b]),V="Per day",W=((e,s)=>{if(!e||!s)return"";let t=e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric"}),a=t(e),r=t(s);return a===r?a:`${a} – ${r}`})(b??void 0,y??void 0),K=["cumulative"===O?"Running total saved":`Saved ${V.toLowerCase()}`,W&&`${W} (UTC)`].filter(Boolean).join(" · "),G=(0,l.useMemo)(()=>w.map(({name:e,color:s})=>({driver:e,color:s,usd:({Compression:F,"Prompt caching":B,"Auto-router":I})[e]})).filter(e=>e.usd>0),[F,B,I]),Q=(0,l.useMemo)(()=>G.reduce((e,s)=>e+s.usd,0),[G]),J=(0,l.useMemo)(()=>((e,s=8)=>[...e].sort((e,s)=>s.spend-e.spend).slice(0,s))(R?.by_tool??[]),[R]),Y=(0,l.useMemo)(()=>J.map(e=>e.tool_name),[J]),X=(0,l.useMemo)(()=>J.map(e=>({tool_name:e.tool_name,spend:e.spend})),[J]),Z=(0,l.useMemo)(()=>((e,s)=>{let t=new Set(s),a=new Map;for(let r of e){if(!t.has(r.tool_name))continue;let e=a.get(r.date)??N(r.date,s);e[r.tool_name]=(Number(e[r.tool_name])||0)+r.spend,a.set(r.date,e)}return[...a.values()].sort((e,s)=>e.date.localeCompare(s.date))})(R?.daily??[],Y).map(e=>({...e,date:T(String(e.date))})),[R,Y]),ee=(0,l.useMemo)(()=>u.SEQUENTIAL_COLOR_RAMP.slice(0,Math.max(Y.length,1)),[Y]);return(0,s.jsxs)("div",{className:"w-full space-y-6",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-end gap-4",children:[(0,s.jsx)("span",{className:"text-sm text-muted-foreground",children:"Spend is bucketed by UTC day"}),(0,s.jsx)(m.default,{value:a,onValueChange:r})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-4",children:[(0,s.jsx)(A,{label:"Total saved",value:j(D),hint:x||v?"Loading...":"Compression + prompt caching + auto-router"}),(0,s.jsx)(A,{label:"Compression savings",value:j(F),hint:`${(0,f.formatNumberWithCommas)(z)} tokens compressed`,info:"Tokens Headroom removed before the call, priced at the model's input rate."}),(0,s.jsx)(A,{label:"Prompt caching savings",value:j(B),hint:"Cache read discount",info:"Tokens the provider served from cache, priced at the discount between the input and cache-read rates."}),(0,s.jsx)(A,{label:"Auto-router savings",value:j(I),hint:"vs. the priciest model it could pick",info:"What this traffic would have cost had every request gone to the most expensive model the auto-router can route to, minus what it actually cost. Switching leaves the new model with a cold cache, so it pays to write the prompt again while the baseline is priced as already warm; a route that thrashes the cache can total below zero, and a genuine first turn, where neither side had anything cached, is undercounted."})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-3",children:[(0,s.jsxs)(h.Card,{className:"lg:col-span-2",children:[(0,s.jsxs)(h.CardHeader,{children:[(0,s.jsx)(h.CardTitle,{children:"Savings"}),(0,s.jsx)(h.CardDescription,{children:K}),(0,s.jsxs)(h.CardAction,{className:"flex flex-wrap items-center justify-end gap-x-4 gap-y-2",children:[(0,s.jsx)(d.CustomLegend,{categories:k,colors:C}),(0,s.jsx)(p.Tabs,{value:O,onValueChange:e=>q(e),children:(0,s.jsxs)(p.TabsList,{children:[(0,s.jsx)(p.TabsTrigger,{value:"cumulative",children:"Cumulative"}),(0,s.jsx)(p.TabsTrigger,{value:"per-interval",children:V})]})})]})]}),(0,s.jsx)(h.CardContent,{children:"cumulative"===O?(0,s.jsx)(i.AreaChart,{data:U,index:"date",categories:k,colors:C,valueFormatter:j,showLegend:!1,showDots:U.length<=31}):(0,s.jsx)(o.BarChart,{data:U,index:"date",categories:k,colors:C,valueFormatter:j,showLegend:!1})})]}),(0,s.jsxs)(h.Card,{children:[(0,s.jsx)(h.CardHeader,{children:(0,s.jsx)(h.CardTitle,{children:"Savings by driver"})}),(0,s.jsx)(h.CardContent,{children:(0,s.jsx)(c.DonutChart,{className:"h-80",data:G,index:"driver",category:"usd",colors:G.map(e=>e.color),valueFormatter:j,showLabel:!0,label:j(Q)})})]})]}),(0,s.jsxs)(h.Card,{children:[(0,s.jsxs)(h.CardHeader,{children:[(0,s.jsx)(h.CardTitle,{children:"Spend by tool"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Spend on requests that invoked each tool (MCP and client-side tools); declaring a tool without invoking it does not count. A request that invoked multiple tools counts its full spend toward each, so this attributes rather than partitions spend."})]}),(0,s.jsx)(h.CardContent,{children:0===J.length?(0,s.jsx)("p",{className:"py-8 text-center text-sm text-muted-foreground",children:H?"Loading...":"No tool usage in this range."}):(0,s.jsxs)("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"mb-2 text-sm font-medium text-muted-foreground",children:"Total by tool"}),(0,s.jsx)(o.BarChart,{data:X,index:"tool_name",categories:["spend"],colors:ee,colorByDatum:!0,layout:"vertical",yAxisWidth:140,maxBarSize:64,showLegend:!1,valueFormatter:j})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"mb-2 text-sm font-medium text-muted-foreground",children:"Daily spend by tool"}),(0,s.jsx)(d.CustomLegend,{categories:Y,colors:ee}),(0,s.jsx)(o.BarChart,{data:Z,index:"date",categories:Y,colors:ee,stack:!0,maxBarSize:64,valueFormatter:j,showLegend:!1})]})]})})]})]})};var L=e.i(464571),M=e.i(808613),$=e.i(311451),R=e.i(790848),H=e.i(727749);let F="headroom",B=e=>(e.litellm_params?.guardrail??"").toLowerCase()===F,I=({accessToken:e})=>{let[t]=M.Form.useForm(),[a,r]=(0,l.useState)([]),[n,i]=(0,l.useState)(!0),[o,d]=(0,l.useState)(!1),c=(0,l.useCallback)(()=>{e&&(0,g.getGuardrailsList)(e).then(e=>r((e.guardrails??[]).filter(B))).catch(e=>{console.error("Failed to load compression guardrails:",e),H.default.fromBackend("Failed to load compression guardrails")}).finally(()=>i(!1))},[e]);(0,l.useEffect)(()=>{c()},[c]);let u=async s=>{if(e){d(!0);try{let a;await (0,g.createGuardrailCall)(e,{guardrail_name:(a={name:s.name,apiBase:s.apiBase,defaultOn:s.defaultOn??!0}).name.trim(),litellm_params:{guardrail:F,mode:"pre_call",api_base:a.apiBase.trim(),default_on:a.defaultOn}}),H.default.success("Compression guardrail created"),t.resetFields(),await c()}catch(e){console.error("Failed to create compression guardrail:",e),H.default.fromBackend("Failed to create compression guardrail")}finally{d(!1)}}};return(0,s.jsxs)("div",{className:"w-full space-y-6",children:[(0,s.jsxs)(h.Card,{children:[(0,s.jsx)(h.CardHeader,{children:(0,s.jsx)(h.CardTitle,{children:"Headroom prompt compression"})}),(0,s.jsxs)(h.CardContent,{children:[(0,s.jsxs)("p",{className:"mb-4 text-sm text-muted-foreground",children:["Headroom is a native LiteLLM guardrail that compresses your prompts before they reach the model, so you pay for fewer input tokens. The tokens it removes are priced and shown on the Usage tab as compression savings."," ",(0,s.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/headroom",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 underline",children:"Headroom setup docs"})]}),n&&(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading..."}),!n&&0===a.length&&(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"No prompt compression guardrails configured yet. Add one below to start saving on input tokens"}),!n&&a.length>0&&(0,s.jsx)("ul",{className:"divide-y divide-gray-200",children:a.map(e=>(0,s.jsxs)("li",{className:"flex items-center justify-between py-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:e.guardrail_name}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:e.litellm_params?.api_base??""})]}),(0,s.jsx)("span",{className:`rounded-full px-2 py-0.5 text-xs font-medium ${e.litellm_params?.default_on?"bg-emerald-100 text-emerald-800":"bg-gray-100 text-gray-600"}`,children:e.litellm_params?.default_on?"Always on":"Opt-in"})]},e.guardrail_id))})]})]}),(0,s.jsxs)(h.Card,{children:[(0,s.jsx)(h.CardHeader,{children:(0,s.jsx)(h.CardTitle,{children:"Add Headroom compression guardrail"})}),(0,s.jsx)(h.CardContent,{children:(0,s.jsxs)(M.Form,{form:t,layout:"vertical",requiredMark:!1,onFinish:u,initialValues:{defaultOn:!0},children:[(0,s.jsx)(M.Form.Item,{name:"name",label:"Name",rules:[{required:!0,message:"Name is required"}],children:(0,s.jsx)($.Input,{placeholder:"headroom-compression"})}),(0,s.jsx)(M.Form.Item,{name:"apiBase",label:"Headroom API base",tooltip:"Base URL of your Headroom compression service (LiteLLM calls its /v1/compress endpoint)",extra:"The URL where your Headroom compression service is hosted",rules:[{required:!0,message:"API base is required"}],children:(0,s.jsx)($.Input,{placeholder:"https://your-headroom-endpoint"})}),(0,s.jsx)(M.Form.Item,{name:"defaultOn",label:"Apply to all requests",valuePropName:"checked",children:(0,s.jsx)(R.Switch,{})}),(0,s.jsx)("div",{className:"mb-4 rounded-lg border border-yellow-200 bg-yellow-50 p-3",children:(0,s.jsxs)("p",{className:"text-sm text-yellow-800",children:["Applying compression to all requests is available to all users. Enabling it selectively per key or team is a LiteLLM Enterprise feature. Get a trial key"," ",(0,s.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"})]})}),(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(L.Button,{type:"primary",htmlType:"submit",loading:o,children:"Add guardrail"})})]})})]})]})};var z=e.i(863679),D=e.i(425063),O=e.i(475254);let q=(0,O.default)("arrow-up",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]),E=(0,O.default)("arrow-up-down",[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]);var U=e.i(784774),V=e.i(746798);let W={uncachedPromptTokens:"desc",cacheHitRatio:"asc",potentialSavings:"desc"},K=({info:e})=>(0,s.jsxs)(V.Tooltip,{children:[(0,s.jsx)(V.TooltipTrigger,{render:(0,s.jsx)("span",{className:"inline-flex","aria-label":e}),children:(0,s.jsx)(n.Info,{className:"h-3 w-3 text-gray-400"})}),(0,s.jsx)(V.TooltipContent,{className:"max-w-xs",children:e})]}),G=({column:e,label:t,info:a,sort:r,onSort:l})=>{let n=r.column===e,i="asc"===r.dir?q:D.ArrowDown;return(0,s.jsx)(U.TableHead,{className:"text-right",children:(0,s.jsxs)("span",{className:"inline-flex items-center justify-end gap-1",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>l(e),"aria-label":`Sort by ${t}`,className:"inline-flex items-center gap-1 font-medium hover:text-foreground",children:[t,(0,s.jsx)(n?i:E,{className:`h-3 w-3 ${n?"text-foreground":"text-gray-400"}`})]}),(0,s.jsx)(K,{info:a})]})})},Q=({activity:e})=>{let{dateValue:t,onDateChange:a,results:r,loading:n,isFetchingMore:i}=e,[o,d]=(0,l.useState)("key"),[c,u]=(0,l.useState)({column:"potentialSavings",dir:"desc"}),x=(0,l.useMemo)(()=>((e,s="key",t=10)=>{let a="model"===s?(e=>{let s=new Map;for(let t of e)for(let[e,a]of Object.entries(t.breakdown?.models??{})){if(!v(e))continue;let t=s.get(e)??b();s.set(e,y(t,a.metrics,null,null))}return s})(e):(e=>{let s=new Map;for(let t of e)for(let[e,a]of Object.entries(t.breakdown?.api_keys??{})){let t=s.get(e)??b();s.set(e,y(t,a.metrics,a.metadata?.key_alias??null,a.metadata?.team_id??null))}return s})(e),r=[...a.values()].reduce((e,s)=>({cacheReadTokens:e.cacheReadTokens+s.cacheReadTokens,realizedCachingSavings:e.realizedCachingSavings+s.realizedCachingSavings}),{cacheReadTokens:0,realizedCachingSavings:0}),l=r.cacheReadTokens>0?r.realizedCachingSavings/r.cacheReadTokens:null;return{rows:[...a.entries()].map(([e,t])=>{let a=Math.max(0,t.promptTokens-t.cacheReadTokens-t.cacheCreationTokens);return{id:e,label:"model"===s?e:t.alias??`${e.slice(0,8)}...`,sublabel:"model"===s?null:t.teamId,uncachedPromptTokens:a,cacheHitRatio:t.promptTokens>0?t.cacheReadTokens/t.promptTokens:0,potentialSavings:null!=l?a*l:null}}).filter(e=>e.uncachedPromptTokens>0).sort((e,s)=>null!=l?(s.potentialSavings??0)-(e.potentialSavings??0):s.uncachedPromptTokens-e.uncachedPromptTokens).slice(0,t),discountPerToken:l}})(r,o),[r,o]),g=(0,l.useMemo)(()=>[...x.rows].sort((e,s)=>{let t,a;return t=e[c.column],a=s[c.column],null==t&&null==a?0:null==t?1:null==a?-1:"asc"===c.dir?t-a:a-t}),[x.rows,c]),N=e=>u(s=>s.column===e?{column:e,dir:"asc"===s.dir?"desc":"asc"}:{column:e,dir:W[e]}),w="model"===o?"Models":"Keys",k="model"===o?"Model":"Key",C="model"===o?"model":"key";return(0,s.jsx)(V.TooltipProvider,{delay:300,children:(0,s.jsxs)(h.Card,{children:[(0,s.jsxs)(h.CardHeader,{children:[(0,s.jsxs)("div",{className:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsxs)(h.CardTitle,{children:["Cache leakage by ","model"===o?"model":"virtual key"]}),(0,s.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground line-clamp-2",children:[w," sending large volumes of uncached input with a low cache hit rate are likely missing prompt caching. Potential savings is approximate: uncached input priced at the realized cache-read discount."]})]}),(0,s.jsx)("div",{className:"shrink-0",children:(0,s.jsx)(m.default,{value:t,onValueChange:a})})]}),(0,s.jsx)(p.Tabs,{value:o,onValueChange:e=>d("model"===e?"model":"key"),children:(0,s.jsxs)(p.TabsList,{children:[(0,s.jsx)(p.TabsTrigger,{value:"key",children:"By virtual key"}),(0,s.jsx)(p.TabsTrigger,{value:"model",children:"By model"})]})})]}),(0,s.jsx)(h.CardContent,{children:0===g.length?(0,s.jsx)("p",{className:"py-8 text-center text-sm text-muted-foreground",children:n||i?"Loading...":`No ${C} usage in this range.`}):(0,s.jsxs)(U.Table,{children:[(0,s.jsx)(U.TableHeader,{children:(0,s.jsxs)(U.TableRow,{children:[(0,s.jsx)(U.TableHead,{children:k}),(0,s.jsx)(G,{column:"uncachedPromptTokens",label:"Uncached input tokens",info:"Input tokens you sent in this range that weren't served from or written to the cache",sort:c,onSort:N}),(0,s.jsx)(G,{column:"cacheHitRatio",label:"Cache hit rate",info:"Share of your input tokens that were served from the cache",sort:c,onSort:N}),(0,s.jsx)(G,{column:"potentialSavings",label:"Potential savings",info:"About how much you'd save if this uncached input used prompt caching. Estimated as uncached input tokens times the per-token discount your cached traffic already gets (realized cache savings ÷ cache-read tokens).",sort:c,onSort:N})]})}),(0,s.jsx)(U.TableBody,{children:g.map(e=>{let t;return(0,s.jsxs)(U.TableRow,{children:[(0,s.jsxs)(U.TableCell,{className:"font-medium",children:[e.label,e.sublabel&&(0,s.jsxs)("span",{className:"ml-1 text-xs text-muted-foreground",children:["(",e.sublabel,")"]})]}),(0,s.jsx)(U.TableCell,{className:"text-right",children:(0,f.formatNumberWithCommas)(e.uncachedPromptTokens)}),(0,s.jsx)(U.TableCell,{className:"text-right",children:(t=e.cacheHitRatio,`${(0,f.formatNumberWithCommas)(100*t,1)}%`)}),(0,s.jsx)(U.TableCell,{className:"text-right",children:null==e.potentialSavings?"—":j(e.potentialSavings)})]},e.id)})})]})})]})})},J=({accessToken:e,activity:t})=>{let[a,r]=(0,l.useState)([]),n=(0,l.useCallback)(()=>{e&&(0,g.getGeneralSettingsCall)(e).then(e=>r(e)).catch(e=>{console.error("Failed to load prompt caching settings:",e),H.default.fromBackend("Failed to load prompt caching settings")})},[e]);return((0,l.useEffect)(()=>{n()},[n]),e)?(0,s.jsxs)("div",{className:"w-full space-y-6",children:[(0,s.jsx)(z.PromptCachingPanel,{accessToken:e,settings:a,onChange:(e,s)=>{r(t=>t.map(t=>t.field_name===e?{...t,field_value:s}:t))}}),(0,s.jsx)(Q,{activity:t})]}):null};var Y=e.i(487486),X=e.i(967489),Z=e.i(431703);let ee="__all__",es={"30d":30,"7d":7,"24h":1},et={"30d":"Last 30 days","7d":"Last 7 days","24h":"Last 24 hours"},ea=e=>`${e.router_name} ${e.router_type}`,er=(e,s)=>s.some(s=>s!==e&&s.router_name===e.router_name)?`${e.router_name} (${e.router_type})`:e.router_name,el=(e,s)=>{let t=e.groups.find(e=>ea(e)===s);return s!==ee&&t?{label:er(t,e.groups),stats:t}:{label:"All auto-routers",stats:e.totals}},en=e=>e.same_model.turns+e.first_visit.turns+e.return_to_tier.turns,ei=(e,s)=>s>0?Math.round(100*e/s):0,eo=(e,s=1)=>`${e.toFixed(s)}%`;var ed=e.i(768371);let ec=({children:e})=>(0,s.jsx)("p",{className:"py-8 text-center text-sm text-muted-foreground",children:e}),eu=({label:e,value:t})=>(0,s.jsxs)(h.Card,{size:"sm",children:[(0,s.jsx)(h.CardHeader,{children:(0,s.jsx)(h.CardTitle,{className:"text-sm font-normal text-muted-foreground",children:e})}),(0,s.jsx)(h.CardContent,{children:(0,s.jsx)("p",{className:"text-3xl font-semibold text-foreground",children:t})})]}),em=({view:e})=>{let t=e.stats,a=t.saved_spend>=0;return(0,s.jsx)(h.Card,{className:"overflow-hidden py-0",children:(0,s.jsxs)("div",{className:"grid md:grid-cols-[4fr_3fr_5fr]",children:[(0,s.jsxs)("div",{className:"flex flex-col justify-center gap-3 p-6",children:[(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Total estimated savings"}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,s.jsx)("p",{className:"text-5xl font-semibold tracking-tight text-foreground",children:j(t.saved_spend)}),(0,s.jsxs)(Y.Badge,{variant:"secondary",className:a?"bg-emerald-50 text-emerald-700":"bg-red-50 text-destructive",children:[a?"-":"+",Math.abs(t.saved_pct).toFixed(0),"%"]})]})]}),(0,s.jsx)("div",{className:"flex flex-col justify-center px-6 pb-6 md:py-6",children:(0,s.jsxs)("dl",{className:"divide-y text-sm",children:[(0,s.jsxs)("div",{className:"flex items-baseline justify-between gap-6 py-3",children:[(0,s.jsx)("dt",{className:"text-muted-foreground",children:"Actual auto-router spend"}),(0,s.jsx)("dd",{className:"font-medium tabular-nums text-foreground",children:j(t.spend)})]}),(0,s.jsxs)("div",{className:"flex items-baseline justify-between gap-6 py-3",children:[(0,s.jsx)("dt",{className:"text-muted-foreground",children:"Estimated spend at highest-cost model"}),(0,s.jsx)("dd",{className:"font-medium tabular-nums text-foreground",children:j(t.baseline_spend)})]})]})}),(0,s.jsxs)("div",{className:"flex flex-col border-t md:border-t-0 md:border-l",children:[(0,s.jsxs)("div",{className:"grid flex-1 grid-cols-2 divide-x",children:[(0,s.jsxs)("div",{className:"flex flex-col justify-center gap-1 px-6 py-4",children:[(0,s.jsx)("p",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:"Total sessions"}),(0,s.jsx)("p",{className:"text-3xl font-semibold text-foreground",children:t.sessions.toLocaleString()})]}),(0,s.jsxs)("div",{className:"flex flex-col justify-center gap-1 px-6 py-4",children:[(0,s.jsx)("p",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:"Total turns"}),(0,s.jsx)("p",{className:"text-3xl font-semibold text-foreground",children:t.turns.toLocaleString()})]})]}),(0,s.jsx)("dl",{className:"flex flex-col divide-y border-t text-sm",children:(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2 px-6 py-3",children:[(0,s.jsx)("dt",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:"Avg saved per session"}),(0,s.jsx)("dd",{className:"text-lg font-semibold tabular-nums text-foreground",children:j(t.saved_per_session)})]})})]})]})})},eh=({buckets:e})=>{let t=e.filter(e=>e.turns>0);return(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)("div",{className:"flex h-2.5 w-full gap-0.5 overflow-hidden rounded-sm",role:"img","aria-label":"Share of turns by bucket",children:t.map(e=>(0,s.jsx)("div",{className:`${e.fill} first:rounded-l-sm last:rounded-r-sm`,style:{width:`${e.sharePct}%`},title:`${e.label}: ${e.turns.toLocaleString()} turns`},e.key))}),(0,s.jsx)("div",{className:"flex w-full gap-0.5 text-[11px] text-muted-foreground",children:t.map(e=>(0,s.jsxs)("span",{className:"whitespace-nowrap",style:{width:`${e.sharePct}%`},children:[e.sharePct,"%"]},e.key))})]})},ex=({buckets:e})=>(0,s.jsxs)(U.Table,{className:"border-b",children:[(0,s.jsx)(U.TableHeader,{children:(0,s.jsxs)(U.TableRow,{className:"hover:bg-transparent",children:[(0,s.jsx)(U.TableHead,{className:"text-[11px] uppercase tracking-wide",children:"Bucket"}),(0,s.jsx)(U.TableHead,{className:"text-right text-[11px] uppercase tracking-wide",children:"Turns"}),(0,s.jsx)(U.TableHead,{className:"w-1/2"}),(0,s.jsx)(U.TableHead,{className:"text-right text-[11px] uppercase tracking-wide",children:"Hit rate"})]})}),(0,s.jsx)(U.TableBody,{children:e.map(e=>(0,s.jsxs)(U.TableRow,{className:"hover:bg-transparent",children:[(0,s.jsx)(U.TableCell,{className:"text-foreground",children:(0,s.jsxs)("span",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:`inline-block size-2 shrink-0 rounded-sm ${e.fill}`,"aria-hidden":!0}),(0,s.jsxs)("span",{children:[e.label,(0,s.jsx)("span",{className:"block text-xs font-normal text-muted-foreground",children:e.sublabel})]})]})}),(0,s.jsx)(U.TableCell,{className:"text-right align-middle tabular-nums text-foreground",children:e.turns.toLocaleString()}),(0,s.jsx)(U.TableCell,{className:"align-middle",children:(0,s.jsx)("div",{className:"h-1.5 w-full rounded-full bg-muted",children:(0,s.jsx)("div",{className:"h-full rounded-full bg-foreground",style:{width:`${e.hitRatePct}%`},"aria-hidden":!0})})}),(0,s.jsx)(U.TableCell,{className:"text-right align-middle font-medium tabular-nums text-foreground",children:eo(e.hitRatePct)})]},e.key))})]}),ep=({cache:e})=>{let t,a,r=(t=en(e),[{key:"same_model",label:"Same model",sublabel:"previous turn → same tier",turns:e.same_model.turns,sharePct:ei(e.same_model.turns,t),hitRatePct:e.same_model.hit_rate_pct,fill:"bg-foreground"},{key:"first_visit",label:"First visit",sublabel:"previous turn → a tier not used yet",turns:e.first_visit.turns,sharePct:ei(e.first_visit.turns,t),hitRatePct:e.first_visit.hit_rate_pct,fill:"bg-foreground/30"},{key:"return_to_tier",label:"Return to tier",sublabel:"previous turn → a tier used earlier",turns:e.return_to_tier.turns,sharePct:ei(e.return_to_tier.turns,t),hitRatePct:e.return_to_tier.hit_rate_pct,fill:"bg-foreground/60"}]),l=en(e),n=(a=en(e))<=0?null:100*e.return_misses_expired/a;return(0,s.jsx)(h.Card,{className:"overflow-hidden py-0",children:(0,s.jsxs)("div",{className:"grid lg:grid-cols-[1fr_3fr]",children:[(0,s.jsxs)("div",{className:"flex flex-col border-b p-6 lg:border-b-0 lg:border-r",children:[(0,s.jsxs)("div",{className:"flex flex-1 flex-col justify-center gap-3",children:[(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Cache hit rate"}),(0,s.jsx)("p",{className:"text-5xl font-semibold tracking-tight text-foreground",children:eo(e.hit_rate_pct)})]}),null===n?null:(0,s.jsx)(V.TooltipProvider,{delay:200,children:(0,s.jsxs)(V.Tooltip,{children:[(0,s.jsxs)(V.TooltipTrigger,{render:(0,s.jsx)("button",{type:"button",className:"flex w-full cursor-default items-baseline justify-between gap-2 border-t pt-3 text-left"}),children:[(0,s.jsx)("span",{className:"text-sm text-muted-foreground underline decoration-dotted underline-offset-2",children:"Expired-miss"}),(0,s.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:eo(n)})]}),(0,s.jsx)(V.TooltipContent,{className:"max-w-64",children:"share of all measured turns that missed cache because a return to an earlier tier came after its TTL lapsed"})]})})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 p-6",children:[(0,s.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,s.jsx)("p",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:"Share of turns"}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground",children:[(0,s.jsx)("span",{className:"text-lg font-semibold tabular-nums text-foreground",children:l.toLocaleString()})," turns measured"]})]}),(0,s.jsx)(eh,{buckets:r}),(0,s.jsx)(ex,{buckets:r}),e.unordered_turns>0&&(0,s.jsxs)("p",{className:"text-xs text-muted-foreground",children:[e.unordered_turns.toLocaleString()," turns arrived out of order across pods and are not bucketed"]})]})]})})},eg=({isPending:e,error:t,data:a,selectedKey:r})=>{var l;if(e)return(0,s.jsx)(ec,{children:"Loading auto-router usage..."});if(t instanceof Z.ApiError&&403===t.status)return(0,s.jsx)(ec,{children:"Auto-router usage is visible to proxy admin roles only"});if(t||!a)return(0,s.jsx)(ec,{children:"Auto-router usage is unavailable right now"});if(0===a.groups.length)return(0,s.jsx)(ec,{children:"No auto-router sessions in this window yet"});let n=el(a,r),i=n.stats;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(em,{view:n}),(0,s.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[(0,s.jsx)(eu,{label:"Avg turns per session",value:i.avg_turns_per_session.toFixed(1)}),(0,s.jsx)(eu,{label:"Avg session length",value:(l=i.avg_session_seconds)<60?`${Math.round(l)}s`:l<3600?`${(l/60).toFixed(1)}m`:`${(l/3600).toFixed(1)}h`}),(0,s.jsx)(eu,{label:"Avg tokens per session",value:(0,f.formatNumberWithCommas)(i.avg_tokens_per_session,1,!0)})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Compares your actual routed spend with the estimated cost of using only the most expensive model configured in the auto-router. It accounts for both the cache savings from staying on one model and the added cache costs from switching models."}),(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-baseline gap-2",children:[(0,s.jsx)("h3",{className:"text-lg font-semibold text-foreground",children:"Auto-router prompt caching"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"every turn falls in exactly one bucket, by what the router did"})]}),(0,s.jsx)(ep,{cache:i.cache})]})]})},ef=({accessToken:e})=>{let t,[a,r]=(0,l.useState)("30d"),{data:n,isPending:i,error:o}=ed.$api.useQuery("get","/auto_router/benchmarks",{params:{query:{start_date:new Date((t=new Date).getTime()-24*es[a]*36e5).toISOString().slice(0,10),end_date:t.toISOString().slice(0,10)}}},{enabled:!!e,retry:!1}),[d,c]=(0,l.useState)(ee),u=n?.groups??[],m=n?el(n,d).label:"All auto-routers";return(0,s.jsxs)("div",{className:"w-full space-y-6",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-xl font-semibold text-foreground",children:"Auto-router usage"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:et[a]})]}),(0,s.jsxs)("div",{className:"flex w-full flex-col gap-3 sm:w-auto sm:flex-row sm:items-center",children:[(0,s.jsx)(p.Tabs,{value:a,onValueChange:e=>r("7d"===e||"24h"===e?e:"30d"),children:(0,s.jsxs)(p.TabsList,{children:[(0,s.jsx)(p.TabsTrigger,{value:"30d",children:"30d"}),(0,s.jsx)(p.TabsTrigger,{value:"7d",children:"7d"}),(0,s.jsx)(p.TabsTrigger,{value:"24h",children:"24h"})]})}),(0,s.jsx)("div",{className:"w-full sm:w-64",children:(0,s.jsxs)(X.Select,{value:d,onValueChange:e=>c(e??ee),children:[(0,s.jsx)(X.SelectTrigger,{className:"w-full",children:(0,s.jsx)(X.SelectValue,{children:m})}),(0,s.jsxs)(X.SelectContent,{children:[(0,s.jsx)(X.SelectItem,{value:ee,children:"All auto-routers"}),u.map(e=>(0,s.jsx)(X.SelectItem,{value:ea(e),children:er(e,u)},ea(e)))]})]})})]})]}),(0,s.jsx)(eg,{isPending:i,error:o,data:n,selectedKey:d})]})};var ej=e.i(708347),ev=e.i(567425);let eb=({accessToken:e,userId:n,userRole:i})=>{let o=((e,s,t)=>{let a=(0,l.useMemo)(()=>new Date(new Date().getTime()-2592e6),[]),r=(0,l.useMemo)(()=>new Date,[]),[n,i]=(0,l.useState)({from:a,to:r}),o=n.from??null,d=n.to??null,c=ej.all_admin_roles.includes(t)?null:s,{data:u,loading:m,isFetchingMore:h}=(0,ev.usePaginatedDailyActivity)({fetchFn:g.userDailyActivityCall,args:[e,o,d,c,!0],enabled:!!e&&!!o&&!!d});return{dateValue:n,onDateChange:i,results:u.results,loading:m,isFetchingMore:h}})(e,n,i),d=[{key:"usage",label:"Overall",children:(0,s.jsx)(P,{accessToken:e,activity:o})},{key:"compression",label:"Prompt Compression",children:(0,s.jsx)(I,{accessToken:e})},{key:"caching",label:"Prompt Caching",children:(0,s.jsx)(J,{accessToken:e,activity:o})},{key:"autorouter-usage",label:"Auto-Router",children:(0,s.jsx)(ef,{accessToken:e})}];return(0,s.jsxs)("div",{className:"w-full space-y-6 p-6",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(t.PiggyBank,{className:"size-6 text-emerald-600",strokeWidth:1.75}),(0,s.jsx)("h1",{className:"text-xl font-semibold text-foreground",children:"Cost Optimization"})]}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Track and configure the mechanisms that save you money: prompt compression and prompt caching. Auto routers live under Models + Endpoints, on the Auto-Routers tab"})]}),(0,s.jsx)(a.Alert,{type:"info",showIcon:!0,message:"This is an experimental dashboard",description:(0,s.jsxs)("span",{children:["Have feedback? Join the discussion"," ",(0,s.jsx)("a",{href:"https://github.com/BerriAI/litellm/discussions/32168",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 underline",children:"here"})]})}),(0,s.jsx)(r.Tabs,{defaultActiveKey:"usage",items:d})]})};var ey=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userId:t,userRole:a}=(0,ey.default)();return(0,s.jsx)(eb,{accessToken:e,userId:t,userRole:a})}],992156)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0ikhgrs0xvkyu.js b/litellm/proxy/_experimental/out/_next/static/chunks/0ikhgrs0xvkyu.js new file mode 100644 index 00000000000..757f7705301 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0ikhgrs0xvkyu.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,72713,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let s={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z"}}]},name:"calendar",theme:"outlined"};var a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["CalendarOutlined",0,n],72713)},278587,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:"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"}))});e.s(["RefreshIcon",0,r],278587)},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)},502547,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 5l7 7-7 7"}))});e.s(["ChevronRightIcon",0,r],502547)},953960,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(599724),a=e.i(389083);let n=r.forwardRef(function(e,t){return r.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),r.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 l=e.i(871943),i=e.i(502547),o=e.i(592968),c=e.i(602869),u=e.i(234713);e.s(["default",0,function({mcpServers:e,mcpAccessGroups:d=[],mcpToolPermissions:p={},mcpToolsets:m=[],accessToken:h}){let[x,g]=(0,r.useState)([]),[f,v]=(0,r.useState)([]),[b,y]=(0,r.useState)(new Set),[j,w]=(0,r.useState)(new Set);(0,r.useEffect)(()=>{(async()=>{if(h&&e.length>0)try{let e=await (0,c.fetchMCPServers)(h);e&&Array.isArray(e)?g(e):e.data&&Array.isArray(e.data)&&g(e.data)}catch(e){console.error("Error fetching MCP servers:",e)}})()},[h,e.length]),(0,r.useEffect)(()=>{(async()=>{if(h&&m.length>0)try{let e=await (0,c.fetchMCPToolsets)(h),t=Array.isArray(e)?e.filter(e=>m.includes(e.toolset_id)):[];v(t)}catch(e){console.error("Error fetching toolsets:",e)}})()},[h,m.length]);let N=e.includes(u.NO_MCP_SERVERS_SENTINEL),k=e.includes(u.ALL_PROXY_MCP_SERVERS_SENTINEL),S=[...e.filter(e=>e!==u.NO_MCP_SERVERS_SENTINEL&&e!==u.ALL_PROXY_MCP_SERVERS_SENTINEL).map(e=>({type:"server",value:e})),...d.map(e=>({type:"accessGroup",value:e}))],_=S.length+m.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)(n,{className:"h-4 w-4 text-blue-600"}),(0,t.jsx)(s.Text,{className:"font-semibold text-gray-900",children:"MCP Servers"}),(0,t.jsx)(a.Badge,{color:N?"red":"blue",size:"xs",children:N?"Blocked":k?"All":_})]}),N?(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)(n,{className:"h-4 w-4 text-red-400"}),(0,t.jsx)(s.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)(n,{className:"h-4 w-4 text-blue-400"}),(0,t.jsx)(s.Text,{className:"text-blue-700 text-sm",children:"All Proxy MCP Servers"})]}):_>0?(0,t.jsxs)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:[S.map((e,r)=>{let s="server"===e.type?p[e.value]:void 0,a=s&&s.length>0,n=b.has(e.value);return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>{var t;return a&&(t=e.value,void y(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 ${a?"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)(o.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||t.server_name||e} (${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"})]})}),a&&(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:s.length}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===s.length?"tool":"tools"}),n?(0,t.jsx)(l.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(i.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),a&&n&&(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:s.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)}),m.length>0&&m.map((e,r)=>{let s=f.find(t=>t.toolset_id===e),a=j.has(e),n=s?.tools.length??0;return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>n>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 ${n>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:s?.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"})]}),n>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:n}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===n?"tool":"tools"}),a?(0,t.jsx)(l.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(i.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),n>0&&a&&s&&(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:s.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)(n,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(s.Text,{className:"text-gray-500 text-sm",children:"No MCP servers, access groups, or toolsets configured"})]})]})}],953960)},384767,e=>{"use strict";var t=e.i(843476),r=e.i(599724),s=e.i(271645),a=e.i(389083);let n=s.forwardRef(function(e,t){return s.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),s.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 l=e.i(602869);let i=function({vectorStores:e,accessToken:i}){let[o,c]=(0,s.useState)([]);return(0,s.useEffect)(()=>{(async()=>{if(i&&0!==e.length)try{let e=await (0,l.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)(n,{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)(a.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 s;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:(s=o.find(t=>t.vector_store_id===e))?`${s.vector_store_name||s.vector_store_id} (${s.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)(n,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(r.Text,{className:"text-gray-500 text-sm",children:"No vector stores configured"})]})]})};var o=e.i(953960);let c=s.forwardRef(function(e,t){return s.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),s.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"}))});var u=e.i(592968);let d=function({agents:e,agentAccessGroups:n=[],accessToken:i}){let[o,d]=(0,s.useState)([]);(0,s.useEffect)(()=>{(async()=>{if(i&&e.length>0)try{let e=await (0,l.getAgentsList)(i);e&&e.agents&&Array.isArray(e.agents)&&d(e.agents)}catch(e){console.error("Error fetching agents:",e)}})()},[i,e.length]);let p=[...e.map(e=>({type:"agent",value:e})),...n.map(e=>({type:"accessGroup",value:e}))],m=p.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)(c,{className:"h-4 w-4 text-purple-600"}),(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"Agents"}),(0,t.jsx)(a.Badge,{color:"purple",size:"xs",children:m})]}),m>0?(0,t.jsx)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:p.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)(u.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)(c,{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:s="card",className:a="",accessToken:n}){let l=e?.vector_stores||[],c=e?.mcp_servers||[],u=e?.mcp_access_groups||[],p=e?.mcp_tool_permissions||{},m=e?.mcp_toolsets||[],h=e?.agents||[],x=e?.agent_access_groups||[],g=e?.search_tools||[],f=(0,t.jsxs)("div",{className:"card"===s?"grid grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-3 gap-6":"space-y-4",children:[(0,t.jsx)(i,{vectorStores:l,accessToken:n}),(0,t.jsx)(o.default,{mcpServers:c,mcpAccessGroups:u,mcpToolPermissions:p,mcpToolsets:m,accessToken:n}),(0,t.jsx)(d,{agents:h,agentAccessGroups:x,accessToken:n}),(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===g.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:g.join(", ")})]})]});return"card"===s?(0,t.jsxs)("div",{className:`@container bg-white border border-gray-200 rounded-lg p-6 ${a}`,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:`${a}`,children:[(0,t.jsx)(r.Text,{className:"font-medium text-gray-900 mb-3",children:"Object Permissions"}),f]})}],384767)},891547,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(199133),a=e.i(602869);e.s(["default",0,({onChange:e,value:n,className:l,accessToken:i,disabled:o})=>{let[c,u]=(0,r.useState)([]),[d,p]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(i){p(!0);try{let e=await (0,a.getGuardrailsList)(i);e.guardrails&&u(e.guardrails)}catch(e){console.error("Error fetching guardrails:",e)}finally{p(!1)}}})()},[i]),(0,t.jsx)("div",{children:(0,t.jsx)(s.Select,{mode:"multiple",disabled:o,placeholder:o?"Setting guardrails is a premium feature.":"Select guardrails",onChange:t=>{e(t)},value:n,loading:d,className:l,allowClear:!0,options:c.map(e=>({label:`${e.guardrail_name}`,value:e.guardrail_name})),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})}])},921511,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(199133),a=e.i(602869);function n(e){return e.filter(e=>(e.version_status??"draft")!=="draft").map(e=>{var t;let r=e.version_number??1,s=e.version_status??"draft";return{label:`${e.policy_name} — v${r} (${s})${e.description?` — ${e.description}`:""}`,value:"production"===s?e.policy_name:e.policy_id?(t=e.policy_id,`policy_${t}`):e.policy_name}})}e.s(["default",0,({onChange:e,value:l,className:i,accessToken:o,disabled:c,onPoliciesLoaded:u})=>{let[d,p]=(0,r.useState)([]),[m,h]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(o){h(!0);try{let e=await (0,a.getPoliciesList)(o);e.policies&&(p(e.policies),u?.(e.policies))}catch(e){console.error("Error fetching policies:",e)}finally{h(!1)}}})()},[o,u]),(0,t.jsx)("div",{children:(0,t.jsx)(s.Select,{mode:"multiple",disabled:c,placeholder:c?"Setting policies is a premium feature.":"Select policies (production or published versions)",onChange:t=>{e(t)},value:l,loading:m,className:i,allowClear:!0,options:n(d),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})},"getPolicyOptionEntries",0,n])},595727,234662,677241,281092,688594,e=>{"use strict";let t=Symbol.for("constructDateFrom");function r(e,r){return"function"==typeof e?e(r):e&&"object"==typeof e&&t in e?e[t](r):e instanceof Date?new e.constructor(r):new Date(r)}function s(e,t){return r(t||e,e)}e.s(["constructFromSymbol",0,t,"millisecondsInDay",0,864e5,"millisecondsInHour",0,36e5,"millisecondsInMinute",0,6e4,"millisecondsInSecond",0,1e3,"millisecondsInWeek",0,6048e5],234662),e.s(["constructFrom",0,r],677241),e.s(["toDate",0,s],281092),e.s(["addDays",0,function(e,t,a){let n=s(e,a?.in);return isNaN(t)?r(a?.in||e,NaN):(t&&n.setDate(n.getDate()+t),n)}],595727),e.s(["addMonths",0,function(e,t,a){let n=s(e,a?.in);if(isNaN(t))return r(a?.in||e,NaN);if(!t)return n;let l=n.getDate(),i=r(a?.in||e,n.getTime());return(i.setMonth(n.getMonth()+t+1,0),l>=i.getDate())?i:(n.setFullYear(i.getFullYear(),i.getMonth(),l),n)}],688594)},24529,e=>{"use strict";var t=e.i(595727),r=e.i(688594),s=e.i(677241),a=e.i(281092);function n(e,n,l){let{years:i=0,months:o=0,weeks:c=0,days:u=0,hours:d=0,minutes:p=0,seconds:m=0}=n,h=(0,a.toDate)(e,l?.in),x=o||i?(0,r.addMonths)(h,o+12*i):h,g=u||c?(0,t.addDays)(x,u+7*c):x;return(0,s.constructFrom)(l?.in||e,+g+1e3*(m+60*(p+60*d)))}let l=/[zZ]$|[+-]\d{2}:?\d{2}$/;function i(e){return Date.parse(l.test(e)?e:`${e}Z`)}e.s(["calculateExpiryPreviewFromDuration",0,function(e){if(!e)return null;try{let t,r=parseInt(e);if(Number.isNaN(r))throw Error("Invalid duration format");let s=new Date;if(e.endsWith("mo"))t=n(s,{months:r});else if(e.endsWith("s"))t=n(s,{seconds:r});else if(e.endsWith("m"))t=n(s,{minutes:r});else if(e.endsWith("h"))t=n(s,{hours:r});else if(e.endsWith("d"))t=n(s,{days:r});else if(e.endsWith("w"))t=n(s,{weeks:r});else throw Error("Invalid duration format");return t.toLocaleString()}catch{return null}},"formatExpiresUtc",0,function(e){let t=i(e);return Number.isNaN(t)?e:new Date(t).toLocaleString()},"isKeyExpired",0,function(e){if(!e)return!1;let t=i(e);return!Number.isNaN(t)&&t{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(115504);let a=r.forwardRef(({className:e,...r},a)=>(0,t.jsx)("textarea",{ref:a,"data-slot":"textarea",className:(0,s.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground 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 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...r}));a.displayName="Textarea",e.s(["Textarea",0,a])},950594,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(115504),a=e.i(519455),n=e.i(793479),l=e.i(624687);let i=(0,s.cva)({base:"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",variants:{align:{"inline-start":"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}}),o=(0,s.cva)({base:"flex items-center gap-2 text-sm shadow-none",variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}}),c=r.forwardRef(({className:e,type:r="button",variant:n="ghost",size:l="xs",...i},c)=>(0,t.jsx)(a.Button,{ref:c,type:r,"data-size":l,variant:n,className:(0,s.cn)(o({size:l}),e),...i}));c.displayName="InputGroupButton";let u=r.forwardRef(({className:e,...r},a)=>(0,t.jsx)(n.Input,{ref:a,"data-slot":"input-group-control",className:(0,s.cn)("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r}));u.displayName="InputGroupInput",r.forwardRef(({className:e,...r},a)=>(0,t.jsx)(l.Textarea,{ref:a,"data-slot":"input-group-control",className:(0,s.cn)("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r})).displayName="InputGroupTextarea",e.s(["InputGroup",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"input-group",role:"group",className:(0,s.cn)("group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...r})},"InputGroupAddon",0,function({className:e,align:r="inline-start",...a}){return(0,t.jsx)("div",{role:"group","data-slot":"input-group-addon","data-align":r,className:(0,s.cn)(i({align:r}),e),onClick:e=>{e.target.closest("button")||e.currentTarget.parentElement?.querySelector("input")?.focus()},...a})},"InputGroupButton",0,c,"InputGroupInput",0,u,"InputGroupText",0,function({className:e,...r}){return(0,t.jsx)("span",{className:(0,s.cn)("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...r})}])},552546,e=>{"use strict";var t=e.i(843476),r=e.i(131792);let s=(e,t)=>{let r=t.trim().toLowerCase();return!r||e.label.toLowerCase().includes(r)||(e.sublabel?.toLowerCase().includes(r)??!1)};e.s(["SearchSelect",0,function({options:e,value:a,onValueChange:n,placeholder:l="Select…",emptyText:i="No results",disabled:o=!1,className:c}){let u=e.find(e=>e.value===a)??null;return(0,t.jsxs)(r.Combobox,{items:e,value:u,onValueChange:e=>n(e?.value??""),isItemEqualToValue:(e,t)=>e.value===t.value,itemToStringLabel:e=>e.label,filter:s,disabled:o,children:[(0,t.jsx)(r.ComboboxInput,{placeholder:l,showClear:null!=a&&""!==a,className:`w-full ${c??""}`}),(0,t.jsxs)(r.ComboboxContent,{children:[(0,t.jsx)(r.ComboboxEmpty,{children:i}),(0,t.jsx)(r.ComboboxList,{children:e=>(0,t.jsx)(r.ComboboxItem,{value:e,children:(0,t.jsxs)("span",{className:"flex min-w-0 flex-col",children:[(0,t.jsx)("span",{className:"truncate",children:e.label}),null!=e.sublabel&&""!==e.sublabel&&(0,t.jsx)("span",{className:"truncate text-xs text-muted-foreground",children:e.sublabel})]})},e.value)})]})]})}])},438847,e=>{"use strict";var t=e.i(916108),r=e.i(487315),s=e.i(280862),a=e.i(271645);function n(e,t,s){try{return e(t)}catch(e){return s?(0,r.i)(25,t,e,s):(0,r.i)(24,t,e),null}}function l(e){function t(t){if(void 0===t)return null;let r="";if(Array.isArray(t)){if(void 0===t[0])return null;r=t[0]}return"string"==typeof t&&(r=t),n(e.parse,r)}return{type:"single",eq:(e,t)=>e===t,...e,parseServerSide:t,withDefault(e){return{...this,defaultValue:e,parseServerSide:r=>t(r)??e}},withOptions(e){return{...this,...e}}}}let i=l({parse:e=>e,serialize:String}),o=l({parse:e=>{let t=parseInt(e);return t==t?t:null},serialize:e=>""+Math.round(e)});function c(e,t){return e.valueOf()===t.valueOf()}l({parse:e=>{let t=parseInt(e);return t==t?t-1:null},serialize:e=>""+Math.round(e+1)}),l({parse:e=>{let t=parseInt(e,16);return t==t?t:null},serialize:e=>{let t=Math.round(e).toString(16);return t<"0"||!(1&t.length)?t:"0"+t}}),l({parse:e=>{let t=parseFloat(e);return t==t?t:null},serialize:String}),l({parse:e=>"true"===e.toLowerCase(),serialize:String}),l({parse:e=>{let t=new Date(parseInt(e));return t.valueOf()==t.valueOf()?t:null},serialize:e=>""+e.valueOf(),eq:c}),l({parse:e=>{let t=new Date(e);return t.valueOf()==t.valueOf()?t:null},serialize:e=>e.toISOString(),eq:c}),l({parse:e=>{let t=new Date(e.slice(0,10));return t.valueOf()==t.valueOf()?t:null},serialize:e=>e.toISOString().slice(0,10),eq:c});let u=(0,s.o)("sync-emitter",()=>(0,t.i)()),d={},p=(e,t)=>"defaultValue"===e?void 0:t;function m(e,n={}){let l=(0,a.useId)(),i=(0,s.i)(),o=(0,s.a)(),{history:c=i?.history??"replace",scroll:g=i?.scroll??!1,shallow:f=i?.shallow??!0,throttleMs:v=t.l.timeMs,limitUrlUpdates:b=i?.limitUrlUpdates,clearOnDefault:y=i?.clearOnDefault??!0,startTransition:j,urlKeys:w=d}=n,N=Object.keys(e).join(","),k=(0,a.useRef)(e),S=k.current,_=JSON.stringify(Object.entries(S),p)===JSON.stringify(Object.entries(e),p)&&Object.entries(e).every(([e,t])=>{let r=S[e]?.defaultValue,s=t.defaultValue;return!!Object.is(r,s)||void 0!==r&&void 0!==s&&t.eq?.(r,s)===!0})?S:e;k.current=_;let O=(0,a.useMemo)(()=>Object.fromEntries(Object.keys(e).map(e=>[e,w[e]??e])),[N,JSON.stringify(w)]),E=(0,s.r)(Object.values(O)),C=E.searchParams,M=(0,a.useRef)({}),I=(0,a.useRef)(null),T=(0,a.useRef)(null),z=(0,t.n)(Object.values(O)),[L,R]=(0,a.useState)(()=>h(e,w,C,z).state),P=(0,a.useRef)(L),$=Object.values(O).map(e=>`${e}=${C.getAll(e)}`).join("&")+JSON.stringify(z),D=()=>{let{state:t,hasChanged:s}=h(e,w,C,z,M.current,P.current);return s&&((0,r.t)(1,l,N,t),P.current=t,R(t)),s},A=Object.keys(M.current).join("&")!==Object.values(O).join("&"),V=null===T.current||T.current===(E.pathname??location.pathname),B=!1;(A||V&&I.current!==$)&&(I.current=$,B=D(),A&&(M.current=Object.fromEntries(Object.entries(O).map(([t,r])=>[r,e[t]?.type==="multi"?C.getAll(r):C.get(r)??null])))),A||B||!V||L===P.current||R(P.current),(0,a.useEffect)(()=>{T.current=E.pathname??location.pathname,D()},[$,E.pathname]),(0,a.useEffect)(()=>{let t=Object.keys(e).reduce((t,s)=>(t[s]=({state:t,query:a})=>{R(n=>{let i=O[s];return Object.is(n[s]??null,t)?((0,r.t)(2,l,N,i,t,e[s]?.defaultValue,P.current),n):(P.current={...P.current,[s]:t},M.current[i]=a,(0,r.t)(3,l,N,i,t,e[s]?.defaultValue,P.current),P.current)})},t),{});for(let s of Object.keys(e)){let e=O[s];(0,r.t)(4,l,e,N),u.on(e,t[s])}return()=>{for(let s of Object.keys(e)){let e=O[s];(0,r.t)(5,l,e,N),u.off(e,t[s])}}},[N,O]);let G=(0,a.useCallback)((e,s={})=>{let a,n=Object.fromEntries(Object.keys(_).map(e=>[e,null])),i="function"==typeof e?e(x(P.current,_))??n:e??n;(0,r.t)(6,l,N,i);let d=0,p=!1,m=[];for(let[e,r]of Object.entries(i)){let n=_[e],l=O[e];if(!n||void 0===l||void 0===r)continue;(s.clearOnDefault??n.clearOnDefault??y)&&null!==r&&void 0!==n.defaultValue&&(n.eq??((e,t)=>e===t))(r,n.defaultValue)&&(r=null);let i=null===r?null:(n.serialize??String)(r);u.emit(l,{state:r,query:i});let h={key:l,query:i,options:{history:s.history??n.history??c,shallow:s.shallow??n.shallow??f,scroll:s.scroll??n.scroll??g,startTransition:s.startTransition??n.startTransition??j}},x=s.limitUrlUpdates??n.limitUrlUpdates??b;if(x?.method==="debounce"){let e=x.timeMs??t.l.timeMs,r=t.t.push(h,e,E,o);dt(e),p?t.r.flush(E,o):t.r.getPendingPromise(E));return a??h},[N,c,f,g,v,b?.method,b?.timeMs,j,y,_,O,E.updateUrl,E.getSearchParamsSnapshot,E.rateLimitFactor,o]);return[(0,a.useMemo)(()=>x(L,_),[L,_]),G]}function h(e,r,s,a,l,i){let o=!1,c=Object.entries(e).reduce((e,[c,u])=>{var d;let p=r?.[c]??c,m=a[p],h="multi"===u.type?[]:null,x=void 0===m?("multi"===u.type?s.getAll(p):s.get(p))??h:m;return l&&i&&((d=l[p]??h)===x||null!==d&&null!==x&&"string"!=typeof d&&"string"!=typeof x&&d.length===x.length&&d.every((e,t)=>e===x[t]))?e[c]=i[c]??null:(o=!0,e[c]=((0,t.o)(x)?null:n(u.parse,x,p))??null,l&&(l[p]=x)),e},{});if(!o){let t=Object.keys(e),r=Object.keys(i??{});o=t.length!==r.length||t.some(e=>!r.includes(e))}return{state:c,hasChanged:o}}function x(e,t){return Object.fromEntries(Object.keys(e).map(r=>[r,e[r]??t[r]?.defaultValue??null]))}e.s(["parseAsInteger",0,o,"parseAsString",0,i,"useQueryState",0,function(e,t={}){let{parse:r,type:s,serialize:n,eq:l,defaultValue:i,...o}=t,[{[e]:c},u]=m({[e]:{parse:r??(e=>e),type:s,serialize:n,eq:l,defaultValue:i}},o);return[c,(0,a.useCallback)((t,r={})=>u(r=>({[e]:"function"==typeof t?t(r[e]):t}),r),[e,u])]},"useQueryStates",0,m],438847)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0imbshqv9tl6y.js b/litellm/proxy/_experimental/out/_next/static/chunks/0imbshqv9tl6y.js new file mode 100644 index 00000000000..90a75d2163f --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0imbshqv9tl6y.js @@ -0,0 +1,19 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,954616,e=>{"use strict";var t=e.i(271645),i=e.i(114272),n=e.i(540143),a=e.i(915823),o=e.i(619273),r=class extends a.Subscribable{#e;#t=void 0;#i;#n;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#a()}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,o.shallowEqualObjects)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#i,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,o.hashKey)(t.mutationKey)!==(0,o.hashKey)(this.options.mutationKey)?this.reset():this.#i?.state.status==="pending"&&this.#i.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#i?.removeObserver(this)}onMutationUpdate(e){this.#a(),this.#o(e)}getCurrentResult(){return this.#t}reset(){this.#i?.removeObserver(this),this.#i=void 0,this.#a(),this.#o()}mutate(e,t){return this.#n=t,this.#i?.removeObserver(this),this.#i=this.#e.getMutationCache().build(this.#e,this.options),this.#i.addObserver(this),this.#i.execute(e)}#a(){let e=this.#i?.state??(0,i.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}}#o(e){n.notifyManager.batch(()=>{if(this.#n&&this.hasListeners()){let t=this.#t.variables,i=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,i,n)}catch(e){Promise.reject(e)}try{this.#n.onSettled?.(e.data,null,t,i,n)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#n.onError?.(e.error,t,i,n)}catch(e){Promise.reject(e)}try{this.#n.onSettled?.(void 0,e.error,t,i,n)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},l=e.i(912598);e.s(["useMutation",0,function(e,i){let a=(0,l.useQueryClient)(i),[s]=t.useState(()=>new r(a,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let c=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(n.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),d=t.useCallback((e,t)=>{s.mutate(e,t).catch(o.noop)},[s]);if(c.error&&(0,o.shouldThrowError)(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:d,mutateAsync:c.mutate}}],954616)},464571,e=>{"use strict";var t=e.i(920228);e.s(["Button",()=>t.default])},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(343794),n=e.i(242064),a=e.i(529681);let o=e=>{let{prefixCls:n,className:a,style:o,size:r,shape:l}=e,s=(0,i.default)({[`${n}-lg`]:"large"===r,[`${n}-sm`]:"small"===r}),c=(0,i.default)({[`${n}-circle`]:"circle"===l,[`${n}-square`]:"square"===l,[`${n}-round`]:"round"===l}),d=t.useMemo(()=>"number"==typeof r?{width:r,height:r,lineHeight:`${r}px`}:{},[r]);return t.createElement("span",{className:(0,i.default)(n,s,c,a),style:Object.assign(Object.assign({},d),o)})};e.i(296059);var r=e.i(694758),l=e.i(915654),s=e.i(246422),c=e.i(838378);let d=new r.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),u=e=>({height:e,lineHeight:(0,l.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)),p=e=>Object.assign({width:e},u(e)),h=(e,t,i)=>{let{skeletonButtonCls:n}=e;return{[`${i}${n}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${i}${n}-round`]:{borderRadius:t}}},b=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},u(e)),f=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:i}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:i,skeletonTitleCls:n,skeletonParagraphCls:a,skeletonButtonCls:o,skeletonInputCls:r,skeletonImageCls:l,controlHeight:s,controlHeightLG:c,controlHeightSM:u,gradientFromColor:f,padding:$,marginSM:v,borderRadius:y,titleHeight:S,blockRadius:O,paragraphLiHeight:x,controlHeightXS:C,paragraphMarginTop:j}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:$,verticalAlign:"top",[i]:Object.assign({display:"inline-block",verticalAlign:"top",background:f},m(s)),[`${i}-circle`]:{borderRadius:"50%"},[`${i}-lg`]:Object.assign({},m(c)),[`${i}-sm`]:Object.assign({},m(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[n]:{width:"100%",height:S,background:f,borderRadius:O,[`+ ${a}`]:{marginBlockStart:u}},[a]:{padding:0,"> li":{width:"100%",height:x,listStyle:"none",background:f,borderRadius:O,"+ li":{marginBlockStart:C}}},[`${a}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${a} > li`]:{borderRadius:y}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:v,[`+ ${a}`]:{marginBlockStart:j}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:i,controlHeight:n,controlHeightLG:a,controlHeightSM:o,gradientFromColor:r,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[i]:Object.assign({display:"inline-block",verticalAlign:"top",background:r,borderRadius:t,width:l(n).mul(2).equal(),minWidth:l(n).mul(2).equal()},b(n,l))},h(e,n,i)),{[`${i}-lg`]:Object.assign({},b(a,l))}),h(e,a,`${i}-lg`)),{[`${i}-sm`]:Object.assign({},b(o,l))}),h(e,o,`${i}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:i,controlHeight:n,controlHeightLG:a,controlHeightSM:o}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:i},m(n)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},m(a)),[`${t}${t}-sm`]:Object.assign({},m(o))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:i,skeletonInputCls:n,controlHeightLG:a,controlHeightSM:o,gradientFromColor:r,calc:l}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:r,borderRadius:i},g(t,l)),[`${n}-lg`]:Object.assign({},g(a,l)),[`${n}-sm`]:Object.assign({},g(o,l))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:i,gradientFromColor:n,borderRadiusSM:a,calc:o}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:a},p(o(i).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},p(i)),{maxWidth:o(i).mul(4).equal(),maxHeight:o(i).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[o]:{width:"100%"},[r]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${n}, + ${a} > li, + ${i}, + ${o}, + ${r}, + ${l} + `]: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:i(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:i}=e;return{color:t,colorGradientEnd:i,gradientFromColor:t,gradientToColor:i,titleHeight:e.controlHeight/2,blockRadius:e.borderRadiusSM,paragraphMarginTop:e.marginLG+e.marginXXS,paragraphLiHeight:e.controlHeight/2}},{deprecatedTokens:[["color","gradientFromColor"],["colorGradientEnd","gradientToColor"]]}),$=e=>{let{prefixCls:n,className:a,style:o,rows:r=0}=e,l=Array.from({length:r}).map((i,n)=>t.createElement("li",{key:n,style:{width:((e,t)=>{let{width:i,rows:n=2}=t;return Array.isArray(i)?i[e]:n-1===e?i:void 0})(n,e)}}));return t.createElement("ul",{className:(0,i.default)(n,a),style:o},l)},v=({prefixCls:e,className:n,width:a,style:o})=>t.createElement("h3",{className:(0,i.default)(e,n),style:Object.assign({width:a},o)});function y(e){return e&&"object"==typeof e?e:{}}let S=e=>{let{prefixCls:a,loading:r,className:l,rootClassName:s,style:c,children:d,avatar:u=!1,title:m=!0,paragraph:g=!0,active:p,round:h}=e,{getPrefixCls:b,direction:S,className:O,style:x}=(0,n.useComponentConfig)("skeleton"),C=b("skeleton",a),[j,w,E]=f(C);if(r||!("loading"in e)){let e,n,a=!!u,r=!!m,d=!!g;if(a){let i=Object.assign(Object.assign({prefixCls:`${C}-avatar`},r&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),y(u));e=t.createElement("div",{className:`${C}-header`},t.createElement(o,Object.assign({},i)))}if(r||d){let e,i;if(r){let i=Object.assign(Object.assign({prefixCls:`${C}-title`},!a&&d?{width:"38%"}:a&&d?{width:"50%"}:{}),y(m));e=t.createElement(v,Object.assign({},i))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${C}-paragraph`},(e={},a&&r||(e.width="61%"),!a&&r?e.rows=3:e.rows=2,e)),y(g));i=t.createElement($,Object.assign({},n))}n=t.createElement("div",{className:`${C}-content`},e,i)}let b=(0,i.default)(C,{[`${C}-with-avatar`]:a,[`${C}-active`]:p,[`${C}-rtl`]:"rtl"===S,[`${C}-round`]:h},O,l,s,w,E);return j(t.createElement("div",{className:b,style:Object.assign(Object.assign({},x),c)},e,n))}return null!=d?d:null};S.Button=e=>{let{prefixCls:r,className:l,rootClassName:s,active:c,block:d=!1,size:u="default"}=e,{getPrefixCls:m}=t.useContext(n.ConfigContext),g=m("skeleton",r),[p,h,b]=f(g),$=(0,a.default)(e,["prefixCls"]),v=(0,i.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},l,s,h,b);return p(t.createElement("div",{className:v},t.createElement(o,Object.assign({prefixCls:`${g}-button`,size:u},$))))},S.Avatar=e=>{let{prefixCls:r,className:l,rootClassName:s,active:c,shape:d="circle",size:u="default"}=e,{getPrefixCls:m}=t.useContext(n.ConfigContext),g=m("skeleton",r),[p,h,b]=f(g),$=(0,a.default)(e,["prefixCls","className"]),v=(0,i.default)(g,`${g}-element`,{[`${g}-active`]:c},l,s,h,b);return p(t.createElement("div",{className:v},t.createElement(o,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:u},$))))},S.Input=e=>{let{prefixCls:r,className:l,rootClassName:s,active:c,block:d,size:u="default"}=e,{getPrefixCls:m}=t.useContext(n.ConfigContext),g=m("skeleton",r),[p,h,b]=f(g),$=(0,a.default)(e,["prefixCls"]),v=(0,i.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},l,s,h,b);return p(t.createElement("div",{className:v},t.createElement(o,Object.assign({prefixCls:`${g}-input`,size:u},$))))},S.Image=e=>{let{prefixCls:a,className:o,rootClassName:r,style:l,active:s}=e,{getPrefixCls:c}=t.useContext(n.ConfigContext),d=c("skeleton",a),[u,m,g]=f(d),p=(0,i.default)(d,`${d}-element`,{[`${d}-active`]:s},o,r,m,g);return u(t.createElement("div",{className:p},t.createElement("div",{className:(0,i.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`})))))},S.Node=e=>{let{prefixCls:a,className:o,rootClassName:r,style:l,active:s,children:c}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),u=d("skeleton",a),[m,g,p]=f(u),h=(0,i.default)(u,`${u}-element`,{[`${u}-active`]:s},g,o,r,p);return m(t.createElement("div",{className:h},t.createElement("div",{className:(0,i.default)(`${u}-image`,o),style:l},c)))},e.s(["default",0,S],185793)},560445,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(201072),n=e.i(726289),a=e.i(864517),o=e.i(562901),r=e.i(779573),l=e.i(343794),s=e.i(361275),c=e.i(244009),d=e.i(611935),u=e.i(763731),m=e.i(242064);e.i(296059);var g=e.i(915654),p=e.i(183293),h=e.i(246422);let b=(e,t,i,n,a)=>({background:e,border:`${(0,g.unit)(n.lineWidth)} ${n.lineType} ${t}`,[`${a}-icon`]:{color:i}}),f=(0,h.genStyleHooks)("Alert",e=>[(e=>{let{componentCls:t,motionDurationSlow:i,marginXS:n,marginSM:a,fontSize:o,fontSizeLG:r,lineHeight:l,borderRadiusLG:s,motionEaseInOutCirc:c,withDescriptionIconSize:d,colorText:u,colorTextHeading:m,withDescriptionPadding:g,defaultPadding:h}=e;return{[t]:Object.assign(Object.assign({},(0,p.resetComponent)(e)),{position:"relative",display:"flex",alignItems:"center",padding:h,wordWrap:"break-word",borderRadius:s,[`&${t}-rtl`]:{direction:"rtl"},[`${t}-content`]:{flex:1,minWidth:0},[`${t}-icon`]:{marginInlineEnd:n,lineHeight:0},"&-description":{display:"none",fontSize:o,lineHeight:l},"&-message":{color:m},[`&${t}-motion-leave`]:{overflow:"hidden",opacity:1,transition:`max-height ${i} ${c}, opacity ${i} ${c}, + padding-top ${i} ${c}, padding-bottom ${i} ${c}, + margin-bottom ${i} ${c}`},[`&${t}-motion-leave-active`]:{maxHeight:0,marginBottom:"0 !important",paddingTop:0,paddingBottom:0,opacity:0}}),[`${t}-with-description`]:{alignItems:"flex-start",padding:g,[`${t}-icon`]:{marginInlineEnd:a,fontSize:d,lineHeight:0},[`${t}-message`]:{display:"block",marginBottom:n,color:m,fontSize:r},[`${t}-description`]:{display:"block",color:u}},[`${t}-banner`]:{marginBottom:0,border:"0 !important",borderRadius:0}}})(e),(e=>{let{componentCls:t,colorSuccess:i,colorSuccessBorder:n,colorSuccessBg:a,colorWarning:o,colorWarningBorder:r,colorWarningBg:l,colorError:s,colorErrorBorder:c,colorErrorBg:d,colorInfo:u,colorInfoBorder:m,colorInfoBg:g}=e;return{[t]:{"&-success":b(a,n,i,e,t),"&-info":b(g,m,u,e,t),"&-warning":b(l,r,o,e,t),"&-error":Object.assign(Object.assign({},b(d,c,s,e,t)),{[`${t}-description > pre`]:{margin:0,padding:0}})}}})(e),(e=>{let{componentCls:t,iconCls:i,motionDurationMid:n,marginXS:a,fontSizeIcon:o,colorIcon:r,colorIconHover:l}=e;return{[t]:{"&-action":{marginInlineStart:a},[`${t}-close-icon`]:{marginInlineStart:a,padding:0,overflow:"hidden",fontSize:o,lineHeight:(0,g.unit)(o),backgroundColor:"transparent",border:"none",outline:"none",cursor:"pointer",[`${i}-close`]:{color:r,transition:`color ${n}`,"&:hover":{color:l}}},"&-close-text":{color:r,transition:`color ${n}`,"&:hover":{color:l}}}}})(e)],e=>({withDescriptionIconSize:e.fontSizeHeading3,defaultPadding:`${e.paddingContentVerticalSM}px 12px`,withDescriptionPadding:`${e.paddingMD}px ${e.paddingContentHorizontalLG}px`}));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 a=0,n=Object.getOwnPropertySymbols(e);at.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(i[n[a]]=e[n[a]]);return i};let v={success:i.default,info:r.default,error:n.default,warning:o.default},y=e=>{let{icon:i,prefixCls:n,type:a}=e,o=v[a]||null;return i?(0,u.replaceElement)(i,t.createElement("span",{className:`${n}-icon`},i),()=>({className:(0,l.default)(`${n}-icon`,i.props.className)})):t.createElement(o,{className:`${n}-icon`})},S=e=>{let{isClosable:i,prefixCls:n,closeIcon:o,handleClose:r,ariaProps:l}=e,s=!0===o||void 0===o?t.createElement(a.default,null):o;return i?t.createElement("button",Object.assign({type:"button",onClick:r,className:`${n}-close-icon`,tabIndex:0},l),s):null},O=t.forwardRef((e,i)=>{let{description:n,prefixCls:a,message:o,banner:r,className:u,rootClassName:g,style:p,onMouseEnter:h,onMouseLeave:b,onClick:v,afterClose:O,showIcon:x,closable:C,closeText:j,closeIcon:w,action:E,id:k}=e,z=$(e,["description","prefixCls","message","banner","className","rootClassName","style","onMouseEnter","onMouseLeave","onClick","afterClose","showIcon","closable","closeText","closeIcon","action","id"]),[N,M]=t.useState(!1),I=t.useRef(null);t.useImperativeHandle(i,()=>({nativeElement:I.current}));let{getPrefixCls:R,direction:T,closable:L,closeIcon:q,className:D,style:P}=(0,m.useComponentConfig)("alert"),H=R("alert",a),[B,G,A]=f(H),W=t=>{var i;M(!0),null==(i=e.onClose)||i.call(e,t)},X=t.useMemo(()=>void 0!==e.type?e.type:r?"warning":"info",[e.type,r]),K=t.useMemo(()=>"object"==typeof C&&!!C.closeIcon||!!j||("boolean"==typeof C?C:!1!==w&&null!=w||!!L),[j,w,C,L]),F=!!r&&void 0===x||x,U=(0,l.default)(H,`${H}-${X}`,{[`${H}-with-description`]:!!n,[`${H}-no-icon`]:!F,[`${H}-banner`]:!!r,[`${H}-rtl`]:"rtl"===T},D,u,g,A,G),V=(0,c.default)(z,{aria:!0,data:!0}),Q=t.useMemo(()=>"object"==typeof C&&C.closeIcon?C.closeIcon:j||(void 0!==w?w:"object"==typeof L&&L.closeIcon?L.closeIcon:q),[w,C,L,j,q]),J=t.useMemo(()=>{let e=null!=C?C:L;if("object"==typeof e){let{closeIcon:t}=e;return $(e,["closeIcon"])}return{}},[C,L]);return B(t.createElement(s.default,{visible:!N,motionName:`${H}-motion`,motionAppear:!1,motionEnter:!1,onLeaveStart:e=>({maxHeight:e.offsetHeight}),onLeaveEnd:O},({className:i,style:a},r)=>t.createElement("div",Object.assign({id:k,ref:(0,d.composeRef)(I,r),"data-show":!N,className:(0,l.default)(U,i),style:Object.assign(Object.assign(Object.assign({},P),p),a),onMouseEnter:h,onMouseLeave:b,onClick:v,role:"alert"},V),F?t.createElement(y,{description:n,icon:e.icon,prefixCls:H,type:X}):null,t.createElement("div",{className:`${H}-content`},o?t.createElement("div",{className:`${H}-message`},o):null,n?t.createElement("div",{className:`${H}-description`},n):null),E?t.createElement("div",{className:`${H}-action`},E):null,t.createElement(S,{isClosable:K,prefixCls:H,closeIcon:Q,handleClose:W,ariaProps:J}))))});var x=e.i(278409),C=e.i(233848),j=e.i(487806),w=e.i(479671),E=e.i(480002),k=e.i(868917);let z=function(e){function i(){var e,t,n;return(0,x.default)(this,i),t=i,n=arguments,t=(0,j.default)(t),(e=(0,E.default)(this,(0,w.default)()?Reflect.construct(t,n||[],(0,j.default)(this).constructor):t.apply(this,n))).state={error:void 0,info:{componentStack:""}},e}return(0,k.default)(i,e),(0,C.default)(i,[{key:"componentDidCatch",value:function(e,t){this.setState({error:e,info:t})}},{key:"render",value:function(){let{message:e,description:i,id:n,children:a}=this.props,{error:o,info:r}=this.state,l=(null==r?void 0:r.componentStack)||null,s=void 0===e?(o||"").toString():e;return o?t.createElement(O,{id:n,type:"error",message:s,description:t.createElement("pre",{style:{fontSize:"0.9em",overflowX:"auto"}},void 0===i?l:i)}):a}}])}(t.Component);O.ErrorBoundary=z,e.s(["Alert",0,O],560445)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(343794),n=e.i(529681),a=e.i(242064),o=e.i(517455),r=e.i(185793),l=e.i(721369),s=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 a=0,n=Object.getOwnPropertySymbols(e);at.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(i[n[a]]=e[n[a]]);return i};let c=e=>{var{prefixCls:n,className:o,hoverable:r=!0}=e,l=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:c}=t.useContext(a.ConfigContext),d=c("card",n),u=(0,i.default)(`${d}-grid`,o,{[`${d}-grid-hoverable`]:r});return t.createElement("div",Object.assign({},l,{className:u}))};e.i(296059);var d=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:i,cardHeadPadding:n,colorBorderSecondary:a,boxShadowTertiary:o,bodyPadding:r,extraColor:l}=e;return{[t]:Object.assign(Object.assign({},(0,u.resetComponent)(e)),{position:"relative",background:e.colorBgContainer,borderRadius:e.borderRadiusLG,[`&:not(${t}-bordered)`]:{boxShadow:o},[`${t}-head`]:(e=>{let{antCls:t,componentCls:i,headerHeight:n,headerPadding:a,tabsMarginBottom:o}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:n,marginBottom:-1,padding:`0 ${(0,d.unit)(a)}`,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),{[` + > ${i}-typography, + > ${i}-typography-edit-content + `]:{insetInlineStart:0,marginTop:0,marginBottom:0}}),[`${t}-tabs-top`]:{clear:"both",marginBottom:o,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:l,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:r,borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:i,cardShadow:n,lineWidth:a}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` + ${(0,d.unit)(a)} 0 0 0 ${i}, + 0 ${(0,d.unit)(a)} 0 0 ${i}, + ${(0,d.unit)(a)} ${(0,d.unit)(a)} 0 0 ${i}, + ${(0,d.unit)(a)} 0 0 0 ${i} inset, + 0 ${(0,d.unit)(a)} 0 0 ${i} inset; + `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:n}}})(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:i,actionsLiMargin:n,cardActionsIconSize:a,colorBorderSecondary:o,actionsBg:r}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:r,borderTop:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${o}`,display:"flex",borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.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), > ${i}`]:{display:"inline-block",width:"100%",color:e.colorIcon,lineHeight:(0,d.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${i}`]:{fontSize:a,lineHeight:(0,d.unit)(e.calc(a).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${o}`}}})})(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} ${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:i}},[`${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:n}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:i,headerPadding:n,bodyPadding:a}=e;return{[`${t}-head`]:{padding:`0 ${(0,d.unit)(n)}`,background:i,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,d.unit)(e.padding)} ${(0,d.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:i,headerPaddingSM:n,headerHeightSM:a,headerFontSizeSM:o}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:a,padding:`0 ${(0,d.unit)(n)}`,fontSize:o,[`> ${t}-head-wrapper`]:{[`> ${t}-extra`]:{fontSize:e.fontSize}}},[`> ${t}-body`]:{padding:i}},[`${t}-small${t}-contain-tabs`]:{[`> ${t}-head`]:{[`${t}-head-title, ${t}-extra`]:{paddingTop:0,display:"flex",alignItems:"center"}}}}})(t)]},e=>{var t,i;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!=(i=e.headerPadding)?i:e.paddingLG}});var h=e.i(792812),b=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 a=0,n=Object.getOwnPropertySymbols(e);at.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(i[n[a]]=e[n[a]]);return i};let f=e=>{let{actionClasses:i,actions:n=[],actionStyle:a}=e;return t.createElement("ul",{className:i,style:a},n.map((e,i)=>{let a=`action-${i}`;return t.createElement("li",{style:{width:`${100/n.length}%`},key:a},t.createElement("span",null,e))}))},$=t.forwardRef((e,s)=>{let d,{prefixCls:u,className:m,rootClassName:g,style:$,extra:v,headStyle:y={},bodyStyle:S={},title:O,loading:x,bordered:C,variant:j,size:w,type:E,cover:k,actions:z,tabList:N,children:M,activeTabKey:I,defaultActiveTabKey:R,tabBarExtraContent:T,hoverable:L,tabProps:q={},classNames:D,styles:P}=e,H=b(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:B,direction:G,card:A}=t.useContext(a.ConfigContext),[W]=(0,h.default)("card",j,C),X=e=>{var t;return(0,i.default)(null==(t=null==A?void 0:A.classNames)?void 0:t[e],null==D?void 0:D[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==P?void 0:P[e])},F=t.useMemo(()=>{let e=!1;return t.Children.forEach(M,t=>{(null==t?void 0:t.type)===c&&(e=!0)}),e},[M]),U=B("card",u),[V,Q,J]=p(U),Y=t.createElement(r.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},M),Z=void 0!==I,_=Object.assign(Object.assign({},q),{[Z?"activeKey":"defaultActiveKey"]:Z?I:R,tabBarExtraContent:T}),ee=(0,o.default)(w),et=ee&&"default"!==ee?ee:"large",ei=N?t.createElement(l.default,Object.assign({size:et},_,{className:`${U}-head-tabs`,onChange:t=>{var i;null==(i=e.onTabChange)||i.call(e,t)},items:N.map(e=>{var{tab:t}=e;return Object.assign({label:t},b(e,["tab"]))})})):null;if(O||v||ei){let e=(0,i.default)(`${U}-head`,X("header")),n=(0,i.default)(`${U}-head-title`,X("title")),a=(0,i.default)(`${U}-extra`,X("extra")),o=Object.assign(Object.assign({},y),K("header"));d=t.createElement("div",{className:e,style:o},t.createElement("div",{className:`${U}-head-wrapper`},O&&t.createElement("div",{className:n,style:K("title")},O),v&&t.createElement("div",{className:a,style:K("extra")},v)),ei)}let en=(0,i.default)(`${U}-cover`,X("cover")),ea=k?t.createElement("div",{className:en,style:K("cover")},k):null,eo=(0,i.default)(`${U}-body`,X("body")),er=Object.assign(Object.assign({},S),K("body")),el=t.createElement("div",{className:eo,style:er},x?Y:M),es=(0,i.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,n.default)(H,["onTabChange"]),eu=(0,i.default)(U,null==A?void 0:A.className,{[`${U}-loading`]:x,[`${U}-bordered`]:"borderless"!==W,[`${U}-hoverable`]:L,[`${U}-contain-grid`]:F,[`${U}-contain-tabs`]:null==N?void 0:N.length,[`${U}-${ee}`]:ee,[`${U}-type-${E}`]:!!E,[`${U}-rtl`]:"rtl"===G},m,g,Q,J),em=Object.assign(Object.assign({},null==A?void 0:A.style),$);return V(t.createElement("div",Object.assign({ref:s},ed,{className:eu,style:em}),d,ea,el,ec))});var v=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 a=0,n=Object.getOwnPropertySymbols(e);at.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(i[n[a]]=e[n[a]]);return i};$.Grid=c,$.Meta=e=>{let{prefixCls:n,className:o,avatar:r,title:l,description:s}=e,c=v(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:d}=t.useContext(a.ConfigContext),u=d("card",n),m=(0,i.default)(`${u}-meta`,o),g=r?t.createElement("div",{className:`${u}-meta-avatar`},r):null,p=l?t.createElement("div",{className:`${u}-meta-title`},l):null,h=s?t.createElement("div",{className:`${u}-meta-description`},s):null,b=p||h?t.createElement("div",{className:`${u}-meta-detail`},p,h):null;return t.createElement("div",Object.assign({},c,{className:m}),g,b)},e.s(["Card",0,$],175712)},56456,e=>{"use strict";var t=e.i(739295);e.s(["LoadingOutlined",()=>t.default])},244451,e=>{"use strict";let t;e.i(247167);var i=e.i(271645),n=e.i(343794),a=e.i(242064),o=e.i(763731),r=e.i(174428);let l=80*Math.PI,s=e=>{let{dotClassName:t,style:a,hasCircleCls:o}=e;return i.createElement("circle",{className:(0,n.default)(`${t}-circle`,{[`${t}-circle-bg`]:o}),r:40,cx:50,cy:50,strokeWidth:20,style:a})},c=({percent:e,prefixCls:t})=>{let a=`${t}-dot`,o=`${a}-holder`,c=`${o}-hidden`,[d,u]=i.useState(!1);(0,r.default)(()=>{0!==e&&u(!0)},[0!==e]);let m=Math.max(Math.min(e,100),0);if(!d)return null;let g={strokeDashoffset:`${l/4}`,strokeDasharray:`${l*m/100} ${l*(100-m)/100}`};return i.createElement("span",{className:(0,n.default)(o,`${a}-progress`,m<=0&&c)},i.createElement("svg",{viewBox:"0 0 100 100",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":m},i.createElement(s,{dotClassName:a,hasCircleCls:!0}),i.createElement(s,{dotClassName:a,style:g})))};function d(e){let{prefixCls:t,percent:a=0}=e,o=`${t}-dot`,r=`${o}-holder`,l=`${r}-hidden`;return i.createElement(i.Fragment,null,i.createElement("span",{className:(0,n.default)(r,a>0&&l)},i.createElement("span",{className:(0,n.default)(o,`${t}-dot-spin`)},[1,2,3,4].map(e=>i.createElement("i",{className:`${t}-dot-item`,key:e})))),i.createElement(c,{prefixCls:t,percent:a}))}function u(e){var t;let{prefixCls:a,indicator:r,percent:l}=e,s=`${a}-dot`;return r&&i.isValidElement(r)?(0,o.cloneElement)(r,{className:(0,n.default)(null==(t=r.props)?void 0:t.className,s),percent:l}):i.createElement(d,{prefixCls:a,percent:l})}e.i(296059);var m=e.i(694758),g=e.i(183293),p=e.i(246422),h=e.i(838378);let b=new m.Keyframes("antSpinMove",{to:{opacity:1}}),f=new m.Keyframes("antRotate",{to:{transform:"rotate(405deg)"}}),$=(0,p.genStyleHooks)("Spin",e=>(e=>{let{componentCls:t,calc:i}=e;return{[t]:Object.assign(Object.assign({},(0,g.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:f,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,h.mergeToken)(e,{spinDotDefault:e.colorTextDescription})),e=>{let{controlHeightLG:t,controlHeight:i}=e;return{contentHeight:400,dotSize:t/2,dotSizeSM:.35*t,dotSizeLG:i}}),v=[[30,.05],[70,.03],[96,.01]];var y=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 a=0,n=Object.getOwnPropertySymbols(e);at.indexOf(n[a])&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(i[n[a]]=e[n[a]]);return i};let S=e=>{var o;let{prefixCls:r,spinning:l=!0,delay:s=0,className:c,rootClassName:d,size:m="default",tip:g,wrapperClassName:p,style:h,children:b,fullscreen:f=!1,indicator:S,percent:O}=e,x=y(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",r),[N,M,I]=$(z),[R,T]=i.useState(()=>l&&(!l||!s||!!Number.isNaN(Number(s)))),L=function(e,t){let[n,a]=i.useState(0),o=i.useRef(null),r="auto"===t;return i.useEffect(()=>(r&&e&&(a(0),o.current=setInterval(()=>{a(e=>{let t=100-e;for(let i=0;i{o.current&&(clearInterval(o.current),o.current=null)}),[r,e]),r?n:t}(R,O);i.useEffect(()=>{if(l){let e=function(e,t,i){var n,a=i||{},o=a.noTrailing,r=void 0!==o&&o,l=a.noLeading,s=void 0!==l&&l,c=a.debounceMode,d=void 0===c?void 0:c,u=!1,m=0;function g(){n&&clearTimeout(n)}function p(){for(var i=arguments.length,a=Array(i),o=0;oe?s?(m=Date.now(),r||(n=setTimeout(d?h:p,e))):p():!0!==r&&(n=setTimeout(d?h:p,void 0===d?e-c:e)))}return p.cancel=function(e){var t=(e||{}).upcomingOnly;g(),u=!(void 0!==t&&t)},p}(s,()=>{T(!0)},{debounceMode:false});return e(),()=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)}}T(!1)},[s,l]);let q=i.useMemo(()=>void 0!==b&&!f,[b,f]),D=(0,n.default)(z,w,{[`${z}-sm`]:"small"===m,[`${z}-lg`]:"large"===m,[`${z}-spinning`]:R,[`${z}-show-text`]:!!g,[`${z}-rtl`]:"rtl"===j},c,!f&&d,M,I),P=(0,n.default)(`${z}-container`,{[`${z}-blur`]:R}),H=null!=(o=null!=S?S:k)?o:t,B=Object.assign(Object.assign({},E),h),G=i.createElement("div",Object.assign({},x,{style:B,className:D,"aria-live":"polite","aria-busy":R}),i.createElement(u,{prefixCls:z,indicator:H,percent:L}),g&&(q||f)?i.createElement("div",{className:`${z}-text`},g):null);return N(q?i.createElement("div",Object.assign({},x,{className:(0,n.default)(`${z}-nested-loading`,p,M,I)}),R&&i.createElement("div",{key:"loading"},G),i.createElement("div",{className:P,key:"container"},b)):f?i.createElement("div",{className:(0,n.default)(`${z}-fullscreen`,{[`${z}-fullscreen-show`]:R},d,M,I)},G):G)};S.setDefaultIndicator=e=>{t=e},e.s(["default",0,S],244451)},482725,e=>{"use strict";var t=e.i(244451);e.s(["Spin",()=>t.default])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0j0zka6472o9x.js b/litellm/proxy/_experimental/out/_next/static/chunks/0j0zka6472o9x.js deleted file mode 100644 index e9169202016..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0j0zka6472o9x.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,648214,e=>{"use strict";var t=e.i(843476),s=e.i(135214),r=e.i(994388),l=e.i(366283),i=e.i(304967),a=e.i(269200),n=e.i(942232),o=e.i(977572),d=e.i(427612),c=e.i(64848),u=e.i(496020),p=e.i(560445),m=e.i(464571),g=e.i(808613),_=e.i(311451),h=e.i(212931),x=e.i(770914),f=e.i(653496),y=e.i(898586),j=e.i(271645),v=e.i(844444),S=e.i(700514),b=e.i(727749),w=e.i(602869),I=e.i(629569),k=e.i(599724),T=e.i(350967),C=e.i(779241),E=e.i(290571),N=e.i(444755);let O=(0,e.i(673706).makeClassName)("Divider"),F=j.default.forwardRef((e,t)=>{let{className:s,children:r}=e,l=(0,E.__rest)(e,["className","children"]);return j.default.createElement("div",Object.assign({ref:t,className:(0,N.tremorTwMerge)(O("root"),"w-full mx-auto my-6 flex justify-between gap-3 items-center text-tremor-default","text-tremor-content","dark:text-dark-tremor-content",s)},l),r?j.default.createElement(j.default.Fragment,null,j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")}),j.default.createElement("div",{className:(0,N.tremorTwMerge)("text-inherit whitespace-nowrap")},r),j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")})):j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")}))});F.displayName="Divider";var P=e.i(237016),A=e.i(596239),M=e.i(438957),B=e.i(166406),L=e.i(270377);e.i(247167);var U=e.i(931067);let R={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.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:"plus-circle",theme:"outlined"};var z=e.i(9583),D=j.forwardRef(function(e,t){return j.createElement(z.default,(0,U.default)({},e,{ref:t,icon:R}))}),V=e.i(190702);let q=({accessToken:e,userID:s,proxySettings:a})=>{let[n]=g.Form.useForm(),[o,d]=(0,j.useState)(!1),[c,u]=(0,j.useState)(null),[p,m]=(0,j.useState)("");(0,j.useEffect)(()=>{let e="";m(e=a&&a.PROXY_BASE_URL&&void 0!==a.PROXY_BASE_URL?a.PROXY_BASE_URL:window.location.origin)},[a]);let _=`${p}/scim/v2`,h=async t=>{if(!e||!s)return void b.default.fromBackend("You need to be logged in to create a SCIM token");try{d(!0);let r={key_alias:t.key_alias||"SCIM Access Token",team_id:null,models:[],allowed_routes:["/scim/*"]},l=await (0,w.keyCreateCall)(e,s,r);u(l),b.default.success("SCIM token created successfully")}catch(e){console.error("Error creating SCIM token:",e),b.default.fromBackend("Failed to create SCIM token: "+(0,V.parseErrorMessage)(e))}finally{d(!1)}};return(0,t.jsx)(T.Grid,{numItems:1,children:(0,t.jsxs)(i.Card,{children:[(0,t.jsx)("div",{className:"flex items-center mb-4",children:(0,t.jsx)(I.Title,{children:"SCIM Configuration"})}),(0,t.jsx)(k.Text,{className:"text-gray-600",children:"System for Cross-domain Identity Management (SCIM) allows you to automatically provision and manage users and groups in LiteLLM."}),(0,t.jsx)(F,{}),(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center mb-2",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-blue-100 text-blue-700 mr-2",children:"1"}),(0,t.jsxs)(I.Title,{className:"text-lg flex items-center",children:[(0,t.jsx)(A.LinkOutlined,{className:"h-5 w-5 mr-2"}),"SCIM Tenant URL"]})]}),(0,t.jsx)(k.Text,{className:"text-gray-600 mb-3",children:"Use this URL in your identity provider SCIM integration settings."}),(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(C.TextInput,{value:_,disabled:!0,className:"grow"}),(0,t.jsx)(P.CopyToClipboard,{text:_,onCopy:()=>b.default.success("URL copied to clipboard"),children:(0,t.jsxs)(r.Button,{variant:"primary",className:"ml-2 flex items-center",children:[(0,t.jsx)(B.CopyOutlined,{className:"h-4 w-4 mr-1"}),"Copy"]})})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center mb-2",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-blue-100 text-blue-700 mr-2",children:"2"}),(0,t.jsxs)(I.Title,{className:"text-lg flex items-center",children:[(0,t.jsx)(M.KeyOutlined,{className:"h-5 w-5 mr-2"}),"Authentication Token"]})]}),(0,t.jsx)(l.Callout,{title:"Using SCIM",color:"blue",className:"mb-4",children:"You need a SCIM token to authenticate with the SCIM API. Create one below and use it in your SCIM provider configuration."}),c?(0,t.jsxs)(i.Card,{className:"border border-yellow-300 bg-yellow-50",children:[(0,t.jsxs)("div",{className:"flex items-center mb-2 text-yellow-800",children:[(0,t.jsx)(L.ExclamationCircleOutlined,{className:"h-5 w-5 mr-2"}),(0,t.jsx)(I.Title,{className:"text-lg text-yellow-800",children:"Your SCIM Token"})]}),(0,t.jsx)(k.Text,{className:"text-yellow-800 mb-4 font-medium",children:"Make sure to copy this token now. You will not be able to see it again."}),(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(C.TextInput,{value:c.key,className:"grow mr-2 bg-white",type:"password",disabled:!0}),(0,t.jsx)(P.CopyToClipboard,{text:c.key,onCopy:()=>b.default.success("Token copied to clipboard"),children:(0,t.jsxs)(r.Button,{variant:"primary",className:"flex items-center",children:[(0,t.jsx)(B.CopyOutlined,{className:"h-4 w-4 mr-1"}),"Copy"]})})]}),(0,t.jsxs)(r.Button,{className:"mt-4 flex items-center",variant:"secondary",onClick:()=>u(null),children:[(0,t.jsx)(D,{className:"h-4 w-4 mr-1"}),"Create Another Token"]})]}):(0,t.jsx)("div",{className:"bg-gray-50 p-4 rounded-lg",children:(0,t.jsxs)(g.Form,{form:n,onFinish:h,layout:"vertical",children:[(0,t.jsx)(g.Form.Item,{name:"key_alias",label:"Token Name",rules:[{required:!0,message:"Please enter a name for your token"}],children:(0,t.jsx)(C.TextInput,{placeholder:"SCIM Access Token"})}),(0,t.jsx)(g.Form.Item,{children:(0,t.jsxs)(r.Button,{variant:"primary",type:"submit",loading:o,className:"flex items-center",children:[(0,t.jsx)(M.KeyOutlined,{className:"h-4 w-4 mr-1"}),"Create SCIM Token"]})})]})})]})]})]})})};var G=e.i(153472),K=e.i(954616),H=e.i(912598);let $=async(e,t)=>{let s=(0,w.getProxyBaseUrl)(),r=s?`${s}/config/update`:"/config/update",l=await fetch(r,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({general_settings:{store_prompts_in_spend_logs:t.store_prompts_in_spend_logs,...t.maximum_spend_logs_retention_period&&{maximum_spend_logs_retention_period:t.maximum_spend_logs_retention_period}}})});if(!l.ok){let e=await l.json().catch(()=>({}));throw Error(e?.error?.message||e?.message||e?.detail||"Failed to update spend logs settings")}return await l.json()};var Q=e.i(637235),W=e.i(175712),Y=e.i(981339),J=e.i(790848);let X=()=>{let[e]=g.Form.useForm(),{mutate:r,isPending:l}=(()=>{let{accessToken:e}=(0,s.default)(),t=(0,H.useQueryClient)();return(0,K.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return await $(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:G.proxyConfigKeys.all})}})})(),{mutate:i,isPending:a}=(0,G.useDeleteProxyConfigField)(),{data:n,isLoading:o}=(0,G.useProxyConfig)(G.ConfigType.GENERAL_SETTINGS),d=(0,j.useMemo)(()=>{if(!n)return{store_prompts_in_spend_logs:!1,maximum_spend_logs_retention_period:void 0};let e=n.find(e=>"store_prompts_in_spend_logs"===e.field_name),t=n.find(e=>"maximum_spend_logs_retention_period"===e.field_name);return{store_prompts_in_spend_logs:e?.field_value??!1,maximum_spend_logs_retention_period:t?.field_value??void 0}},[n]);return(0,t.jsx)(W.Card,{title:"Logging Settings",children:(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",style:{width:"100%"},children:[(0,t.jsx)(y.Typography.Paragraph,{style:{marginBottom:0},type:"secondary",children:"Proxy-wide settings that control how request and response data are written to spend logs."}),o?(0,t.jsx)(Y.Skeleton,{active:!0,paragraph:{rows:4}}):(0,t.jsxs)(g.Form,{form:e,layout:"vertical",onFinish:e=>{let t=e.maximum_spend_logs_retention_period,s="string"==typeof t&&""!==t.trim(),l={store_prompts_in_spend_logs:e.store_prompts_in_spend_logs,...s&&{maximum_spend_logs_retention_period:t}},a=()=>r(l,{onSuccess:()=>b.default.success("Spend logs settings updated successfully"),onError:e=>b.default.fromBackend("Failed to save spend logs settings: "+(0,V.parseErrorMessage)(e))});s?a():i({config_type:G.ConfigType.GENERAL_SETTINGS,field_name:G.GeneralSettingsFieldName.MAXIMUM_SPEND_LOGS_RETENTION_PERIOD},{onError:e=>console.warn("Failed to delete retention period field (may not exist):",e),onSettled:a})},initialValues:d,children:[(0,t.jsx)(g.Form.Item,{label:"Store Prompts in Spend Logs",name:"store_prompts_in_spend_logs",tooltip:n?.find(e=>"store_prompts_in_spend_logs"===e.field_name)?.field_description||"When enabled, prompts will be stored in spend logs for tracking and analysis purposes.",valuePropName:"checked",children:(0,t.jsx)(J.Switch,{})}),(0,t.jsx)(g.Form.Item,{label:"Maximum Spend Logs Retention Period (Optional)",name:"maximum_spend_logs_retention_period",tooltip:n?.find(e=>"maximum_spend_logs_retention_period"===e.field_name)?.field_description||"Set the maximum retention period for spend logs (e.g., '7d' for 7 days, '30d' for 30 days). Leave empty for no limit.",children:(0,t.jsx)(_.Input,{placeholder:"e.g., 7d, 30d",prefix:(0,t.jsx)(Q.ClockCircleOutlined,{})})}),(0,t.jsx)(g.Form.Item,{children:(0,t.jsx)(m.Button,{type:"primary",htmlType:"submit",loading:l||a,children:l||a?"Saving...":"Save Settings"})})]})]})})};var Z=e.i(266027),ee=e.i(243652);let et=(0,ee.createQueryKeys)("sso"),es=()=>{let{accessToken:e,userId:t,userRole:r}=(0,s.default)();return(0,Z.useQuery)({queryKey:et.detail("settings"),queryFn:async()=>await (0,w.getSSOSettings)(e),enabled:!!(e&&t&&r)})};var er=e.i(869216),el=e.i(262218),ei=e.i(823429),ei=ei,ea=e.i(98919),en=e.i(727612),eo=e.i(174553),ed=e.i(336712),ec=e.i(39182);let eu={google:ed.default.src,microsoft:ec.default.src,okta:"https://www.okta.com/sites/default/files/Okta_Logo_BrightBlue_Medium.png",generic:"",saml:""},ep={google:"Google SSO",microsoft:"Microsoft SSO",okta:"Okta / Auth0 SSO",generic:"Generic SSO",saml:"SAML SSO"},em={internal_user_viewer:"Internal Viewer",internal_user:"Internal User",proxy_admin_viewer:"Proxy Admin Viewer",proxy_admin:"Proxy Admin"};var eg=e.i(536916),e_=e.i(199133);let eh={google:{envVarMap:{google_client_id:"GOOGLE_CLIENT_ID",google_client_secret:"GOOGLE_CLIENT_SECRET"},fields:[{label:"Google Client ID",name:"google_client_id"},{label:"Google Client Secret",name:"google_client_secret"}]},microsoft:{envVarMap:{microsoft_client_id:"MICROSOFT_CLIENT_ID",microsoft_client_secret:"MICROSOFT_CLIENT_SECRET",microsoft_tenant:"MICROSOFT_TENANT"},fields:[{label:"Microsoft Client ID",name:"microsoft_client_id"},{label:"Microsoft Client Secret",name:"microsoft_client_secret"},{label:"Microsoft Tenant",name:"microsoft_tenant"}]},okta:{envVarMap:{generic_client_id:"GENERIC_CLIENT_ID",generic_client_secret:"GENERIC_CLIENT_SECRET",generic_authorization_endpoint:"GENERIC_AUTHORIZATION_ENDPOINT",generic_token_endpoint:"GENERIC_TOKEN_ENDPOINT",generic_userinfo_endpoint:"GENERIC_USERINFO_ENDPOINT",generic_scope:"GENERIC_SCOPE"},fields:[{label:"Generic Client ID",name:"generic_client_id"},{label:"Generic Client Secret",name:"generic_client_secret"},{label:"Authorization Endpoint",name:"generic_authorization_endpoint",placeholder:"https://your-domain/authorize"},{label:"Token Endpoint",name:"generic_token_endpoint",placeholder:"https://your-domain/token"},{label:"Userinfo Endpoint",name:"generic_userinfo_endpoint",placeholder:"https://your-domain/userinfo"},{label:"Scopes",name:"generic_scope",placeholder:"openid email profile",required:!1}]},generic:{envVarMap:{generic_client_id:"GENERIC_CLIENT_ID",generic_client_secret:"GENERIC_CLIENT_SECRET",generic_authorization_endpoint:"GENERIC_AUTHORIZATION_ENDPOINT",generic_token_endpoint:"GENERIC_TOKEN_ENDPOINT",generic_userinfo_endpoint:"GENERIC_USERINFO_ENDPOINT",generic_scope:"GENERIC_SCOPE"},fields:[{label:"Generic Client ID",name:"generic_client_id"},{label:"Generic Client Secret",name:"generic_client_secret"},{label:"Authorization Endpoint",name:"generic_authorization_endpoint"},{label:"Token Endpoint",name:"generic_token_endpoint"},{label:"Userinfo Endpoint",name:"generic_userinfo_endpoint"},{label:"Scopes",name:"generic_scope",placeholder:"openid email profile",required:!1}]},saml:{envVarMap:{saml_idp_metadata_url:"SAML_IDP_METADATA_URL",saml_idp_metadata_xml:"SAML_IDP_METADATA_XML",saml_sp_entity_id:"SAML_SP_ENTITY_ID",saml_allow_unsolicited:"SAML_ALLOW_UNSOLICITED"},fields:[{label:"IdP Metadata URL",name:"saml_idp_metadata_url",required:!1,placeholder:"https://idp.example.com/metadata (use this or the metadata XML below)"},{label:"IdP Metadata XML",name:"saml_idp_metadata_xml",required:!1,type:"textarea",placeholder:"Paste the IdP metadata XML here if you do not have a metadata URL"},{label:"SP Entity ID",name:"saml_sp_entity_id",required:!1,placeholder:"Defaults to /sso/saml/metadata"},{label:"Allow IdP-initiated (unsolicited) responses",name:"saml_allow_unsolicited",required:!1,type:"checkbox"}]}},ex=e=>{let s=eh[e];return s?s.fields.map(e=>{let s,r=!1!==e.required?[{required:!0,message:`Please enter the ${e.label.toLowerCase()}`}]:[];return s="checkbox"===e.type?(0,t.jsx)(eg.Checkbox,{}):"textarea"===e.type?(0,t.jsx)(_.Input.TextArea,{rows:4,placeholder:e.placeholder}):"password"===e.type||e.name.includes("client")?(0,t.jsx)(_.Input.Password,{}):(0,t.jsx)(C.TextInput,{placeholder:e.placeholder}),(0,t.jsx)(g.Form.Item,{label:e.label,name:e.name,rules:r,valuePropName:"checkbox"===e.type?"checked":void 0,children:s},e.name)}):null},ef=({form:e,onFormSubmit:s})=>(0,t.jsx)("div",{children:(0,t.jsxs)(g.Form,{form:e,onFinish:s,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsx)(g.Form.Item,{label:"SSO Provider",name:"sso_provider",rules:[{required:!0,message:"Please select an SSO provider"}],children:(0,t.jsx)(e_.Select,{children:Object.entries(eu).map(([e,s])=>(0,t.jsx)(e_.Select.Option,{value:e,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",padding:"4px 0"},children:[s&&(0,t.jsx)(eo.Logo,{src:s,label:ep[e]||e,className:"h-6 w-6 mr-3 object-contain"}),(0,t.jsx)("span",{children:ep[e]||e.charAt(0).toUpperCase()+e.slice(1)+" SSO"})]})},e))})}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let t=e("sso_provider");return t?ex(t):null}}),(0,t.jsx)(g.Form.Item,{label:"Proxy Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Proxy Base URL",name:"proxy_base_url",normalize:e=>e?.trim(),rules:[{required:!0,message:"Please enter the proxy base url"},{pattern:/^https?:\/\/.+/,message:"URL must start with http:// or https://"},{validator:(e,t)=>t&&/^https?:\/\/.+/.test(t)&&t.endsWith("/")?Promise.reject("URL must not end with a trailing slash"):Promise.resolve()}],children:(0,t.jsx)(C.TextInput,{placeholder:"https://example.com"})}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("sso_provider");return"okta"===s||"generic"===s?(0,t.jsx)(g.Form.Item,{label:"Use Role Mappings",name:"use_role_mappings",valuePropName:"checked",children:(0,t.jsx)(eg.Checkbox,{})}):null}}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.use_role_mappings!==t.use_role_mappings||e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("use_role_mappings"),r=e("sso_provider");return s&&("okta"===r||"generic"===r)?(0,t.jsx)(g.Form.Item,{label:"Group Claim",name:"group_claim",rules:[{required:!0,message:"Please enter the group claim"}],children:(0,t.jsx)(C.TextInput,{})}):null}}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.use_role_mappings!==t.use_role_mappings||e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("use_role_mappings"),r=e("sso_provider");return s&&("okta"===r||"generic"===r)?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Form.Item,{label:"Default Role",name:"default_role",initialValue:"Internal User",children:(0,t.jsxs)(e_.Select,{children:[(0,t.jsx)(e_.Select.Option,{value:"internal_user_viewer",children:"Internal Viewer"}),(0,t.jsx)(e_.Select.Option,{value:"internal_user",children:"Internal User"}),(0,t.jsx)(e_.Select.Option,{value:"proxy_admin_viewer",children:"Admin Viewer"}),(0,t.jsx)(e_.Select.Option,{value:"proxy_admin",children:"Proxy Admin"})]})}),(0,t.jsx)(g.Form.Item,{label:"Proxy Admin Teams",name:"proxy_admin_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Admin Viewer Teams",name:"admin_viewer_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Internal User Teams",name:"internal_user_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Internal Viewer Teams",name:"internal_viewer_teams",children:(0,t.jsx)(C.TextInput,{})})]}):null}}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("sso_provider");return"okta"===s||"generic"===s?(0,t.jsx)(g.Form.Item,{label:"Use Team Mappings",name:"use_team_mappings",valuePropName:"checked",children:(0,t.jsx)(eg.Checkbox,{})}):null}}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.use_team_mappings!==t.use_team_mappings||e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("use_team_mappings"),r=e("sso_provider");return s&&("okta"===r||"generic"===r)?(0,t.jsx)(g.Form.Item,{label:"Team IDs JWT Field",name:"team_ids_jwt_field",rules:[{required:!0,message:"Please enter the team IDs JWT field"}],children:(0,t.jsx)(C.TextInput,{})}):null}})]})}),ey=()=>{let{accessToken:e}=(0,s.default)();return(0,K.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return await (0,w.updateSSOSettings)(e,t)}})},ej=e=>{let{proxy_admin_teams:t,admin_viewer_teams:s,internal_user_teams:r,internal_viewer_teams:l,default_role:i,group_claim:a,use_role_mappings:n,use_team_mappings:o,team_ids_jwt_field:d,...c}=e,u={...c};"boolean"==typeof u.saml_allow_unsolicited&&(u.saml_allow_unsolicited=u.saml_allow_unsolicited?"true":"false");let p=c.sso_provider;if(n&&("okta"===p||"generic"===p)){let e=e=>e&&""!==e.trim()?e.split(",").map(e=>e.trim()).filter(e=>e.length>0):[];u.role_mappings={provider:"generic",group_claim:a,default_role:({internal_user_viewer:"internal_user_viewer",internal_user:"internal_user",proxy_admin_viewer:"proxy_admin_viewer",proxy_admin:"proxy_admin"})[i]||"internal_user",roles:{proxy_admin:e(t),proxy_admin_viewer:e(s),internal_user:e(r),internal_user_viewer:e(l)}}}return o&&("okta"===p||"generic"===p)&&(u.team_mappings={team_ids_jwt_field:d}),u},ev=e=>e.google_client_id?"google":e.microsoft_client_id?"microsoft":e.generic_client_id?e.generic_authorization_endpoint?.includes("okta")||e.generic_authorization_endpoint?.includes("auth0")?"okta":"generic":e.saml_idp_metadata_url||e.saml_idp_metadata_xml?"saml":null,eS=({isVisible:e,onCancel:s,onSuccess:r})=>{let[l]=g.Form.useForm(),{mutateAsync:i,isPending:a}=ey(),n=async e=>{let t=ej(e);await i(t,{onSuccess:()=>{b.default.success("SSO settings added successfully"),r()},onError:e=>{b.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}})},o=()=>{l.resetFields(),s()};return(0,t.jsx)(h.Modal,{title:"Add SSO",open:e,width:800,footer:(0,t.jsxs)(x.Space,{children:[(0,t.jsx)(m.Button,{onClick:o,disabled:a,children:"Cancel"}),(0,t.jsx)(m.Button,{loading:a,onClick:()=>l.submit(),children:a?"Adding...":"Add SSO"})]}),onCancel:o,children:(0,t.jsx)(ef,{form:l,onFormSubmit:n})})};var eb=e.i(127952);let ew=({isVisible:e,onCancel:s,onSuccess:r})=>{let{data:l}=es(),{mutateAsync:i,isPending:a}=ey(),n=async()=>{await i({google_client_id:null,google_client_secret:null,microsoft_client_id:null,microsoft_client_secret:null,microsoft_tenant:null,generic_client_id:null,generic_client_secret:null,generic_authorization_endpoint:null,generic_token_endpoint:null,generic_userinfo_endpoint:null,saml_idp_metadata_url:null,saml_idp_metadata_xml:null,saml_sp_entity_id:null,saml_allow_unsolicited:null,proxy_base_url:null,user_email:null,sso_provider:null,role_mappings:null,team_mappings:null},{onSuccess:()=>{b.default.success("SSO settings cleared successfully"),s(),r()},onError:e=>{b.default.fromBackend("Failed to clear SSO settings: "+(0,V.parseErrorMessage)(e))}})};return(0,t.jsx)(eb.default,{isOpen:e,title:"Confirm Clear SSO Settings",alertMessage:"This action cannot be undone.",message:"Are you sure you want to clear all SSO settings? Users will no longer be able to login using SSO after this change.",resourceInformationTitle:"SSO Settings",resourceInformation:[{label:"Provider",value:l?.values&&ev(l?.values)||"Generic"}],onCancel:s,onOk:n,confirmLoading:a})},eI=({isVisible:e,onCancel:s,onSuccess:r})=>{let[l]=g.Form.useForm(),i=es(),{mutateAsync:a,isPending:n}=ey();(0,j.useEffect)(()=>{if(e&&i.data&&i.data.values){let e=i.data,t=ev(e.values),s={};if(e.values.role_mappings){let t=e.values.role_mappings,r=e=>e&&0!==e.length?e.join(", "):"";s={use_role_mappings:!0,group_claim:t.group_claim,default_role:t.default_role||"internal_user",proxy_admin_teams:r(t.roles?.proxy_admin),admin_viewer_teams:r(t.roles?.proxy_admin_viewer),internal_user_teams:r(t.roles?.internal_user),internal_viewer_teams:r(t.roles?.internal_user_viewer)}}let r={};e.values.team_mappings&&(r={use_team_mappings:!0,team_ids_jwt_field:e.values.team_mappings.team_ids_jwt_field});let a={sso_provider:t,...e.values,...s,...r,...null!=e.values.saml_allow_unsolicited?{saml_allow_unsolicited:"true"===e.values.saml_allow_unsolicited}:{}};l.resetFields(),setTimeout(()=>{l.setFieldsValue(a)},100)}},[e,i.data,l]);let o=async e=>{try{let t=ej(e);await a(t,{onSuccess:()=>{b.default.success("SSO settings updated successfully"),r()},onError:e=>{b.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}})}catch(e){b.default.fromBackend("Failed to process SSO settings: "+(0,V.parseErrorMessage)(e))}},d=()=>{l.resetFields(),s()};return(0,t.jsx)(h.Modal,{title:"Edit SSO Settings",open:e,width:800,footer:(0,t.jsxs)(x.Space,{children:[(0,t.jsx)(m.Button,{onClick:d,disabled:n,children:"Cancel"}),(0,t.jsx)(m.Button,{loading:n,onClick:()=>l.submit(),children:n?"Saving...":"Save"})]}),onCancel:d,children:(0,t.jsx)(ef,{form:l,onFormSubmit:o})})};var ek=e.i(286536),eT=e.i(77705);function eC({defaultHidden:e=!0,value:s}){let[r,l]=(0,j.useState)(e);return(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"font-mono text-gray-600 flex-1",children:s?r?"•".repeat(s.length):s:(0,t.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})}),s&&(0,t.jsx)(m.Button,{type:"text",size:"small",icon:r?(0,t.jsx)(ek.Eye,{className:"w-4 h-4"}):(0,t.jsx)(eT.EyeOff,{className:"w-4 h-4"}),onClick:()=>l(!r),className:"text-gray-400 hover:text-gray-600"})]})}var eE=e.i(312361),eN=e.i(291542),eO=e.i(761911);let{Title:eF,Text:eP}=y.Typography;function eA({roleMappings:e}){if(!e)return null;let s=[{title:"Role",dataIndex:"role",key:"role",render:e=>(0,t.jsx)(eP,{strong:!0,children:em[e]})},{title:"Mapped Groups",dataIndex:"groups",key:"groups",render:e=>(0,t.jsx)(t.Fragment,{children:e.length>0?e.map((e,s)=>(0,t.jsx)(el.Tag,{color:"blue",children:e},s)):(0,t.jsx)(eP,{className:"text-gray-400 italic",children:"No groups mapped"})})}];return(0,t.jsxs)(W.Card,{children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(eO.Users,{className:"w-6 h-6 text-gray-400 mb-2"}),(0,t.jsx)(eF,{level:3,children:"Role Mappings"})]}),(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(eF,{level:5,children:"Group Claim"}),(0,t.jsx)("div",{children:(0,t.jsx)(eP,{code:!0,children:e.group_claim})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)(eF,{level:5,children:"Default Role"}),(0,t.jsx)("div",{children:(0,t.jsx)(eP,{strong:!0,children:em[e.default_role]})})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsx)(eN.Table,{columns:s,dataSource:Object.entries(e.roles).map(([e,t])=>({role:e,groups:t})),pagination:!1,bordered:!0,size:"small",className:"w-full"})]})]})}var eM=e.i(21548);let{Title:eB,Paragraph:eL}=y.Typography;function eU({onAdd:e}){return(0,t.jsx)("div",{className:"bg-white p-12 rounded-lg border border-dashed border-gray-300 text-center w-full",children:(0,t.jsx)(eM.Empty,{image:eM.Empty.PRESENTED_IMAGE_SIMPLE,description:(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(eB,{level:4,children:"No SSO Configuration Found"}),(0,t.jsx)(eL,{type:"secondary",className:"max-w-md mx-auto",children:"Configure Single Sign-On (SSO) to enable seamless authentication for your team members using your identity provider."})]}),children:(0,t.jsx)(m.Button,{type:"primary",size:"large",onClick:e,className:"flex items-center gap-2 mx-auto mt-4",children:"Configure SSO"})})})}let{Title:eR,Text:ez}=y.Typography;function eD(){return(0,t.jsx)(W.Card,{children:(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(ea.Shield,{className:"w-6 h-6 text-gray-400"}),(0,t.jsxs)("div",{children:[(0,t.jsx)(eR,{level:3,children:"SSO Configuration"}),(0,t.jsx)(ez,{type:"secondary",children:"Manage Single Sign-On authentication settings"})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(Y.Skeleton.Button,{active:!0,size:"default",style:{width:170,height:32}}),(0,t.jsx)(Y.Skeleton.Button,{active:!0,size:"default",style:{width:190,height:32}})]})]}),(0,t.jsxs)(er.Descriptions,{bordered:!0,...{column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}},children:[(0,t.jsx)(er.Descriptions.Item,{label:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,t.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:100,height:16}})})}),(0,t.jsx)(er.Descriptions.Item,{label:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:200,height:16}})}),(0,t.jsx)(er.Descriptions.Item,{label:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:250,height:16}})}),(0,t.jsx)(er.Descriptions.Item,{label:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:180,height:16}})}),(0,t.jsx)(er.Descriptions.Item,{label:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,t.jsx)(Y.Skeleton.Node,{active:!0,style:{width:220,height:16}})})]})]})})}let{Title:eV,Text:eq}=y.Typography;function eG(){let{data:e,refetch:s,isLoading:r}=es(),[l,i]=(0,j.useState)(!1),[a,n]=(0,j.useState)(!1),[o,d]=(0,j.useState)(!1),c=[e?.values.google_client_id,e?.values.microsoft_client_id,e?.values.generic_client_id,e?.values.saml_idp_metadata_url,e?.values.saml_idp_metadata_xml].some(Boolean),u=e?.values?ev(e.values):null,p=!!e?.values.role_mappings,g=!!e?.values.team_mappings,_=e=>(0,t.jsx)(eq,{className:"font-mono text-gray-600 text-sm",copyable:!!e,children:e||"-"}),h=e=>e||(0,t.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"}),f=e=>e.team_mappings?.team_ids_jwt_field?(0,t.jsx)(el.Tag,{children:e.team_mappings.team_ids_jwt_field}):(0,t.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"}),y={column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}},v={google:{providerText:ep.google,fields:[{label:"Client ID",render:e=>(0,t.jsx)(eC,{value:e.google_client_id})},{label:"Client Secret",render:e=>(0,t.jsx)(eC,{value:e.google_client_secret})},{label:"Proxy Base URL",render:e=>h(e.proxy_base_url)}]},microsoft:{providerText:ep.microsoft,fields:[{label:"Client ID",render:e=>(0,t.jsx)(eC,{value:e.microsoft_client_id})},{label:"Client Secret",render:e=>(0,t.jsx)(eC,{value:e.microsoft_client_secret})},{label:"Tenant",render:e=>h(e.microsoft_tenant)},{label:"Proxy Base URL",render:e=>h(e.proxy_base_url)}]},okta:{providerText:ep.okta,fields:[{label:"Client ID",render:e=>(0,t.jsx)(eC,{value:e.generic_client_id})},{label:"Client Secret",render:e=>(0,t.jsx)(eC,{value:e.generic_client_secret})},{label:"Authorization Endpoint",render:e=>_(e.generic_authorization_endpoint)},{label:"Token Endpoint",render:e=>_(e.generic_token_endpoint)},{label:"User Info Endpoint",render:e=>_(e.generic_userinfo_endpoint)},{label:"Scopes",render:e=>h(e.generic_scope)},{label:"Proxy Base URL",render:e=>h(e.proxy_base_url)},g?{label:"Team IDs JWT Field",render:e=>f(e)}:null]},generic:{providerText:ep.generic,fields:[{label:"Client ID",render:e=>(0,t.jsx)(eC,{value:e.generic_client_id})},{label:"Client Secret",render:e=>(0,t.jsx)(eC,{value:e.generic_client_secret})},{label:"Authorization Endpoint",render:e=>_(e.generic_authorization_endpoint)},{label:"Token Endpoint",render:e=>_(e.generic_token_endpoint)},{label:"User Info Endpoint",render:e=>_(e.generic_userinfo_endpoint)},{label:"Scopes",render:e=>h(e.generic_scope)},{label:"Proxy Base URL",render:e=>h(e.proxy_base_url)},g?{label:"Team IDs JWT Field",render:e=>f(e)}:null]},saml:{providerText:ep.saml,fields:[{label:"IdP Metadata URL",render:e=>_(e.saml_idp_metadata_url)},{label:"IdP Metadata XML",render:e=>e.saml_idp_metadata_xml?(0,t.jsx)(el.Tag,{children:"Provided"}):(0,t.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})},{label:"SP Entity ID",render:e=>_(e.saml_sp_entity_id)},{label:"Allow IdP-initiated (unsolicited) responses",render:e=>(0,t.jsx)(el.Tag,{color:"true"===e.saml_allow_unsolicited?"green":"default",children:"true"===e.saml_allow_unsolicited?"Enabled":"Disabled"})},{label:"Proxy Base URL",render:e=>h(e.proxy_base_url)}]}};return(0,t.jsxs)(t.Fragment,{children:[r?(0,t.jsx)(eD,{}):(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsx)(W.Card,{children:(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(ea.Shield,{className:"w-6 h-6 text-gray-400"}),(0,t.jsxs)("div",{children:[(0,t.jsx)(eV,{level:3,children:"SSO Configuration"}),(0,t.jsx)(eq,{type:"secondary",children:"Manage Single Sign-On authentication settings"})]})]}),(0,t.jsx)("div",{className:"flex items-center gap-3",children:c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(m.Button,{icon:(0,t.jsx)(ei.default,{className:"w-4 h-4"}),onClick:()=>d(!0),children:"Edit SSO Settings"}),(0,t.jsx)(m.Button,{danger:!0,icon:(0,t.jsx)(en.Trash2,{className:"w-4 h-4"}),onClick:()=>i(!0),children:"Delete SSO Settings"})]})})]}),c?(()=>{if(!e?.values||!u)return null;let{values:s}=e,r=v[u];return r?(0,t.jsxs)(er.Descriptions,{bordered:!0,...y,children:[(0,t.jsx)(er.Descriptions.Item,{label:"Provider",children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[eu[u]&&(0,t.jsx)(eo.Logo,{src:eu[u],label:ep[u]||u,className:"h-6 w-6 object-contain"}),(0,t.jsx)("span",{children:r.providerText})]})}),r.fields.map((e,r)=>e&&(0,t.jsx)(er.Descriptions.Item,{label:e.label,children:e.render(s)},r))]}):null})():(0,t.jsx)(eU,{onAdd:()=>n(!0)})]})}),p&&(0,t.jsx)(eA,{roleMappings:e?.values.role_mappings})]}),(0,t.jsx)(ew,{isVisible:l,onCancel:()=>i(!1),onSuccess:()=>s()}),(0,t.jsx)(eS,{isVisible:a,onCancel:()=>n(!1),onSuccess:()=>{n(!1),s()}}),(0,t.jsx)(eI,{isVisible:o,onCancel:()=>d(!1),onSuccess:()=>{d(!1),s()}})]})}var eK=e.i(292639);let eH=(0,ee.createQueryKeys)("uiSettings");var e$=e.i(111672);let eQ={"api-keys":"Manage virtual keys for API access and authentication","llm-playground":"Interactive playground for testing LLM requests",models:"Configure and manage LLM models and endpoints",agents:"Create and manage AI agents",agentic:"Manage agentic resources: agents, workflow runs, and memory",workflows:"Track and inspect durable workflow run history","mcp-servers":"Configure Model Context Protocol servers",memory:"Inspect and manage agent memory entries stored under /v1/memory",guardrails:"Set up content moderation and safety guardrails",policies:"Define access control and usage policies","search-tools":"Configure RAG search and retrieval tools","tool-policies":"Configure tool use policies and permissions","vector-stores":"Manage vector databases for embeddings",new_usage:"View usage analytics and metrics","cost-optimization":"Track and configure cost-saving features: prompt compression, caching, and auto routing",logs:"Access request and response logs","guardrails-monitor":"Monitor guardrail performance and view logs",users:"Manage internal user accounts and permissions",teams:"Create and manage teams for access control",organizations:"Manage organizations and their members",projects:"Manage projects within teams","access-groups":"Manage access groups for role-based permissions",budgets:"Set and monitor spending budgets",api_ref:"Browse API documentation and endpoints","model-hub-table":"Explore available AI models and providers","learning-resources":"Access tutorials and documentation",caching:"Configure response caching and coordination Redis settings","transform-request":"Set up request transformation rules","cost-tracking":"Track and analyze API costs","ui-theme":"Customize dashboard appearance","tag-management":"Organize resources with tags",prompts:"Manage and version prompt templates",skills:"Browse and manage Claude Code skills",usage:"View legacy usage dashboard","router-settings":"Configure routing and load balancing settings","logging-and-alerts":"Set up logging and alert configurations","admin-panel":"Access admin panel and settings"};var eW=e.i(708347);let eY=e=>!e||0===e.length||e.some(e=>eW.internalUserRoles.includes(e));var eJ=e.i(362024);function eX({enabledPagesInternalUsers:e,enabledPagesPropertyDescription:s,isUpdating:r,onUpdate:l}){let i=null!=e,a=(0,j.useMemo)(()=>{let e;return e=[],e$.menuGroups.forEach(t=>{t.items.forEach(s=>{if(s.page&&"tools"!==s.page&&"experimental"!==s.page&&"settings"!==s.page&&eY(s.roles)){let r="string"==typeof s.label?s.label:s.key;e.push({page:s.page,label:r,group:t.groupLabel,description:eQ[s.page]||"No description available"})}if(s.children){let r="string"==typeof s.label?s.label:s.key;s.children.forEach(s=>{if(eY(s.roles)){let l="string"==typeof s.label?s.label:s.key;e.push({page:s.page,label:l,group:`${t.groupLabel} > ${r}`,description:eQ[s.page]||"No description available"})}})}})}),e},[]),n=(0,j.useMemo)(()=>{let e={};return a.forEach(t=>{e[t.group]||(e[t.group]=[]),e[t.group].push(t)}),e},[a]),[o,d]=(0,j.useState)(e||[]);return(0,j.useMemo)(()=>{e?d(e):d([])},[e]),(0,t.jsxs)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:[(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsxs)(x.Space,{align:"center",children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Internal User Page Visibility"}),!i&&(0,t.jsx)(el.Tag,{color:"default",style:{marginLeft:"8px"},children:"Not set (all pages visible)"}),i&&(0,t.jsxs)(el.Tag,{color:"blue",style:{marginLeft:"8px"},children:[o.length," page",1!==o.length?"s":""," selected"]})]}),s&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:s}),(0,t.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px",fontStyle:"italic"},children:"By default, all pages are visible to internal users. Select specific pages to restrict visibility."}),(0,t.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px",color:"#8b5cf6"},children:"Note: Only pages accessible to internal user roles are shown here. Admin-only pages are excluded as they cannot be made visible to internal users regardless of this setting."})]}),(0,t.jsx)(eJ.Collapse,{items:[{key:"page-visibility",label:"Configure Page Visibility",children:(0,t.jsxs)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:[(0,t.jsx)(eg.Checkbox.Group,{value:o,onChange:d,style:{width:"100%"},children:(0,t.jsx)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:Object.entries(n).map(([e,s])=>(0,t.jsxs)("div",{children:[(0,t.jsx)(y.Typography.Text,{strong:!0,style:{fontSize:"11px",color:"#6b7280",letterSpacing:"0.05em",display:"block",marginBottom:"8px"},children:e}),(0,t.jsx)(x.Space,{direction:"vertical",size:"small",style:{marginLeft:"16px",width:"100%"},children:s.map(e=>(0,t.jsx)("div",{style:{marginBottom:"4px"},children:(0,t.jsx)(eg.Checkbox,{value:e.page,children:(0,t.jsxs)(x.Space,{direction:"vertical",size:0,children:[(0,t.jsx)(y.Typography.Text,{children:e.label}),(0,t.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px"},children:e.description})]})})},e.page))})]},e))})}),(0,t.jsxs)(x.Space,{children:[(0,t.jsx)(m.Button,{type:"primary",onClick:()=>{l({enabled_ui_pages_internal_users:o.length>0?o:null})},loading:r,disabled:r,children:"Save Page Visibility Settings"}),i&&(0,t.jsx)(m.Button,{onClick:()=>{d([]),l({enabled_ui_pages_internal_users:null})},loading:r,disabled:r,children:"Reset to Default (All Pages)"})]})]})}]})]})}function eZ(){let e,{accessToken:r}=(0,s.default)(),{data:l,isLoading:i,isError:a,error:n}=(0,eK.useUISettings)(),{mutate:o,isPending:d,error:c}=(e=(0,H.useQueryClient)(),(0,K.useMutation)({mutationFn:async e=>{if(!r)throw Error("Access token is required");return(0,w.updateUiSettings)(r,e)},onSuccess:()=>{e.invalidateQueries({queryKey:eH.all})}})),u=l?.field_schema,m=u?.properties?.disable_model_add_for_internal_users,g=u?.properties?.disable_team_admin_delete_team_user,_=u?.properties?.require_auth_for_public_ai_hub,h=u?.properties?.forward_client_headers_to_llm_api,f=u?.properties?.forward_llm_provider_auth_headers,j=u?.properties?.enable_projects_ui,v=u?.properties?.enable_chat_ui,S=u?.properties?.enabled_ui_pages_internal_users,I=u?.properties?.disable_agents_for_internal_users,k=u?.properties?.allow_agents_for_team_admins,T=u?.properties?.disable_vector_stores_for_internal_users,C=u?.properties?.allow_vector_stores_for_team_admins,E=u?.properties?.scope_user_search_to_org,N=u?.properties?.disable_custom_api_keys,O=l?.values??{},F=!!O.disable_model_add_for_internal_users,P=!!O.disable_team_admin_delete_team_user,A=!!O.disable_agents_for_internal_users,M=!!O.disable_vector_stores_for_internal_users;return(0,t.jsx)(W.Card,{title:"UI Settings",children:i?(0,t.jsx)(Y.Skeleton,{active:!0}):a?(0,t.jsx)(p.Alert,{type:"error",message:"Could not load UI settings",description:n instanceof Error?n.message:void 0}):(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",style:{width:"100%"},children:[u?.description&&(0,t.jsx)(y.Typography.Paragraph,{style:{marginBottom:0},children:u.description}),c&&(0,t.jsx)(p.Alert,{type:"error",message:"Could not update UI settings",description:c instanceof Error?c.message:void 0}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:F,disabled:d,loading:d,onChange:e=>{o({disable_model_add_for_internal_users:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":m?.description??"Disable model add for internal users"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Disable model add for internal users"}),m?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:m.description})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:P,disabled:d,loading:d,onChange:e=>{o({disable_team_admin_delete_team_user:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":g?.description??"Disable team admin delete team user"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Disable team admin delete team user"}),g?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:g.description})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:O.require_auth_for_public_ai_hub,disabled:d,loading:d,onChange:e=>{o({require_auth_for_public_ai_hub:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":_?.description??"Require authentication for public AI Hub"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Require authentication for public AI Hub"}),_?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:_.description})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.forward_client_headers_to_llm_api,disabled:d,loading:d,onChange:e=>{o({forward_client_headers_to_llm_api:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":h?.description??"Forward client headers to LLM API"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Forward client headers to LLM API"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:h?.description??"Forwards client headers (Authorization, anthropic-beta, and x-* custom headers) to the upstream LLM. Enable for Claude Code with a Max subscription (forwards the OAuth token) or to pass custom/tracing headers through to the provider. Independent of the BYOK toggle — enable only the one(s) you need."})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.forward_llm_provider_auth_headers,disabled:d,loading:d,onChange:e=>{o({forward_llm_provider_auth_headers:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":f?.description??"Forward LLM provider auth headers"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Forward LLM provider auth headers"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:f?.description??"Forwards provider auth headers (x-api-key, x-goog-api-key, api-key, ocp-apim-subscription-key) to the upstream LLM, overriding any deployment-configured key for that request. Enable for Claude Code BYOK (clients bring their own API key). Independent of the client-headers toggle — enable only the one(s) you need."})]})]}),j&&(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.enable_projects_ui,disabled:d,loading:d,onChange:e=>{o({enable_projects_ui:e},{onSuccess:()=>{b.default.success("UI settings updated successfully. Refreshing page..."),setTimeout(()=>window.location.reload(),1e3)},onError:e=>{b.default.fromBackend(e)}})},"aria-label":j.description??"Enable Projects UI"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"[BETA] Enable Projects (page will refresh)"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:j.description??"If enabled, shows the Projects feature in the UI sidebar and the project field in key management."})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.enable_chat_ui,disabled:d,loading:d,onChange:e=>{o({enable_chat_ui:e},{onSuccess:()=>{b.default.success("UI settings updated successfully. Refreshing page..."),setTimeout(()=>window.location.reload(),1e3)},onError:e=>{b.default.fromBackend(e)}})},"aria-label":v?.description??"Enable Chat page"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"[BETA] Enable Chat page (page will refresh)"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:v?.description??"If enabled, shows the Chat page in the UI sidebar, letting users chat with an LLM and connect their own MCP server credentials via OAuth."})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:A,disabled:d,loading:d,onChange:e=>{o({disable_agents_for_internal_users:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":I?.description??"Disable agents for internal users"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Disable agents for internal users"}),I?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:I.description})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",style:{marginLeft:32},children:[(0,t.jsx)(J.Switch,{checked:!!O.allow_agents_for_team_admins,disabled:d||!A,loading:d,onChange:e=>{o({allow_agents_for_team_admins:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":k?.description??"Allow agents for team admins"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,type:A?void 0:"secondary",children:"Allow agents for team admins"}),k?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:k.description})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:M,disabled:d,loading:d,onChange:e=>{o({disable_vector_stores_for_internal_users:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":T?.description??"Disable vector stores for internal users"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Disable vector stores for internal users"}),T?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:T.description})]})]}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",style:{marginLeft:32},children:[(0,t.jsx)(J.Switch,{checked:!!O.allow_vector_stores_for_team_admins,disabled:d||!M,loading:d,onChange:e=>{o({allow_vector_stores_for_team_admins:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":C?.description??"Allow vector stores for team admins"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,type:M?void 0:"secondary",children:"Allow vector stores for team admins"}),C?.description&&(0,t.jsx)(y.Typography.Text,{type:"secondary",children:C.description})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.scope_user_search_to_org,disabled:d,loading:d,onChange:e=>{o({scope_user_search_to_org:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":E?.description??"Scope user search to organization"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Scope user search to organization"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:E?.description??"If enabled, the user search endpoint restricts results by organization. When off, any authenticated user can search all users."})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,t.jsx)(J.Switch,{checked:!!O.disable_custom_api_keys,disabled:d,loading:d,onChange:e=>{o({disable_custom_api_keys:e},{onSuccess:()=>{b.default.success("UI settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})},"aria-label":N?.description??"Disable custom Virtual key values"}),(0,t.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,t.jsx)(y.Typography.Text,{strong:!0,children:"Disable custom Virtual key values"}),(0,t.jsx)(y.Typography.Text,{type:"secondary",children:N?.description??"If true, users cannot specify custom key values. All keys must be auto-generated."})]})]}),(0,t.jsx)(eE.Divider,{}),(0,t.jsx)(eX,{enabledPagesInternalUsers:O.enabled_ui_pages_internal_users,enabledPagesPropertyDescription:S?.description,isUpdating:d,onUpdate:e=>{o(e,{onSuccess:()=>{b.default.success("Page visibility settings updated successfully")},onError:e=>{b.default.fromBackend(e)}})}})]})})}var e0=e.i(431703);let e1=async e=>{let t=(0,w.getProxyBaseUrl)(),s=t?`${t}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",r=await fetch(s,{method:"GET",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,e0.deriveErrorMessage)(e))}return await r.json()},e4=async(e,t)=>{let s=(0,w.getProxyBaseUrl)(),r=s?`${s}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",l=await fetch(r,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!l.ok){let e=await l.json();throw Error((0,e0.deriveErrorMessage)(e))}return await l.json()},e6=async e=>{let t=(0,w.getProxyBaseUrl)(),s=t?`${t}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",r=await fetch(s,{method:"DELETE",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,e0.deriveErrorMessage)(e))}return await r.json()},e2=async e=>{let t=(0,w.getProxyBaseUrl)(),s=t?`${t}/config_overrides/hashicorp_vault/test_connection`:"/config_overrides/hashicorp_vault/test_connection",r=await fetch(s,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,e0.deriveErrorMessage)(e))}return await r.json()},e3=(0,ee.createQueryKeys)("hashicorpVaultConfig"),e8=()=>{let{accessToken:e}=(0,s.default)();return(0,Z.useQuery)({queryKey:e3.list({}),queryFn:async()=>{if(!e)throw Error("Access token is required");return e1(e)},enabled:!!e,staleTime:36e5,gcTime:36e5})},e5=e=>{let t=(0,H.useQueryClient)();return(0,K.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return e4(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:e3.all})}})};var e7=e.i(525720),ei=ei,e9=e.i(465261);let te=(0,e.i(475254).default)("plug-zap",[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]]),tt=new Set(["vault_token","approle_secret_id","client_key"]),ts={vault_addr:"Vault Address",vault_namespace:"Namespace",vault_mount_name:"KV Mount Name",vault_path_prefix:"Path Prefix",vault_token:"Token",approle_role_id:"Role ID",approle_secret_id:"Secret ID",approle_mount_path:"Mount Path",client_cert:"Client Certificate",client_key:"Client Key",vault_cert_role:"Certificate Role"},tr=[{title:"Connection",fields:["vault_addr","vault_namespace","vault_mount_name","vault_path_prefix"]},{title:"Token Authentication",subtitle:"Use a Vault token to authenticate. Only one auth method is required.",fields:["vault_token"]},{title:"AppRole Authentication",subtitle:"Use AppRole credentials to authenticate. Only one auth method is required.",fields:["approle_role_id","approle_secret_id","approle_mount_path"]},{title:"TLS",subtitle:"Optional client certificate for mTLS.",fields:["client_cert","client_key","vault_cert_role"]}],tl=({isVisible:e,onCancel:r,onSuccess:l})=>{let[i]=g.Form.useForm(),{accessToken:a}=(0,s.default)(),{data:n}=e8(),{mutate:o,isPending:d}=e5(a),c=n?.field_schema,u=c?.properties??{},p=n?.values??{};(0,j.useEffect)(()=>{if(e&&n){i.resetFields();let e={};for(let[t,s]of Object.entries(p))tt.has(t)||(e[t]=s);i.setFieldsValue(e)}},[e,n,i]);let f=()=>{i.resetFields(),r()},v=e=>{let s=u[e];if(!s)return null;let r="vault_addr"===e?[{pattern:/^https?:\/\/.+/,message:"Must start with http:// or https://"}]:void 0,l=tt.has(e),i=p[e],a=l&&null!=i&&""!==i?`Leave blank to keep existing (${i})`:s?.description;return(0,t.jsx)(g.Form.Item,{name:e,label:ts[e]??e,rules:r,children:l?(0,t.jsx)(_.Input.Password,{placeholder:a}):(0,t.jsx)(_.Input,{placeholder:s?.description})},e)};return(0,t.jsx)(h.Modal,{title:"Edit Hashicorp Vault Configuration",open:e,width:700,footer:(0,t.jsxs)(x.Space,{children:[(0,t.jsx)(m.Button,{onClick:f,disabled:d,children:"Cancel"}),(0,t.jsx)(m.Button,{type:"primary",loading:d,onClick:()=>i.submit(),children:d?"Saving...":"Save"})]}),onCancel:f,children:(0,t.jsx)(g.Form,{form:i,layout:"vertical",onFinish:e=>{let t={};for(let[s,r]of Object.entries(e))null!=r&&""!==r?t[s]=r:tt.has(s)||(t[s]="");o(t,{onSuccess:()=>{b.default.success("Hashicorp Vault configuration updated successfully"),l()},onError:e=>{b.default.fromBackend(e)}})},children:tr.map((e,s)=>(0,t.jsxs)("div",{children:[s>0&&(0,t.jsx)(eE.Divider,{}),(0,t.jsx)(y.Typography.Title,{level:5,style:{marginBottom:4},children:e.title}),e.subtitle&&(0,t.jsx)(y.Typography.Paragraph,{type:"secondary",style:{marginBottom:16},children:e.subtitle}),e.fields.map(v)]},e.title))})})},{Title:ti,Paragraph:ta}=y.Typography;function tn({onAdd:e}){return(0,t.jsx)("div",{className:"bg-white p-12 rounded-lg border border-dashed border-gray-300 text-center w-full",children:(0,t.jsx)(eM.Empty,{image:eM.Empty.PRESENTED_IMAGE_SIMPLE,description:(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(ti,{level:4,children:"No Vault Configuration Found"}),(0,t.jsx)(ta,{type:"secondary",className:"max-w-md mx-auto",children:"Configure Hashicorp Vault to securely manage provider API keys and secrets for your LiteLLM deployment."})]}),children:(0,t.jsx)(m.Button,{type:"primary",size:"large",onClick:e,className:"flex items-center gap-2 mx-auto mt-4",children:"Configure Vault"})})})}let{Title:to,Text:td}=y.Typography,tc={column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}};function tu(){let e,{accessToken:r}=(0,s.default)(),{data:l,isLoading:i,isError:a,error:n}=e8(),{mutate:o,isPending:d}=(e=(0,H.useQueryClient)(),(0,K.useMutation)({mutationFn:async()=>{if(!r)throw Error("Access token is required");return e6(r)},onSuccess:()=>{e.invalidateQueries({queryKey:e3.all})}})),{mutate:c,isPending:u}=e5(r),[g,_]=(0,j.useState)(!1),[h,f]=(0,j.useState)(!1),[v,S]=(0,j.useState)(null),[w,I]=(0,j.useState)(!1),k=l?.values??{},T=!!k.vault_addr,C=async()=>{if(r){I(!0);try{let e=await e2(r);b.default.success(e.message||"Connection to Vault successful!")}catch(e){b.default.fromBackend(e)}finally{I(!1)}}};return(0,t.jsxs)(t.Fragment,{children:[i?(0,t.jsx)(W.Card,{children:(0,t.jsx)(Y.Skeleton,{active:!0})}):a?(0,t.jsx)(W.Card,{children:(0,t.jsx)(p.Alert,{type:"error",message:"Could not load Hashicorp Vault configuration",description:n instanceof Error?n.message:void 0})}):(0,t.jsx)(W.Card,{children:(0,t.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,t.jsxs)(e7.Flex,{justify:"space-between",align:"center",children:[(0,t.jsxs)(e7.Flex,{align:"center",gap:12,children:[(0,t.jsx)(e9.KeyRound,{className:"w-6 h-6 text-gray-400"}),(0,t.jsxs)("div",{children:[(0,t.jsx)(to,{level:3,style:{marginBottom:0},children:"Hashicorp Vault"}),(0,t.jsx)(td,{type:"secondary",children:"Manage secret manager configuration"})]})]}),(0,t.jsx)(x.Space,{children:T&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(m.Button,{icon:(0,t.jsx)(te,{className:"w-4 h-4"}),loading:w,onClick:C,children:"Test Connection"}),(0,t.jsx)(m.Button,{icon:(0,t.jsx)(ei.default,{className:"w-4 h-4"}),onClick:()=>_(!0),children:"Edit Configuration"}),(0,t.jsx)(m.Button,{danger:!0,icon:(0,t.jsx)(en.Trash2,{className:"w-4 h-4"}),onClick:()=>f(!0),children:"Delete Configuration"})]})})]}),T&&(0,t.jsx)(p.Alert,{type:"info",showIcon:!0,message:'Secrets must be stored with the field name "key"',description:(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(td,{code:!0,children:"vault kv put secret/SECRET_NAME key=secret_value"}),(0,t.jsx)("br",{}),(0,t.jsx)(y.Typography.Link,{href:"https://docs.litellm.ai/docs/secret_managers/hashicorp_vault",target:"_blank",children:"View documentation"})]})}),T?(()=>{let e=Object.entries(k).filter(([e,t])=>null!=t&&""!==t);return 0===e.length?null:(0,t.jsxs)(er.Descriptions,{bordered:!0,...tc,children:[(0,t.jsx)(er.Descriptions.Item,{label:"Auth Method",children:(0,t.jsx)(td,{children:k.approle_role_id||k.approle_secret_id?"AppRole":k.client_cert&&k.client_key?"TLS Certificate":k.vault_token?"Token":"None"})}),e.map(([e])=>{let s;return(0,t.jsx)(er.Descriptions.Item,{label:ts[e]??e,children:(s=k[e])?tt.has(e)?(0,t.jsxs)(e7.Flex,{justify:"space-between",align:"center",children:[(0,t.jsx)(td,{className:"font-mono text-gray-600",children:s}),(0,t.jsx)(m.Button,{type:"text",size:"small",danger:!0,icon:(0,t.jsx)(en.Trash2,{className:"w-3.5 h-3.5"}),onClick:()=>S(e)})]}):(0,t.jsx)(td,{className:"font-mono text-gray-600",children:s}):(0,t.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})},e)})]})})():(0,t.jsx)(tn,{onAdd:()=>_(!0)})]})}),(0,t.jsx)(tl,{isVisible:g,onCancel:()=>_(!1),onSuccess:()=>_(!1)}),(0,t.jsx)(eb.default,{isOpen:h,title:"Delete Hashicorp Vault Configuration?",message:"Models using Vault secrets will lose access to their API keys until a new configuration is saved.",resourceInformationTitle:"Vault Configuration",resourceInformation:[{label:"Vault Address",value:k.vault_addr}],onCancel:()=>f(!1),onOk:()=>{o(void 0,{onSuccess:()=>{b.default.success("Hashicorp Vault configuration deleted"),f(!1)},onError:e=>{b.default.fromBackend(e)}})},confirmLoading:d}),(0,t.jsx)(eb.default,{isOpen:null!==v,title:`Clear ${v?ts[v]??v:""}?`,message:"This will remove the stored value.",resourceInformationTitle:"Field",resourceInformation:[{label:"Field",value:v?ts[v]??v:""}],onCancel:()=>S(null),onOk:()=>{v&&c({[v]:""},{onSuccess:()=>{b.default.success(`${ts[v]??v} cleared`),S(null)},onError:e=>{b.default.fromBackend(e)}})},confirmLoading:u})]})}var tp=e.i(955135),tm=e.i(751904),tg=e.i(646563);let{Title:t_,Text:th,Paragraph:tx}=y.Typography;function tf(){let{accessToken:e}=(0,s.default)(),[r,l]=(0,j.useState)([]),[i,a]=(0,j.useState)(!0),[n,o]=(0,j.useState)(!1),[d,c]=(0,j.useState)(!1),[u,p]=(0,j.useState)(null),[f]=g.Form.useForm();(0,j.useEffect)(()=>{e&&(0,w.getConfigFieldSetting)(e,"plugins").then(e=>{let t=e?.field_value;l(Array.isArray(t)?t:[])}).catch(()=>l([])).finally(()=>a(!1))},[e]);let y=async t=>{if(e){o(!0);try{await (0,w.updateConfigFieldSetting)(e,"plugins",t),l(t)}finally{o(!1)}}},v=async()=>{let e=await f.validateFields(),t=null!==u?r.map((t,s)=>s===u?e:t):[...r,e];await y(t),c(!1)},S=[{title:"Name",dataIndex:"name",key:"name",render:e=>(0,t.jsx)(th,{code:!0,children:e})},{title:"Display Name",dataIndex:"display_name",key:"display_name"},{title:"URL",dataIndex:"url",key:"url",render:e=>(0,t.jsx)("a",{href:e,target:"_blank",rel:"noopener noreferrer",children:e})},{title:"Plugin Key",dataIndex:"plugin_key",key:"plugin_key",render:e=>e?(0,t.jsx)(th,{code:!0,children:"•".repeat(8)}):(0,t.jsx)(th,{type:"secondary",children:"—"})},{title:"Actions",key:"actions",render:(e,s,l)=>(0,t.jsxs)(x.Space,{children:[(0,t.jsx)(m.Button,{icon:(0,t.jsx)(tm.EditOutlined,{}),size:"small",onClick:()=>{p(l),f.setFieldsValue({...r[l],plugin_key:""}),c(!0)}}),(0,t.jsx)(m.Button,{icon:(0,t.jsx)(tp.DeleteOutlined,{}),size:"small",danger:!0,onClick:()=>{y(r.filter((e,t)=>t!==l))}})]})}];return(0,t.jsxs)(W.Card,{children:[(0,t.jsx)(t_,{level:4,children:"Plugins"}),(0,t.jsx)(tx,{children:"Register external services as plugins. Once added, users can toggle to the plugin from the mode switcher in the top-left of the sidebar."}),(0,t.jsxs)(tx,{type:"secondary",style:{fontSize:12},children:["Each plugin must expose ",(0,t.jsx)(th,{code:!0,children:"GET /api/plugin-manifest"})," returning nav items and capabilities."]}),(0,t.jsx)(m.Button,{type:"primary",icon:(0,t.jsx)(tg.PlusOutlined,{}),onClick:()=>{p(null),f.resetFields(),c(!0)},style:{marginBottom:16},children:"Add Plugin"}),(0,t.jsx)(eN.Table,{dataSource:r,columns:S,rowKey:"name",loading:i,pagination:!1,size:"small"}),(0,t.jsx)(h.Modal,{title:null!==u?"Edit Plugin":"Add Plugin",open:d,onOk:v,onCancel:()=>c(!1),confirmLoading:n,okText:"Save",children:(0,t.jsxs)(g.Form,{form:f,layout:"vertical",style:{marginTop:16},children:[(0,t.jsx)(g.Form.Item,{name:"name",label:"Name (identifier)",rules:[{required:!0,message:"Required"}],extra:"Used in URLs and config. No spaces. E.g. litellm-platform-plugin",children:(0,t.jsx)(_.Input,{placeholder:"litellm-platform-plugin"})}),(0,t.jsx)(g.Form.Item,{name:"display_name",label:"Display Name",rules:[{required:!0,message:"Required"}],children:(0,t.jsx)(_.Input,{placeholder:"Agent Control Plane"})}),(0,t.jsx)(g.Form.Item,{name:"url",label:"URL",rules:[{required:!0,message:"Required"},{type:"url",message:"Must be a valid URL"}],extra:"Base URL of the plugin service",children:(0,t.jsx)(_.Input,{placeholder:"https://your-plugin.example.com"})}),(0,t.jsx)(g.Form.Item,{name:"plugin_key",label:"Plugin Key",extra:"Optional. The plugin's own credential, injected as Authorization: Bearer only when litellm reverse-proxies API calls to the plugin's backend (/plugin-proxy//*). Leave blank for plugins that use the forwarded litellm user token (e.g. iframe plugins) — that path uses the user's token, not this key.",children:(0,t.jsx)(_.Input.Password,{placeholder:null!==u?"Leave blank to keep current key":"sk-... (optional)"})})]})})]})}let ty=({isAddSSOModalVisible:e,isInstructionsModalVisible:s,handleAddSSOOk:r,handleAddSSOCancel:l,handleShowInstructions:i,handleInstructionsOk:a,handleInstructionsCancel:n,form:o,accessToken:d,ssoConfigured:c=!1})=>{let[u,p]=(0,j.useState)(!1);(0,j.useEffect)(()=>{(async()=>{if(e&&d)try{let e=await (0,w.getSSOSettings)(d);if(e&&e.values){let t=(e=>{if(e.google_client_id)return"google";if(e.microsoft_client_id)return"microsoft";if(e.generic_client_id){let t="string"==typeof e.generic_authorization_endpoint?e.generic_authorization_endpoint:"";return t.includes("okta")||t.includes("auth0")?"okta":"generic"}return e.saml_idp_metadata_url||e.saml_idp_metadata_xml?"saml":null})(e.values),s={};if(e.values.role_mappings){let t=e.values.role_mappings,r=e=>e&&0!==e.length?e.join(", "):"";s={use_role_mappings:!0,group_claim:t.group_claim,default_role:t.default_role||"internal_user",proxy_admin_teams:r(t.roles?.proxy_admin),admin_viewer_teams:r(t.roles?.proxy_admin_viewer),internal_user_teams:r(t.roles?.internal_user),internal_viewer_teams:r(t.roles?.internal_user_viewer)}}let r={sso_provider:t,proxy_base_url:e.values.proxy_base_url,user_email:e.values.user_email,...e.values,...s,saml_allow_unsolicited:"true"===e.values.saml_allow_unsolicited};o.resetFields(),setTimeout(()=>{o.setFieldsValue(r)},100)}}catch(e){console.error("Failed to load SSO settings:",e)}})()},[e,d,o]);let _=async e=>{if(!d)return void b.default.fromBackend("No access token available");try{let{proxy_admin_teams:t,admin_viewer_teams:s,internal_user_teams:r,internal_viewer_teams:l,default_role:a,group_claim:n,use_role_mappings:o,...c}=e,u={...c};if("boolean"==typeof u.saml_allow_unsolicited&&(u.saml_allow_unsolicited=u.saml_allow_unsolicited?"true":"false"),o){let e=e=>e&&""!==e.trim()?e.split(",").map(e=>e.trim()).filter(e=>e.length>0):[];u.role_mappings={provider:"generic",group_claim:n,default_role:({internal_user_viewer:"internal_user_viewer",internal_user:"internal_user",proxy_admin_viewer:"proxy_admin_viewer",proxy_admin:"proxy_admin"})[a]||"internal_user",roles:{proxy_admin:e(t),proxy_admin_viewer:e(s),internal_user:e(r),internal_user_viewer:e(l)}}}await (0,w.updateSSOSettings)(d,u),i(e)}catch(e){b.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}},x=async()=>{if(!d)return void b.default.fromBackend("No access token available");try{await (0,w.updateSSOSettings)(d,{google_client_id:null,google_client_secret:null,microsoft_client_id:null,microsoft_client_secret:null,microsoft_tenant:null,generic_client_id:null,generic_client_secret:null,generic_authorization_endpoint:null,generic_token_endpoint:null,generic_userinfo_endpoint:null,saml_idp_metadata_url:null,saml_idp_metadata_xml:null,saml_sp_entity_id:null,saml_allow_unsolicited:null,generic_scope:null,proxy_base_url:null,user_email:null,sso_provider:null,role_mappings:null}),o.resetFields(),p(!1),r(),b.default.success("SSO settings cleared successfully")}catch(e){console.error("Failed to clear SSO settings:",e),b.default.fromBackend("Failed to clear SSO settings")}};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(h.Modal,{title:c?"Edit SSO Settings":"Add SSO",open:e,width:800,footer:null,onOk:r,onCancel:l,children:(0,t.jsxs)(g.Form,{form:o,onFinish:_,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Form.Item,{label:"SSO Provider",name:"sso_provider",rules:[{required:!0,message:"Please select an SSO provider"}],children:(0,t.jsx)(e_.Select,{children:Object.entries(eu).map(([e,s])=>(0,t.jsx)(e_.Select.Option,{value:e,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",padding:"4px 0"},children:[s&&(0,t.jsx)(eo.Logo,{src:s,label:ep[e]||e,className:"h-6 w-6 mr-3 object-contain"}),(0,t.jsx)("span",{children:ep[e]||e.charAt(0).toUpperCase()+e.slice(1)+" SSO"})]})},e))})}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let t=e("sso_provider");return t?ex(t):null}}),(0,t.jsx)(g.Form.Item,{label:"Proxy Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Proxy Base URL",name:"proxy_base_url",normalize:e=>e?.trim(),rules:[{required:!0,message:"Please enter the proxy base url"},{pattern:/^https?:\/\/.+/,message:"URL must start with http:// or https://"},{validator:(e,t)=>t&&/^https?:\/\/.+/.test(t)&&t.endsWith("/")?Promise.reject("URL must not end with a trailing slash"):Promise.resolve()}],children:(0,t.jsx)(C.TextInput,{placeholder:"https://example.com"})}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.sso_provider!==t.sso_provider,children:({getFieldValue:e})=>{let s=e("sso_provider");return"okta"===s||"generic"===s?(0,t.jsx)(g.Form.Item,{label:"Use Role Mappings",name:"use_role_mappings",valuePropName:"checked",children:(0,t.jsx)(eg.Checkbox,{})}):null}}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.use_role_mappings!==t.use_role_mappings,children:({getFieldValue:e})=>e("use_role_mappings")?(0,t.jsx)(g.Form.Item,{label:"Group Claim",name:"group_claim",rules:[{required:!0,message:"Please enter the group claim"}],children:(0,t.jsx)(C.TextInput,{})}):null}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.use_role_mappings!==t.use_role_mappings,children:({getFieldValue:e})=>e("use_role_mappings")?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Form.Item,{label:"Default Role",name:"default_role",initialValue:"Internal User",children:(0,t.jsxs)(e_.Select,{children:[(0,t.jsx)(e_.Select.Option,{value:"internal_user_viewer",children:"Internal Viewer"}),(0,t.jsx)(e_.Select.Option,{value:"internal_user",children:"Internal User"}),(0,t.jsx)(e_.Select.Option,{value:"proxy_admin_viewer",children:"Admin Viewer"}),(0,t.jsx)(e_.Select.Option,{value:"proxy_admin",children:"Proxy Admin"})]})}),(0,t.jsx)(g.Form.Item,{label:"Proxy Admin Teams",name:"proxy_admin_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Admin Viewer Teams",name:"admin_viewer_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Internal User Teams",name:"internal_user_teams",children:(0,t.jsx)(C.TextInput,{})}),(0,t.jsx)(g.Form.Item,{label:"Internal Viewer Teams",name:"internal_viewer_teams",children:(0,t.jsx)(C.TextInput,{})})]}):null})]}),(0,t.jsxs)("div",{style:{textAlign:"right",marginTop:"10px",display:"flex",justifyContent:"flex-end",alignItems:"center",gap:"8px"},children:[c&&(0,t.jsx)(m.Button,{onClick:()=>p(!0),style:{backgroundColor:"#6366f1",borderColor:"#6366f1",color:"white"},onMouseEnter:e=>{e.currentTarget.style.backgroundColor="#5558eb",e.currentTarget.style.borderColor="#5558eb"},onMouseLeave:e=>{e.currentTarget.style.backgroundColor="#6366f1",e.currentTarget.style.borderColor="#6366f1"},children:"Clear"}),(0,t.jsx)(m.Button,{htmlType:"submit",children:"Save"})]})]})}),(0,t.jsxs)(h.Modal,{title:"Confirm Clear SSO Settings",open:u,onOk:x,onCancel:()=>p(!1),okText:"Yes, Clear",cancelText:"Cancel",okButtonProps:{danger:!0,style:{backgroundColor:"#dc2626",borderColor:"#dc2626"}},children:[(0,t.jsx)("p",{children:"Are you sure you want to clear all SSO settings? This action cannot be undone."}),(0,t.jsx)("p",{children:"Users will no longer be able to login using SSO after this change."})]}),(0,t.jsxs)(h.Modal,{title:"SSO Setup Instructions",open:s,width:800,footer:null,onOk:a,onCancel:n,children:[(0,t.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,t.jsx)(k.Text,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,t.jsx)(k.Text,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,t.jsx)(k.Text,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,t.jsx)(k.Text,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(m.Button,{onClick:a,children:"Done"})})]})]})},tj=({accessToken:e,onSuccess:s})=>{let[r]=g.Form.useForm(),[l,i]=(0,j.useState)(!1);(0,j.useEffect)(()=>{(async()=>{if(e)try{let t=await (0,w.getSSOSettings)(e);if(t&&t.values){let e=t.values.ui_access_mode,s={};e&&"object"==typeof e?s={ui_access_mode_type:e.type,restricted_sso_group:e.restricted_sso_group,sso_group_jwt_field:e.sso_group_jwt_field}:"string"==typeof e&&(s={ui_access_mode_type:e,restricted_sso_group:t.values.restricted_sso_group,sso_group_jwt_field:t.values.team_ids_jwt_field||t.values.sso_group_jwt_field}),r.setFieldsValue(s)}}catch(e){console.error("Failed to load UI access settings:",e)}})()},[e,r]);let a=async t=>{if(!e)return void b.default.fromBackend("No access token available");i(!0);try{let r;r="all_authenticated_users"===t.ui_access_mode_type?{ui_access_mode:"none"}:{ui_access_mode:{type:t.ui_access_mode_type,restricted_sso_group:t.restricted_sso_group,sso_group_jwt_field:t.sso_group_jwt_field}},await (0,w.updateSSOSettings)(e,r),s()}catch(e){console.error("Failed to save UI access settings:",e),b.default.fromBackend("Failed to save UI access settings")}finally{i(!1)}};return(0,t.jsxs)("div",{style:{padding:"16px"},children:[(0,t.jsx)("div",{style:{marginBottom:"16px"},children:(0,t.jsx)(k.Text,{style:{fontSize:"14px",color:"#6b7280"},children:"Configure who can access the UI interface and how group information is extracted from JWT tokens."})}),(0,t.jsxs)(g.Form,{form:r,onFinish:a,layout:"vertical",children:[(0,t.jsx)(g.Form.Item,{label:"UI Access Mode",name:"ui_access_mode_type",tooltip:"Controls who can access the UI interface",children:(0,t.jsxs)(e_.Select,{placeholder:"Select access mode",children:[(0,t.jsx)(e_.Select.Option,{value:"all_authenticated_users",children:"All Authenticated Users"}),(0,t.jsx)(e_.Select.Option,{value:"restricted_sso_group",children:"Restricted SSO Group"})]})}),(0,t.jsx)(g.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.ui_access_mode_type!==t.ui_access_mode_type,children:({getFieldValue:e})=>"restricted_sso_group"===e("ui_access_mode_type")?(0,t.jsx)(g.Form.Item,{label:"Restricted SSO Group",name:"restricted_sso_group",rules:[{required:!0,message:"Please enter the restricted SSO group"}],children:(0,t.jsx)(C.TextInput,{placeholder:"ui-access-group"})}):null}),(0,t.jsx)(g.Form.Item,{label:"SSO Group JWT Field",name:"sso_group_jwt_field",tooltip:"JWT field name that contains team/group information. Use dot notation to access nested fields.",children:(0,t.jsx)(C.TextInput,{placeholder:"groups"})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"16px"},children:(0,t.jsx)(m.Button,{type:"primary",htmlType:"submit",loading:l,style:{backgroundColor:"#6366f1",borderColor:"#6366f1"},children:"Update UI Access Control"})})]})]})},{Title:tv,Paragraph:tS,Text:tb}=y.Typography,tw=({proxySettings:e})=>{let{premiumUser:y,accessToken:I,userId:k}=(0,s.default)(),[T]=g.Form.useForm(),[C,E]=(0,j.useState)(!1),[N,O]=(0,j.useState)(!1),[F,P]=(0,j.useState)(!1),[A,M]=(0,j.useState)(!1),[B,L]=(0,j.useState)(!1),[U,R]=(0,j.useState)(!1),[z,D]=(0,j.useState)([]),[V,G]=(0,j.useState)(null),[K,H]=(0,j.useState)(!1),$=(0,S.useBaseUrl)(),Q="All IP Addresses Allowed",W=$;W+="/fallback/login";let Y=async()=>{if(I)try{let e=await (0,w.getSSOSettings)(I);if(e&&e.values){let t=e.values.google_client_id&&e.values.google_client_secret,s=e.values.microsoft_client_id&&e.values.microsoft_client_secret,r=e.values.generic_client_id&&e.values.generic_client_secret;H(t||s||r)}else H(!1)}catch(e){console.error("Error checking SSO configuration:",e),H(!1)}},J=async()=>{try{if(!0!==y)return void b.default.fromBackend("This feature is only available for premium users. Please upgrade your account.");if(I){let e=await (0,w.getAllowedIPs)(I);D(e&&e.length>0?e:[Q])}else D([Q])}catch(e){console.error("Error fetching allowed IPs:",e),b.default.fromBackend(`Failed to fetch allowed IPs ${e}`),D([Q])}finally{!0===y&&P(!0)}},Z=async e=>{try{if(I){await (0,w.addAllowedIP)(I,e.ip);let t=await (0,w.getAllowedIPs)(I);D(t),b.default.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),b.default.fromBackend(`Failed to add IP address ${e}`)}finally{M(!1)}},ee=async e=>{G(e),L(!0)},et=async()=>{if(V&&I)try{await (0,w.deleteAllowedIP)(I,V);let e=await (0,w.getAllowedIPs)(I);D(e.length>0?e:[Q]),b.default.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),b.default.fromBackend(`Failed to delete IP address ${e}`)}finally{L(!1),G(null)}};(0,j.useEffect)(()=>{Y()},[I,y,Y]);let es=()=>{R(!1)},er=[{key:"sso-settings",label:"SSO Settings",children:(0,t.jsx)(eG,{})},{key:"security-settings",label:"Security Settings",children:(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.Card,{children:[(0,t.jsx)(tv,{level:4,children:" ✨ Security Settings"}),(0,t.jsx)(p.Alert,{message:"SSO Configuration Deprecated",description:"Editing SSO Settings on this page is deprecated and will be removed in a future version. Please use the SSO Settings tab for SSO configuration.",type:"warning",showIcon:!0}),(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem",marginLeft:"0.5rem"},children:[(0,t.jsx)("div",{children:(0,t.jsx)(r.Button,{style:{width:"150px"},onClick:()=>E(!0),children:K?"Edit SSO Settings":"Add SSO"})}),(0,t.jsx)("div",{children:(0,t.jsx)(r.Button,{style:{width:"150px"},onClick:J,children:"Allowed IPs"})}),(0,t.jsx)("div",{children:(0,t.jsx)(r.Button,{style:{width:"150px"},onClick:()=>!0===y?R(!0):b.default.fromBackend("Only premium users can configure UI access control"),children:"UI Access Control"})})]})]}),(0,t.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,t.jsx)(ty,{isAddSSOModalVisible:C,isInstructionsModalVisible:N,handleAddSSOOk:()=>{E(!1),T.resetFields(),I&&y&&Y()},handleAddSSOCancel:()=>{E(!1),T.resetFields()},handleShowInstructions:e=>{E(!1),O(!0)},handleInstructionsOk:()=>{O(!1),I&&y&&Y()},handleInstructionsCancel:()=>{O(!1),I&&y&&Y()},form:T,accessToken:I,ssoConfigured:K}),(0,t.jsx)(h.Modal,{title:"Manage Allowed IP Addresses",width:800,open:F,onCancel:()=>P(!1),footer:[(0,t.jsx)(r.Button,{className:"mx-1",onClick:()=>M(!0),children:"Add IP Address"},"add"),(0,t.jsx)(r.Button,{onClick:()=>P(!1),children:"Close"},"close")],children:(0,t.jsxs)(a.Table,{children:[(0,t.jsx)(d.TableHead,{children:(0,t.jsxs)(u.TableRow,{children:[(0,t.jsx)(c.TableHeaderCell,{children:"IP Address"}),(0,t.jsx)(c.TableHeaderCell,{className:"text-right",children:"Action"})]})}),(0,t.jsx)(n.TableBody,{children:z.map((e,s)=>(0,t.jsxs)(u.TableRow,{children:[(0,t.jsx)(o.TableCell,{children:e}),(0,t.jsx)(o.TableCell,{className:"text-right",children:e!==Q&&(0,t.jsx)(r.Button,{onClick:()=>ee(e),color:"red",size:"xs",children:"Delete"})})]},s))})]})}),(0,t.jsx)(h.Modal,{title:"Add Allowed IP Address",open:A,onCancel:()=>M(!1),footer:null,children:(0,t.jsxs)(g.Form,{onFinish:Z,children:[(0,t.jsx)(g.Form.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,t.jsx)(_.Input,{placeholder:"Enter IP address"})}),(0,t.jsx)(g.Form.Item,{children:(0,t.jsx)(m.Button,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,t.jsx)(h.Modal,{title:"Confirm Delete",open:B,onCancel:()=>L(!1),onOk:et,footer:[(0,t.jsx)(r.Button,{className:"mx-1",onClick:()=>et(),children:"Yes"},"delete"),(0,t.jsx)(r.Button,{onClick:()=>L(!1),children:"Close"},"close")],children:(0,t.jsxs)(tb,{children:["Are you sure you want to delete the IP address: ",V,"?"]})}),(0,t.jsx)(h.Modal,{title:"UI Access Control Settings",open:U,width:600,footer:null,onOk:es,onCancel:()=>{R(!1)},children:(0,t.jsx)(tj,{accessToken:I,onSuccess:()=>{es(),b.default.success("UI Access Control settings updated successfully")}})})]}),(0,t.jsxs)(l.Callout,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,t.jsxs)("a",{href:W,target:"_blank",rel:"noopener noreferrer",children:[(0,t.jsx)("b",{children:W})," "]})]})]})},{key:"scim",label:"SCIM",children:(0,t.jsx)(q,{accessToken:I,userID:k,proxySettings:e})},{key:"ui-settings",label:(0,t.jsx)(x.Space,{children:(0,t.jsxs)(tb,{children:["UI Settings ",(0,t.jsx)(v.default,{})]})}),children:(0,t.jsx)(eZ,{})},{key:"logging-settings",label:"Logging Settings",children:(0,t.jsx)(X,{})},{key:"hashicorp-vault",label:"Hashicorp Vault",children:(0,t.jsx)(tu,{})},{key:"plugins",label:"Plugins",children:(0,t.jsx)(tf,{})}];return(0,t.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,t.jsx)(tv,{level:4,children:"Admin Access "}),(0,t.jsx)(tS,{children:"Go to 'Internal Users' page to add other admins."}),(0,t.jsx)(f.Tabs,{items:er})]})};var tI=e.i(592392);e.s(["default",0,function(){let{accessToken:e}=(0,s.default)(),r=(0,tI.default)(e);return(0,t.jsx)(tw,{proxySettings:r})}],648214)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0j43vc4hvn3oe.js b/litellm/proxy/_experimental/out/_next/static/chunks/0j43vc4hvn3oe.js deleted file mode 100644 index e54ffc52947..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0j43vc4hvn3oe.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},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])},204258,e=>{"use strict";var t,n,o,r=e.i(843476);e.s([],958842),e.i(958842),e.i(247167);var i=e.i(271645),a=e.i(667865),s=e.i(552245),l=e.i(951437),c=e.i(788015),u=e.i(675606),d=e.i(56434),p=e.i(223910),f=e.i(733332);let m=i.createContext(void 0);function h(){let e=i.useContext(m);if(void 0===e)throw Error((0,f.default)(15));return e}var g=e.i(209407);let b=((t={}).open="data-open",t.closed="data-closed",t[t.startingStyle=g.TransitionStatusDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=g.TransitionStatusDataAttributes.endingStyle]="endingStyle",t),v=((n={}).panelOpen="data-panel-open",n),y={[b.open]:""},S={[b.closed]:""},x={open:e=>e?y:S,...g.transitionStatusMapping},_=i.forwardRef(function(e,t){let{render:n,className:o,defaultOpen:f=!1,disabled:h=!1,onOpenChange:g,open:b,style:v,...y}=e,S=(0,a.useStableCallback)(g),_=function(e){let{open:t,defaultOpen:n,onOpenChange:o,disabled:r}=e,[s,f]=(0,l.useControlled)({controlled:t,default:n,name:"Collapsible",state:"open"}),{mounted:m,setMounted:h,transitionStatus:g}=(0,p.useTransitionStatus)(s,!0,!0),b=(0,c.useBaseUiId)(),[v,y]=i.useState(),S=v??b,x=(0,a.useStableCallback)(e=>{let t=!s,n=(0,u.createChangeEventDetails)(d.REASONS.triggerPress,e.nativeEvent);o(t,n),n.isCanceled||f(t)});return i.useMemo(()=>({disabled:r,handleTrigger:x,mounted:m,open:s,panelId:S,setMounted:h,setOpen:f,setPanelIdState:y,transitionStatus:g}),[r,x,m,s,S,h,f,y,g])}({open:b,defaultOpen:f,onOpenChange:S,disabled:h}),R=i.useMemo(()=>({open:_.open,disabled:_.disabled,transitionStatus:_.transitionStatus}),[_.open,_.disabled,_.transitionStatus]),w=i.useMemo(()=>({..._,onOpenChange:S,state:R}),[_,S,R]),C=(0,s.useRenderElement)("div",e,{state:R,ref:t,props:y,stateAttributesMapping:x});return(0,r.jsx)(m.Provider,{value:w,children:C})});var R=e.i(540886);let w={open:e=>e?{[v.panelOpen]:""}:null,...g.transitionStatusMapping},C=i.forwardRef(function(e,t){let{panelId:n,open:o,handleTrigger:r,state:i,disabled:a}=h(),{className:l,disabled:c=a,render:u,nativeButton:d=!0,style:p,...f}=e,{getButtonProps:m,buttonRef:g}=(0,R.useButton)({disabled:c,focusableWhenDisabled:!0,native:d});return(0,s.useRenderElement)("button",e,{state:i,ref:[t,g],props:[{"aria-controls":o?n:void 0,"aria-expanded":o,onClick:r},f,m],stateAttributesMapping:w})});var k=e.i(146376),j=e.i(377570),E=e.i(574735),O=e.i(828918),T=e.i(708445),P=e.i(446265),I=e.i(333848),F=e.i(137584),M=e.i(222640);let z={height:void 0,width:void 0};function A(e){return{height:e.scrollHeight,width:e.scrollWidth}}function N(e){return e.split(",").map(e=>e.trim()).some(e=>""!==e&&Number.parseFloat(e)>0)}function B(e,t,n){let o=e.style.getPropertyValue(t),r=e.style.getPropertyPriority(t);return e.style.setProperty(t,n),()=>{""===o?e.style.removeProperty(t):e.style.setProperty(t,o,r)}}let H=((o={}).collapsiblePanelHeight="--collapsible-panel-height",o.collapsiblePanelWidth="--collapsible-panel-width",o),D=i.forwardRef(function(e,t){let{className:n,hiddenUntilFound:o,keepMounted:r,render:l,id:c,style:p,...f}=e,{mounted:m,onOpenChange:g,open:v,panelId:y,setMounted:S,setPanelIdState:_,setOpen:R,state:w,transitionStatus:C}=h();(0,k.useIsoLayoutEffect)(()=>{if(c)return _(c),()=>{_(void 0)}},[c,_]);let{height:D,props:L,ref:W,shouldPreventOpenAnimation:V,shouldRender:U,transitionStatus:q,width:K}=function(e){let{externalRef:t,hiddenUntilFound:n,id:o,keepMounted:r,mounted:s,onOpenChange:l,open:c,setMounted:p,setOpen:f,transitionStatus:m}=e,h=i.useRef(null),g=i.useRef(null),[v,y]=i.useState(z),S=i.useRef(z),x=i.useRef(!1),_=i.useRef(c),R=i.useRef(!1),[w,C]=i.useState(!1),j=i.useRef(null),H=(0,O.useMergedRefs)(t,h),D=(0,P.useValueAsRef)({mounted:s,open:c}),L=(0,M.useAnimationsFinished)(h,!1,!1),W=!c&&!s,V=w?"idle":m,U=c&&(_.current||R.current),q=!c&&s&&"css-animation"===g.current&&void 0===v.height&&void 0===v.width?S.current:v,K=n&&W&&"css-animation"!==g.current,$=(0,a.useStableCallback)((e,t=!0)=>{t&&(S.current=e),y(e)}),G=(0,a.useStableCallback)(()=>{j.current?.(),j.current=null}),J=(0,a.useStableCallback)(e=>{G(),j.current=()=>{j.current=null,e()}}),Y=(0,a.useStableCallback)(()=>{c&&s&&"css-animation"===g.current&&(R.current=!0)});(0,k.useIsoLayoutEffect)(()=>{w&&"starting"!==m&&C(!1)},[w,m]),i.useEffect(()=>()=>{Y(),G()},[Y,G]),(0,k.useIsoLayoutEffect)(()=>{let e=h.current;if(!e)return;!c&&j.current&&G();let t=function(e,t=!1){let n=(0,I.ownerWindow)(e).getComputedStyle(e),o=(n.animationName.split(",").map(e=>e.trim()).some(e=>""!==e&&"none"!==e)||t)&&N(n.animationDuration),r=N(n.transitionDuration);return o&&r||r?"css-transition":o?"css-animation":"none"}(e,U);if(g.current=t,c&&"idle"===m&&_.current&&"css-animation"===t){S.current=A(e);return}if(c&&"starting"===m){let n=x.current;if(x.current=!1,"none"===t){$(A(e)),C(!0);return}if("css-transition"===t){let t=function(e){let t={"justify-content":e.style.justifyContent,"align-items":e.style.alignItems,"align-content":e.style.alignContent,"justify-items":e.style.justifyItems};function n(){Object.entries(t).forEach(([t,n])=>{""===n?e.style.removeProperty(t):e.style.setProperty(t,n)})}Object.keys(t).forEach(t=>{e.style.setProperty(t,"initial","important")});let o=T.AnimationFrame.request(n);return()=>{T.AnimationFrame.cancel(o),n()}}(e);return $(A(e)),n&&(J(B(e,"transition-duration","0s")),C(!0)),t}if("css-animation"===t){if($(A(e)),!n)return void B(e,"animation-name","none")();let t=B(e,"animation-name","none"),o=B(e,"animation-duration","0s");return t(),J(o),C(!0),void 0}}if(!c&&s&&("idle"===m||"starting"===m)){if(_.current=!1,R.current=!1,"none"===t){$(z,!1),p(!1);return}$(A(e));return}if("ending"!==m)return;if("none"===t)return void p(!1);let n=A(e);(n.height??0)>0||(n.width??0)>0?($(n),"css-animation"===t&&B(e,"animation-name","none")()):p(!1)},[s,c,G,$,p,J,U,m]),(0,F.useOpenChangeComplete)({enabled:c&&s&&"idle"===V,open:!0,ref:h,onComplete(){c&&$(z,!1)}}),i.useEffect(()=>{if(c||!s||"ending"!==V||!h.current)return;let e=new AbortController,t=-1;function n(){D.current.open||(p(!1),$(z,!1))}return t=T.AnimationFrame.request(()=>{e.signal.aborted||L(n,e.signal)}),()=>{T.AnimationFrame.cancel(t),e.abort()}},[D,s,c,V,L,$,p]),(0,k.useIsoLayoutEffect)(()=>{let e=h.current;e&&n&&W&&e.setAttribute("hidden","until-found")},[W,n]),i.useEffect(function(){let e=h.current;if(e)return(0,E.addEventListener)(e,"beforematch",function(e){let t=(0,u.createChangeEventDetails)(d.REASONS.none,e);l(!0,t),t.isCanceled||(x.current=!0,f(!0))})},[l,f]);let X=r||n||s||c;return{height:q.height,props:{...K?{[b.startingStyle]:""}:void 0,hidden:W,id:o},ref:H,shouldPreventOpenAnimation:U,shouldRender:X,transitionStatus:V,width:q.width}}({externalRef:t,hiddenUntilFound:o??!1,id:y,keepMounted:r??!1,mounted:m,onOpenChange:g,open:v,setMounted:S,setOpen:R,transitionStatus:C}),$={...w,transitionStatus:q},G=(0,j.resolveStyle)(p,$),J=(0,s.useRenderElement)("div",{...e,style:void 0},{state:$,ref:W,props:[L,{style:{[H.collapsiblePanelHeight]:void 0===D?"auto":`${D}px`,[H.collapsiblePanelWidth]:void 0===K?"auto":`${K}px`}},f,G?{style:G}:void 0,V?{style:{animationName:"none"}}:void 0],stateAttributesMapping:x});return U?J:null});e.s(["Panel",0,D,"Root",0,_,"Trigger",0,C],596315);var L=e.i(596315),L=L;e.s(["Collapsible",0,function({...e}){return(0,r.jsx)(L.Root,{"data-slot":"collapsible",...e})},"CollapsibleContent",0,function({...e}){return(0,r.jsx)(L.Panel,{"data-slot":"collapsible-content",...e})},"CollapsibleTrigger",0,function({...e}){return(0,r.jsx)(L.Trigger,{"data-slot":"collapsible-trigger",...e})}],204258)},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)},699375,e=>{"use strict";var t,n=e.i(843476);e.s([],924305),e.i(924305),e.i(247167);var o=e.i(271645),r=e.i(951437),i=e.i(828918),a=e.i(146376),s=e.i(502077),l=e.i(956789),c=e.i(333848),u=e.i(552245),d=e.i(176782),p=e.i(788015),f=e.i(540886),m=e.i(733332);let h=o.createContext(void 0);var g=e.i(875812);let b=((t={}).checked="data-checked",t.unchecked="data-unchecked",t.disabled="data-disabled",t.readonly="data-readonly",t.required="data-required",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),v={...g.fieldValidityMapping,checked:e=>e?{[b.checked]:""}:{[b.unchecked]:""}};var y=e.i(469690),S=e.i(381104),x=e.i(884708),_=e.i(247778),R=e.i(31421),w=e.i(538489),C=e.i(675606),k=e.i(56434),j=e.i(606039);let E=o.forwardRef(function(e,t){let{checked:m,className:g,defaultChecked:b,"aria-labelledby":E,form:O,id:T,inputRef:P,name:I,nativeButton:F=!1,onCheckedChange:M,readOnly:z=!1,required:A=!1,disabled:N=!1,render:B,uncheckedValue:H,value:D,style:L,...W}=e,{clearErrors:V}=(0,x.useFormContext)(),{state:U,setTouched:q,setDirty:K,validityData:$,setFilled:G,setFocused:J,validationMode:Y,disabled:X,name:Q,validation:Z}=(0,y.useFieldRootContext)(),{labelId:ee}=(0,_.useLabelableContext)(),et=X||N,en=Q??I,eo=o.useRef(null),er=(0,i.useMergedRefs)(eo,P,Z.inputRef),ei=o.useRef(null),ea=(0,p.useBaseUiId)(),es=(0,w.useLabelableId)({id:T,implicit:!1,controlRef:ei}),el=F?void 0:es,[ec,eu]=(0,r.useControlled)({controlled:m,default:!!b,name:"Switch",state:"checked"});(0,S.useRegisterFieldControl)(ei,ea,ec,void 0,!et,I),(0,a.useIsoLayoutEffect)(()=>{eo.current&&G(eo.current.checked)},[eo,G]),(0,j.useValueChanged)(ec,()=>{V(en),K(ec!==$.initialValue),G(ec),Z.change(ec)});let{getButtonProps:ed,buttonRef:ep}=(0,f.useButton)({disabled:et,native:F}),ef=(0,R.useAriaLabelledBy)(E,ee,eo,!F,el),em=(0,d.mergeProps)({checked:ec,disabled:et,form:O,id:el,name:en,required:A,style:en?s.visuallyHiddenInput:s.visuallyHidden,tabIndex:-1,type:"checkbox","aria-hidden":!0,ref:er,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(z)return void e.preventDefault();let t=e.currentTarget.checked,n=(0,C.createChangeEventDetails)(k.REASONS.none,e.nativeEvent);M?.(t,n),n.isCanceled||eu(t)},onFocus(){ei.current?.focus()}},e=>Z.getValidationProps(et,e),void 0!==D?{value:D}:l.EMPTY_OBJECT),eh=o.useMemo(()=>({...U,checked:ec,disabled:et,readOnly:z,required:A}),[U,ec,et,z,A]),eg=(0,u.useRenderElement)("span",e,{state:eh,ref:[t,ei,ep],props:[{id:F?es:ea,role:"switch","aria-checked":ec,"aria-readonly":z||void 0,"aria-required":A||void 0,"aria-labelledby":ef,onFocus(){et||J(!0)},onBlur(){let e=eo.current;e&&!et&&(q(!0),J(!1),"onBlur"===Y&&Z.commit(e.checked))},onClick(e){if(z||et)return;e.preventDefault();let t=eo.current;t&&t.dispatchEvent(new((0,c.ownerWindow)(t)).PointerEvent("click",{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey}))}},W,ed,e=>Z.getValidationProps(et,e)],stateAttributesMapping:v});return(0,n.jsxs)(h.Provider,{value:eh,children:[eg,!ec&&en&&void 0!==H&&(0,n.jsx)("input",{type:"hidden",form:O,name:en,value:H,disabled:et}),(0,n.jsx)("input",{...em,suppressHydrationWarning:!0})]})}),O=o.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,s=function(){let e=o.useContext(h);if(void 0===e)throw Error((0,m.default)(63));return e}();return(0,u.useRenderElement)("span",e,{state:s,ref:t,stateAttributesMapping:v,props:a})});e.s(["Root",0,E,"Thumb",0,O],450994);var T=e.i(450994),T=T,P=e.i(115504);e.s(["Switch",0,function({className:e,size:t="default",...o}){return(0,n.jsx)(T.Root,{"data-slot":"switch","data-size":t,className:(0,P.cn)("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",e),...o,children:(0,n.jsx)(T.Thumb,{"data-slot":"switch-thumb",className:"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"})})}],699375)},337822,e=>{"use strict";var t,n=e.i(843476);e.s([],158421),e.i(158421);var o=e.i(271645),r=e.i(956789),i=e.i(17989),a=e.i(46420);e.i(247167);var s=e.i(733332);let l=o.createContext(void 0);function c(e){let t=o.useContext(l);if(void 0===t&&!e)throw Error((0,s.default)(47));return t}var u=e.i(174080),d=e.i(301252),p=e.i(616269),f=e.i(439957),m=e.i(56434),h=e.i(264111),g=e.i(116786),b=e.i(990627),v=e.i(638396);let y={...g.popupStoreSelectors,disabled:(0,p.createSelector)(e=>e.disabled),instantType:(0,p.createSelector)(e=>e.instantType),openMethod:(0,p.createSelector)(e=>e.openMethod),openChangeReason:(0,p.createSelector)(e=>e.openChangeReason),modal:(0,p.createSelector)(e=>e.modal),focusManagerModal:(0,p.createSelector)(e=>e.focusManagerModal),stickIfOpen:(0,p.createSelector)(e=>e.stickIfOpen),titleElementId:(0,p.createSelector)(e=>e.titleElementId),descriptionElementId:(0,p.createSelector)(e=>e.descriptionElementId),openOnHover:(0,p.createSelector)(e=>e.openOnHover),closeDelay:(0,p.createSelector)(e=>e.closeDelay),hasViewport:(0,p.createSelector)(e=>e.hasViewport)};class S extends d.ReactStore{constructor(e,t,n=!1){const r={...(0,g.createInitialPopupStoreState)(),disabled:!1,modal:!1,focusManagerModal:!1,instantType:void 0,openMethod:null,openChangeReason:null,titleElementId:void 0,descriptionElementId:void 0,stickIfOpen:!0,nested:!1,openOnHover:!1,closeDelay:0,hasViewport:!1,...e},i=new b.PopupTriggerMap;r.open&&e?.mounted===void 0&&(r.mounted=!0),r.floatingRootContext=(0,g.createPopupFloatingRootContext)(i,t,n),super(r,{popupRef:o.createRef(),backdropRef:o.createRef(),internalBackdropRef:o.createRef(),onOpenChange:void 0,onOpenChangeComplete:void 0,triggerFocusTargetRef:o.createRef(),beforeContentFocusGuardRef:o.createRef(),stickIfOpenTimeout:new f.Timeout,triggerElements:i},y)}setOpen=(e,t)=>{let n=t.reason===m.REASONS.triggerHover,o=t.reason===m.REASONS.triggerPress&&0===t.event.detail,r=!e&&(t.reason===m.REASONS.escapeKey||null==t.reason),i=(0,h.attachPreventUnmountOnClose)(t),a=this.select("activeTriggerId");if(e||t.reason!==m.REASONS.closePress||null!=t.trigger||null==a||(t.trigger=this.context.triggerElements.getById(a)??this.select("activeTriggerElement")??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let s=()=>{let n={open:e,openChangeReason:t.reason};(0,h.setPopupOpenState)(n,e,t.trigger,i()),this.update(n)};n?(this.set("stickIfOpen",!0),this.context.stickIfOpenTimeout.start(v.PATIENT_CLICK_THRESHOLD,()=>{this.set("stickIfOpen",!1)}),u.flushSync(s)):s(),o||r?this.set("instantType",o?"click":"dismiss"):t.reason===m.REASONS.focusOut?this.set("instantType","focus"):this.set("instantType",void 0)};static useStore(e,t){let{store:n,internalStore:r}=(0,h.usePopupStore)(e,(e,n)=>new S(t,e,n));return o.useEffect(()=>r?.disposeEffect(),[r]),n}disposeEffect=()=>this.context.stickIfOpenTimeout.disposeEffect()}var x=e.i(675606),_=e.i(176782);function R({props:e}){let{children:t,open:r,defaultOpen:i=!1,onOpenChange:s,onOpenChangeComplete:c,modal:u=!1,handle:d,triggerId:p,defaultTriggerId:f=null}=e,g=S.useStore(d?.store,{modal:u,open:i,openProp:r,activeTriggerId:f,triggerIdProp:p});(0,h.useInitialOpenSync)(g,r,i,f),g.useControlledProp("openProp",r),g.useControlledProp("triggerIdProp",p);let b=g.useState("open"),v=g.useState("mounted"),y=g.useState("payload"),_=null!=(0,a.useFloatingParentNodeId)();g.useContextCallback("onOpenChange",s),g.useContextCallback("onOpenChangeComplete",c),(0,h.usePopupRootSync)(g,b),(0,h.useImplicitActiveTrigger)(g);let{forceUnmount:C}=(0,h.useOpenStateTransitions)(b,g,()=>{g.update({stickIfOpen:!0,openChangeReason:null})});g.useSyncedValues({modal:u,nested:_}),o.useEffect(()=>{b||g.context.stickIfOpenTimeout.clear()},[g,b]);let k=o.useCallback(()=>{g.setOpen(!1,(0,x.createChangeEventDetails)(m.REASONS.imperativeAction))},[g]);o.useImperativeHandle(e.actionsRef,()=>({unmount:C,close:k}),[C,k]);let j=b||v,E=o.useMemo(()=>({store:g}),[g]);return(0,n.jsxs)(l.Provider,{value:E,children:[j&&(0,n.jsx)(w,{store:g,modal:u}),"function"==typeof t?t({payload:y}):t]})}function w({store:e,modal:t}){let n=e.useState("floatingRootContext"),a=(0,i.useDismiss)(n,{outsidePressEvent:{mouse:"trap-focus"===t?"sloppy":"intentional",touch:"sloppy"}}),s=a.reference??r.EMPTY_OBJECT,l=a.trigger??r.EMPTY_OBJECT,c=o.useMemo(()=>(0,_.mergeProps)(h.FOCUSABLE_POPUP_PROPS,a.floating),[a.floating]);return(0,h.usePopupInteractionProps)(e,{activeTriggerProps:s,inactiveTriggerProps:l,popupProps:c}),null}var C=e.i(540886),k=e.i(405005),j=e.i(552245),E=e.i(650316),O=e.i(385689),T=e.i(872135),P=e.i(788015),I=e.i(152535),F=e.i(346570),M=e.i(32199);let z=o.forwardRef(function(e,t){let{render:r,className:i,style:a,disabled:l=!1,nativeButton:u=!0,handle:d,payload:p,openOnHover:f=!1,delay:g=300,closeDelay:b=0,id:y,...S}=e,x=c(!0),_=d?.store??x?.store;if(!_)throw Error((0,s.default)(74));let R=(0,P.useBaseUiId)(y),w=_.useState("isTriggerActive",R),z=_.useState("floatingRootContext"),A=_.useState("isOpenedByTrigger",R),N=_.useState("triggerPopupId",R),B=o.useRef(null),{registerTrigger:H,isMountedByThisTrigger:D}=(0,h.useTriggerDataForwarding)(R,B,_,{payload:p,disabled:l,openOnHover:f,closeDelay:b}),L=_.useState("openChangeReason"),W=_.useState("stickIfOpen"),V=_.useState("openMethod"),U=_.useState("focusManagerModal"),q=(0,T.useHoverReferenceInteraction)(z,{enabled:!l&&null!=z&&f&&("touch"!==V||L!==m.REASONS.triggerPress),mouseOnly:!0,move:!1,handleClose:(0,E.safePolygon)(),restMs:g,delay:{close:b},triggerElementRef:B,isActiveTrigger:w,isClosing:()=>"ending"===_.select("transitionStatus")}),K=(0,O.useClick)(z,{enabled:null!=z,stickIfOpen:W}),$=(0,M.useOpenMethodTriggerProps)(()=>_.select("open"),e=>{_.set("openMethod",e)}),G=_.useState("triggerProps",D),{getButtonProps:J,buttonRef:Y}=(0,C.useButton)({disabled:l,native:u}),{preFocusGuardRef:X,handlePreFocusGuardFocus:Q,handleFocusTargetFocus:Z}=(0,F.useTriggerFocusGuards)(_,B),ee=(0,j.useRenderElement)("button",e,{state:{disabled:l,open:A},ref:[Y,t,H,B],props:[K.reference,q,G,$,{[v.CLICK_TRIGGER_IDENTIFIER]:"",id:R,"aria-haspopup":"dialog","aria-expanded":A,"aria-controls":N},S,J],stateAttributesMapping:{open:e=>e&&L===m.REASONS.triggerPress?k.pressableTriggerOpenStateMapping.open(e):k.triggerOpenStateMapping.open(e)}});return D&&!U?(0,n.jsxs)(o.Fragment,{children:[(0,n.jsx)(I.FocusGuard,{ref:X,onFocus:Q}),(0,n.jsx)(o.Fragment,{children:ee},R),(0,n.jsx)(I.FocusGuard,{ref:_.context.triggerFocusTargetRef,onFocus:Z})]}):(0,n.jsx)(o.Fragment,{children:ee},R)});var A=e.i(726674);let N=o.createContext(void 0),B=o.forwardRef(function(e,t){let{keepMounted:o=!1,...r}=e,{store:i}=c();return i.useState("mounted")||o?(0,n.jsx)(N.Provider,{value:o,children:(0,n.jsx)(A.FloatingPortal,{ref:t,...r})}):null});var H=e.i(144394),D=e.i(146376);let L=o.createContext(void 0);function W(){let e=o.useContext(L);if(!e)throw Error((0,s.default)(46));return e}var V=e.i(329365),U=e.i(426),q=e.i(222640),K=e.i(360495),$=e.i(789579),G=e.i(33383);let J=o.forwardRef(function(e,t){let{render:r,className:i,style:l,anchor:u,positionMethod:d="absolute",side:p="bottom",align:f="center",sideOffset:h=0,alignOffset:g=0,collisionBoundary:b="clipping-ancestors",collisionPadding:y=5,arrowPadding:S=5,sticky:x=!1,disableAnchorTracking:_=!1,collisionAvoidance:R=v.POPUP_COLLISION_AVOIDANCE,...w}=e,{store:C}=c(),k=function(){let e=o.useContext(N);if(void 0===e)throw Error((0,s.default)(45));return e}(),j=(0,a.useFloatingNodeId)(),E=C.useState("floatingRootContext"),O=C.useState("mounted"),T=C.useState("open"),P=C.useState("openChangeReason"),I=C.useState("activeTriggerElement"),F=C.useState("modal"),M=C.useState("openMethod"),z=C.useState("positionerElement"),A=C.useState("instantType"),B=C.useState("transitionStatus"),W=C.useState("hasViewport"),J=o.useRef(null),Y=(0,q.useAnimationsFinished)(z,!1,!1),X=(0,V.useAnchorPositioning)({anchor:u,floatingRootContext:E,positionMethod:d,mounted:O,side:p,sideOffset:h,align:f,alignOffset:g,arrowPadding:S,collisionBoundary:b,collisionPadding:y,sticky:x,disableAnchorTracking:_,keepMounted:k,nodeId:j,collisionAvoidance:R,adaptiveOrigin:W?K.adaptiveOrigin:void 0}),Q=E.useState("domReferenceElement");(0,D.useIsoLayoutEffect)(()=>{let e=J.current;if(Q&&(J.current=Q),e&&Q&&Q!==e){C.set("instantType",void 0);let e=new AbortController;return Y(()=>{C.set("instantType","trigger-change")},e.signal),()=>{e.abort()}}},[Q,Y,C]),(0,G.useAnchoredPopupScrollLock)(T&&!0===F&&P!==m.REASONS.triggerHover,"touch"===M,z,I);let Z=o.useCallback(e=>{C.set("positionerElement",e)},[C]),ee={open:T,side:X.side,align:X.align,anchorHidden:X.anchorHidden,instant:A},et=(0,$.usePositioner)(e,ee,{styles:X.positionerStyles,transitionStatus:B,props:w,refs:[t,Z],hidden:!O,inert:!T});return(0,n.jsxs)(L.Provider,{value:X,children:[O&&!0===F&&P!==m.REASONS.triggerHover&&(0,n.jsx)(U.InternalBackdrop,{ref:C.context.internalBackdropRef,inert:(0,H.inertValue)(!T),cutout:I}),(0,n.jsx)(a.FloatingNode,{id:j,children:et})]})});var Y=e.i(229315),X=e.i(61487),Q=e.i(431157),Z=e.i(209407),ee=e.i(137584),et=e.i(673327),en=e.i(96533),eo=e.i(815982),er=e.i(667865);let ei=o.createContext(void 0);function ea(e){let{value:t,children:o}=e;return(0,n.jsx)(ei.Provider,{value:t,children:o})}let es={...k.popupStateMapping,...Z.transitionStatusMapping},el=o.forwardRef(function(e,t){let{render:r,className:i,style:a,initialFocus:s,finalFocus:l,...u}=e,{store:d}=c(),p=W(),f=null!=(0,en.useToolbarRootContext)(!0),{context:g,hasClosePart:b}=function(){let[e,t]=o.useState(0),n=(0,er.useStableCallback)(()=>(t(e=>e+1),()=>{t(e=>Math.max(0,e-1))}));return{context:o.useMemo(()=>({register:n}),[n]),hasClosePart:e>0}}(),v=d.useState("open"),y=d.useState("openMethod"),S=d.useState("instantType"),x=d.useState("transitionStatus"),_=d.useState("popupProps"),R=d.useState("titleElementId"),w=d.useState("descriptionElementId"),C=d.useState("modal"),k=d.useState("mounted"),E=d.useState("openChangeReason"),O=d.useState("activeTriggerElement"),T=d.useState("floatingRootContext"),P=T.useState("floatingId"),I=d.useState("disabled"),F=d.useState("openOnHover"),M=d.useState("closeDelay"),z=u.id??P;(0,ee.useOpenChangeComplete)({open:v,ref:d.context.popupRef,onComplete(){v&&d.context.onOpenChangeComplete?.(!0)}}),(0,Q.useHoverFloatingInteraction)(T,{enabled:F&&!I,closeDelay:M});let A=void 0===s?(0,h.createDefaultInitialFocus)(d.context.popupRef):s,N=!1!==C&&b;d.useSyncedValue("focusManagerModal",N);let B=o.useCallback(e=>{d.set("popupElement",e)},[d]),H={open:v,side:p.side,align:p.align,instant:S,transitionStatus:x},D=(0,j.useRenderElement)("div",e,{state:H,ref:[t,d.context.popupRef,B],props:[_,{id:z,role:"dialog",...h.FOCUSABLE_POPUP_PROPS,"aria-labelledby":R,"aria-describedby":w,onKeyDown(e){f&&et.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()}},(0,eo.getDisabledMountTransitionStyles)(x),u],stateAttributesMapping:es});return(0,n.jsx)(X.FloatingFocusManager,{context:T,openInteractionType:y,modal:N,disabled:!k||E===m.REASONS.triggerHover,initialFocus:A,returnFocus:l,restoreFocus:"popup",previousFocusableElement:(0,Y.isHTMLElement)(O)?O:void 0,nextFocusableElement:d.context.triggerFocusTargetRef,beforeContentFocusGuardRef:d.context.beforeContentFocusGuardRef,children:(0,n.jsx)(ea,{value:g,children:D})})}),ec=o.forwardRef(function(e,t){let{render:n,className:o,style:r,...i}=e,{store:a}=c(),s=a.useState("open"),{arrowRef:l,side:u,align:d,arrowUncentered:p,arrowStyles:f}=W();return(0,j.useRenderElement)("div",e,{state:{open:s,side:u,align:d,uncentered:p},ref:[t,l],props:[{style:f,"aria-hidden":!0},i],stateAttributesMapping:k.popupStateMapping})}),eu={...k.popupStateMapping,...Z.transitionStatusMapping},ed=o.forwardRef(function(e,t){let{render:n,className:o,style:r,...i}=e,{store:a}=c(),s=a.useState("open"),l=a.useState("mounted"),u=a.useState("transitionStatus"),d=a.useState("openChangeReason");return(0,j.useRenderElement)("div",e,{state:{open:s,transitionStatus:u},ref:[a.context.backdropRef,t],props:[{role:"presentation",hidden:!l,style:{pointerEvents:d===m.REASONS.triggerHover?"none":void 0,userSelect:"none",WebkitUserSelect:"none"}},i],stateAttributesMapping:eu})}),ep=o.forwardRef(function(e,t){let{render:n,className:o,style:r,...i}=e,{store:a}=c(),s=(0,P.useBaseUiId)(i.id);return a.useSyncedValueWithCleanup("titleElementId",s),(0,j.useRenderElement)("h2",e,{ref:t,props:[{id:s},i]})}),ef=o.forwardRef(function(e,t){let{render:n,className:o,style:r,...i}=e,{store:a}=c(),s=(0,P.useBaseUiId)(i.id);return a.useSyncedValueWithCleanup("descriptionElementId",s),(0,j.useRenderElement)("p",e,{ref:t,props:[{id:s},i]})}),em=o.forwardRef(function(e,t){let n,{render:r,className:i,style:a,disabled:s=!1,nativeButton:l=!0,...u}=e,{buttonRef:d,getButtonProps:p}=(0,C.useButton)({disabled:s,focusableWhenDisabled:!1,native:l}),{store:f}=c();return n=o.useContext(ei),(0,D.useIsoLayoutEffect)(()=>n?.register(),[n]),(0,j.useRenderElement)("button",e,{ref:[t,d],props:[{onClick(e){f.setOpen(!1,(0,x.createChangeEventDetails)(m.REASONS.closePress,e.nativeEvent))}},u,p]})}),eh=((t={}).popupWidth="--popup-width",t.popupHeight="--popup-height",t);var eg=e.i(818390);let eb={activationDirection:e=>e?{"data-activation-direction":e}:null},ev=o.forwardRef(function(e,t){let{render:n,className:o,style:r,children:i,...a}=e,{store:s}=c(),{side:l}=W(),u=s.useState("instantType"),{children:d,state:p}=(0,eg.usePopupViewport)({store:s,side:l,cssVars:eh,children:i}),f={activationDirection:p.activationDirection,transitioning:p.transitioning,instant:u};return(0,j.useRenderElement)("div",e,{state:f,ref:t,props:[a,{children:d}],stateAttributesMapping:eb})});class ey{constructor(){this.store=new S}open(e){let t=e?this.store.context.triggerElements.getById(e)??void 0:void 0;if(e&&!t)throw Error((0,s.default)(80,e));this.store.setOpen(!0,(0,x.createChangeEventDetails)(m.REASONS.imperativeAction,void 0,t))}close(){this.store.setOpen(!1,(0,x.createChangeEventDetails)(m.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",0,ec,"Backdrop",0,ed,"Close",0,em,"Description",0,ef,"Handle",0,ey,"Popup",0,el,"Portal",0,B,"Positioner",0,J,"Root",0,function(e){return c(!0)?(0,n.jsx)(R,{props:e}):(0,n.jsx)(a.FloatingTree,{children:(0,n.jsx)(R,{props:e})})},"Title",0,ep,"Trigger",0,z,"Viewport",0,ev,"createHandle",0,function(){return new ey}],466914);var eS=e.i(466914),eS=eS,ex=e.i(115504);e.s(["Popover",0,function({...e}){return(0,n.jsx)(eS.Root,{"data-slot":"popover",...e})},"PopoverContent",0,function({className:e,align:t="center",alignOffset:o=0,side:r="bottom",sideOffset:i=4,...a}){return(0,n.jsx)(eS.Portal,{children:(0,n.jsx)(eS.Positioner,{align:t,alignOffset:o,side:r,sideOffset:i,className:"isolate z-50",children:(0,n.jsx)(eS.Popup,{"data-slot":"popover-content",className:(0,ex.cn)("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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),...a})})})},"PopoverTrigger",0,function({...e}){return(0,n.jsx)(eS.Trigger,{"data-slot":"popover-trigger",...e})}],337822)},516015,(e,t,n)=>{},898547,(e,t,n)=>{var o=e.i(247167);e.r(516015);var r=e.r(271645),i=r&&"object"==typeof r&&"default"in r?r:{default:r},a=void 0!==o.default&&o.default.env&&!0,s=function(e){return"[object String]"===Object.prototype.toString.call(e)},l=function(){function e(e){var t=void 0===e?{}:e,n=t.name,o=void 0===n?"stylesheet":n,r=t.optimizeForSpeed,i=void 0===r?a:r;c(s(o),"`name` must be a string"),this._name=o,this._deletedRulePlaceholder="#"+o+"-deleted-rule____{}",c("boolean"==typeof i,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=i,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var l="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=l?l.getAttribute("content"):null}var t,n=e.prototype;return n.setOptimizeForSpeed=function(e){c("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),c(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},n.isOptimizeForSpeed=function(){return this._optimizeForSpeed},n.inject=function(){var e=this;if(c(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(a||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,n){return"number"==typeof n?e._serverSheet.cssRules[n]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),n},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},n.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;ttypeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!n.cssRules[e])return e;n.deleteRule(e);try{n.insertRule(t,e)}catch(o){a||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),n.insertRule(this._deletedRulePlaceholder,e)}}else{var o=this._tags[e];c(o,"old rule at index `"+e+"` not found"),o.textContent=t}return e},n.deleteRule=function(e){if("u"typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},n.cssRules=function(){var e=this;return"u">>0},d={};function p(e,t){if(!t)return"jsx-"+e;var n=String(t),o=e+n;return d[o]||(d[o]="jsx-"+u(e+"-"+n)),d[o]}function f(e,t){"u"typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var n=this.getIdAndRules(e),o=n.styleId,r=n.rules;if(o in this._instancesCounts){this._instancesCounts[o]+=1;return}var i=r.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[o]=i,this._instancesCounts[o]=1},t.remove=function(e){var t=this,n=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(n in this._instancesCounts,"styleId: `"+n+"` not found"),this._instancesCounts[n]-=1,this._instancesCounts[n]<1){var o=this._fromServer&&this._fromServer[n];o?(o.parentNode.removeChild(o),delete this._fromServer[n]):(this._indices[n].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[n]),delete this._instancesCounts[n]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],n=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return n[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,n;return t=this.cssRules(),void 0===(n=e)&&(n={}),t.map(function(e){var t=e[0],o=e[1];return i.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:n.nonce?n.nonce:void 0,dangerouslySetInnerHTML:{__html:o}})})},t.getIdAndRules=function(e){var t=e.children,n=e.dynamic,o=e.id;if(n){var r=p(o,n);return{styleId:r,rules:Array.isArray(t)?t.map(function(e){return f(r,e)}):[f(r,t)]}}return{styleId:p(o),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),h=r.createContext(null);function g(){return new m}function b(){return r.useContext(h)}h.displayName="StyleSheetContext";var v=i.default.useInsertionEffect||i.default.useLayoutEffect,y="u">typeof window?g():void 0;function S(e){var t=y||b();return t&&("u"{t.exports=e.r(898547).style},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),n=e.i(271645);let o={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 r=e.i(9583),i=n.forwardRef(function(e,i){return n.createElement(r.default,(0,t.default)({},e,{ref:i,icon:o}))});e.s(["BulbOutlined",0,i],812618)},936772,e=>{"use strict";var t=e.i(843476),n=e.i(271645),o=e.i(464571),r=e.i(918789),i=e.i(650056),a=e.i(219470),s=e.i(755151),l=e.i(240647),c=e.i(812618);e.s(["default",0,({reasoningContent:e})=>{let[u,d]=(0,n.useState)(!0);return e?(0,t.jsxs)("div",{className:"reasoning-content mt-1 mb-2",children:[(0,t.jsxs)(o.Button,{type:"text",className:"flex items-center text-xs text-gray-500 hover:text-gray-700",onClick:()=>d(!u),icon:(0,t.jsx)(c.BulbOutlined,{}),children:[u?"Hide reasoning":"Show reasoning",u?(0,t.jsx)(s.DownOutlined,{className:"ml-1"}):(0,t.jsx)(l.RightOutlined,{className:"ml-1"})]}),u&&(0,t.jsx)("div",{className:"mt-2 p-3 bg-gray-50 border border-gray-200 rounded-md text-sm text-gray-700 max-w-full overflow-x-auto whitespace-pre-wrap break-words",style:{wordBreak:"break-word",overflowWrap:"break-word"},children:(0,t.jsx)(r.default,{components:{code({node:e,inline:n,className:o,children:r,...s}){let l=/language-(\w+)/.exec(o||"");return!n&&l?(0,t.jsx)(i.Prism,{style:a.coy,language:l[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...s,children:String(r).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${o} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...s,children:r})},pre:({node:e,...n})=>(0,t.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...n})},children:e})})]}):null}])},499569,e=>{"use strict";var t=e.i(843476),n=e.i(437902),o=e.i(898586),r=e.i(362024);let{Text:i}=o.Typography,{Panel:a}=r.Collapse;e.s(["default",0,({events:e,className:o})=>{if(!e||0===e.length)return null;let i=e.find(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_list_tools"&&e.item.tools&&e.item.tools.length>0),s=e.filter(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_call");return i||0!==s.length?(0,t.jsxs)("div",{className:`jsx-32b14b04f420f3ac mcp-events-display ${o||""}`,children:[(0,t.jsx)(n.default,{id:"32b14b04f420f3ac",children:".openai-mcp-tools.jsx-32b14b04f420f3ac{margin:0;padding:0;position:relative}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse.jsx-32b14b04f420f3ac,.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-item.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac{color:#9ca3af!important;background:0 0!important;border:none!important;min-height:20px!important;padding:0 0 0 20px!important;font-size:14px!important;font-weight:400!important;line-height:20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac:hover{color:#6b7280!important;background:0 0!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content-box.jsx-32b14b04f420f3ac{padding:4px 0 0 20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac{color:#9ca3af!important;justify-content:center!important;align-items:center!important;width:16px!important;height:16px!important;font-size:10px!important;display:flex!important;position:absolute!important;top:2px!important;left:2px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac:hover{color:#6b7280!important}.openai-vertical-line.jsx-32b14b04f420f3ac{opacity:.8;background-color:#f3f4f6;width:.5px;position:absolute;top:18px;bottom:0;left:9px}.tool-item.jsx-32b14b04f420f3ac{color:#4b5563;z-index:1;background:#fff;margin:0;padding:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:18px;position:relative}.mcp-section.jsx-32b14b04f420f3ac{z-index:1;background:#fff;margin-bottom:12px;position:relative}.mcp-section.jsx-32b14b04f420f3ac:last-child{margin-bottom:0}.mcp-section-header.jsx-32b14b04f420f3ac{color:#6b7280;margin-bottom:4px;font-size:13px;font-weight:500}.mcp-code-block.jsx-32b14b04f420f3ac{background:#f9fafb;border:1px solid #f3f4f6;border-radius:6px;padding:8px;font-size:12px}.mcp-json.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;word-wrap:break-word;margin:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcp-approved.jsx-32b14b04f420f3ac{color:#6b7280;align-items:center;font-size:13px;display:flex}.mcp-checkmark.jsx-32b14b04f420f3ac{color:#10b981;margin-right:6px;font-weight:700}.mcp-response-content.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:1.5}"}),(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac openai-mcp-tools",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac openai-vertical-line"}),(0,t.jsxs)(r.Collapse,{ghost:!0,size:"small",expandIconPosition:"start",defaultActiveKey:i?["list-tools"]:s.map((e,t)=>`mcp-call-${t}`),children:[i&&(0,t.jsx)(a,{header:"List tools",children:(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac",children:i.item?.tools?.map((e,n)=>(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac tool-item",children:e.name},n))})},"list-tools"),s.map((e,n)=>(0,t.jsx)(a,{header:e.item?.name||"Tool call",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac",children:[(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Request"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-code-block",children:e.item?.arguments&&(0,t.jsx)("pre",{className:"jsx-32b14b04f420f3ac mcp-json",children:(()=>{try{return JSON.stringify(JSON.parse(e.item.arguments),null,2)}catch(t){return e.item.arguments}})()})})]}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-approved",children:[(0,t.jsx)("span",{className:"jsx-32b14b04f420f3ac mcp-checkmark",children:"✓"})," Approved"]})}),e.item?.output&&(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Response"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-response-content",children:e.item.output})]})]})},`mcp-call-${n}`))]})]})]}):null}])},459161,e=>{"use strict";e.i(247167);var t=e.i(356449),n=e.i(602869),o=e.i(727749);async function r(e,i,a,s,l=[],c,u,d,p,f,m,h,g,b,v,y,S,x,_,R,w,C,k){if(!s)throw Error("Virtual Key is required");if(!a||""===a.trim())throw Error("Model is required. Please select a model before sending a request.");console.log=function(){};let j=R||(0,n.getProxyBaseUrl)(),E={};l&&l.length>0&&(E["x-litellm-tags"]=l.join(","));let O=new t.default.OpenAI({apiKey:s,baseURL:j,dangerouslyAllowBrowser:!0,defaultHeaders:E});try{let t=Date.now(),n=!1,o=e.map(e=>(Array.isArray(e.content),{role:e.role,content:e.content,type:"message"})),r=[];b&&b.length>0&&(b.includes("__all__")?r.push({type:"mcp",server_label:"litellm",server_url:`${j}/mcp`,require_approval:"never"}):b.forEach(e=>{if(e.startsWith("toolset:")){let t=e.slice(8),n=k?.find(e=>e.toolset_id===t),o=n?.toolset_name||t;r.push({type:"mcp",server_label:o,server_url:`${j}/mcp/${encodeURIComponent(o)}`,require_approval:"never"})}else{let t=w?.find(t=>t.server_id===e),n=t?.server_name||e,o=C?.[e]||[];r.push({type:"mcp",server_label:n,server_url:`${j}/mcp/${encodeURIComponent(n)}`,require_approval:"never",...o.length>0?{allowed_tools:o}:{}})}})),x&&r.push({type:"code_interpreter",container:{type:"auto"}});let s=await O.responses.create({model:a,input:o,stream:!0,litellm_trace_id:f,...v?{previous_response_id:v}:{},...m?{vector_store_ids:m}:{},...h?{guardrails:h}:{},...g?{policies:g}:{},...r.length>0?{tools:r,tool_choice:"auto"}:{}},{signal:c}),l="",R={code:"",containerId:""};for await(let e of s)if("object"==typeof e&&null!==e){if((e.type?.startsWith("response.mcp_")||"response.output_item.done"===e.type&&(e.item?.type==="mcp_list_tools"||e.item?.type==="mcp_call"))&&S){let t={type:e.type,sequence_number:e.sequence_number,output_index:e.output_index,item_id:e.item_id||e.item?.id,item:e.item,delta:e.delta,arguments:e.arguments,timestamp:Date.now()};S(t)}"response.output_item.done"===e.type&&e.item?.type==="mcp_call"&&e.item?.name&&(l=e.item.name),T=R;var T,P=R="response.output_item.done"===e.type&&e.item?.type==="code_interpreter_call"?{code:e.item.code||"",containerId:e.item.container_id||""}:T;if("response.output_item.done"===e.type&&e.item?.type==="message"&&e.item?.content&&_){for(let t of e.item.content)if("output_text"===t.type&&t.annotations){let e=t.annotations.filter(e=>"container_file_citation"===e.type);(e.length>0||P.code)&&_({code:P.code,containerId:P.containerId,annotations:e})}}if("response.role.delta"===e.type)continue;if("response.output_text.delta"===e.type&&"string"==typeof e.delta){let o=e.delta;if(o.length>0&&(i("assistant",o,a),!n)){n=!0;let e=Date.now()-t;d&&d(e)}}if("response.reasoning.delta"===e.type&&"delta"in e){let t=e.delta;"string"==typeof t&&u&&u(t)}if("response.completed"===e.type&&"response"in e){let t=e.response,n=t.usage;if(t.id&&y&&y(t.id),n&&p){let e={completionTokens:n.output_tokens,promptTokens:n.input_tokens,totalTokens:n.total_tokens};n.completion_tokens_details?.reasoning_tokens&&(e.reasoningTokens=n.completion_tokens_details.reasoning_tokens),p(e,l)}}}return s}catch(e){throw c?.aborted||o.default.fromBackend(`Error occurred while generating model response. Please try again. Error: ${e}`),e}}e.s(["makeOpenAIResponsesRequest",0,r],459161)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0jf45vdwkbyvs.js b/litellm/proxy/_experimental/out/_next/static/chunks/0jf45vdwkbyvs.js new file mode 100644 index 00000000000..ace0d66aed0 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0jf45vdwkbyvs.js @@ -0,0 +1,66 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,509345,e=>{"use strict";var t,a,r=e.i(843476),l=e.i(271645),i=e.i(653496),s=e.i(664659),n=e.i(758472),o=e.i(107233),d=e.i(602869),c=e.i(519455),m=e.i(755146),u=e.i(115504),p=e.i(808613),g=e.i(311451),x=e.i(212931),h=e.i(199133),f=e.i(262218),y=e.i(464571),j=e.i(727749),b=e.i(898586),_=e.i(770914),A=e.i(515831),v=e.i(175712),w=e.i(646563),C=e.i(519756);let{Text:N}=b.Typography,{Option:k}=h.Select,S=({visible:e,prebuiltPatterns:t,categories:a,selectedPatternName:l,patternAction:i,onPatternNameChange:s,onActionChange:n,onAdd:o,onCancel:d})=>(0,r.jsxs)(x.Modal,{title:"Add prebuilt pattern",open:e,onCancel:d,footer:null,width:800,children:[(0,r.jsxs)(_.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(N,{strong:!0,children:"Pattern type"}),(0,r.jsx)(h.Select,{placeholder:"Choose pattern type",value:l,onChange:s,style:{width:"100%",marginTop:8},showSearch:!0,filterOption:(e,a)=>{let r=t.find(e=>e.name===a?.value);return!!r&&(r.display_name.toLowerCase().includes(e.toLowerCase())||r.name.toLowerCase().includes(e.toLowerCase()))},children:a.map(e=>{let a=t.filter(t=>t.category===e);return 0===a.length?null:(0,r.jsx)(h.Select.OptGroup,{label:e,children:a.map(e=>(0,r.jsx)(k,{value:e.name,children:e.display_name},e.name))},e)})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(N,{strong:!0,children:"Action"}),(0,r.jsx)(N,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this pattern is detected"}),(0,r.jsxs)(h.Select,{value:i,onChange:n,style:{width:"100%"},children:[(0,r.jsx)(k,{value:"BLOCK",children:"Block"}),(0,r.jsx)(k,{value:"MASK",children:"Mask"})]})]})]}),(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,r.jsx)(y.Button,{onClick:d,children:"Cancel"}),(0,r.jsx)(y.Button,{type:"primary",onClick:o,children:"Add"})]})]}),{Text:I}=b.Typography,{Option:O}=h.Select,B=({visible:e,patternName:t,patternRegex:a,patternAction:l,onNameChange:i,onRegexChange:s,onActionChange:n,onAdd:o,onCancel:d})=>(0,r.jsxs)(x.Modal,{title:"Add custom regex pattern",open:e,onCancel:d,footer:null,width:800,children:[(0,r.jsxs)(_.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(I,{strong:!0,children:"Pattern name"}),(0,r.jsx)(g.Input,{placeholder:"e.g., internal_id, employee_code",value:t,onChange:e=>i(e.target.value),style:{marginTop:8}})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(I,{strong:!0,children:"Regex pattern"}),(0,r.jsx)(g.Input,{placeholder:"e.g., ID-[0-9]{6}",value:a,onChange:e=>s(e.target.value),style:{marginTop:8}}),(0,r.jsx)(I,{type:"secondary",style:{fontSize:12},children:"Enter a valid regular expression to match sensitive data"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(I,{strong:!0,children:"Action"}),(0,r.jsx)(I,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this pattern is detected"}),(0,r.jsxs)(h.Select,{value:l,onChange:n,style:{width:"100%"},children:[(0,r.jsx)(O,{value:"BLOCK",children:"Block"}),(0,r.jsx)(O,{value:"MASK",children:"Mask"})]})]})]}),(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,r.jsx)(y.Button,{onClick:d,children:"Cancel"}),(0,r.jsx)(y.Button,{type:"primary",onClick:o,children:"Add"})]})]}),{Text:E}=b.Typography,{Option:P}=h.Select,L=({visible:e,keyword:t,action:a,description:l,onKeywordChange:i,onActionChange:s,onDescriptionChange:n,onAdd:o,onCancel:d})=>(0,r.jsxs)(x.Modal,{title:"Add blocked keyword",open:e,onCancel:d,footer:null,width:800,children:[(0,r.jsxs)(_.Space,{direction:"vertical",style:{width:"100%"},size:"large",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(E,{strong:!0,children:"Keyword"}),(0,r.jsx)(g.Input,{placeholder:"Enter sensitive keyword or phrase",value:t,onChange:e=>i(e.target.value),style:{marginTop:8}})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(E,{strong:!0,children:"Action"}),(0,r.jsx)(E,{type:"secondary",style:{display:"block",marginTop:4,marginBottom:8},children:"Choose what action the guardrail should take when this keyword is detected"}),(0,r.jsxs)(h.Select,{value:a,onChange:s,style:{width:"100%"},children:[(0,r.jsx)(P,{value:"BLOCK",children:"Block"}),(0,r.jsx)(P,{value:"MASK",children:"Mask"})]})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(E,{strong:!0,children:"Description (optional)"}),(0,r.jsx)(g.Input.TextArea,{placeholder:"Explain why this keyword is sensitive",value:l,onChange:e=>n(e.target.value),rows:3,style:{marginTop:8}})]})]}),(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"24px"},children:[(0,r.jsx)(y.Button,{onClick:d,children:"Cancel"}),(0,r.jsx)(y.Button,{type:"primary",onClick:o,children:"Add"})]})]});var R=e.i(291542),T=e.i(955135);let{Text:D}=b.Typography,{Option:z}=h.Select,F=({patterns:e,onActionChange:t,onRemove:a})=>{let l=[{title:"Type",dataIndex:"type",key:"type",width:100,render:e=>(0,r.jsx)(f.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,r.jsxs)(D,{code:!0,style:{fontSize:12},children:[e.substring(0,40),"..."]}):"-"},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>(0,r.jsxs)(h.Select,{value:e,onChange:e=>t(a.id,e),style:{width:120},size:"small",children:[(0,r.jsx)(z,{value:"BLOCK",children:"Block"}),(0,r.jsx)(z,{value:"MASK",children:"Mask"})]})},{title:"",key:"actions",width:100,render:(e,t)=>(0,r.jsx)(y.Button,{type:"text",danger:!0,size:"small",icon:(0,r.jsx)(T.DeleteOutlined,{}),onClick:()=>a(t.id),children:"Delete"})}];return 0===e.length?(0,r.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No patterns added."}):(0,r.jsx)(R.Table,{dataSource:e,columns:l,rowKey:"id",pagination:!1,size:"small"})},{Option:M}=h.Select,K=({keywords:e,onActionChange:t,onRemove:a})=>{let l=[{title:"Keyword",dataIndex:"keyword",key:"keyword"},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>(0,r.jsxs)(h.Select,{value:e,onChange:e=>t(a.id,"action",e),style:{width:120},size:"small",children:[(0,r.jsx)(M,{value:"BLOCK",children:"Block"}),(0,r.jsx)(M,{value:"MASK",children:"Mask"})]})},{title:"Description",dataIndex:"description",key:"description",render:e=>e||"-"},{title:"",key:"actions",width:100,render:(e,t)=>(0,r.jsx)(y.Button,{type:"text",danger:!0,size:"small",icon:(0,r.jsx)(T.DeleteOutlined,{}),onClick:()=>a(t.id),children:"Delete"})}];return 0===e.length?(0,r.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No keywords added."}):(0,r.jsx)(R.Table,{dataSource:e,columns:l,rowKey:"id",pagination:!1,size:"small"})};var Q=e.i(362024),G=e.i(993914);let{Title:U,Text:H}=b.Typography,{Option:J}=h.Select,W=({availableCategories:e,selectedCategories:t,onCategoryAdd:a,onCategoryRemove:i,onCategoryUpdate:s,accessToken:n,pendingSelection:o,onPendingSelectionChange:c})=>{let[m,u]=l.default.useState(""),p=void 0!==o?o:m,g=c||u,[x,j]=l.default.useState({}),[b,_]=l.default.useState({}),[A,C]=l.default.useState({}),[N,k]=l.default.useState([]),[S,I]=l.default.useState(""),[O,B]=l.default.useState(!1),E=async e=>{if(n&&!x[e]){C(t=>({...t,[e]:!0}));try{let t=await (0,d.getCategoryYaml)(n,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)}j(t=>({...t,[e]:a})),_(a=>({...a,[e]:t.file_type||"yaml"}))}catch(t){console.error(`Failed to fetch content for category ${e}:`,t)}finally{C(t=>({...t,[e]:!1}))}}};l.default.useEffect(()=>{if(p&&n){let e=x[p];if(e)return void I(e);B(!0),(0,d.getCategoryYaml)(n,p).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 ${p}:`,e)}I(t),j(e=>({...e,[p]:t})),_(t=>({...t,[p]:e.file_type||"yaml"}))}).catch(e=>{console.error(`Failed to fetch preview content for category ${p}:`,e),I("")}).finally(()=>{B(!1)})}else I(""),B(!1)},[p,n]);let P=[{title:"Category",dataIndex:"display_name",key:"display_name",render:(t,a)=>{let l=e.find(e=>e.name===a.category);return(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{style:{fontWeight:500},children:t}),l?.description&&(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888",marginTop:"4px"},children:l.description})]})}},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,t)=>(0,r.jsxs)(h.Select,{value:e,onChange:e=>s(t.id,"action",e),style:{width:"100%"},children:[(0,r.jsx)(J,{value:"BLOCK",children:(0,r.jsx)(f.Tag,{color:"red",children:"BLOCK"})}),(0,r.jsx)(J,{value:"MASK",children:(0,r.jsx)(f.Tag,{color:"orange",children:"MASK"})})]})},{title:"Severity Threshold",dataIndex:"severity_threshold",key:"severity_threshold",width:180,render:(e,t)=>(0,r.jsxs)(h.Select,{value:e,onChange:e=>s(t.id,"severity_threshold",e),style:{width:"100%"},children:[(0,r.jsx)(J,{value:"low",children:"Low"}),(0,r.jsx)(J,{value:"medium",children:"Medium"}),(0,r.jsx)(J,{value:"high",children:"High"})]})},{title:"",key:"actions",width:80,render:(e,t)=>(0,r.jsx)(y.Button,{icon:(0,r.jsx)(T.DeleteOutlined,{}),onClick:()=>i(t.id),size:"small",children:"Remove"})}],L=e.filter(e=>!t.some(t=>t.category===e.name));return(0,r.jsxs)(v.Card,{title:(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",flexWrap:"wrap",gap:8},children:[(0,r.jsx)(U,{level:5,style:{margin:0},children:"Blocked topics"}),(0,r.jsx)(H,{type:"secondary",style:{fontSize:12,fontWeight:400},children:"Select topics to block using keyword and semantic analysis"})]}),size:"small",children:[(0,r.jsxs)("div",{style:{marginBottom:16,display:"flex",gap:8},children:[(0,r.jsx)(h.Select,{placeholder:"Select a content category",value:p||void 0,onChange:g,style:{flex:1},showSearch:!0,optionLabelProp:"label",filterOption:(e,t)=>(t?.label?.toString().toLowerCase()??"").includes(e.toLowerCase()),children:L.map(e=>(0,r.jsx)(J,{value:e.name,label:e.display_name,children:(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{style:{fontWeight:500},children:e.display_name}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#666",marginTop:"2px"},children:e.description})]})},e.name))}),(0,r.jsx)(y.Button,{type:"primary",onClick:()=>{if(!p)return;let r=e.find(e=>e.name===p);!r||t.some(e=>e.category===p)||(a({id:`category-${Date.now()}`,category:r.name,display_name:r.display_name,action:r.default_action,severity_threshold:"medium"}),g(""),I(""))},disabled:!p,icon:(0,r.jsx)(w.PlusOutlined,{}),children:"Add"})]}),p&&(0,r.jsxs)("div",{style:{marginBottom:16,padding:"12px",background:"#f9f9f9",border:"1px solid #e0e0e0",borderRadius:"4px"},children:[(0,r.jsxs)("div",{style:{marginBottom:8,fontWeight:500,fontSize:"14px"},children:["Preview: ",e.find(e=>e.name===p)?.display_name,b[p]&&(0,r.jsxs)("span",{style:{marginLeft:8,fontSize:"12px",color:"#888",fontWeight:400},children:["(",b[p]?.toUpperCase(),")"]})]}),O?(0,r.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Loading content..."}):S?(0,r.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,r.jsx)("code",{children:S})}):(0,r.jsx)("div",{style:{padding:"8px",textAlign:"center",color:"#888",fontSize:"12px"},children:"Unable to load category content"})]}),t.length>0?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(R.Table,{dataSource:t,columns:P,pagination:!1,size:"small",rowKey:"id"}),(0,r.jsx)("div",{style:{marginTop:16},children:(0,r.jsx)(Q.Collapse,{activeKey:N,onChange:e=>{let t=Array.isArray(e)?e:e?[e]:[],a=new Set(N);t.forEach(e=>{a.has(e)||x[e]||E(e)}),k(t)},ghost:!0,items:t.map(e=>{let t=(b[e.category]||"yaml").toUpperCase();return{key:e.category,label:(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,r.jsx)(G.FileTextOutlined,{}),(0,r.jsxs)("span",{children:["View ",t," for ",e.display_name]})]}),children:A[e.category]?(0,r.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Loading content..."}):x[e.category]?(0,r.jsx)("pre",{style:{background:"#f5f5f5",padding:"16px",borderRadius:"4px",overflow:"auto",maxHeight:"400px",fontSize:"12px",lineHeight:"1.5",margin:0},children:(0,r.jsx)("code",{children:x[e.category]})}):(0,r.jsx)("div",{style:{padding:"16px",textAlign:"center",color:"#888"},children:"Content will load when expanded"})}})})})]}):(0,r.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 q=e.i(790848),V=e.i(28651);let{Title:Y,Text:Z}=b.Typography,{Option:$}=h.Select,X={competitor_intent_type:"airline",brand_self:[],locations:[],policy:{competitor_comparison:"refuse",possible_competitor_comparison:"reframe"},threshold_high:.7,threshold_medium:.45,threshold_low:.3},ee=({enabled:e,config:t,onChange:a,accessToken:i})=>{let s=t??X,[n,o]=(0,l.useState)([]),[c,m]=(0,l.useState)(!1);(0,l.useEffect)(()=>{"airline"===s.competitor_intent_type&&i&&0===n.length&&(m(!0),(0,d.getMajorAirlines)(i).then(e=>o(e.airlines??[])).catch(()=>o([])).finally(()=>m(!1)))},[s.competitor_intent_type,i,n.length]);let u=e=>{a(e,e?{...X}:null)},g=(t,r)=>{a(e,{...s,[t]:r})},x=(t,r)=>{a(e,{...s,policy:{...s.policy,[t]:r}})},f=(t,r)=>{a(e,{...s,[t]:r.filter(Boolean)})};return e?(0,r.jsxs)(v.Card,{title:(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,r.jsx)(Y,{level:5,style:{margin:0},children:"Competitor Intent Filter"}),(0,r.jsx)(q.Switch,{checked:e,onChange:u})]}),size:"small",children:[(0,r.jsx)(Z,{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,r.jsxs)(p.Form,{layout:"vertical",size:"small",children:[(0,r.jsx)(p.Form.Item,{label:"Type",children:(0,r.jsxs)(h.Select,{value:s.competitor_intent_type,onChange:e=>g("competitor_intent_type",e),style:{width:"100%"},children:[(0,r.jsx)($,{value:"airline",children:"Airline (auto-load competitors from IATA)"}),(0,r.jsx)($,{value:"generic",children:"Generic (specify competitors manually)"})]})}),(0,r.jsx)(p.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,r.jsx)(h.Select,{mode:"tags",style:{width:"100%"},placeholder:c?"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 r=t.filter(Boolean),l=[],i=new Set;for(let e of r){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),l.push(e));else i.has(e.toLowerCase())||(i.add(e.toLowerCase()),l.push(e))}a(e,{...s,brand_self:l})})(t??[]):f("brand_self",t??[]),tokenSeparators:[","],loading:c,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,r.jsx)(p.Form.Item,{label:"Locations (optional)",help:"Countries, cities, airports for disambiguation (e.g. qatar, doha)",children:(0,r.jsx)(h.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,r.jsx)(p.Form.Item,{label:"Competitors",required:!0,help:"Competitor names to detect (required for generic type)",children:(0,r.jsx)(h.Select,{mode:"tags",style:{width:"100%"},placeholder:"Type and press Enter to add",value:s.competitors??[],onChange:e=>f("competitors",e??[]),tokenSeparators:[","]})}),(0,r.jsx)(p.Form.Item,{label:"Policy: Competitor comparison",children:(0,r.jsxs)(h.Select,{value:s.policy?.competitor_comparison??"refuse",onChange:e=>x("competitor_comparison",e),style:{width:"100%"},children:[(0,r.jsx)($,{value:"refuse",children:"Refuse (block request)"}),(0,r.jsx)($,{value:"reframe",children:"Reframe (suggest alternative)"})]})}),(0,r.jsx)(p.Form.Item,{label:"Policy: Possible competitor comparison",children:(0,r.jsxs)(h.Select,{value:s.policy?.possible_competitor_comparison??"reframe",onChange:e=>x("possible_competitor_comparison",e),style:{width:"100%"},children:[(0,r.jsx)($,{value:"refuse",children:"Refuse (block request)"}),(0,r.jsx)($,{value:"reframe",children:"Reframe (suggest alternative to backend LLM)"})]})}),(0,r.jsx)(p.Form.Item,{label:"Confidence thresholds",help:(0,r.jsxs)(r.Fragment,{children:["Classify competitor intent by confidence (0–1). Higher confidence → stronger intent.",(0,r.jsxs)("ul",{style:{marginBottom:0,marginTop:4,paddingLeft:20},children:[(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{children:"High (≥)"}),': Treat as full competitor comparison → uses "Competitor comparison" policy']}),(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{children:"Medium (≥)"}),': Treat as possible comparison → uses "Possible competitor comparison" policy']}),(0,r.jsxs)("li",{children:[(0,r.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,r.jsxs)(_.Space,{wrap:!0,children:[(0,r.jsx)(p.Form.Item,{label:"High",style:{marginBottom:0},help:"e.g. 0.7",children:(0,r.jsx)(V.InputNumber,{min:0,max:1,step:.05,value:s.threshold_high??.7,onChange:e=>g("threshold_high",e??.7),style:{width:80}})}),(0,r.jsx)(p.Form.Item,{label:"Medium",style:{marginBottom:0},help:"e.g. 0.45",children:(0,r.jsx)(V.InputNumber,{min:0,max:1,step:.05,value:s.threshold_medium??.45,onChange:e=>g("threshold_medium",e??.45),style:{width:80}})}),(0,r.jsx)(p.Form.Item,{label:"Low",style:{marginBottom:0},help:"e.g. 0.3",children:(0,r.jsx)(V.InputNumber,{min:0,max:1,step:.05,value:s.threshold_low??.3,onChange:e=>g("threshold_low",e??.3),style:{width:80}})})]})})]})]}):(0,r.jsx)(v.Card,{title:(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,r.jsx)(Y,{level:5,style:{margin:0},children:"Competitor Intent Filter"}),(0,r.jsx)(q.Switch,{checked:!1,onChange:u})]}),size:"small",children:(0,r.jsx)(Z,{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:et,Text:ea}=b.Typography,er=({prebuiltPatterns:e,categories:t,selectedPatterns:a,blockedWords:i,onPatternAdd:s,onPatternRemove:n,onPatternActionChange:o,onBlockedWordAdd:c,onBlockedWordRemove:m,onBlockedWordUpdate:u,onFileUpload:p,accessToken:g,showStep:x,contentCategories:h=[],selectedContentCategories:f=[],onContentCategoryAdd:b,onContentCategoryRemove:N,onContentCategoryUpdate:k,pendingCategorySelection:I,onPendingCategorySelectionChange:O,competitorIntentEnabled:E=!1,competitorIntentConfig:P=null,onCompetitorIntentChange:R})=>{let[T,D]=(0,l.useState)(!1),[z,M]=(0,l.useState)(!1),[Q,G]=(0,l.useState)(!1),[U,H]=(0,l.useState)(""),[J,q]=(0,l.useState)("BLOCK"),[V,Y]=(0,l.useState)(""),[Z,$]=(0,l.useState)(""),[X,er]=(0,l.useState)("BLOCK"),[el,ei]=(0,l.useState)(""),[es,en]=(0,l.useState)("BLOCK"),[eo,ed]=(0,l.useState)(""),[ec,em]=(0,l.useState)(!1),eu=async e=>{em(!0);try{let t=await e.text();if(g){let e=await (0,d.validateBlockedWordsFile)(g,t);if(e.valid)p&&p(t),j.default.success(e.message||"File uploaded successfully");else{let t=e.error||e.errors&&e.errors.join(", ")||"Invalid file";j.default.error(`Validation failed: ${t}`)}}}catch(e){j.default.error(`Failed to upload file: ${e}`)}finally{em(!1)}return!1};return(0,r.jsxs)("div",{className:"space-y-6",children:[!x&&(0,r.jsx)("div",{children:(0,r.jsx)(ea,{type:"secondary",children:"Configure patterns, keywords, and content categories to detect and filter sensitive information in requests and responses."})}),(!x||"patterns"===x)&&(0,r.jsxs)(v.Card,{title:(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,r.jsx)(et,{level:5,style:{margin:0},children:"Pattern Detection"}),(0,r.jsx)(ea,{type:"secondary",style:{fontSize:14,fontWeight:400},children:"Detect sensitive information using regex patterns (SSN, credit cards, API keys, etc.)"})]}),size:"small",children:[(0,r.jsx)("div",{style:{marginBottom:16},children:(0,r.jsxs)(_.Space,{children:[(0,r.jsx)(y.Button,{type:"primary",onClick:()=>D(!0),icon:(0,r.jsx)(w.PlusOutlined,{}),children:"Add prebuilt pattern"}),(0,r.jsx)(y.Button,{onClick:()=>G(!0),icon:(0,r.jsx)(w.PlusOutlined,{}),children:"Add custom regex"})]})}),(0,r.jsx)(F,{patterns:a,onActionChange:o,onRemove:n})]}),(!x||"keywords"===x)&&(0,r.jsxs)(v.Card,{title:(0,r.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,r.jsx)(et,{level:5,style:{margin:0},children:"Blocked Keywords"}),(0,r.jsx)(ea,{type:"secondary",style:{fontSize:14,fontWeight:400},children:"Block or mask specific sensitive terms and phrases"})]}),size:"small",children:[(0,r.jsx)("div",{style:{marginBottom:16},children:(0,r.jsxs)(_.Space,{children:[(0,r.jsx)(y.Button,{type:"primary",onClick:()=>M(!0),icon:(0,r.jsx)(w.PlusOutlined,{}),children:"Add keyword"}),(0,r.jsx)(A.Upload,{beforeUpload:eu,accept:".yaml,.yml",showUploadList:!1,children:(0,r.jsx)(y.Button,{icon:(0,r.jsx)(C.UploadOutlined,{}),loading:ec,children:"Upload YAML file"})})]})}),(0,r.jsx)(K,{keywords:i,onActionChange:u,onRemove:m})]}),(!x||"competitor_intent"===x||"categories"===x)&&R&&(0,r.jsx)(ee,{enabled:E,config:P,onChange:R,accessToken:g}),(!x||"categories"===x)&&h.length>0&&b&&N&&k&&(0,r.jsx)(W,{availableCategories:h,selectedCategories:f,onCategoryAdd:b,onCategoryRemove:N,onCategoryUpdate:k,accessToken:g,pendingSelection:I,onPendingSelectionChange:O}),(0,r.jsx)(S,{visible:T,prebuiltPatterns:e,categories:t,selectedPatternName:U,patternAction:J,onPatternNameChange:H,onActionChange:e=>q(e),onAdd:()=>{if(!U)return void j.default.error("Please select a pattern");let t=e.find(e=>e.name===U);s({id:`pattern-${Date.now()}`,type:"prebuilt",name:U,display_name:t?.display_name,action:J}),D(!1),H(""),q("BLOCK")},onCancel:()=>{D(!1),H(""),q("BLOCK")}}),(0,r.jsx)(B,{visible:Q,patternName:V,patternRegex:Z,patternAction:X,onNameChange:Y,onRegexChange:$,onActionChange:e=>er(e),onAdd:()=>{V&&Z?(s({id:`custom-${Date.now()}`,type:"custom",name:V,pattern:Z,action:X}),G(!1),Y(""),$(""),er("BLOCK")):j.default.error("Please provide pattern name and regex")},onCancel:()=>{G(!1),Y(""),$(""),er("BLOCK")}}),(0,r.jsx)(L,{visible:z,keyword:el,action:es,description:eo,onKeywordChange:ei,onActionChange:e=>en(e),onDescriptionChange:ed,onAdd:()=>{el?(c({id:`word-${Date.now()}`,keyword:el,action:es,description:eo||void 0}),M(!1),ei(""),ed(""),en("BLOCK")):j.default.error("Please enter a keyword")},onCancel:()=>{M(!1),ei(""),ed(""),en("BLOCK")}})]})},el={src:e.i(462433).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzWNfC/wDZoEkl99sERJKgbDJg8fTOPyPrwAf/2Q=="},ei={src:e.i(80967).default,width:20,height:20,blurWidth:0,blurHeight:0},es={src:e.i(20698).default,width:224,height:224,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqUlEQVR42j2Nzw7BQBjE91G5i+AVJF5BFHHhHRoJrRvHtlTbRCp0kdAi+ic2u9/62MZkLvObZIbIn0BKP0u8LAFZiijqZXHdn9f8mZvG8C/C4tkMzD61h9RpBMYuf3wLATCgDqLF/YgendYatTkAYSCm8R5R1dUrG91IDhjfghNcTDnrhKtuZPUiqx0uX5yB+sA1nGoFJlqLbIzlOerGisllOz67V5Yr8gGQaKlBeRtj9QAAAABJRU5ErkJggg=="};var en=e.i(922158);let eo={src:e.i(509105).default,width:143,height:71,blurWidth:0,blurHeight:0},ed={src:e.i(648931).default,width:300,height:168,blurWidth:8,blurHeight:4,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAIAAAA8r+mnAAAAUElEQVR42jVMSQqAMAzs/7/kRW8exSeIgqAiQm2NbdJOtzBJZoFRIc/P4jJAiqOwxsl02PlMAIGsAbGMu+lX3S162F7iFuA/xPfnL+txS1cEEuZcPA75paAAAAAASUVORK5CYII="},ec={src:e.i(689521).default,width:80,height:80,blurWidth:0,blurHeight:0},em={src:e.i(579477).default,width:100,height:100,blurWidth:1,blurHeight:1,blurDataURL:"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="};var eu=e.i(336712);let ep={src:e.i(872799).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0A7/PIVWN3vPpkcce/X8Me1M+d159Pjv/AMN57/K3kf/Z"},eg={src:e.i(616667).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAeUlEQVR42nXNvQpAUBTAcU/CQgYfxSB5EKPBeAcUUuQZLGKyWzyAFxDPcw/CgkK5Umc4p1+nP4URfY7LTZmJHfY6EU1dm8fPpX0wCRDKS1uAL3wgUra+gUD+gUQHXyRA3YbmyMwVesGUW2tXQyA9/fsj1sbUwIh5Gjs1Qmc92eX7VgAAAABJRU5ErkJggg=="},ex={src:e.i(356349).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDyf/iX/wBk/wDT5/wL+9+XSgD/2Q=="},eh={src:e.i(855305).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAiklEQVR42nWOvQqCUABG71qLg3Wvcu/DBBH0ONHQ0hZE0BLhIDgLgqsgohfFwUXERXDXRxAERfFvUlHhLIczfB9oHbIKmEpjL0KuY+cNlRubaXgMNSWhgC5of2J3wR/1OoTSxO4HqvfD88o8zgx9HSORKwwMKovEEpfIfCrz/g95X9hrRefjm6+mdCpVaxgK1brjAAAAAElFTkSuQmCC"},ef={src:e.i(480509).default,width:195,height:192,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtnfVRrKokBLmT5pC/Qewx/wDWrt0t/dPNXxdeY//Z"};var ey=e.i(39182);let ej={src:e.i(622024).default,width:325,height:326,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAlUlEQVR42n2OPQ6CQBCFtzbxCHoES69iYmPvDeyNvXSWJja2amJjZQMVtBTUJFATSIDdj12Wv4pJJu9l3peXEYCaW8FkamVValWdbwHjgwTOHqQ5OD68Igu2QJDC9gHrGxx/sHRg94ai0kBRw/4DiyscvrDS0OYOXmybhal5hnDR9XEGpz+4XTj8YKBK2kMpx7AH5Nw25wnuSVRZ0REAAAAASUVORK5CYII="};var eb=e.i(980385);let e_={src:e.i(818207).default,width:225,height:225,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0z/idDVOzQl/YIF/nn+prl/fc/keh/sro+dvnf8v+Af/Z"},eA={src:e.i(896626).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAkklEQVR42m2OsQqCUABFXcsHRQR9QL4iIqKhUN9gkUsRfUANQbSFCCLooiK4ODi4OYgoiIiD4h8Koqgo3OHC4XIuthyRg8GqhtMEQPvFdQVQC0zP8KYcTr/ITVXe3M0vFSA2rzUXPth/7GVJkD+pT72YMJCVRd13rED4atsZ0zggQIZk349viFNd+ZgszXTvVS8FCXgoSUm17AYAAAAASUVORK5CYII="},ev={src:e.i(297290).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDWd9JXw9GojDX7HBYZyvzdT26Vwe5yeZ9qliXim7+5/wAA/9k="},ew={src:e.i(414170).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABE0lEQVR42gEIAff+AAAAAAAAAAAAKSMtK3diiIpmQoOKIhUsLQAAAAAAAAAAAAAAAAALCQwLloOnpOHD/P7GkPL+ekugqAkGDAwAAAAAAAEBAQFNQ1VTyqvk8rGJ0/7Xsvf+s3Xl80AnVFYBAAEBABsXHRywmMTEl2q+/04fdc2wlsbLzZ31/5BZvMcXDh4eAHxsiofBnt/6XCWK9CILNV1PQ1pY0rDv8rp87PtmPoWLAMyw5eqCUaz/ay2e94pTt8qQWbvKt3vn9rdz7f+nZtvrAHFUiahVGob9YCGU/3Iyp/9yMqf/cjKn/3Eypv1RJnSkAA8GFycpCUSGLAlJkiwJSZIsCUmSLAlJkikIRIUMAhQlPo1u6u1JP8MAAAAASUVORK5CYII="},eC={src:e.i(923884).default,width:1024,height:1024,blurWidth:0,blurHeight:0},eN={src:e.i(295045).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDsPtuq/wDCTf23i6+wmb7J9l2Njyc7fNx67+f92p5lzcpPN73Kf//Z"},ek={src:e.i(145645).default,width:512,height:512,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAtUlEQVR42oVPQQqCUBT8ZCBqFh1AJLqBKEYolSB0EMWVBNJOkk4jgZ2hpdkVOsJv76759f4i3LUY3mNmmDePMcZGijLeqap+0/VpT6CdONIYLZo2eX4FYRgzQZNAnDSR27aXKIojquoM1/URhluY5lyQxigyjveC85eo6wuSJEPXPeB5K0rqpcH316Jt70jT7N00V3DORRTFkAaKobgg2MBxPJTlCXl+gGUtIE8MSw7xK/nvzQ+841NB/ZJxVQAAAABJRU5ErkJggg=="},eS={src:e.i(205897).default,width:35,height:49,blurWidth:0,blurHeight:0},eI={src:e.i(926168).default,width:36,height:36,blurWidth:0,blurHeight:0},eO={src:e.i(583306).default,width:50,height:41,blurWidth:0,blurHeight:0};var eB=((t={}).PresidioPII="Presidio PII",t.Bedrock="Bedrock Guardrail",t.Lakera="Lakera",t);let eE={},eP=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)}),eE=t,t},eL=()=>Object.keys(eE).length>0?eE:eB,eR={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",Deepkeep:"deepkeep",QostodianNexus:"qostodian_nexus",Repelloai:"repelloai"},eT=e=>{Object.entries(e).forEach(([e,t])=>{t&&"object"==typeof t&&"ui_friendly_name"in t&&(eR[e.split("_").map((e,t)=>e.charAt(0).toUpperCase()+e.slice(1)).join("")]=e)})},eD=e=>!!e&&"Presidio PII"===eL()[e],ez=e=>!!e&&"LiteLLM Content Filter"===eL()[e],eF=e=>!!e&&"llm_as_a_judge"===eR[e],eM={"Zscaler AI Guard":eO.src,"Presidio PII":ey.default.src,"Bedrock Guardrail":en.default.src,Lakera:ex.src,"Azure Content Safety Prompt Shield":ey.default.src,"Azure Content Safety Text Moderation":ey.default.src,"Aporia AI":es.src,"PANW Prisma AIRS":e_.src,"Cisco AI Defense":ed.src,"Noma Security":ej.src,"Javelin Guardrails":eg.src,"Pillar Guardrail":ev.src,"Google Cloud Model Armor":eu.default.src,"Guardrails AI":ep.src,"Lasso Guardrail":eh.src,"Pangea Guardrail":eA.src,"AIM Guardrail":el.src,"Cato Networks Guardrail":eo.src,"OpenAI Moderation":eb.default.src,EnkryptAI:em.src,"Prompt Security":ew.src,PromptGuard:eC.src,XecGuard:eI.src,"LiteLLM Content Filter":ef.src,"LiteLLM LLM as a Judge":ef.src,Akto:ei.src,"DeepKeep AI Firewall":ec.src,"Qostodian Nexus":eN.src,"RepelloAI Argus":ek.src,Straiker:eS.src},eK=e=>Object.prototype.hasOwnProperty.call(eM,e)?eM[e]:void 0,eQ=e=>{if(!e)return{logo:"",displayName:"-"};let t=Object.keys(eR).find(t=>eR[t].toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let a=eL()[t];return{logo:eK(a??"")??"",displayName:a||e}};function eG(e){return!0===e?"yes":!1===e?"no":"inherit"}function eU(e){return!0===e?"yes":!1===e?"no":"inherit"}var eH=e.i(174553),eJ=e.i(435451);let{Title:eW}=b.Typography,eq=({field:e,fieldKey:t,fullFieldKey:a,value:i})=>{let[s,n]=l.default.useState([]),[o,d]=l.default.useState(e.dict_key_options||[]);return l.default.useEffect(()=>{if(i&&"object"==typeof i){let t=Object.keys(i);n(t.map(e=>({key:e,id:`${e}_${Date.now()}_${Math.random()}`}))),d((e.dict_key_options||[]).filter(e=>!t.includes(e)))}},[i,e.dict_key_options]),(0,r.jsxs)("div",{className:"space-y-3",children:[s.map(t=>(0,r.jsxs)("div",{className:"flex items-center space-x-3 p-3 border rounded-lg",children:[(0,r.jsx)("div",{className:"w-24 font-medium text-sm",children:t.key}),(0,r.jsx)("div",{className:"flex-1",children:(0,r.jsx)(p.Form.Item,{name:Array.isArray(a)?[...a,t.key]:[a,t.key],style:{marginBottom:0},initialValue:i&&"object"==typeof i?i[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,r.jsx)(eJ.default,{step:1,width:200,placeholder:`Enter ${t.key} value`}):"boolean"===e.dict_value_type?(0,r.jsxs)(h.Select,{placeholder:`Select ${t.key} value`,children:[(0,r.jsx)(h.Select.Option,{value:!0,children:"True"}),(0,r.jsx)(h.Select.Option,{value:!1,children:"False"})]}):(0,r.jsx)(g.Input,{placeholder:`Enter ${t.key} value`})})}),(0,r.jsx)(y.Button,{type:"text",danger:!0,size:"small",onClick:()=>{var e,a;return e=t.id,a=t.key,void(n(s.filter(t=>t.id!==e)),d([...o,a].sort()))},children:"Remove"})]},t.id)),o.length>0&&(0,r.jsxs)("div",{className:"flex items-center space-x-3 mt-2",children:[(0,r.jsx)(h.Select,{placeholder:"Select category to configure",style:{width:200},onSelect:e=>e&&void(!e||(n([...s,{key:e,id:`${e}_${Date.now()}`}]),d(o.filter(t=>t!==e)))),value:void 0,children:o.map(e=>(0,r.jsx)(h.Select.Option,{value:e,children:e},e))}),(0,r.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,r.jsxs)("div",{className:"guardrail-optional-params",children:[(0,r.jsxs)("div",{className:"mb-8 pb-4 border-b border-gray-100",children:[(0,r.jsx)(eW,{level:3,className:"mb-2 font-semibold text-gray-900",children:"Optional Parameters"}),(0,r.jsx)("p",{className:"text-gray-600 text-sm",children:e.description||"Configure additional settings for this guardrail provider"})]}),(0,r.jsx)("div",{className:"space-y-8",children:Object.entries(e.fields).map(([e,l])=>{let i,s;return i=`${t}.${e}`,s=a?.[e],"dict"===l.type&&l.dict_key_options?(0,r.jsxs)("div",{className:"mb-8 p-6 bg-gray-50 rounded-lg border border-gray-200",children:[(0,r.jsx)("div",{className:"mb-4 font-medium text-gray-900 text-base",children:e}),(0,r.jsx)("p",{className:"text-sm text-gray-600 mb-4",children:l.description}),(0,r.jsx)(eq,{field:l,fieldKey:e,fullFieldKey:[t,e],value:s})]},i):(0,r.jsx)("div",{className:"mb-8 p-6 bg-white rounded-lg border border-gray-200 shadow-xs",children:(0,r.jsx)(p.Form.Item,{name:[t,e],label:(0,r.jsxs)("div",{className:"mb-2",children:[(0,r.jsx)("div",{className:"font-medium text-gray-900 text-base",children:e}),(0,r.jsx)("p",{className:"text-sm text-gray-600 mt-1",children:l.description})]}),rules:l.required?[{required:!0,message:`${e} is required`}]:void 0,className:"mb-0",initialValue:void 0!==s?s:l.default_value,normalize:"number"===l.type?e=>{if(null==e||""===e)return;let t=Number(e);return isNaN(t)?e:t}:void 0,children:"select"===l.type&&l.options?(0,r.jsx)(h.Select,{placeholder:l.description,children:l.options.map(e=>(0,r.jsx)(h.Select.Option,{value:e,children:e},e))}):"multiselect"===l.type&&l.options?(0,r.jsx)(h.Select,{mode:"multiple",placeholder:l.description,children:l.options.map(e=>(0,r.jsx)(h.Select.Option,{value:e,children:e},e))}):"bool"===l.type||"boolean"===l.type?(0,r.jsxs)(h.Select,{placeholder:l.description,children:[(0,r.jsx)(h.Select.Option,{value:!0,children:"True"}),(0,r.jsx)(h.Select.Option,{value:!1,children:"False"})]}):"number"===l.type?(0,r.jsx)(eJ.default,{step:1,width:400,placeholder:l.description}):e.includes("password")||e.includes("secret")||e.includes("key")?(0,r.jsx)(g.Input.Password,{placeholder:l.description}):(0,r.jsx)(g.Input,{placeholder:l.description})})},i)})})]}):null;var eY=e.i(482725),eZ=e.i(850627);let e$=({selectedProvider:e,accessToken:t,providerParams:a=null,value:i=null})=>{let[s,n]=(0,l.useState)(!1),[o,c]=(0,l.useState)(a),[m,u]=(0,l.useState)(null);if((0,l.useEffect)(()=>{if(a)return void c(a);let e=async()=>{if(t){n(!0),u(null);try{let e=await (0,d.getGuardrailProviderSpecificParams)(t);c(e),eP(e),eT(e)}catch(e){console.error("Error fetching provider params:",e),u("Failed to load provider parameters")}finally{n(!1)}}};a||e()},[t,a]),!e)return null;if(s)return(0,r.jsx)(eY.Spin,{tip:"Loading provider parameters..."});if(m)return(0,r.jsx)("div",{className:"text-red-500",children:m});let x=eR[e]?.toLowerCase(),f=o&&o[x];if(!f||0===Object.keys(f).length)return(0,r.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=ez(e),b=(e,t="",a)=>Object.entries(e).map(([e,l])=>{let s=t?`${t}.${e}`:e,n=a?a[e]:i?.[e];if("ui_friendly_name"===e||"optional_params"===e&&"nested"===l.type&&l.fields||j&&y.has(e))return null;if("nested"===l.type&&l.fields)return(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"mb-2 font-medium",children:e}),(0,r.jsx)("div",{className:"ml-4 border-l-2 border-gray-200 pl-4",children:b(l.fields,s,n)})]},s);let o=void 0!==n?n:l.default_value??("percentage"===l.type?.5:void 0);return(0,r.jsx)(p.Form.Item,{name:s,label:e,tooltip:l.description,rules:l.required?[{required:!0,message:`${e} is required`}]:void 0,initialValue:o,children:"select"===l.type&&l.options?(0,r.jsx)(h.Select,{placeholder:l.description,defaultValue:n||l.default_value,children:l.options.map(e=>(0,r.jsx)(h.Select.Option,{value:e,children:e},e))}):"multiselect"===l.type&&l.options?(0,r.jsx)(h.Select,{mode:"multiple",placeholder:l.description,defaultValue:n||l.default_value,children:l.options.map(e=>(0,r.jsx)(h.Select.Option,{value:e,children:e},e))}):"bool"===l.type||"boolean"===l.type?(0,r.jsxs)(h.Select,{placeholder:l.description,children:[(0,r.jsx)(h.Select.Option,{value:!0,children:"True"}),(0,r.jsx)(h.Select.Option,{value:!1,children:"False"})]}):"percentage"===l.type&&null!=l.min&&null!=l.max?(0,r.jsx)(eZ.Slider,{min:l.min,max:l.max,step:l.step??.1,marks:{[l.min]:"0%",[(l.min+l.max)/2]:"50%",[l.max]:"100%"}}):"number"===l.type?(0,r.jsx)(eJ.default,{step:1,width:400,placeholder:l.description,defaultValue:void 0!==n?Number(n):void 0}):e.includes("password")||e.includes("secret")||e.includes("key")?(0,r.jsx)(g.Input.Password,{placeholder:l.description,defaultValue:n||""}):(0,r.jsx)(g.Input,{placeholder:l.description,defaultValue:n||""})},s)});return(0,r.jsx)(r.Fragment,{children:b(f)})};var eX=e.i(592968),e0=e.i(750113);let e1=({availableModels:e,form:t})=>(0,r.jsxs)(r.Fragment,{children:[(0,r.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,r.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,r.jsx)(p.Form.Item,{name:"judge_model",label:(0,r.jsxs)("span",{children:["Judge Model ",(0,r.jsx)(eX.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,r.jsx)(e0.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),rules:[{required:!0,message:"Select a judge model"}],children:(0,r.jsx)(h.Select,{showSearch:!0,placeholder:"Select a model",options:e.map(e=>({label:e,value:e}))})}),(0,r.jsx)(p.Form.Item,{name:"overall_threshold",label:(0,r.jsxs)("span",{children:["Minimum Score to Pass ",(0,r.jsx)(eX.Tooltip,{title:"0–100. If the weighted average of criterion scores falls below this, the guardrail triggers. 80 is a good default.",children:(0,r.jsx)(e0.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),initialValue:80,children:(0,r.jsx)(V.InputNumber,{min:0,max:100,addonAfter:"/ 100",style:{width:"100%"}})}),(0,r.jsx)(p.Form.Item,{name:"on_failure",label:(0,r.jsxs)("span",{children:["On Failure ",(0,r.jsx)(eX.Tooltip,{title:"Block: return HTTP 422 when the score is too low. Log: record the result but let the response through.",children:(0,r.jsx)(e0.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),initialValue:"block",children:(0,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"block",children:"Block (return 422)"}),(0,r.jsx)(h.Select.Option,{value:"log",children:"Log only"})]})}),(0,r.jsx)(p.Form.Item,{label:(0,r.jsxs)("span",{children:["Evaluation Criteria ",(0,r.jsx)(eX.Tooltip,{title:"Each criterion is something the judge checks. Weights must add up to 100%.",children:(0,r.jsx)(e0.QuestionCircleOutlined,{style:{color:"#8c8c8c"}})})]}),children:(0,r.jsx)(p.Form.List,{name:"criteria",initialValue:[{name:"",weight:100,description:""}],children:(e,{add:a,remove:l})=>(0,r.jsxs)(r.Fragment,{children:[e.map(({key:e,name:t,...a})=>(0,r.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,padding:"12px 12px 0",marginBottom:8},children:[(0,r.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"flex-end"},children:[(0,r.jsx)(p.Form.Item,{...a,name:[t,"name"],rules:[{required:!0,message:"Enter criterion name"}],style:{flex:2,marginBottom:8},children:(0,r.jsx)(g.Input,{placeholder:"Criterion name (e.g. Policy accuracy)"})}),(0,r.jsx)(p.Form.Item,{...a,name:[t,"weight"],label:(0,r.jsx)(eX.Tooltip,{title:"How much this criterion counts toward the final score. All weights must add up to 100%.",children:(0,r.jsxs)("span",{style:{fontSize:12,color:"#595959"},children:["Weight ",(0,r.jsx)(e0.QuestionCircleOutlined,{style:{color:"#bfbfbf"}})]})}),rules:[{required:!0,message:"Enter weight"}],style:{flex:1,marginBottom:8},children:(0,r.jsx)(V.InputNumber,{min:0,max:100,addonAfter:"%",style:{width:"100%"},placeholder:"e.g. 50"})}),(0,r.jsx)("div",{style:{marginBottom:8},children:(0,r.jsx)(y.Button,{type:"text",danger:!0,size:"small",onClick:()=>l(t),children:"×"})})]}),(0,r.jsx)(p.Form.Item,{...a,name:[t,"description"],rules:[{required:!0,message:"Describe what to check"}],style:{marginBottom:8},children:(0,r.jsx)(g.Input,{placeholder:"What should the judge check for this criterion?"})})]},e)),(0,r.jsx)(y.Button,{type:"dashed",block:!0,style:{marginTop:4},onClick:()=>a({name:"",weight:0,description:""}),icon:(0,r.jsx)(w.PlusOutlined,{}),children:"Add Criterion"}),e.length>0&&(0,r.jsx)(p.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,r.jsxs)("div",{style:{marginTop:6,fontSize:12,color:a?"#52c41a":"#faad14"},children:["Weights total: ",e,"%",a?" ✓":" — must add up to 100%"]})}})]})})})]});var e2=e.i(536916),e4=e.i(149192),e5=e.i(741585),e5=e5,e8=e.i(724154);e.i(247167);var e6=e.i(931067);let e3={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 e7=e.i(9583),e9=l.forwardRef(function(e,t){return l.createElement(e7.default,(0,e6.default)({},e,{ref:t,icon:e3}))});let{Text:te}=b.Typography,{Option:tt}=h.Select,ta=({categories:e,selectedCategories:t,onChange:a})=>(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center mb-2",children:[(0,r.jsx)(e9,{className:"text-gray-500 mr-1"}),(0,r.jsx)(te,{className:"text-gray-500 font-medium",children:"Filter by category"})]}),(0,r.jsx)(h.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,r.jsx)(f.Tag,{color:"blue",closable:e.closable,onClose:e.onClose,className:"mr-2 mb-2",children:e.label}),children:e.map(e=>(0,r.jsx)(tt,{value:e.category,children:e.category},e.category))})]}),tr=({onSelectAll:e,onUnselectAll:t,hasSelectedEntities:a})=>(0,r.jsxs)("div",{className:"bg-gray-50 p-5 rounded-lg mb-6 border border-gray-200 shadow-xs",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)(te,{strong:!0,className:"text-gray-700 text-base",children:"Quick Actions"}),(0,r.jsx)(eX.Tooltip,{title:"Apply action to all PII types at once",children:(0,r.jsx)("div",{className:"ml-2 text-gray-400 cursor-help text-xs",children:"ⓘ"})})]}),(0,r.jsx)(y.Button,{color:"danger",variant:"outlined",onClick:t,disabled:!a,icon:(0,r.jsx)(e4.CloseOutlined,{}),children:"Unselect All"})]}),(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,r.jsx)(y.Button,{color:"primary",variant:"outlined",onClick:()=>e("MASK"),className:"h-10",block:!0,icon:(0,r.jsx)(e5.default,{}),children:"Select All & Mask"}),(0,r.jsx)(y.Button,{color:"danger",variant:"outlined",onClick:()=>e("BLOCK"),className:"h-10 hover:bg-red-100",block:!0,icon:(0,r.jsx)(e8.StopOutlined,{}),children:"Select All & Block"})]})]}),tl=({entities:e,selectedEntities:t,selectedActions:a,actions:l,onEntitySelect:i,onActionSelect:s,entityToCategoryMap:n})=>(0,r.jsxs)("div",{className:"border rounded-lg overflow-hidden shadow-xs",children:[(0,r.jsxs)("div",{className:"bg-gray-50 px-5 py-3 border-b flex",children:[(0,r.jsx)(te,{strong:!0,className:"flex-1 text-gray-700",children:"PII Type"}),(0,r.jsx)(te,{strong:!0,className:"w-32 text-right text-gray-700",children:"Action"})]}),(0,r.jsx)("div",{className:"max-h-[400px] overflow-y-auto",children:0===e.length?(0,r.jsx)("div",{className:"py-10 text-center text-gray-500",children:"No PII types match your filter criteria"}):e.map(e=>(0,r.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,r.jsxs)("div",{className:"flex items-center flex-1",children:[(0,r.jsx)(e2.Checkbox,{checked:t.includes(e),onChange:()=>i(e),className:"mr-3"}),(0,r.jsx)(te,{className:t.includes(e)?"font-medium text-gray-900":"text-gray-700",children:e.replace(/_/g," ")}),n.get(e)&&(0,r.jsx)(f.Tag,{className:"ml-2 text-xs",color:"blue",children:n.get(e)})]}),(0,r.jsx)("div",{className:"w-32",children:(0,r.jsx)(h.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:l.map(e=>(0,r.jsx)(tt,{value:e,children:(0,r.jsxs)("div",{className:"flex items-center",children:[(e=>{switch(e){case"MASK":return(0,r.jsx)(e5.default,{style:{marginRight:4}});case"BLOCK":return(0,r.jsx)(e8.StopOutlined,{style:{marginRight:4}});default:return null}})(e),e]})},e))})})]},e))})]}),{Title:ti,Text:ts}=b.Typography,tn=({entities:e,actions:t,selectedEntities:a,selectedActions:i,onEntitySelect:s,onActionSelect:n,entityCategories:o=[]})=>{let[d,c]=(0,l.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,r.jsxs)("div",{className:"pii-configuration",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-5",children:[(0,r.jsx)("div",{className:"flex items-center",children:(0,r.jsx)(ti,{level:4,className:"m-0! font-semibold text-gray-800",children:"Configure PII Protection"})}),(0,r.jsxs)(ts,{className:"text-gray-500",children:[a.length," items selected"]})]}),(0,r.jsxs)("div",{className:"mb-6",children:[(0,r.jsx)(ta,{categories:o,selectedCategories:d,onChange:c}),(0,r.jsx)(tr,{onSelectAll:t=>{e.forEach(e=>{a.includes(e)||s(e),n(e,t)})},onUnselectAll:()=>{a.forEach(e=>{s(e)})},hasSelectedEntities:a.length>0})]}),(0,r.jsx)(tl,{entities:u,selectedEntities:a,selectedActions:i,actions:t,onEntitySelect:s,onActionSelect:n,entityToCategoryMap:m})]})};var to=e.i(304967),td=e.i(599724),tc=e.i(312361),tm=e.i(21548),tu=e.i(827252);let tp={rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""},tg=({value:e,onChange:t,disabled:a=!1})=>{let l={...tp,...e||{},rules:e?.rules?[...e.rules]:[]},i=e=>{let a={...l,...e};t?.(a)},s=(e,t)=>{i({rules:l.rules.map((a,r)=>r===e?{...a,...t}:a)})},n=(e,t)=>{let a=l.rules[e];if(!a)return;let r=Object.entries(a.allowed_param_patterns||{});t(r);let i={};r.forEach(([e,t])=>{i[e]=t}),s(e,{allowed_param_patterns:Object.keys(i).length>0?i:void 0})};return(0,r.jsxs)(to.Card,{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"text-lg font-semibold",children:"LiteLLM Tool Permission Guardrail"}),(0,r.jsx)(td.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,r.jsx)(y.Button,{icon:(0,r.jsx)(w.PlusOutlined,{}),type:"primary",onClick:()=>{i({rules:[...l.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,r.jsx)(tc.Divider,{}),0===l.rules.length?(0,r.jsx)(tm.Empty,{description:"No tool rules added yet"}):(0,r.jsx)("div",{className:"space-y-4",children:l.rules.map((e,t)=>{let o;return(0,r.jsxs)(to.Card,{className:"bg-gray-50",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,r.jsxs)(td.Text,{className:"font-semibold",children:["Rule ",t+1]}),(0,r.jsx)(y.Button,{icon:(0,r.jsx)(T.DeleteOutlined,{}),danger:!0,type:"text",disabled:a,onClick:()=>{i({rules:l.rules.filter((e,a)=>a!==t)})},children:"Remove"})]}),(0,r.jsxs)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Rule ID"}),(0,r.jsx)(g.Input,{disabled:a,placeholder:"unique_rule_id",value:e.id,onChange:e=>s(t,{id:e.target.value})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Tool Name (optional)"}),(0,r.jsx)(g.Input,{disabled:a,placeholder:"^mcp__github_.*$",value:e.tool_name??"",onChange:e=>s(t,{tool_name:""===e.target.value.trim()?void 0:e.target.value})})]})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 mt-4",children:(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Tool Type (optional)"}),(0,r.jsx)(g.Input,{disabled:a,placeholder:"^function$",value:e.tool_type??"",onChange:e=>s(t,{tool_type:""===e.target.value.trim()?void 0:e.target.value})})]})}),(0,r.jsxs)("div",{className:"mt-4 flex flex-col gap-2",children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Decision"}),(0,r.jsxs)(h.Select,{disabled:a,value:e.decision,style:{width:200},onChange:e=>s(t,{decision:e}),children:[(0,r.jsx)(h.Select.Option,{value:"allow",children:"Allow"}),(0,r.jsx)(h.Select.Option,{value:"deny",children:"Deny"})]})]}),(0,r.jsx)("div",{className:"mt-4",children:0===(o=Object.entries(e.allowed_param_patterns||{})).length?(0,r.jsx)(y.Button,{disabled:a,size:"small",onClick:()=>s(t,{allowed_param_patterns:{"":""}}),children:"+ Restrict tool arguments (optional)"}):(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)(td.Text,{className:"text-sm text-gray-600",children:"Argument constraints (dot or array paths)"}),o.map(([l,i],s)=>(0,r.jsxs)(_.Space,{align:"start",children:[(0,r.jsx)(g.Input,{disabled:a,placeholder:"messages[0].content",value:l,onChange:e=>{var a;return a=e.target.value,void n(t,e=>{if(!e[s])return;let[,t]=e[s];e[s]=[a,t]})}}),(0,r.jsx)(g.Input,{disabled:a,placeholder:"^email@.*$",value:i,onChange:e=>{var a;return a=e.target.value,void n(t,e=>{if(!e[s])return;let[t]=e[s];e[s]=[t,a]})}}),(0,r.jsx)(y.Button,{disabled:a,icon:(0,r.jsx)(T.DeleteOutlined,{}),danger:!0,onClick:()=>n(t,e=>{e.splice(s,1)})})]},`${e.id||t}-${s}`)),(0,r.jsx)(y.Button,{disabled:a,size:"small",onClick:()=>s(t,{allowed_param_patterns:{...e.allowed_param_patterns||{},"":""}}),children:"+ Add another constraint"})]})})]},e.id||t)})}),(0,r.jsx)(tc.Divider,{}),(0,r.jsxs)("div",{className:"grid gap-4 md:grid-cols-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Default action"}),(0,r.jsxs)(h.Select,{disabled:a,value:l.default_action,onChange:e=>i({default_action:e}),children:[(0,r.jsx)(h.Select.Option,{value:"allow",children:"Allow"}),(0,r.jsx)(h.Select.Option,{value:"deny",children:"Deny"})]})]}),(0,r.jsxs)("div",{children:[(0,r.jsxs)(td.Text,{className:"text-sm font-medium flex items-center gap-1",children:["On disallowed action",(0,r.jsx)(eX.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,r.jsx)(tu.InfoCircleOutlined,{})})]}),(0,r.jsxs)(h.Select,{disabled:a,value:l.on_disallowed_action,onChange:e=>i({on_disallowed_action:e}),children:[(0,r.jsx)(h.Select.Option,{value:"block",children:"Block"}),(0,r.jsx)(h.Select.Option,{value:"rewrite",children:"Rewrite"})]})]})]}),(0,r.jsxs)("div",{className:"mt-4",children:[(0,r.jsx)(td.Text,{className:"text-sm font-medium",children:"Violation message (optional)"}),(0,r.jsx)(g.Input.TextArea,{disabled:a,rows:3,placeholder:"This violates our org policy...",value:l.violation_message_template,onChange:e=>i({violation_message_template:e.target.value})})]})]})},{Option:tx}=h.Select,th={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",post_mcp_call:"After MCP Tool Call - Runs after MCP tool execution and checks the tool result"},tf=()=>({rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""}),ty=({visible:e,onClose:t,accessToken:a,onSuccess:i,preset:s})=>{let[n]=p.Form.useForm(),[o,c]=(0,l.useState)(!1),[m,u]=(0,l.useState)(null),[b,_]=(0,l.useState)(null),[A,v]=(0,l.useState)([]),[w,C]=(0,l.useState)({}),[N,k]=(0,l.useState)(0),[S,I]=(0,l.useState)(null),[O,B]=(0,l.useState)([]),[E,P]=(0,l.useState)([]),[L,R]=(0,l.useState)([]),[T,D]=(0,l.useState)(""),[z,F]=(0,l.useState)(!1),[M,K]=(0,l.useState)(null),[Q,G]=(0,l.useState)(""),[U,H]=(0,l.useState)(void 0),[J,W]=(0,l.useState)("warn"),[q,V]=(0,l.useState)(""),[Y,Z]=(0,l.useState)(!1),[$,X]=(0,l.useState)([]),[ee,et]=(0,l.useState)(tf),ea=(0,l.useMemo)(()=>!!m&&"tool_permission"===(eR[m]||"").toLowerCase(),[m]);(0,l.useEffect)(()=>{a&&(async()=>{try{let[e,t,r]=await Promise.all([(0,d.getGuardrailUISettings)(a),(0,d.getGuardrailProviderSpecificParams)(a),(0,d.modelAvailableCall)(a,"","").catch(()=>null)]);_(e),I(t),r?.data&&X(r.data.map(e=>e.id)),eP(t),eT(t)}catch(e){console.error("Error fetching guardrail data:",e),j.default.fromBackend("Failed to load guardrail configuration")}})()},[a]),(0,l.useEffect)(()=>{if(!s||!e||!b)return;u(s.provider);let t={provider:s.provider,guardrail_name:s.guardrailNameSuggestion,mode:s.mode,default_on:s.defaultOn,skip_system_message_choice:"inherit",skip_tool_message_choice:"inherit"};if("BlockCodeExecution"===s.provider&&(t.confidence_threshold=.5),n.setFieldsValue(t),s.categoryName&&b.content_filter_settings?.content_categories){let e=b.content_filter_settings.content_categories.find(e=>e.name===s.categoryName);e&&R([{id:`category-${Date.now()}`,category:e.name,display_name:e.display_name,action:e.default_action,severity_threshold:"medium"}])}},[s,e,b,n]);let el=e=>{u(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=eR[e]?.toLowerCase(),r=a&&b?.supported_modes_by_provider?b.supported_modes_by_provider[a]:void 0;if(r){var l;let e=Array.isArray(l=n.getFieldValue("mode"))?l.filter(e=>"string"==typeof e):"string"==typeof l?[l]:[],a=e.filter(e=>r.includes(e));a.length!==e.length&&(t.mode=a.length>0?a:void 0)}n.setFieldsValue(t),v([]),C({}),B([]),P([]),R([]),D(""),F(!1),K(null),et(tf()),"LlmAsAJudge"===e&&n.setFieldsValue({mode:"post_call"})},ei=e=>{v(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},es=(e,t)=>{C(a=>({...a,[e]:t}))},en=async()=>{try{if(0===N&&(await n.validateFields(["guardrail_name","provider","mode","default_on"]),m)){let e=["guardrail_name","provider","mode","default_on"];"PresidioPII"===m&&e.push("presidio_analyzer_api_base","presidio_anonymizer_api_base"),await n.validateFields(e)}if(1===N&&eD(m)&&0===A.length)return void j.default.fromBackend("Please select at least one PII entity to continue");k(N+1)}catch(e){console.error("Form validation failed:",e)}},eo=()=>{n.resetFields(),u(null),v([]),C({}),B([]),P([]),R([]),D(""),et(tf()),G(""),H(void 0),W("warn"),V(""),Z(!1),k(0)},ed=()=>{eo(),t()},ec=async()=>{try{var e,r;c(!0),await n.validateFields();let l=n.getFieldsValue(!0),s=eR[l.provider],o={guardrail_name:l.guardrail_name,litellm_params:{guardrail:s,mode:l.mode,default_on:l.default_on},guardrail_info:{}},u=(e=l.skip_system_message_choice,"yes"===e||"no"!==e&&void 0);void 0!==u&&(o.litellm_params.skip_system_message_in_guardrail=u);let p=(r=l.skip_tool_message_choice,"yes"===r||"no"!==r&&void 0);if(void 0!==p&&(o.litellm_params.skip_tool_message_in_guardrail=p),"PresidioPII"===l.provider&&A.length>0){let e={};A.forEach(t=>{e[t]=w[t]||"MASK"}),o.litellm_params.pii_entities_config=e,l.presidio_analyzer_api_base&&(o.litellm_params.presidio_analyzer_api_base=l.presidio_analyzer_api_base),l.presidio_anonymizer_api_base&&(o.litellm_params.presidio_anonymizer_api_base=l.presidio_anonymizer_api_base)}if(ez(l.provider)){let e=z&&(M?.brand_self?.length??0)>0;if(!(O.length>0||E.length>0||L.length>0)&&!e){j.default.fromBackend("Please configure at least one content filter setting (category, pattern, keyword, or competitor intent)"),c(!1);return}O.length>0&&(o.litellm_params.patterns=O.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}))),E.length>0&&(o.litellm_params.blocked_words=E.map(e=>({keyword:e.keyword,action:e.action,description:e.description}))),L.length>0&&(o.litellm_params.categories=L.map(e=>({category:e.category,enabled:!0,action:e.action,severity_threshold:e.severity_threshold||"medium"}))),e&&M&&(o.litellm_params.competitor_intent_config={competitor_intent_type:M.competitor_intent_type??"airline",brand_self:M.brand_self,locations:(M.locations?.length??0)>0?M.locations:void 0,competitors:"generic"===M.competitor_intent_type&&(M.competitors?.length??0)>0?M.competitors:void 0,policy:M.policy,threshold_high:M.threshold_high,threshold_medium:M.threshold_medium,threshold_low:M.threshold_low})}else if(l.config)try{o.guardrail_info=JSON.parse(l.config)}catch(e){j.default.fromBackend("Invalid JSON in configuration"),c(!1);return}if("llm_as_a_judge"===s){let e=l.criteria||[];if(0===e.length){j.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){j.default.fromBackend(`Criterion weights must sum to 100% (currently ${t}%)`),c(!1);return}o.litellm_params.judge_model=l.judge_model,o.litellm_params.overall_threshold=l.overall_threshold??80,o.litellm_params.on_failure=l.on_failure??"block",o.litellm_params.criteria=e.map(e=>({name:e.name,weight:Number(e.weight),description:e.description||""}))}if("tool_permission"===s){if(0===ee.rules.length){j.default.fromBackend("Add at least one tool permission rule"),c(!1);return}o.litellm_params.rules=ee.rules,o.litellm_params.default_action=ee.default_action,o.litellm_params.on_disallowed_action=ee.on_disallowed_action,ee.violation_message_template&&(o.litellm_params.violation_message_template=ee.violation_message_template)}if(ez(l.provider)&&(void 0!==U&&U>0&&(o.litellm_params.end_session_after_n_fails=U),J&&"realtime"===Q&&(o.litellm_params.on_violation=J),q.trim()&&(o.litellm_params.realtime_violation_message=q.trim())),S&&m&&"llm_as_a_judge"!==s){let e=S[eR[m]?.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=l[e];(null==t||""===t)&&(t=l.optional_params?.[e]),null!=t&&""!==t&&(o.litellm_params[e]=t)})}if(!a)throw Error("No access token available");await (0,d.createGuardrailCall)(a,o),j.default.success("Guardrail created successfully"),eo(),i(),t()}catch(e){console.error("Failed to create guardrail:",e),j.default.fromBackend("Failed to create guardrail: "+(e instanceof Error?e.message:String(e)))}finally{c(!1)}},em=e=>{if(!b||!ez(m))return null;let t=b.content_filter_settings;return t?(0,r.jsx)(er,{prebuiltPatterns:t.prebuilt_patterns||[],categories:t.pattern_categories||[],selectedPatterns:O,blockedWords:E,onPatternAdd:e=>B([...O,e]),onPatternRemove:e=>B(O.filter(t=>t.id!==e)),onPatternActionChange:(e,t)=>{B(O.map(a=>a.id===e?{...a,action:t}:a))},onBlockedWordAdd:e=>P([...E,e]),onBlockedWordRemove:e=>P(E.filter(t=>t.id!==e)),onBlockedWordUpdate:(e,t,a)=>{P(E.map(r=>r.id===e?{...r,[t]:a}:r))},contentCategories:t.content_categories||[],selectedContentCategories:L,onContentCategoryAdd:e=>R([...L,e]),onContentCategoryRemove:e=>R(L.filter(t=>t.id!==e)),onContentCategoryUpdate:(e,t,a)=>{R(L.map(r=>r.id===e?{...r,[t]:a}:r))},pendingCategorySelection:T,onPendingCategorySelectionChange:D,accessToken:a,showStep:e,competitorIntentEnabled:z,competitorIntentConfig:M,onCompetitorIntentChange:(e,t)=>{F(e),K(t)}}):null},eu=ez(m)?[{title:"Basic Info",optional:!1},{title:"Topics",optional:!1},{title:"Patterns",optional:!1},{title:"Keywords",optional:!1},{title:"Endpoint Settings (Optional)",optional:!0}]:eD(m)?[{title:"Basic Info",optional:!1},{title:"PII Configuration",optional:!1}]:[{title:"Basic Info",optional:!1},{title:"Provider Configuration",optional:!1}];return(0,r.jsx)(x.Modal,{title:null,open:e,onCancel:ed,maskClosable:!1,footer:null,width:1e3,closable:!1,className:"top-8",styles:{body:{padding:0}},children:(0,r.jsxs)("div",{className:"flex flex-col",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[(0,r.jsx)("h3",{className:"text-base font-semibold text-gray-900 m-0",children:"Create guardrail"}),(0,r.jsx)("button",{onClick:ed,className:"text-gray-400 hover:text-gray-600 bg-transparent border-none cursor-pointer text-base leading-none p-1",children:"✕"})]}),(0,r.jsx)("div",{className:"overflow-auto px-6 py-4",style:{maxHeight:"calc(80vh - 120px)"},children:(0,r.jsx)(p.Form,{form:n,layout:"vertical",initialValues:{mode:"pre_call",default_on:!1,skip_system_message_choice:"inherit",skip_tool_message_choice:"inherit"},children:eu.map((e,t)=>{let l=t{l&&k(t)},style:{minHeight:24},children:[(0,r.jsx)("span",{className:"text-sm",style:{fontWeight:i?600:500,color:i?"#1e293b":l?"#4f46e5":"#94a3b8"},children:e.title}),e.optional&&!i&&(0,r.jsx)("span",{className:"text-[11px] text-slate-400",children:"optional"}),l&&(0,r.jsx)("span",{className:"text-[11px] text-indigo-500 hover:underline",children:"Edit"})]}),i&&(0,r.jsx)("div",{className:"mt-3",children:(()=>{switch(N){case 0:let e,t;return e=!ea&&!ez(m)&&!eF(m),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(p.Form.Item,{name:"guardrail_name",label:"Guardrail Name",rules:[{required:!0,message:"Please enter a guardrail name"}],children:(0,r.jsx)(g.Input,{placeholder:"Enter a name for this guardrail"})}),(0,r.jsx)(p.Form.Item,{name:"provider",label:"Guardrail Provider",rules:[{required:!0,message:"Please select a provider"}],children:(0,r.jsx)(h.Select,{placeholder:"Select a guardrail provider",onChange:el,labelInValue:!1,optionLabelProp:"label",dropdownRender:e=>e,showSearch:!0,children:Object.entries(eL()).map(([e,t])=>{let a=(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[(0,r.jsx)(eH.Logo,{src:eK(t),label:t,className:"h-5 w-5 mr-2 object-contain shrink-0"}),(0,r.jsx)("span",{children:t})]});return(0,r.jsx)(tx,{value:e,label:a,children:a},e)})})}),(0,r.jsx)(p.Form.Item,{name:"mode",label:"Mode",tooltip:"How the guardrail should be applied",rules:[{required:!0,message:"Please select a mode"}],children:(0,r.jsx)(h.Select,{optionLabelProp:"label",mode:"multiple",children:(((t=m?eR[m]?.toLowerCase():null)&&b?.supported_modes_by_provider?b.supported_modes_by_provider[t]:void 0)??b?.supported_modes)?.map(e=>(0,r.jsx)(tx,{value:e,label:e,children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:e}),"pre_call"===e&&(0,r.jsx)(f.Tag,{color:"green",style:{marginLeft:"8px"},children:"Recommended"})]}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:th[e]})]})},e))||(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(tx,{value:"pre_call",label:"pre_call",children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"pre_call"})," ",(0,r.jsx)(f.Tag,{color:"green",children:"Recommended"})]}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:th.pre_call})]})}),(0,r.jsx)(tx,{value:"during_call",label:"during_call",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{children:(0,r.jsx)("strong",{children:"during_call"})}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:th.during_call})]})}),(0,r.jsx)(tx,{value:"post_call",label:"post_call",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{children:(0,r.jsx)("strong",{children:"post_call"})}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:th.post_call})]})}),(0,r.jsx)(tx,{value:"logging_only",label:"logging_only",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{children:(0,r.jsx)("strong",{children:"logging_only"})}),(0,r.jsx)("div",{style:{fontSize:"12px",color:"#888"},children:th.logging_only})]})})]})})}),(0,r.jsx)(p.Form.Item,{name:"default_on",label:"Always On",tooltip:"If enabled, this guardrail will be applied to all requests by default.",children:(0,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:!0,children:"Yes"}),(0,r.jsx)(h.Select.Option,{value:!1,children:"No"})]})}),(0,r.jsx)(p.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,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"inherit",children:"Use global default"}),(0,r.jsx)(h.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,r.jsx)(h.Select.Option,{value:"no",children:"No — always include in scan"})]})}),(0,r.jsx)(p.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,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"inherit",children:"Use global default"}),(0,r.jsx)(h.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,r.jsx)(h.Select.Option,{value:"no",children:"No — always include in scan"})]})}),e&&(0,r.jsx)(e$,{selectedProvider:m,accessToken:a,providerParams:S})]});case 1:if(eD(m))return b&&"PresidioPII"===m?(0,r.jsx)(tn,{entities:b.supported_entities,actions:b.supported_actions,selectedEntities:A,selectedActions:w,onEntitySelect:ei,onActionSelect:es,entityCategories:b.pii_entity_categories}):null;if(ez(m))return em("categories");if(eF(m))return(0,r.jsx)(e1,{availableModels:$,form:n});if(!m)return null;if(ea)return(0,r.jsx)(tg,{value:ee,onChange:et});if(!S)return null;let l=eR[m]?.toLowerCase(),i=S&&S[l];return i&&i.optional_params?(0,r.jsx)(eV,{optionalParams:i.optional_params,parentFieldKey:"optional_params"}):null;case 2:if(ez(m))return em("patterns");return null;case 3:if(ez(m))return em("keywords");return null;case 4:return(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsx)("div",{children:(0,r.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,r.jsx)("code",{children:"/v1/realtime"}),"."]})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Call type"}),(0,r.jsx)(h.Select,{placeholder:"Select a call type",value:Q||void 0,onChange:e=>{G(e),Z(!1)},style:{width:260},allowClear:!0,options:[{value:"realtime",label:"/v1/realtime"}]}),(0,r.jsx)("p",{className:"text-xs text-gray-400 mt-1",children:"More call types coming soon."})]}),"realtime"===Q&&(0,r.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>Z(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,r.jsx)("span",{children:"/v1/realtime settings"}),(0,r.jsx)("svg",{className:`w-4 h-4 text-gray-500 transition-transform ${Y?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),Y&&(0,r.jsxs)("div",{className:"space-y-5 px-4 py-4 border-t border-gray-200",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"End session after X violations"}),(0,r.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,r.jsx)("input",{type:"number",min:1,placeholder:"e.g. 3",value:U??"",onChange:e=>H(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,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"On violation"}),(0,r.jsx)("div",{className:"space-y-2",children:["warn","end_session"].map(e=>(0,r.jsxs)("label",{className:"flex items-start gap-2 cursor-pointer",children:[(0,r.jsx)("input",{type:"radio",name:"on_violation",value:e,checked:J===e,onChange:()=>W(e),className:"mt-0.5"}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-sm font-medium text-gray-800",children:"warn"===e?"Warn":"End session"}),(0,r.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,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Message the user hears"}),(0,r.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,r.jsx)("textarea",{rows:3,placeholder:"e.g. I'm not able to continue this conversation. Please contact us at 1-800-774-2678.",value:q,onChange:e=>V(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,r.jsxs)("div",{className:"flex items-center justify-end space-x-3 px-6 py-3 border-t border-gray-200",children:[(0,r.jsx)(y.Button,{onClick:ed,children:"Cancel"}),N>0&&(0,r.jsx)(y.Button,{onClick:()=>{k(N-1)},children:"Previous"}),Nt(e.guardrail_id,e.guardrail_name||"Unnamed Guardrail"),children:[(0,r.jsx)(tA.Trash2,{}),"Delete"]})})]})}let tO=[{id:"created_at",desc:!0}];function tB(){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)(tj.Inbox,{className:"size-5 text-muted-foreground"})}),(0,r.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No guardrails yet"}),(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Add a guardrail to start filtering requests and responses."})]})}let tE=({guardrailsList:e,isLoading:t,onDeleteClick:a,onGuardrailClick:i})=>{let[s,n]=(0,l.useState)(tO),o=(0,l.useMemo)(()=>(({onGuardrailClick:e,onDeleteClick:t})=>[{id:"guardrail_id",accessorKey:"guardrail_id",meta:{title:"Guardrail ID"},header:({column:e})=>(0,r.jsx)(tv.DataTableSortHeader,{column:e,title:"Guardrail ID"}),size:200,enableSorting:!0,cell:({row:t})=>(0,r.jsx)(tC.IdentityCell,{title:t.original.guardrail_id,titleClassName:"font-mono text-xs font-normal",onClick:()=>e(t.original.guardrail_id)})},{id:"guardrail_name",accessorKey:"guardrail_name",meta:{title:"Name"},header:({column:e})=>(0,r.jsx)(tv.DataTableSortHeader,{column:e,title:"Name"}),size:200,enableSorting:!0,cell:({row:e})=>{let t=e.original.guardrail_name;return(0,r.jsx)("span",{className:"block truncate text-sm font-medium",title:t??void 0,children:t||"-"})}},{id:"provider",meta:{title:"Provider"},header:"Provider",size:180,enableSorting:!1,cell:({row:e})=>(0,r.jsx)(tS,{provider:e.original.litellm_params.guardrail})},{id:"mode",meta:{title:"Mode"},header:"Mode",size:130,enableSorting:!1,cell:({row:e})=>(0,r.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:e.original.litellm_params.mode})},{id:"default_on",meta:{title:"Default On"},header:"Default On",size:120,enableSorting:!1,cell:({row:e})=>{let t=!!e.original.litellm_params?.default_on;return(0,r.jsx)(tN.StatusBadge,{tone:t?"success":"neutral",label:t?"Default On":"Default Off"})}},{id:"created_at",accessorKey:"created_at",meta:{title:"Created At"},header:({column:e})=>(0,r.jsx)(tv.DataTableSortHeader,{column:e,title:"Created At"}),size:150,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(tw.DateCell,{value:e.original.created_at})},{id:"updated_at",accessorKey:"updated_at",meta:{title:"Updated At"},header:({column:e})=>(0,r.jsx)(tv.DataTableSortHeader,{column:e,title:"Updated At"}),size:150,enableSorting:!0,cell:({row:e})=>(0,r.jsx)(tw.DateCell,{value:e.original.updated_at})},{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)(tI,{guardrail:e.original,onDeleteClick:t})})}])({onGuardrailClick:i,onDeleteClick:a}),[i,a]);return(0,r.jsx)(tb.DataTable,{data:e,columns:o,getRowId:(e,t)=>e.guardrail_id||String(t),sortingMode:"client",sorting:s,onSortingChange:n,isLoading:t,loadingMessage:"Loading guardrails…",noDataMessage:(0,r.jsx)(tB,{}),size:"compact"})};var tP=e.i(708347),tL=e.i(500330),tR=e.i(245094),e5=e5,tT=e.i(530212),tD=e.i(389083),tz=e.i(350967),tF=e.i(197647),tM=e.i(653824),tK=e.i(881073),tQ=e.i(404206),tG=e.i(723731),tU=e.i(629569),tH=e.i(678784),tJ=e.i(118366),tW=e.i(560445);let{Text:tq}=b.Typography,{Option:tV}=h.Select,tY=({categories:e,onActionChange:t,onSeverityChange:a,onRemove:l,readOnly:i=!1})=>{let s=[{title:"Category",dataIndex:"display_name",key:"display_name",render:(e,t)=>(0,r.jsxs)("div",{children:[(0,r.jsx)(tq,{strong:!0,children:e}),e!==t.category&&(0,r.jsx)("div",{children:(0,r.jsx)(tq,{type:"secondary",style:{fontSize:12},children:t.category})})]})},{title:"Severity Threshold",dataIndex:"severity_threshold",key:"severity_threshold",width:180,render:(e,t)=>i?(0,r.jsx)(f.Tag,{color:{high:"red",medium:"orange",low:"yellow"}[e],children:e.toUpperCase()}):(0,r.jsxs)(h.Select,{value:e,onChange:e=>a?.(t.id,e),style:{width:150},size:"small",children:[(0,r.jsx)(tV,{value:"high",children:"High"}),(0,r.jsx)(tV,{value:"medium",children:"Medium"}),(0,r.jsx)(tV,{value:"low",children:"Low"})]})},{title:"Action",dataIndex:"action",key:"action",width:150,render:(e,a)=>i?(0,r.jsx)(f.Tag,{color:"BLOCK"===e?"red":"blue",children:e}):(0,r.jsxs)(h.Select,{value:e,onChange:e=>t?.(a.id,e),style:{width:120},size:"small",children:[(0,r.jsx)(tV,{value:"BLOCK",children:"Block"}),(0,r.jsx)(tV,{value:"MASK",children:"Mask"})]})}];return(i||s.push({title:"",key:"actions",width:100,render:(e,t)=>(0,r.jsx)(y.Button,{type:"text",danger:!0,size:"small",icon:(0,r.jsx)(T.DeleteOutlined,{}),onClick:()=>l?.(t.id),children:"Delete"})}),0===e.length)?(0,r.jsx)("div",{style:{textAlign:"center",padding:"40px 0",color:"#999"},children:"No categories configured."}):(0,r.jsx)(R.Table,{dataSource:e,columns:s,rowKey:"id",pagination:!1,size:"small"})},tZ=({patterns:e,blockedWords:t,categories:a=[],readOnly:l=!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,r.jsxs)(r.Fragment,{children:[a.length>0&&(0,r.jsxs)(to.Card,{className:"mt-6",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsx)(td.Text,{className:"text-lg font-semibold",children:"Content Categories"}),(0,r.jsxs)(tD.Badge,{color:"blue",children:[a.length," categories configured"]})]}),(0,r.jsx)(tY,{categories:a,onActionChange:l?void 0:d,onSeverityChange:l?void 0:c,onRemove:l?void 0:m,readOnly:l})]}),e.length>0&&(0,r.jsxs)(to.Card,{className:"mt-6",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsx)(td.Text,{className:"text-lg font-semibold",children:"Pattern Detection"}),(0,r.jsxs)(tD.Badge,{color:"blue",children:[e.length," patterns configured"]})]}),(0,r.jsx)(F,{patterns:e,onActionChange:l?u:i||u,onRemove:l?u:s||u})]}),t.length>0&&(0,r.jsxs)(to.Card,{className:"mt-6",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsx)(td.Text,{className:"text-lg font-semibold",children:"Blocked Keywords"}),(0,r.jsxs)(tD.Badge,{color:"blue",children:[t.length," keywords configured"]})]}),(0,r.jsx)(K,{keywords:t,onActionChange:l?u:n||u,onRemove:l?u:o||u})]})]})},{Text:t$}=b.Typography,tX=({guardrailData:e,guardrailSettings:t,isEditing:a,accessToken:i,onDataChange:s,onUnsavedChanges:n})=>{let[o,d]=(0,l.useState)([]),[c,m]=(0,l.useState)([]),[u,p]=(0,l.useState)([]),[g,x]=(0,l.useState)([]),[h,f]=(0,l.useState)([]),[y,j]=(0,l.useState)([]),[b,_]=(0,l.useState)(!1),[A,v]=(0,l.useState)(null),[w,C]=(0,l.useState)(!1),[N,k]=(0,l.useState)(null);(0,l.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])):{},r=e.litellm_params.categories.map((e,t)=>{let r=a[e.category];return{id:`category-${t}`,category:e.category,display_name:r?.display_name??e.category,action:e.action||"BLOCK",severity_threshold:e.severity_threshold||"medium"}});p(r),j(r)}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};_(e),v(t),C(e),k(t)}else _(!1),v(null),C(!1),k(null)},[e,t?.content_filter_settings?.content_categories]),(0,l.useEffect)(()=>{s&&s(o,c,u,b,A)},[o,c,u,b,A,s]);let S=l.default.useMemo(()=>{let e=JSON.stringify(o)!==JSON.stringify(g),t=JSON.stringify(c)!==JSON.stringify(h),a=JSON.stringify(u)!==JSON.stringify(y),r=b!==w||JSON.stringify(A)!==JSON.stringify(N);return e||t||a||r},[o,c,u,b,A,g,h,y,w,N]);return((0,l.useEffect)(()=>{a&&n&&n(S)},[S,a,n]),e?.litellm_params?.guardrail!=="litellm_content_filter")?null:a?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(tc.Divider,{orientation:"left",children:"Content Filter Configuration"}),S&&(0,r.jsx)(tW.Alert,{type:"warning",showIcon:!0,className:"mb-4",message:(0,r.jsx)(t$,{children:'You have unsaved changes to patterns or keywords. Remember to click "Save Changes" at the bottom.'})}),(0,r.jsx)("div",{className:"mb-6",children:t&&t.content_filter_settings&&(0,r.jsx)(er,{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(r=>r.id===e?{...r,[t]:a}:r)),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(r=>r.id===e?{...r,[t]:a}:r)),competitorIntentEnabled:b,competitorIntentConfig:A,onCompetitorIntentChange:(e,t)=>{_(e),v(t)}})})]}):(0,r.jsx)(tZ,{patterns:o,blockedWords:c,categories:u,readOnly:!0})};var t0=e.i(994388),t1=e.i(779241),t2=e.i(788191),t4=e.i(245704),t5=e.i(518617);let t8={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 t6=l.forwardRef(function(e,t){return l.createElement(e7.default,(0,e6.default)({},e,{ref:t,icon:t8}))}),t3=e.i(987432);let t7={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 t9=l.forwardRef(function(e,t){return l.createElement(e7.default,(0,e6.default)({},e,{ref:t,icon:t7}))}),ae=e.i(872934);let{Panel:at}=Q.Collapse,{TextArea:aa}=g.Input,ar={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()`}},al={"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"}]},ai=[{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)"}],as=({visible:e,onClose:t,onSuccess:a,accessToken:i,editData:s})=>{let n=!!s,[o,c]=(0,l.useState)(""),[m,u]=(0,l.useState)(["pre_call"]),[p,g]=(0,l.useState)(!1),[f,y]=(0,l.useState)("empty"),[b,_]=(0,l.useState)(ar.empty.code),[A,v]=(0,l.useState)(!1),[w,C]=(0,l.useState)(!1),[N,k]=(0,l.useState)(!1),S={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"},I={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"},O={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"},[B,E]=(0,l.useState)(JSON.stringify(S,null,2)),[P,L]=(0,l.useState)(null),[R,T]=(0,l.useState)(null),D=(0,l.useRef)(null),z=e=>null==e?["pre_call"]:Array.isArray(e)?e.length?e:["pre_call"]:[e];(0,l.useEffect)(()=>{e&&(s?(c(s.guardrail_name||""),u(z(s.litellm_params?.mode)),g(s.litellm_params?.default_on||!1),_(s.litellm_params?.custom_code||ar.empty.code),y("")):(c(""),u(["pre_call"]),g(!1),y("empty"),_(ar.empty.code)),L(null),k(!1))},[e,s]);let F=async e=>{try{await navigator.clipboard.writeText(e),T(e),setTimeout(()=>T(null),2e3)}catch(e){console.error("Failed to copy:",e)}},M=async()=>{if(!o.trim())return void j.default.fromBackend("Please enter a guardrail name");if(!b.trim())return void j.default.fromBackend("Please enter custom code");if(!i)return void j.default.fromBackend("No access token available");v(!0);try{if(n&&s){let e={litellm_params:{custom_code:b}};o!==s.guardrail_name&&(e.guardrail_name=o);let t=z(s.litellm_params?.mode);(m.length!==t.length||m.some((e,a)=>e!==t[a]))&&(e.litellm_params.mode=m),p!==s.litellm_params?.default_on&&(e.litellm_params.default_on=p),await (0,d.updateGuardrailCall)(i,s.guardrail_id,e),j.default.success("Custom code guardrail updated successfully")}else await (0,d.createGuardrailCall)(i,{guardrail_name:o,litellm_params:{guardrail:"custom_code",mode:m,default_on:p,custom_code:b},guardrail_info:{}}),j.default.success("Custom code guardrail created successfully");a(),t()}catch(e){console.error("Failed to save guardrail:",e),j.default.fromBackend(`Failed to ${n?"update":"create"} guardrail: `+(e instanceof Error?e.message:String(e)))}finally{v(!1)}},K=async()=>{if(!i)return void L({error:"No access token available"});C(!0),L(null);try{let e;try{e=JSON.parse(B)}catch(e){L({error:"Invalid test input JSON"}),C(!1);return}e.texts||(e.texts=[]);let t=["pre_call","pre_mcp_call"],a=["post_call","post_mcp_call"],r=m.some(e=>t.includes(e))?"request":m.some(e=>a.includes(e))?"response":"request",l=await (0,d.testCustomCodeGuardrail)(i,{custom_code:b,test_input:e,input_type:r,request_data:{model:"test-model",metadata:{}}});l.success&&l.result?L(l.result):l.error?L({error:l.error,error_type:l.error_type}):L({error:"Unknown error occurred"})}catch(e){console.error("Failed to test custom code:",e),L({error:e instanceof Error?e.message:"Failed to test custom code"})}finally{C(!1)}},G=b.split("\n").length;return(0,r.jsxs)(x.Modal,{open:e,onCancel:t,footer:null,width:1400,className:"custom-code-modal",closable:!0,destroyOnClose:!0,children:[(0,r.jsxs)("div",{className:"flex flex-col h-[80vh]",children:[(0,r.jsxs)("div",{className:"pb-4 border-b border-gray-200",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold text-gray-900",children:n?"Edit Custom Guardrail":"Create Custom Guardrail"}),(0,r.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Define custom logic using Python-like syntax"})]}),(0,r.jsxs)("div",{className:"flex items-center gap-4 py-4 border-b border-gray-100",children:[(0,r.jsxs)("div",{className:"flex-1 max-w-[200px]",children:[(0,r.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Guardrail Name"}),(0,r.jsx)(t1.TextInput,{value:o,onValueChange:c,placeholder:"e.g., block-pii-custom"})]}),(0,r.jsxs)("div",{className:"w-[280px]",children:[(0,r.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Mode (can select multiple)"}),(0,r.jsx)(h.Select,{mode:"multiple",value:m,onChange:u,options:ai,className:"w-full",size:"middle",placeholder:"Select modes"})]}),(0,r.jsxs)("div",{className:"w-[180px]",children:[(0,r.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Template"}),(0,r.jsx)(h.Select,{value:f,onChange:e=>{y(e),_(ar[e].code)},className:"w-full",size:"middle",dropdownRender:e=>(0,r.jsxs)(r.Fragment,{children:[e,(0,r.jsx)(tc.Divider,{style:{margin:"8px 0"}}),(0,r.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,r.jsx)(t9,{}),(0,r.jsx)("span",{children:"Browse Community templates"}),(0,r.jsx)(ae.ExportOutlined,{style:{fontSize:"10px"}})]})]}),children:(0,r.jsx)(h.Select.OptGroup,{label:"STANDARD",children:Object.entries(ar).map(([e,t])=>(0,r.jsx)(h.Select.Option,{value:e,children:t.name},e))})})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 pt-5",children:[(0,r.jsx)("span",{className:"text-sm text-gray-600",children:"Default On"}),(0,r.jsx)(q.Switch,{checked:p,onChange:g})]})]}),(0,r.jsxs)("div",{className:"flex flex-1 overflow-hidden mt-4 gap-6",children:[(0,r.jsxs)("div",{className:"flex-2 flex flex-col min-w-0 overflow-y-auto",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-2 shrink-0",children:[(0,r.jsx)("span",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide",children:"Python Logic"}),(0,r.jsx)("span",{className:"text-xs text-gray-400",children:"Restricted environment (no imports)"})]}),(0,r.jsxs)("div",{className:"relative rounded-lg overflow-hidden border border-gray-700 bg-[#1e1e1e] shrink-0",style:{minHeight:"300px",maxHeight:"400px"},children:[(0,r.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(G,20)},(e,t)=>(0,r.jsx)("div",{className:"text-gray-500 h-[22.4px]",children:t+1},t+1))}),(0,r.jsx)("textarea",{ref:D,value:b,onChange:e=>_(e.target.value),onKeyDown:e=>{if("Tab"===e.key){e.preventDefault();let t=e.currentTarget,a=t.selectionStart,r=t.selectionEnd;_(b.substring(0,a)+" "+b.substring(r)),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,r.jsx)(Q.Collapse,{activeKey:N?["test"]:[],onChange:e=>k(e.includes("test")),className:"mt-3 bg-white border border-gray-200 rounded-lg shrink-0",expandIcon:({isActive:e})=>(0,r.jsx)(t6,{rotate:90*!!e}),children:(0,r.jsx)(at,{header:(0,r.jsxs)("span",{className:"flex items-center gap-2 text-sm font-medium",children:[(0,r.jsx)(t2.PlayCircleOutlined,{className:"text-blue-500"}),"Test Your Guardrail"]}),children:(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,r.jsx)("label",{className:"block text-xs font-medium text-gray-600",children:"Test Input (JSON)"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"text-xs text-gray-500",children:"Load example:"}),(0,r.jsx)("button",{type:"button",onClick:()=>E(JSON.stringify(S,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,r.jsx)("button",{type:"button",onClick:()=>E(JSON.stringify(O,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,r.jsx)("button",{type:"button",onClick:()=>E(JSON.stringify(I,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,r.jsx)("div",{className:"mb-2 p-2 bg-gray-50 rounded-sm text-xs text-gray-600 border border-gray-200",children:(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"texts"}),": Message content (always)"]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"images"}),": Base64 images (vision)"]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"tools"}),": Tool definitions ",(0,r.jsx)("span",{className:"text-orange-600",children:"(pre_call)"}),", MCP as OpenAI tool ",(0,r.jsx)("span",{className:"text-purple-600",children:"(pre_mcp_call)"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"tool_calls"}),": LLM tool calls"," ",(0,r.jsx)("span",{className:"text-green-600",children:"(post_call)"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"structured_messages"}),": Full messages"," ",(0,r.jsx)("span",{className:"text-orange-600",children:"(pre_call)"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("strong",{children:"model"}),": Model name (always)"]})]})}),(0,r.jsx)(aa,{value:B,onChange:e=>E(e.target.value),rows:8,className:"font-mono text-xs",placeholder:'{"texts": ["test message"], ...}'})]}),(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)(t0.Button,{size:"xs",onClick:K,disabled:w,icon:t2.PlayCircleOutlined,children:w?"Running...":"Run Test"}),P&&(0,r.jsx)("div",{className:`flex items-center gap-2 text-sm ${P.error?"text-red-600":"allow"===P.action?"text-green-600":"block"===P.action?"text-orange-600":"text-blue-600"}`,children:P.error?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t5.CloseCircleOutlined,{}),(0,r.jsxs)("span",{children:[P.error_type&&(0,r.jsxs)("span",{className:"font-medium",children:["[",P.error_type,"] "]}),P.error]})]}):"allow"===P.action?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t4.CheckCircleOutlined,{})," Allowed"]}):"block"===P.action?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t5.CloseCircleOutlined,{})," Blocked: ",P.reason]}):"modify"===P.action?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t4.CheckCircleOutlined,{})," Modified",P.texts&&P.texts.length>0&&(0,r.jsxs)("span",{className:"text-xs text-gray-500 ml-1",children:["→ ",P.texts[0].substring(0,50),P.texts[0].length>50?"...":""]})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t4.CheckCircleOutlined,{})," ",P.action||"Unknown"]})})]})]})},"test")}),(0,r.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,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:"bg-blue-100 rounded-full p-2",children:(0,r.jsx)(t9,{className:"text-blue-600 text-lg"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-sm font-medium text-gray-900",children:"Built a useful guardrail?"}),(0,r.jsx)("div",{className:"text-xs text-gray-600",children:"Share it with the community and help others build faster"})]})]}),(0,r.jsx)(t0.Button,{size:"xs",onClick:()=>window.open("https://github.com/BerriAI/litellm-guardrails","_blank"),icon:ae.ExportOutlined,className:"bg-blue-600 hover:bg-blue-700 text-white border-0",children:"Contribute Template"})]})]}),(0,r.jsxs)("div",{className:"w-[300px] shrink-0 overflow-auto border-l border-gray-200 pl-6",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,r.jsx)(tR.CodeOutlined,{className:"text-blue-500"}),(0,r.jsx)("span",{className:"font-semibold text-gray-700",children:"Available Primitives"})]}),(0,r.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Click to copy functions to clipboard"}),(0,r.jsx)(Q.Collapse,{defaultActiveKey:["Return Values"],className:"primitives-collapse bg-transparent border-0",expandIconPosition:"end",children:Object.entries(al).map(([e,t])=>(0,r.jsx)(at,{header:(0,r.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,r.jsx)("div",{className:"space-y-2",children:t.map(e=>(0,r.jsx)("button",{onClick:()=>F(e.name),className:`w-full text-left px-2 py-2 rounded transition-colors ${R===e.name?"bg-green-100":"bg-gray-50 hover:bg-blue-50"}`,children:R===e.name?(0,r.jsxs)("span",{className:"flex items-center gap-1 text-xs font-mono text-green-700",children:[(0,r.jsx)(t4.CheckCircleOutlined,{})," Copied!"]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"text-xs font-mono text-gray-800",children:e.name}),(0,r.jsx)("div",{className:"text-[10px] text-gray-500 mt-0.5",children:e.desc})]})},e.name))})},e))})]})]}),(0,r.jsxs)("div",{className:"flex items-center justify-between pt-4 mt-4 border-t border-gray-200",children:[(0,r.jsx)("span",{className:"text-xs text-gray-400",children:"Changes are auto-saved to local draft"}),(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)(t0.Button,{variant:"secondary",onClick:t,children:"Cancel"}),(0,r.jsx)(t0.Button,{onClick:M,loading:A,disabled:A||!o.trim(),icon:t3.SaveOutlined,children:n?"Update Guardrail":"Save Guardrail"})]})]})]}),(0,r.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; + } + `})]})},an=({guardrailId:e,onClose:t,accessToken:a,isAdmin:i})=>{let s,[n,o]=(0,l.useState)(null),[c,m]=(0,l.useState)(null),[u,x]=(0,l.useState)(!0),[f,b]=(0,l.useState)(!1),[_]=p.Form.useForm(),[A,v]=(0,l.useState)([]),[w,C]=(0,l.useState)({}),[N,k]=(0,l.useState)(null),[S,I]=(0,l.useState)({}),[O,B]=(0,l.useState)(!1),E={rules:[],default_action:"deny",on_disallowed_action:"block",violation_message_template:""},[P,L]=(0,l.useState)(E),[R,T]=(0,l.useState)(!1),[D,z]=(0,l.useState)(!1),F=l.default.useRef({patterns:[],blockedWords:[],categories:[]}),M=(0,l.useCallback)((e,t,a,r,l)=>{F.current={patterns:e,blockedWords:t,categories:a||[],competitorIntentEnabled:r,competitorIntentConfig:l}},[]),K=async()=>{try{if(x(!0),!a)return;let t=await (0,d.getGuardrailInfo)(a,e);if(o(t),t.litellm_params?.pii_entities_config){let e=t.litellm_params.pii_entities_config;if(v([]),C({}),Object.keys(e).length>0){let t=[],a={};Object.entries(e).forEach(([e,r])=>{t.push(e),a[e]="string"==typeof r?r:"MASK"}),v(t),C(a)}}else v([]),C({})}catch(e){j.default.fromBackend("Failed to load guardrail information"),console.error("Error fetching guardrail info:",e)}finally{x(!1)}},Q=async()=>{try{if(!a)return;let e=await (0,d.getGuardrailProviderSpecificParams)(a);m(e)}catch(e){console.error("Error fetching guardrail provider specific params:",e)}},G=async()=>{try{if(!a)return;let e=await (0,d.getGuardrailUISettings)(a);k(e)}catch(e){console.error("Error fetching guardrail UI settings:",e)}};(0,l.useEffect)(()=>{Q()},[a]),(0,l.useEffect)(()=>{K(),G()},[e,a]),(0,l.useEffect)(()=>{if(n&&_){let e={...n.litellm_params||{}};delete e.skip_system_message_in_guardrail,delete e.skip_tool_message_in_guardrail,_.setFieldsValue({guardrail_name:n.guardrail_name,...e,skip_system_message_choice:eG(n.litellm_params?.skip_system_message_in_guardrail),skip_tool_message_choice:eU(n.litellm_params?.skip_tool_message_in_guardrail),guardrail_info:n.guardrail_info?JSON.stringify(n.guardrail_info,null,2):"",...n.litellm_params?.optional_params&&{optional_params:n.litellm_params.optional_params}})}},[n,c,_]);let U=(0,l.useCallback)(()=>{n?.litellm_params?.guardrail==="tool_permission"?L({rules:n.litellm_params?.rules||[],default_action:(n.litellm_params?.default_action||"deny").toLowerCase(),on_disallowed_action:(n.litellm_params?.on_disallowed_action||"block").toLowerCase(),violation_message_template:n.litellm_params?.violation_message_template||""}):L(E),T(!1)},[n]);(0,l.useEffect)(()=>{U()},[U]);let H=async t=>{try{if(!a)return;let m={litellm_params:{}};t.guardrail_name!==n.guardrail_name&&(m.guardrail_name=t.guardrail_name),t.default_on!==n.litellm_params?.default_on&&(m.litellm_params.default_on=t.default_on);let u=eG(n.litellm_params?.skip_system_message_in_guardrail),p=t.skip_system_message_choice;void 0!==p&&p!==u&&("inherit"===p?m.litellm_params.skip_system_message_in_guardrail=null:"yes"===p?m.litellm_params.skip_system_message_in_guardrail=!0:m.litellm_params.skip_system_message_in_guardrail=!1);let g=eU(n.litellm_params?.skip_tool_message_in_guardrail),x=t.skip_tool_message_choice;void 0!==x&&x!==g&&("inherit"===x?m.litellm_params.skip_tool_message_in_guardrail=null:"yes"===x?m.litellm_params.skip_tool_message_in_guardrail=!0:m.litellm_params.skip_tool_message_in_guardrail=!1);let h=n.guardrail_info,f=t.guardrail_info?JSON.parse(t.guardrail_info):void 0;JSON.stringify(h)!==JSON.stringify(f)&&(m.guardrail_info=f);let y=n.litellm_params?.pii_entities_config||{},_={};if(A.forEach(e=>{_[e]=w[e]||"MASK"}),JSON.stringify(y)!==JSON.stringify(_)&&(m.litellm_params.pii_entities_config=_),n.litellm_params?.guardrail==="litellm_content_filter"&&O){var r,l,i,s,o;let e,t=(r=F.current.patterns||[],l=F.current.blockedWords||[],i=F.current.categories||[],s=F.current.competitorIntentEnabled,o=F.current.competitorIntentConfig,e={patterns:r.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:l.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&&o&&o.brand_self.length>0&&(e.competitor_intent_config={competitor_intent_type:o.competitor_intent_type,brand_self:o.brand_self,locations:o.locations?.length?o.locations:void 0,competitors:"generic"===o.competitor_intent_type&&o.competitors?.length?o.competitors:void 0,policy:o.policy,threshold_high:o.threshold_high,threshold_medium:o.threshold_medium,threshold_low:o.threshold_low}),e);m.litellm_params.patterns=t.patterns,m.litellm_params.blocked_words=t.blocked_words,m.litellm_params.categories=t.categories,m.litellm_params.competitor_intent_config=t.competitor_intent_config??null}if(n.litellm_params?.guardrail==="tool_permission"){let e=n.litellm_params?.rules||[],t=P.rules||[],a=JSON.stringify(e)!==JSON.stringify(t),r=(n.litellm_params?.default_action||"deny").toLowerCase(),l=(P.default_action||"deny").toLowerCase(),i=r!==l,s=(n.litellm_params?.on_disallowed_action||"block").toLowerCase(),o=(P.on_disallowed_action||"block").toLowerCase(),d=s!==o,c=n.litellm_params?.violation_message_template||"",u=P.violation_message_template||"",p=c!==u;(R||a||i||d||p)&&(m.litellm_params.rules=t,m.litellm_params.default_action=l,m.litellm_params.on_disallowed_action=o,m.litellm_params.violation_message_template=u||null)}let v=Object.keys(eR).find(e=>eR[e]===n.litellm_params?.guardrail),C=n.litellm_params?.guardrail==="tool_permission";if(c&&v&&!C){let e=c[eR[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 r=n.litellm_params?.[e];JSON.stringify(a)!==JSON.stringify(r)&&(null!=a&&""!==a?m.litellm_params[e]=a:null!=r&&""!==r&&(m.litellm_params[e]=null))})}if(0===Object.keys(m.litellm_params).length&&delete m.litellm_params,0===Object.keys(m).length){j.default.info("No changes detected"),b(!1);return}await (0,d.updateGuardrailCall)(a,e,m),j.default.success("Guardrail updated successfully"),B(!1),K(),b(!1)}catch(e){console.error("Error updating guardrail:",e),j.default.fromBackend("Failed to update guardrail")}};if(u)return(0,r.jsx)("div",{className:"p-4",children:"Loading..."});if(!n)return(0,r.jsx)("div",{className:"p-4",children:"Guardrail not found"});let J=e=>e?new Date(e).toLocaleString():"-",{logo:W,displayName:q}=eQ(n.litellm_params?.guardrail||""),V=async(e,t)=>{await (0,tL.copyToClipboard)(e)&&(I(e=>({...e,[t]:!0})),setTimeout(()=>{I(e=>({...e,[t]:!1}))},2e3))},Y="config"===n.guardrail_definition_location;return(0,r.jsxs)("div",{className:"p-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(y.Button,{type:"text",icon:(0,r.jsx)(tT.ArrowLeftIcon,{className:"w-4 h-4"}),onClick:t,className:"mb-4",children:"Back to Guardrails"}),(0,r.jsx)(tU.Title,{children:n.guardrail_name||"Unnamed Guardrail"}),(0,r.jsxs)("div",{className:"flex items-center cursor-pointer",children:[(0,r.jsx)(td.Text,{className:"text-gray-500 font-mono",children:n.guardrail_id}),(0,r.jsx)(y.Button,{type:"text",size:"small",icon:S["guardrail-id"]?(0,r.jsx)(tH.CheckIcon,{size:12}):(0,r.jsx)(tJ.CopyIcon,{size:12}),onClick:()=>V(n.guardrail_id,"guardrail-id"),className:`left-2 z-10 transition-all duration-200 ${S["guardrail-id"]?"text-green-600 bg-green-50 border-green-200":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"}`})]})]}),(0,r.jsxs)(tM.TabGroup,{children:[(0,r.jsxs)(tK.TabList,{className:"mb-4",children:[(0,r.jsx)(tF.Tab,{children:"Overview"},"overview"),i?(0,r.jsx)(tF.Tab,{children:"Settings"},"settings"):(0,r.jsx)(r.Fragment,{})]}),(0,r.jsxs)(tG.TabPanels,{children:[(0,r.jsxs)(tQ.TabPanel,{children:[(0,r.jsxs)(tz.Grid,{numItems:1,numItemsSm:2,numItemsLg:3,className:"gap-6",children:[(0,r.jsxs)(to.Card,{children:[(0,r.jsx)(td.Text,{children:"Provider"}),(0,r.jsxs)("div",{className:"mt-2 flex items-center space-x-2",children:[(0,r.jsx)(eH.Logo,{src:W,label:q,className:"w-6 h-6"}),(0,r.jsx)(tU.Title,{children:q})]})]}),(0,r.jsxs)(to.Card,{children:[(0,r.jsx)(td.Text,{children:"Mode"}),(0,r.jsxs)("div",{className:"mt-2",children:[(0,r.jsx)(tU.Title,{children:n.litellm_params?.mode||"-"}),(0,r.jsx)(tD.Badge,{color:n.litellm_params?.default_on?"green":"gray",children:n.litellm_params?.default_on?"Default On":"Default Off"})]})]}),(0,r.jsxs)(to.Card,{children:[(0,r.jsx)(td.Text,{children:"Created At"}),(0,r.jsxs)("div",{className:"mt-2",children:[(0,r.jsx)(tU.Title,{children:J(n.created_at)}),(0,r.jsxs)(td.Text,{children:["Last Updated: ",J(n.updated_at)]})]})]})]}),n.litellm_params?.pii_entities_config&&Object.keys(n.litellm_params.pii_entities_config).length>0&&(0,r.jsx)(to.Card,{className:"mt-6",children:(0,r.jsxs)("div",{className:"flex justify-between items-center",children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"PII Protection"}),(0,r.jsxs)(tD.Badge,{color:"blue",children:[Object.keys(n.litellm_params.pii_entities_config).length," PII entities configured"]})]})}),n.litellm_params?.pii_entities_config&&Object.keys(n.litellm_params.pii_entities_config).length>0&&(0,r.jsxs)(to.Card,{className:"mt-6",children:[(0,r.jsx)(td.Text,{className:"mb-4 text-lg font-semibold",children:"PII Entity Configuration"}),(0,r.jsxs)("div",{className:"border rounded-lg overflow-hidden shadow-xs",children:[(0,r.jsxs)("div",{className:"bg-gray-50 px-5 py-3 border-b flex",children:[(0,r.jsx)(td.Text,{className:"flex-1 font-semibold text-gray-700",children:"Entity Type"}),(0,r.jsx)(td.Text,{className:"flex-1 font-semibold text-gray-700",children:"Configuration"})]}),(0,r.jsx)("div",{className:"max-h-[400px] overflow-y-auto",children:Object.entries(n.litellm_params?.pii_entities_config).map(([e,t])=>(0,r.jsxs)("div",{className:"px-5 py-3 flex border-b hover:bg-gray-50 transition-colors",children:[(0,r.jsx)(td.Text,{className:"flex-1 font-medium text-gray-900",children:e}),(0,r.jsx)(td.Text,{className:"flex-1",children:(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 ${"MASK"===t?"text-blue-600":"text-red-600"}`,children:["MASK"===t?(0,r.jsx)(e5.default,{}):(0,r.jsx)(e8.StopOutlined,{}),String(t)]})})]},e))})]})]}),n.litellm_params?.guardrail==="tool_permission"&&(0,r.jsx)(to.Card,{className:"mt-6",children:(0,r.jsx)(tg,{value:P,disabled:!0})}),n.litellm_params?.guardrail==="custom_code"&&n.litellm_params?.custom_code&&(0,r.jsxs)(to.Card,{className:"mt-6",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(tR.CodeOutlined,{className:"text-blue-500"}),(0,r.jsx)(td.Text,{className:"font-medium text-lg",children:"Custom Code"})]}),i&&!Y&&(0,r.jsx)(y.Button,{size:"small",icon:(0,r.jsx)(tR.CodeOutlined,{}),onClick:()=>z(!0),children:"Edit Code"})]}),(0,r.jsx)("div",{className:"relative rounded-lg overflow-hidden border border-gray-700 bg-[#1e1e1e]",children:(0,r.jsx)("pre",{className:"p-4 text-sm text-gray-200 overflow-x-auto",style:{fontFamily:"'Fira Code', 'Monaco', 'Consolas', monospace"},children:(0,r.jsx)("code",{children:n.litellm_params.custom_code})})})]}),(0,r.jsx)(tX,{guardrailData:n,guardrailSettings:N,isEditing:!1,accessToken:a})]}),i&&(0,r.jsx)(tQ.TabPanel,{children:(0,r.jsxs)(to.Card,{children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,r.jsx)(tU.Title,{children:"Guardrail Settings"}),Y&&(0,r.jsx)(eX.Tooltip,{title:"Guardrail is defined in the config file and cannot be edited.",children:(0,r.jsx)(tu.InfoCircleOutlined,{})}),!f&&!Y&&(n.litellm_params?.guardrail==="custom_code"?(0,r.jsx)(y.Button,{icon:(0,r.jsx)(tR.CodeOutlined,{}),onClick:()=>z(!0),children:"Edit Code"}):(0,r.jsx)(y.Button,{onClick:()=>b(!0),children:"Edit Settings"}))]}),f?(0,r.jsxs)(p.Form,{form:_,onFinish:H,initialValues:{guardrail_name:n.guardrail_name,...(s={...n.litellm_params||{}},delete s.skip_system_message_in_guardrail,delete s.skip_tool_message_in_guardrail,s),skip_system_message_choice:eG(n.litellm_params?.skip_system_message_in_guardrail),skip_tool_message_choice:eU(n.litellm_params?.skip_tool_message_in_guardrail),guardrail_info:n.guardrail_info?JSON.stringify(n.guardrail_info,null,2):"",...n.litellm_params?.optional_params&&{optional_params:n.litellm_params.optional_params}},layout:"vertical",children:[(0,r.jsx)(p.Form.Item,{label:"Guardrail Name",name:"guardrail_name",rules:[{required:!0,message:"Please input a guardrail name"}],children:(0,r.jsx)(g.Input,{placeholder:"Enter guardrail name"})}),(0,r.jsx)(p.Form.Item,{label:"Default On",name:"default_on",children:(0,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:!0,children:"Yes"}),(0,r.jsx)(h.Select.Option,{value:!1,children:"No"})]})}),(0,r.jsx)(p.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,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"inherit",children:"Use global default"}),(0,r.jsx)(h.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,r.jsx)(h.Select.Option,{value:"no",children:"No — always include in scan"})]})}),(0,r.jsx)(p.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,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"inherit",children:"Use global default"}),(0,r.jsx)(h.Select.Option,{value:"yes",children:"Yes — exclude from guardrail scan"}),(0,r.jsx)(h.Select.Option,{value:"no",children:"No — always include in scan"})]})}),n.litellm_params?.guardrail==="presidio"&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(tc.Divider,{orientation:"left",children:"PII Protection"}),(0,r.jsx)("div",{className:"mb-6",children:N&&(0,r.jsx)(tn,{entities:N.supported_entities,actions:N.supported_actions,selectedEntities:A,selectedActions:w,onEntitySelect:e=>{v(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},onActionSelect:(e,t)=>{C(a=>({...a,[e]:t}))},entityCategories:N.pii_entity_categories})})]}),(0,r.jsx)(tX,{guardrailData:n,guardrailSettings:N,isEditing:!0,accessToken:a,onDataChange:M,onUnsavedChanges:B}),(n.litellm_params?.guardrail==="tool_permission"||c)&&(0,r.jsx)(tc.Divider,{orientation:"left",children:"Provider Settings"}),n.litellm_params?.guardrail==="tool_permission"?(0,r.jsx)(tg,{value:P,onChange:L}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e$,{selectedProvider:Object.keys(eR).find(e=>eR[e]===n.litellm_params?.guardrail)||null,accessToken:a,providerParams:c,value:n.litellm_params}),c&&(()=>{let e=Object.keys(eR).find(e=>eR[e]===n.litellm_params?.guardrail);if(!e)return null;let t=c[eR[e]?.toLowerCase()];return t&&t.optional_params?(0,r.jsx)(eV,{optionalParams:t.optional_params,parentFieldKey:"optional_params",values:n.litellm_params}):null})()]}),(0,r.jsx)(tc.Divider,{orientation:"left",children:"Advanced Settings"}),(0,r.jsx)(p.Form.Item,{label:"Guardrail Information",name:"guardrail_info",children:(0,r.jsx)(g.Input.TextArea,{rows:5})}),(0,r.jsxs)("div",{className:"flex justify-end gap-2 mt-6",children:[(0,r.jsx)(y.Button,{onClick:()=>{b(!1),B(!1),U()},children:"Cancel"}),(0,r.jsx)(y.Button,{type:"primary",htmlType:"submit",children:"Save Changes"})]})]}):(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Guardrail ID"}),(0,r.jsx)("div",{className:"font-mono",children:n.guardrail_id})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Guardrail Name"}),(0,r.jsx)("div",{children:n.guardrail_name||"Unnamed Guardrail"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Provider"}),(0,r.jsx)("div",{children:q})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Mode"}),(0,r.jsx)("div",{children:n.litellm_params?.mode||"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Default On"}),(0,r.jsx)(tD.Badge,{color:n.litellm_params?.default_on?"green":"gray",children:n.litellm_params?.default_on?"Yes":"No"})]}),n.litellm_params?.pii_entities_config&&Object.keys(n.litellm_params.pii_entities_config).length>0&&(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"PII Protection"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsxs)(tD.Badge,{color:"blue",children:[Object.keys(n.litellm_params.pii_entities_config).length," PII entities configured"]})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Created At"}),(0,r.jsx)("div",{children:J(n.created_at)})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)(td.Text,{className:"font-medium",children:"Last Updated"}),(0,r.jsx)("div",{children:J(n.updated_at)})]}),n.litellm_params?.guardrail==="tool_permission"&&(0,r.jsx)(tg,{value:P,disabled:!0})]})]})})]})]}),(0,r.jsx)(as,{visible:D,onClose:()=>z(!1),onSuccess:()=>{z(!1),K()},accessToken:a,editData:n?{guardrail_id:n.guardrail_id,guardrail_name:n.guardrail_name,litellm_params:n.litellm_params}:null})]})};var ao=e.i(573421),ad=e.i(19732),ac=e.i(928685),am=e.i(166406),au=e.i(637235),ap=e.i(755151),ag=e.i(240647);let ax=function({results:e,errors:t}){let[a,i]=(0,l.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,r.jsxs)("div",{className:"space-y-3 pt-4 border-t border-gray-200",children:[(0,r.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Results"}),e&&e.map(e=>{let t=a.has(e.guardrailName);return(0,r.jsx)(to.Card,{className:"bg-green-50 border-green-200",children:(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex items-center space-x-2 cursor-pointer flex-1",onClick:()=>s(e.guardrailName),children:[t?(0,r.jsx)(ag.RightOutlined,{className:"text-gray-500 text-xs"}):(0,r.jsx)(ap.DownOutlined,{className:"text-gray-500 text-xs"}),(0,r.jsx)(t4.CheckCircleOutlined,{className:"text-green-600 text-lg"}),(0,r.jsx)("span",{className:"text-sm font-medium text-green-800",children:e.guardrailName})]}),(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center space-x-1 text-xs text-gray-600",children:[(0,r.jsx)(au.ClockCircleOutlined,{}),(0,r.jsxs)("span",{className:"font-medium",children:[e.latency,"ms"]})]}),!t&&(0,r.jsx)(t0.Button,{size:"xs",variant:"secondary",icon:am.CopyOutlined,onClick:async()=>{await n(e.response_text)?j.default.success("Result copied to clipboard"):j.default.fromBackend("Failed to copy result")},children:"Copy"})]})]}),!t&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"bg-white border border-green-200 rounded-sm p-3",children:[(0,r.jsx)("label",{className:"text-xs font-medium text-gray-600 mb-2 block",children:"Output Text"}),(0,r.jsx)("div",{className:"font-mono text-sm text-gray-900 whitespace-pre-wrap wrap-break-word",children:e.response_text})]}),(0,r.jsxs)("div",{className:"text-xs text-gray-600",children:[(0,r.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,r.jsx)(to.Card,{className:"bg-red-50 border-red-200",children:(0,r.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,r.jsx)("div",{className:"cursor-pointer mt-0.5",onClick:()=>s(e.guardrailName),children:t?(0,r.jsx)(ag.RightOutlined,{className:"text-gray-500 text-xs"}):(0,r.jsx)(ap.DownOutlined,{className:"text-gray-500 text-xs"})}),(0,r.jsx)("div",{className:"text-red-600 mt-0.5",children:(0,r.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 20 20",children:(0,r.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,r.jsxs)("div",{className:"flex-1",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,r.jsxs)("p",{className:"text-sm font-medium text-red-800 cursor-pointer",onClick:()=>s(e.guardrailName),children:[e.guardrailName," - Error"]}),(0,r.jsxs)("div",{className:"flex items-center space-x-1 text-xs text-gray-600",children:[(0,r.jsx)(au.ClockCircleOutlined,{}),(0,r.jsxs)("span",{className:"font-medium",children:[e.latency,"ms"]})]})]}),!t&&(0,r.jsx)("p",{className:"text-sm text-red-700 mt-1",children:e.error.message})]})]})},e.guardrailName)})]}):null},{TextArea:ah}=g.Input,{Text:af}=b.Typography,ay=function({guardrailNames:e,onSubmit:t,isLoading:a,results:i,errors:s,onClose:n}){let[o,d]=(0,l.useState)(""),[c,m]=(0,l.useState)(""),[u,p]=(0,l.useState)(null),g=e=>{if(!e.trim())return{metadata:null,error:null};try{let t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.isArray(t))return{metadata:null,error:"Metadata must be a JSON object"};return{metadata:t,error:null}}catch{return{metadata:null,error:"Invalid JSON"}}},x=()=>{if(!o.trim())return void j.default.fromBackend("Please enter text to test");let{metadata:e,error:a}=g(c);if(a){p(a),j.default.fromBackend(`Metadata: ${a}`);return}p(null),t(o,e)},h=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}},f=async()=>{await h(o)?j.default.success("Input copied to clipboard"):j.default.fromBackend("Failed to copy input")};return(0,r.jsxs)("div",{className:"space-y-4 h-full flex flex-col",children:[(0,r.jsx)("div",{className:"flex items-center justify-between pb-3 border-b border-gray-200",children:(0,r.jsx)("div",{className:"flex items-center space-x-3",children:(0,r.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center space-x-2 mb-1",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold text-gray-900",children:"Test Guardrails:"}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:e.map(e=>(0,r.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,r.jsx)("span",{className:"font-mono text-blue-700 font-medium text-sm",children:e})},e))})]}),(0,r.jsxs)("p",{className:"text-sm text-gray-500",children:["Test ",e.length>1?"guardrails":"guardrail"," and compare results"]})]})})}),(0,r.jsxs)("div",{className:"flex-1 overflow-auto space-y-4",children:[(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex justify-between items-center mb-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Input Text"}),(0,r.jsx)(eX.Tooltip,{title:"Press Enter to submit. Use Shift+Enter for new line.",children:(0,r.jsx)(tu.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),o&&(0,r.jsx)(t0.Button,{size:"xs",variant:"secondary",icon:am.CopyOutlined,onClick:f,children:"Copy Input"})]}),(0,r.jsx)(ah,{value:o,onChange:e=>d(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.ctrlKey||e.metaKey||(e.preventDefault(),x())},placeholder:"Enter text to test with guardrails...",rows:8,className:"font-mono text-sm"}),(0,r.jsxs)("div",{className:"flex justify-between items-center mt-1",children:[(0,r.jsxs)(af,{className:"text-xs text-gray-500",children:["Press ",(0,r.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 border border-gray-300 rounded-sm text-xs",children:"Enter"})," to submit •"," ",(0,r.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,r.jsxs)(af,{className:"text-xs text-gray-500",children:["Characters: ",o.length]})]})]}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Metadata (optional)"}),(0,r.jsx)(eX.Tooltip,{title:"JSON object forwarded to the guardrail as request_data['metadata']. Custom guardrails can read per-request configuration from it.",children:(0,r.jsx)(tu.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,r.jsx)(ah,{value:c,onChange:e=>{m(e.target.value),u&&p(g(e.target.value).error)},placeholder:'{"forbidden_topics": ["tax", "finance"]}',rows:3,className:"font-mono text-sm",status:u?"error":void 0}),u&&(0,r.jsx)(af,{type:"danger",className:"text-xs",children:u})]}),(0,r.jsx)("div",{className:"pt-2",children:(0,r.jsx)(t0.Button,{onClick:x,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,r.jsx)(ax,{results:i,errors:s})]})]})},aj=({guardrailsList:e,isLoading:t,accessToken:a,onClose:i})=>{let[s,n]=(0,l.useState)(new Set),[o,c]=(0,l.useState)(""),[m,u]=(0,l.useState)([]),[p,x]=(0,l.useState)([]),[h,f]=(0,l.useState)(!1),y=e.filter(e=>e.guardrail_name?.toLowerCase().includes(o.toLowerCase())),_=async(e,t)=>{if(0===s.size||!a)return;f(!0),u([]),x([]);let r=[],l=[];await Promise.all(Array.from(s).map(async i=>{let s=Date.now();try{let l=await (0,d.applyGuardrail)(a,i,e,null,null,t),n=Date.now()-s;r.push({guardrailName:i,response_text:l.response_text,latency:n})}catch(t){let e=Date.now()-s;console.error(`Error testing guardrail ${i}:`,t),l.push({guardrailName:i,error:t,latency:e})}})),u(r),x(l),f(!1),r.length>0&&j.default.success(`${r.length} guardrail${r.length>1?"s":""} applied successfully`),l.length>0&&j.default.fromBackend(`${l.length} guardrail${l.length>1?"s":""} failed`)};return(0,r.jsx)("div",{className:"w-full h-[calc(100vh-200px)]",children:(0,r.jsx)(v.Card,{className:"h-full",styles:{body:{padding:0,height:"100%"}},children:(0,r.jsxs)("div",{className:"flex h-full",children:[(0,r.jsxs)("div",{className:"w-1/4 border-r border-gray-200 flex flex-col overflow-hidden",children:[(0,r.jsx)("div",{className:"p-4 border-b border-gray-200",children:(0,r.jsxs)("div",{className:"mb-3",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold mb-3",children:"Guardrails"}),(0,r.jsx)(g.Input,{prefix:(0,r.jsx)(ac.SearchOutlined,{}),placeholder:"Search guardrails...",value:o,onChange:e=>c(e.target.value)})]})}),(0,r.jsx)("div",{className:"flex-1 overflow-auto",children:t?(0,r.jsx)("div",{className:"flex items-center justify-center h-32",children:(0,r.jsx)(eY.Spin,{})}):0===y.length?(0,r.jsx)("div",{className:"p-4",children:(0,r.jsx)(tm.Empty,{description:o?"No guardrails match your search":"No guardrails available"})}):(0,r.jsx)(ao.List,{dataSource:y,renderItem:e=>(0,r.jsx)(ao.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,r.jsx)(ao.List.Item.Meta,{title:(0,r.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,r.jsx)(ad.ExperimentOutlined,{className:"text-gray-400"}),(0,r.jsx)("span",{className:"font-medium text-gray-900",children:e.guardrail_name})]}),description:(0,r.jsxs)("div",{className:"text-xs space-y-1 mt-1",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"font-medium",children:"Type: "}),(0,r.jsx)("span",{className:"text-gray-600",children:e.litellm_params.guardrail})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"font-medium",children:"Mode: "}),(0,r.jsx)("span",{className:"text-gray-600",children:e.litellm_params.mode})]})]})})})})}),(0,r.jsx)("div",{className:"p-3 border-t border-gray-200 bg-gray-50",children:(0,r.jsxs)(b.Typography.Text,{className:"text-xs text-gray-600",children:[s.size," of ",y.length," selected"]})})]}),(0,r.jsxs)("div",{className:"w-3/4 flex flex-col bg-white",children:[(0,r.jsx)("div",{className:"p-4 border-b border-gray-200 flex justify-between items-center",children:(0,r.jsx)(b.Typography.Title,{level:2,className:"text-xl font-semibold mb-0",children:"Guardrail Testing Playground"})}),(0,r.jsx)("div",{className:"flex-1 overflow-auto p-4",children:0===s.size?(0,r.jsxs)("div",{className:"h-full flex flex-col items-center justify-center text-gray-400",children:[(0,r.jsx)(ad.ExperimentOutlined,{style:{fontSize:"48px",marginBottom:"16px"}}),(0,r.jsx)(b.Typography.Paragraph,{className:"text-lg font-medium text-gray-600 mb-2",children:"Select Guardrails to Test"}),(0,r.jsx)(b.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,r.jsx)("div",{className:"h-full",children:(0,r.jsx)(ay,{guardrailNames:Array.from(s),onSubmit:_,results:m.length>0?m:null,errors:p.length>0?p:null,isLoading:h,onClose:()=>n(new Set)})})})]})]})})})};var ab=e.i(127952),a_=e.i(266537);let aA=eM["LiteLLM Content Filter"],av=[{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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:aA,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:eM["Presidio PII"],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:eM["Bedrock Guardrail"],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:eM.Lakera,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:eM["OpenAI Moderation"],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:eM["Google Cloud Model Armor"],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:eM["Guardrails AI"],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:eM["Zscaler AI Guard"],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:eM["PANW Prisma AIRS"],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:eM["Cisco AI Defense"],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:eM["Noma Security"],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:eM["Aporia AI"],tags:["Hallucination","Policy"]},{id:"aim",name:"AIM Guardrail",description:"AIM Security guardrails for comprehensive AI threat detection and mitigation.",category:"partner",logo:eM["AIM Guardrail"],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:eM["Cato Networks Guardrail"],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:eM["Prompt Security"],tags:["Prompt Injection","Security"]},{id:"lasso",name:"Lasso Guardrail",description:"Content moderation and safety guardrails for responsible AI deployments.",category:"partner",logo:eM["Lasso Guardrail"],tags:["Content Moderation"]},{id:"pangea",name:"Pangea Guardrail",description:"Pangea's AI guardrails for secure, compliant, and trustworthy AI applications.",category:"partner",logo:eM["Pangea Guardrail"],tags:["Compliance","Security"]},{id:"enkryptai",name:"EnkryptAI",description:"AI security and governance platform for enterprise AI safety and compliance.",category:"partner",logo:eM.EnkryptAI,tags:["Enterprise","Governance"]},{id:"javelin",name:"Javelin Guardrails",description:"AI gateway with built-in guardrails for secure and compliant AI operations.",category:"partner",logo:eM["Javelin Guardrails"],tags:["Gateway","Security"]},{id:"pillar",name:"Pillar Guardrail",description:"AI safety platform for monitoring, testing, and securing AI systems.",category:"partner",logo:eM["Pillar Guardrail"],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:eM.Akto,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:eM.PromptGuard,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:eM.XecGuard,tags:["Security","Policy","Grounding","RAG"],providerKey:"Xecguard"},{id:"deepkeep",name:"DeepKeep AI Firewall",description:"DeepKeep AI Firewall for comprehensive LLM security — prompt injection detection, PII protection, content moderation, and policy enforcement with configurable guardrail pipelines.",category:"partner",logo:eM["DeepKeep AI Firewall"],tags:["Security","Prompt Injection","PII","Firewall"],providerKey:"Deepkeep"},{id:"repelloai",name:"RepelloAI Argus",description:"RepelloAI Argus scans prompts and responses against policies configured per asset in the Repello dashboard.",category:"partner",logo:eM["RepelloAI Argus"],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:eM.Straiker,tags:["Agentic","Prompt Injection","Tool Misuse","MCP","Skills"],providerKey:"Straiker"}];var aw=e.i(826910);let aC=({card:e,onClick:t})=>{let[a,i]=(0,l.useState)(!1);return(0,r.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,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:10},children:[(0,r.jsx)(eH.Logo,{src:e.logo,label:e.name,className:"w-7 h-7 rounded-md object-contain shrink-0"}),(0,r.jsx)("span",{style:{fontSize:14,fontWeight:600,color:"#111827",lineHeight:1.3},children:e.name})]}),(0,r.jsx)("p",{className:"line-clamp-3",style:{fontSize:12,color:"#6b7280",lineHeight:1.6,margin:0,flex:1},children:e.description}),e.eval&&(0,r.jsxs)("div",{style:{marginTop:10,display:"flex",alignItems:"center",gap:4},children:[(0,r.jsx)(aw.CheckCircleFilled,{style:{color:"#16a34a",fontSize:12}}),(0,r.jsxs)("span",{style:{fontSize:11,color:"#16a34a",fontWeight:500},children:["F1: ",e.eval.f1,"% · ",e.eval.testCases," test cases"]})]})]})};var aN=e.i(447566);let ak={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},deepkeep:{provider:"Deepkeep",guardrailNameSuggestion:"DeepKeep AI Firewall",mode:"pre_call",defaultOn:!1},repelloai:{provider:"Repelloai",guardrailNameSuggestion:"RepelloAI Argus",mode:"pre_call",defaultOn:!1},straiker:{provider:"Straiker",guardrailNameSuggestion:"Straiker Guardrail",mode:"pre_call",defaultOn:!1}},aS=({card:e,onBack:t,accessToken:a,onGuardrailCreated:i})=>{let[s,n]=(0,l.useState)(!1),[o,d]=(0,l.useState)("overview"),c=[{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"}]:[]],m=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}]:[],u=[{key:"overview",label:"Overview"},...e.eval?[{key:"eval",label:"Eval Results"}]:[]];return(0,r.jsxs)("div",{style:{maxWidth:960,margin:"0 auto"},children:[(0,r.jsxs)("div",{onClick:t,style:{display:"inline-flex",alignItems:"center",gap:6,color:"#5f6368",cursor:"pointer",fontSize:14,marginBottom:24},children:[(0,r.jsx)(aN.ArrowLeftOutlined,{style:{fontSize:11}}),(0,r.jsx)("span",{children:e.name})]}),(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16,marginBottom:8},children:[(0,r.jsx)(eH.Logo,{src:e.logo,label:e.name,className:"w-10 h-10 rounded-lg object-contain shrink-0"}),(0,r.jsx)("h1",{style:{fontSize:28,fontWeight:400,color:"#202124",margin:0,lineHeight:1.2},children:e.name})]}),(0,r.jsx)("p",{style:{fontSize:14,color:"#5f6368",margin:"0 0 20px 0",lineHeight:1.6},children:e.description}),(0,r.jsx)("div",{style:{display:"flex",gap:10,marginBottom:32},children:(0,r.jsx)(y.Button,{onClick:()=>n(!0),style:{borderRadius:20,padding:"4px 20px",height:36,borderColor:"#dadce0",color:"#1a73e8",fontWeight:500,fontSize:14},children:"Create Guardrail"})}),(0,r.jsx)("div",{style:{borderBottom:"1px solid #dadce0",marginBottom:28},children:(0,r.jsx)("div",{style:{display:"flex",gap:0},children:u.map(e=>(0,r.jsx)("div",{onClick:()=>d(e.key),style:{padding:"12px 20px",fontSize:14,color:o===e.key?"#1a73e8":"#5f6368",borderBottom:o===e.key?"3px solid #1a73e8":"3px solid transparent",cursor:"pointer",fontWeight:o===e.key?500:400,marginBottom:-1},children:e.label},e.key))})}),"overview"===o&&(0,r.jsxs)("div",{style:{display:"flex",gap:64},children:[(0,r.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,r.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 12px 0"},children:"Overview"}),(0,r.jsx)("p",{style:{fontSize:14,color:"#3c4043",lineHeight:1.7,margin:"0 0 32px 0"},children:e.description}),(0,r.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 4px 0"},children:"Guardrail Details"}),(0,r.jsx)("p",{style:{fontSize:13,color:"#5f6368",margin:"0 0 16px 0"},children:"Details are as follows"}),(0,r.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:14},children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{style:{borderBottom:"1px solid #dadce0"},children:[(0,r.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500,width:200},children:"Property"}),(0,r.jsx)("th",{style:{textAlign:"left",padding:"12px 0",color:"#5f6368",fontWeight:500},children:e.name})]})}),(0,r.jsx)("tbody",{children:c.map((e,t)=>(0,r.jsxs)("tr",{style:{borderBottom:"1px solid #f1f3f4"},children:[(0,r.jsx)("td",{style:{padding:"12px 0",color:"#3c4043"},children:e.property}),(0,r.jsx)("td",{style:{padding:"12px 0",color:"#202124"},children:e.value})]},t))})]})]}),(0,r.jsxs)("div",{style:{width:240,flexShrink:0},children:[(0,r.jsxs)("div",{style:{marginBottom:28},children:[(0,r.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Guardrail ID"}),(0,r.jsxs)("div",{style:{fontSize:13,color:"#202124",wordBreak:"break-all"},children:["litellm/",e.id]})]}),(0,r.jsxs)("div",{style:{marginBottom:28},children:[(0,r.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:4},children:"Type"}),(0,r.jsx)("div",{style:{fontSize:13,color:"#202124"},children:"litellm"===e.category?"Content Filter":"Partner"})]}),e.tags.length>0&&(0,r.jsxs)("div",{style:{marginBottom:28},children:[(0,r.jsx)("div",{style:{fontSize:12,color:"#5f6368",marginBottom:8},children:"Tags"}),(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:e.tags.map(e=>(0,r.jsx)("span",{style:{fontSize:12,padding:"4px 12px",borderRadius:16,border:"1px solid #dadce0",color:"#3c4043",backgroundColor:"#fff"},children:e},e))})]})]})]}),"eval"===o&&(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{style:{fontSize:18,fontWeight:400,color:"#202124",margin:"0 0 16px 0"},children:"Eval Results"}),(0,r.jsxs)("table",{style:{width:"100%",maxWidth:560,borderCollapse:"collapse",fontSize:14},children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{style:{backgroundColor:"#f8f9fa",borderBottom:"1px solid #dadce0"},children:[(0,r.jsx)("th",{style:{textAlign:"left",padding:"12px 16px",color:"#5f6368",fontWeight:500},children:"Metric"}),(0,r.jsx)("th",{style:{textAlign:"left",padding:"12px 16px",color:"#5f6368",fontWeight:500},children:"Value"})]})}),(0,r.jsx)("tbody",{children:m.map((e,t)=>(0,r.jsxs)("tr",{style:{borderBottom:"1px solid #f1f3f4"},children:[(0,r.jsx)("td",{style:{padding:"12px 16px",color:"#3c4043"},children:e.metric}),(0,r.jsx)("td",{style:{padding:"12px 16px",color:"#202124",fontWeight:500},children:e.value})]},t))})]})]}),(0,r.jsx)(ty,{visible:s,onClose:()=>n(!1),accessToken:a,onSuccess:()=>{n(!1),i()},preset:ak[e.id]})]})},aI=({accessToken:e,onGuardrailCreated:t})=>{let[a,i]=(0,l.useState)(""),[s,n]=(0,l.useState)(null),[o,d]=(0,l.useState)(!1),c=av.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,r.jsx)(aS,{card:s,onBack:()=>n(null),accessToken:e,onGuardrailCreated:t}):(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{style:{marginBottom:24},children:(0,r.jsx)(g.Input,{size:"large",placeholder:"Search guardrails",prefix:(0,r.jsx)(ac.SearchOutlined,{style:{color:"#9ca3af"}}),value:a,onChange:e=>i(e.target.value),style:{borderRadius:8}})}),(0,r.jsxs)("div",{style:{marginBottom:40},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:4},children:[(0,r.jsx)("h2",{style:{fontSize:20,fontWeight:600,color:"#111827",margin:0},children:"LiteLLM Content Filter"}),(0,r.jsx)("span",{style:{display:"inline-flex",alignItems:"center",gap:6,fontSize:14,color:"#1a73e8",cursor:"pointer"},onClick:()=>d(!o),children:o?(0,r.jsx)(r.Fragment,{children:"Show less"}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a_.ArrowRightOutlined,{style:{fontSize:12}}),`Show all (${m.length})`]})})]}),(0,r.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,r.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:16},children:(o?m:m.slice(0,10)).map(e=>(0,r.jsx)(aC,{card:e,onClick:()=>n(e)},e.id))})]}),(0,r.jsxs)("div",{style:{marginBottom:40},children:[(0,r.jsx)("h2",{style:{fontSize:20,fontWeight:600,color:"#111827",margin:"0 0 4px 0"},children:"Partner Guardrails"}),(0,r.jsx)("p",{style:{fontSize:13,color:"#6b7280",margin:"4px 0 20px 0"},children:"Third-party guardrail integrations from leading AI security providers."}),(0,r.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:16},children:u.map(e=>(0,r.jsx)(aC,{card:e,onClick:()=>n(e)},e.id))})]})]})};var aO=e.i(655063),aB=e.i(741466),aE=e.i(988846),aP=e.i(837007),aL=e.i(409797),aR=e.i(54131),aT=e.i(995926),aD=e.i(634831),az=e.i(438100),aF=e.i(302202),aM=e.i(328196),aK=e.i(168118),aQ=e.i(663435),aG=e.i(954616),aU=e.i(912598),aH=e.i(431703),aJ=e.i(135214),aW=e.i(243652);let aq=async(e,t)=>{let a=(0,d.getProxyBaseUrl)(),r=`${a}/guardrails/register`,l=await fetch(r,{method:"POST",headers:{[(0,d.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!l.ok){let e=await l.json().catch(()=>({})),t=(0,aH.deriveErrorMessage)(e);throw(0,d.handleError)(t),Error(t)}return l.json()},aV=(0,aW.createQueryKeys)("guardrails");function aY(e){var t;let a=e.litellm_params??{},r=e.guardrail_info??{},l=a.headers,i=Array.isArray(l)?l.map(e=>({key:(e.key??e.name??"").toString(),value:String(e.value??"")})):"object"==typeof l&&null!==l?Object.entries(l).map(([e,t])=>({key:e,value:String(t??"")})):[],s=a.api_base??a.url??"",n=r.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:r.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 aZ={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"}},a$={"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 aX({label:e,value:t,color:a}){return(0,r.jsxs)("div",{className:"bg-white border border-gray-200 rounded-lg px-4 py-3",children:[(0,r.jsx)("div",{className:`text-2xl font-bold ${a}`,children:t}),(0,r.jsx)("div",{className:"text-xs text-gray-500 mt-0.5",children:e})]})}function a0({enabled:e,onToggle:t,disabled:a=!1}){return(0,r.jsx)("button",{type:"button",onClick:t,role:"switch","aria-checked":e,disabled:a,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"} ${a?"opacity-50 cursor-not-allowed":""}`,children:(0,r.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 a1({guardrail:e,isSelected:t,isHeadersExpanded:a,isAdmin:l,onSelect:i,onToggleForwardKey:s,onToggleHeaders:n,onApprove:o,onReject:d}){let c=aZ[e.status],m=a$[e.team]??"bg-gray-100 text-gray-700";return(0,r.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,r.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,r.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-1.5 flex-wrap",children:[(0,r.jsxs)("span",{className:`text-xs font-medium px-2 py-0.5 rounded-full ${m}`,children:["Team: ",e.team]}),(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${c.bg} ${c.text}`,children:[(0,r.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${c.dot}`}),c.label]})]}),(0,r.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-1",children:e.name}),(0,r.jsx)("p",{className:"text-xs text-gray-500 mb-2 line-clamp-1",children:e.description}),(0,r.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,r.jsx)(aF.ServerIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0"}),(0,r.jsx)("code",{className:"text-xs text-gray-500 font-mono truncate",children:e.endpoint})]}),(0,r.jsxs)("div",{className:"flex items-center gap-4 text-xs text-gray-500",children:[(0,r.jsxs)("span",{children:["Model: ",(0,r.jsx)("span",{className:"font-medium text-gray-700",children:e.model})]}),(0,r.jsxs)("span",{children:["Submitted: ",(0,r.jsx)("span",{className:"font-medium text-gray-700",children:e.submittedAt})]})]})]}),(0,r.jsxs)("div",{className:"flex flex-col items-end gap-2 shrink-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"text-xs text-gray-500 whitespace-nowrap",children:"Forward API Key"}),(0,r.jsx)(a0,{enabled:e.forwardKey,onToggle:s,disabled:!l})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,r.jsx)("button",{type:"button",onClick:i,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"}),l&&"pending"===e.status&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{type:"button",onClick:o,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,r.jsx)("button",{type:"button",onClick:d,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,r.jsxs)("div",{className:"mt-3 pt-3 border-t border-gray-100",children:[(0,r.jsxs)("button",{type:"button",onClick:n,className:"flex items-center gap-1.5 text-xs text-gray-500 hover:text-gray-700 transition-colors",children:[a?(0,r.jsx)(aR.ChevronUpIcon,{className:"h-3.5 w-3.5"}):(0,r.jsx)(aL.ChevronDownIcon,{className:"h-3.5 w-3.5"}),"Static headers",e.customHeaders.length>0&&(0,r.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,r.jsx)("div",{className:"mt-2",children:0===e.customHeaders.length?(0,r.jsx)("p",{className:"text-xs text-gray-400 italic",children:"No static headers configured."}):(0,r.jsx)("div",{className:"space-y-1",children:e.customHeaders.map((e,t)=>(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs font-mono",children:[(0,r.jsx)("span",{className:"text-gray-500 bg-gray-50 border border-gray-200 rounded-sm px-2 py-0.5",children:e.key}),(0,r.jsx)("span",{className:"text-gray-400",children:":"}),(0,r.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 a2({label:e,children:t}){return(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-xs font-semibold text-gray-500 mb-1",children:e}),(0,r.jsx)("div",{children:t})]})}function a4({guardrail:e,isAdmin:t,onClose:a,onApprove:i,onReject:s,onToggleForwardKey:n,onUpdateCustomHeaders:o,onUpdateExtraHeaders:d}){let[c,m]=(0,l.useState)(!1),[u,p]=(0,l.useState)(""),[g,x]=(0,l.useState)(""),[h,f]=(0,l.useState)(""),y=aZ[e.status],j=a$[e.team]??"bg-gray-100 text-gray-700";return(0,r.jsx)("div",{className:"w-96 shrink-0 bg-white overflow-auto",children:(0,r.jsxs)("div",{className:"p-5",children:[(0,r.jsxs)("div",{className:"flex items-start justify-between mb-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,r.jsxs)("span",{className:`text-xs font-medium px-2 py-0.5 rounded-full ${j}`,children:["Team: ",e.team]}),(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-xs font-medium px-2 py-0.5 rounded-full ${y.bg} ${y.text}`,children:[(0,r.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${y.dot}`}),y.label]})]}),(0,r.jsx)("h2",{className:"text-base font-semibold text-gray-900",children:e.name}),(0,r.jsxs)("p",{className:"text-xs text-gray-500 mt-0.5",children:["Submitted by ",e.submittedBy," on ",e.submittedAt]})]}),(0,r.jsx)("button",{type:"button",onClick:a,className:"text-gray-400 hover:text-gray-600 transition-colors","aria-label":"Close detail panel",children:(0,r.jsx)(aT.XIcon,{className:"h-4 w-4"})})]}),(0,r.jsx)("p",{className:"text-sm text-gray-600 mb-5",children:e.description}),(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsx)(a2,{label:"Endpoint",children:(0,r.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,r.jsx)("code",{className:"text-xs font-mono text-gray-700 break-all",children:e.endpoint}),(0,r.jsx)("a",{href:e.endpoint,target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-blue-500 shrink-0",children:(0,r.jsx)(aD.ExternalLinkIcon,{className:"h-3.5 w-3.5"})})]})}),(0,r.jsx)(a2,{label:"Method",children:(0,r.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,r.jsxs)("div",{className:"border border-blue-100 bg-blue-50 rounded-lg p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,r.jsx)(az.KeyIcon,{className:"h-3.5 w-3.5 text-blue-500"}),(0,r.jsx)("span",{className:"text-xs font-semibold text-blue-800",children:"Forward LiteLLM API Key"})]}),(0,r.jsx)(a0,{enabled:e.forwardKey,onToggle:n,disabled:!t})]}),(0,r.jsxs)("p",{className:"text-xs text-blue-700 leading-relaxed",children:["When enabled, the caller's LiteLLM API key is forwarded as an"," ",(0,r.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,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,r.jsx)("span",{className:"text-xs font-semibold text-gray-700",children:"Static headers"}),e.customHeaders.length>0&&(0,r.jsx)("span",{className:"bg-gray-100 text-gray-600 rounded-full px-1.5 py-0.5 text-xs",children:e.customHeaders.length})]}),(0,r.jsx)("p",{className:"text-xs text-gray-400 mb-2",children:"Sent with every request to the guardrail."}),0===e.customHeaders.length?(0,r.jsx)("p",{className:"text-xs text-gray-400 italic mb-2",children:"No static headers configured."}):(0,r.jsx)("ul",{className:"list-none space-y-1 mb-2",children:e.customHeaders.map((a,l)=>(0,r.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,r.jsxs)("span",{className:"text-gray-700 truncate",children:[a.key,": ",a.value]}),t&&(0,r.jsx)("button",{type:"button",onClick:()=>o(e.customHeaders.filter((e,t)=>t!==l)),className:"text-gray-400 hover:text-red-600 shrink-0","aria-label":`Remove ${a.key}`,children:(0,r.jsx)(aT.XIcon,{className:"h-3.5 w-3.5"})})]},`${a.key}-${l}`))}),t&&(0,r.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,r.jsx)("input",{type:"text",value:g,onChange:e=>x(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=g.trim(),r=h.trim();a&&!e.customHeaders.some(e=>e.key.toLowerCase()===a.toLowerCase())&&(o([...e.customHeaders,{key:a,value:r}]),x(""),f(""))}}}),(0,r.jsx)("input",{type:"text",value:h,onChange:e=>f(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=g.trim(),r=h.trim();a&&!e.customHeaders.some(e=>e.key.toLowerCase()===a.toLowerCase())&&(o([...e.customHeaders,{key:a,value:r}]),x(""),f(""))}}}),(0,r.jsx)("button",{type:"button",onClick:()=>{let t=g.trim(),a=h.trim();t&&!e.customHeaders.some(e=>e.key.toLowerCase()===t.toLowerCase())&&(o([...e.customHeaders,{key:t,value:a}]),x(""),f(""))},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,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5 mb-2",children:[(0,r.jsx)("span",{className:"text-xs font-semibold text-gray-700",children:"Forward client headers"}),e.extraHeaders.length>0&&(0,r.jsx)("span",{className:"bg-gray-100 text-gray-600 rounded-full px-1.5 py-0.5 text-xs",children:e.extraHeaders.length})]}),(0,r.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,r.jsx)("p",{className:"text-xs text-gray-400 italic mb-2",children:"No forward client headers configured."}):(0,r.jsx)("ul",{className:"list-none space-y-1 mb-2",children:e.extraHeaders.map((a,l)=>(0,r.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,r.jsx)("span",{className:"text-gray-700 truncate",children:a}),t&&(0,r.jsx)("button",{type:"button",onClick:()=>d(e.extraHeaders.filter((e,t)=>t!==l)),className:"text-gray-400 hover:text-red-600 shrink-0","aria-label":`Remove ${a}`,children:(0,r.jsx)(aT.XIcon,{className:"h-3.5 w-3.5"})})]},`${a}-${l}`))}),t&&(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)("input",{type:"text",value:u,onChange:e=>p(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=u.trim().toLowerCase();a&&!e.extraHeaders.map(e=>e.toLowerCase()).includes(a)&&(d([...e.extraHeaders,a]),p(""))}}}),(0,r.jsx)("button",{type:"button",onClick:()=>{let t=u.trim().toLowerCase();t&&!e.extraHeaders.map(e=>e.toLowerCase()).includes(t)&&(d([...e.extraHeaders,t]),p(""))},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,r.jsxs)("div",{className:"border border-gray-200 rounded-lg overflow-hidden",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>m(!c),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,r.jsx)("span",{children:"Equivalent config"}),c?(0,r.jsx)(aR.ChevronUpIcon,{className:"h-3.5 w-3.5 text-gray-500"}):(0,r.jsx)(aL.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-500"})]}),c&&(0,r.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,r]of(t.push(" additional_provider_specific_params:"),Object.entries(e.additionalProviderParams))){let e="string"==typeof r?`"${r}"`:String(r);t.push(` ${a}: ${e}`)}return t.join("\n")}(e)})]}),(0,r.jsxs)("div",{className:"flex items-start gap-2 bg-gray-50 border border-gray-200 rounded-lg p-3",children:[(0,r.jsx)(aK.InfoIcon,{className:"h-3.5 w-3.5 text-gray-400 shrink-0 mt-0.5"}),(0,r.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,r.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,r.jsxs)("div",{className:"mt-5 pt-4 border-t border-gray-100 space-y-2",children:[(0,r.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,r.jsx)(aD.ExternalLinkIcon,{className:"h-4 w-4"}),"Test Endpoint"]}),t&&"pending"===e.status&&(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsxs)("button",{type:"button",onClick:i,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,r.jsx)(tH.CheckIcon,{className:"h-4 w-4"}),"Approve"]}),(0,r.jsxs)("button",{type:"button",onClick:s,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,r.jsx)(aT.XIcon,{className:"h-4 w-4"}),"Reject"]})]})]})]})})}function a5({action:e,guardrailName:t,onConfirm:a,onCancel:l}){let i="approve"===e;return(0,r.jsx)("div",{className:"fixed inset-0 bg-black/30 flex items-center justify-center z-50",children:(0,r.jsxs)("div",{className:"bg-white rounded-xl shadow-xl p-6 max-w-sm w-full mx-4",children:[(0,r.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,r.jsx)(tH.CheckIcon,{className:"h-5 w-5 text-green-600"}):(0,r.jsx)(aM.AlertCircleIcon,{className:"h-5 w-5 text-red-600"})}),(0,r.jsx)("h3",{className:"text-base font-semibold text-gray-900 mb-1",children:i?"Approve Guardrail":"Reject Guardrail"}),(0,r.jsxs)("p",{className:"text-sm text-gray-500 mb-5",children:["Are you sure you want to ",e," ",(0,r.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,r.jsxs)("div",{className:"flex gap-3",children:[(0,r.jsx)("button",{type:"button",onClick:l,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,r.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 a8({accessToken:e}){let{userRole:t}=(0,aJ.default)(),a=!!t&&(0,tP.isProxyAdminRole)(t),[i,s]=(0,l.useState)([]),[n,o]=(0,l.useState)({total:0,pending_review:0,active:0,rejected:0}),[c,m]=(0,l.useState)(""),[u]=(0,aO.useDebouncedValue)(c,{wait:aB.DEBOUNCE_WAIT_MS}),[f,y]=(0,l.useState)("all"),[b,_]=(0,l.useState)(null),[A,v]=(0,l.useState)(new Set),[w,C]=(0,l.useState)(null),[N,k]=(0,l.useState)(!0),[S,I]=(0,l.useState)(null),[O,B]=(0,l.useState)(!1),[E]=p.Form.useForm(),P=(()=>{let{accessToken:e}=(0,aJ.default)(),t=(0,aU.useQueryClient)();return(0,aG.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return aq(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:aV.all})}})})(),L=(0,l.useCallback)(async()=>{if(!e)return void k(!1);k(!0),I(null);try{let t="all"===f?void 0:"pending"===f?"pending_review":f,a=await (0,d.listGuardrailSubmissions)(e,{status:t,search:u.trim()||void 0});s(a.submissions.map(aY)),o(a.summary)}catch(e){I(e instanceof Error?e.message:"Failed to load submissions"),s([])}finally{k(!1)}},[e,f,u]);(0,l.useEffect)(()=>{L()},[L]);let R=i.find(e=>e.id===b)??null,T=n.total,D=n.pending_review,z=n.active,F=n.rejected;async function M(t){if(!e)return;let a=i.find(e=>e.id===t);if(!a)return;let r=!a.forwardKey;try{await (0,d.updateGuardrailCall)(e,t,{litellm_params:{forward_api_key:r}}),s(e=>e.map(e=>e.id===t?{...e,forwardKey:r}:e)),j.default.success(r?"Forward API key enabled":"Forward API key disabled")}catch{j.default.fromBackend("Failed to update forward API key")}}async function K(t,a){if(!e)return;let r={};for(let{key:e,value:t}of a)e.trim()&&(r[e.trim()]=t);try{await (0,d.updateGuardrailCall)(e,t,{litellm_params:{headers:r}}),s(e=>e.map(e=>e.id===t?{...e,customHeaders:a.filter(e=>e.key.trim())}:e)),j.default.success("Static headers updated")}catch{j.default.fromBackend("Failed to update static headers")}}async function Q(t,a){if(e)try{await (0,d.updateGuardrailCall)(e,t,{litellm_params:{extra_headers:a}}),s(e=>e.map(e=>e.id===t?{...e,extraHeaders:a}:e)),j.default.success("Forward client headers updated")}catch{j.default.fromBackend("Failed to update forward client headers")}}async function G(t){if(e)try{await (0,d.approveGuardrailSubmission)(e,t),C(null),b===t&&_(null),await L(),j.default.success("Guardrail approved")}catch{j.default.fromBackend("Failed to approve guardrail")}}async function U(t){if(e)try{await (0,d.rejectGuardrailSubmission)(e,t),C(null),b===t&&_(null),await L(),j.default.success("Guardrail rejected")}catch{j.default.fromBackend("Failed to reject guardrail")}}return(0,r.jsxs)("div",{className:"flex h-full",children:[(0,r.jsxs)("div",{className:`flex-1 min-w-0 p-6 overflow-auto ${R?"border-r border-gray-200":""}`,children:[(0,r.jsxs)("div",{className:"grid grid-cols-4 gap-4 mb-6",children:[(0,r.jsx)(aX,{label:"Total Submitted",value:T,color:"text-gray-900"}),(0,r.jsx)(aX,{label:"Pending Review",value:D,color:"text-yellow-600"}),(0,r.jsx)(aX,{label:"Active",value:z,color:"text-green-600"}),(0,r.jsx)(aX,{label:"Rejected",value:F,color:"text-red-600"})]}),(0,r.jsxs)("div",{className:"flex items-center gap-3 mb-5",children:[(0,r.jsxs)("div",{className:"relative flex-1 max-w-xs",children:[(0,r.jsx)(aE.SearchIcon,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400"}),(0,r.jsx)("input",{type:"text",placeholder:"Search guardrails...",value:c,onChange:e=>m(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,r.jsxs)("select",{value:f,onChange:e=>y(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,r.jsx)("option",{value:"all",children:"All Status"}),(0,r.jsx)("option",{value:"pending",children:"Pending Review"}),(0,r.jsx)("option",{value:"active",children:"Active"}),(0,r.jsx)("option",{value:"rejected",children:"Rejected"})]}),(0,r.jsxs)("button",{type:"button",onClick:()=>B(!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,r.jsx)(aP.PlusIcon,{className:"h-4 w-4"}),"Add Guardrail"]})]}),(0,r.jsxs)("div",{className:"space-y-3",children:[N&&(0,r.jsx)("div",{className:"text-center py-12 text-gray-500 text-sm",children:"Loading submissions…"}),S&&(0,r.jsx)("div",{className:"text-center py-12 text-red-600 text-sm",children:S}),!N&&!S&&0===i.length&&(0,r.jsx)("div",{className:"text-center py-12 text-gray-400 text-sm",children:"No guardrails match your filters."}),!N&&!S&&i.map(e=>(0,r.jsx)(a1,{guardrail:e,isSelected:b===e.id,isHeadersExpanded:A.has(e.id),isAdmin:a,onSelect:()=>_(b===e.id?null:e.id),onToggleForwardKey:()=>M(e.id),onToggleHeaders:()=>{var t;return t=e.id,void v(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})},onApprove:()=>C({id:e.id,action:"approve"}),onReject:()=>C({id:e.id,action:"reject"})},e.id))]})]}),R&&(0,r.jsx)(a4,{guardrail:R,isAdmin:a,onClose:()=>_(null),onApprove:()=>C({id:R.id,action:"approve"}),onReject:()=>C({id:R.id,action:"reject"}),onToggleForwardKey:()=>M(R.id),onUpdateCustomHeaders:e=>K(R.id,e),onUpdateExtraHeaders:e=>Q(R.id,e)}),w&&(0,r.jsx)(a5,{action:w.action,guardrailName:i.find(e=>e.id===w.id)?.name??"",onConfirm:()=>"approve"===w.action?G(w.id):U(w.id),onCancel:()=>C(null)}),(0,r.jsxs)(x.Modal,{title:"Submit Guardrail for Review",open:O,onCancel:()=>{B(!1),E.resetFields()},onOk:()=>E.submit(),okText:"Submit for Review",children:[(0,r.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,r.jsxs)(p.Form,{form:E,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}),j.default.success("Guardrail submitted for review"),B(!1),E.resetFields(),L()}catch{}},children:[(0,r.jsx)(p.Form.Item,{label:"Team",name:"team_id",rules:[{required:!0,message:"Select a team"}],children:(0,r.jsx)(aQ.default,{})}),(0,r.jsx)(p.Form.Item,{label:"Guardrail Name",name:"guardrail_name",rules:[{required:!0,message:"Enter a guardrail name"}],children:(0,r.jsx)(g.Input,{placeholder:"e.g. pii-detection"})}),(0,r.jsx)(p.Form.Item,{label:"Mode",name:"mode",rules:[{required:!0,message:"Select a mode"}],children:(0,r.jsxs)(h.Select,{children:[(0,r.jsx)(h.Select.Option,{value:"pre_call",children:"Pre Call"}),(0,r.jsx)(h.Select.Option,{value:"post_call",children:"Post Call"}),(0,r.jsx)(h.Select.Option,{value:"during_call",children:"During Call"})]})}),(0,r.jsx)(p.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,r.jsx)(g.Input,{placeholder:"https://your-guardrail-api.com/v1/check",className:"font-mono"})}),(0,r.jsx)(p.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,r.jsx)(g.Input.TextArea,{rows:3,className:"font-mono text-xs",placeholder:'{"forward_api_key": true, "headers": {"X-Custom": "value"}}'})}),(0,r.jsx)(p.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,r.jsx)(g.Input.TextArea,{rows:3,className:"font-mono text-xs",placeholder:'{"description": "Detects PII in requests"}'})})]})]})]})}let a6=({accessToken:e,userRole:t})=>{let[a,p]=(0,l.useState)([]),[g,x]=(0,l.useState)(!1),[h,f]=(0,l.useState)(!1),[y,b]=(0,l.useState)(!1),[_,A]=(0,l.useState)(!1),[v,w]=(0,l.useState)(null),[C,N]=(0,l.useState)(!1),[k,S]=(0,l.useState)(null),I=!!t&&(0,tP.isAdminRole)(t),O=async()=>{if(e){b(!0);try{let t=await (0,d.getGuardrailsList)(e);p(t.guardrails)}catch(e){console.error("Error fetching guardrails:",e)}finally{b(!1)}}};(0,l.useEffect)(()=>{O()},[e]);let B=()=>{O()},E=async()=>{if(v&&e){A(!0);try{await (0,d.deleteGuardrailCall)(e,v.guardrail_id),j.default.success(`Guardrail "${v.guardrail_name}" deleted successfully`),await O()}catch(e){console.error("Error deleting guardrail:",e),j.default.fromBackend("Failed to delete guardrail")}finally{A(!1),N(!1),w(null)}}},P=v&&v.litellm_params?eQ(v.litellm_params.guardrail).displayName:void 0;return(0,r.jsx)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:(0,r.jsx)(i.Tabs,{defaultActiveKey:"guardrails",items:[...I?[{key:"garden",label:"Guardrail Garden",children:(0,r.jsx)(aI,{accessToken:e,onGuardrailCreated:B})},{key:"guardrails",label:"Guardrails",children:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"flex justify-between items-center mb-4",children:(0,r.jsxs)(m.DropdownMenu,{children:[(0,r.jsxs)(m.DropdownMenuTrigger,{disabled:!e,className:(0,u.cn)((0,c.buttonVariants)({variant:"default"})),children:[(0,r.jsx)(o.Plus,{}),"Add New Guardrail",(0,r.jsx)(s.ChevronDown,{})]}),(0,r.jsxs)(m.DropdownMenuContent,{align:"start",className:"w-56",children:[(0,r.jsxs)(m.DropdownMenuItem,{onClick:()=>{k&&S(null),x(!0)},children:[(0,r.jsx)(o.Plus,{}),"Add Provider Guardrail"]}),(0,r.jsxs)(m.DropdownMenuItem,{onClick:()=>{k&&S(null),f(!0)},children:[(0,r.jsx)(n.Code,{}),"Create Custom Code Guardrail"]})]})]})}),k?(0,r.jsx)(an,{guardrailId:k,onClose:()=>S(null),accessToken:e,isAdmin:I}):(0,r.jsx)(tE,{guardrailsList:a,isLoading:y,onDeleteClick:(e,t)=>{w(a.find(t=>t.guardrail_id===e)||null),N(!0)},onGuardrailClick:e=>S(e)}),(0,r.jsx)(ty,{visible:g,onClose:()=>{x(!1)},accessToken:e,onSuccess:B}),(0,r.jsx)(as,{visible:h,onClose:()=>{f(!1)},accessToken:e,onSuccess:B}),(0,r.jsx)(ab.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:E,confirmLoading:_})]})},{key:"playground",label:"Test Playground",disabled:!e,children:(0,r.jsx)(aj,{guardrailsList:a,isLoading:y,accessToken:e,onClose:()=>{}})}]:[],{key:"submitted",label:"Submitted Guardrails",children:(0,r.jsx)(a8,{accessToken:e})}]})})};e.s(["default",0,function(){let{accessToken:e,userRole:t}=(0,aJ.default)();return(0,r.jsx)(a6,{accessToken:e,userRole:t})}],509345)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0jjbikxye1xv_.js b/litellm/proxy/_experimental/out/_next/static/chunks/0jjbikxye1xv_.js deleted file mode 100644 index c37af60a23c..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0jjbikxye1xv_.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,986888,e=>{"use strict";var s=e.i(843476),t=e.i(755151),a=e.i(872934),l=e.i(827252),r=e.i(56456),i=e.i(240647),n=e.i(399029),c=e.i(741466),o=e.i(304967),d=e.i(309426),m=e.i(350967),u=e.i(197647),x=e.i(653824),h=e.i(881073),p=e.i(404206),g=e.i(723731),_=e.i(599724),j=e.i(629569),f=e.i(560445),y=e.i(464571),b=e.i(560025),k=e.i(199133),v=e.i(592968),T=e.i(898586),N=e.i(271645);e.i(32117);var C=e.i(343053),w=e.i(515288),q=e.i(289793),S=e.i(768371),L=e.i(708347),A=e.i(135214),D=e.i(738014),F=e.i(602869),E=e.i(621482);let O=(0,e.i(243652).createQueryKeys)("infiniteUsers"),M=50;var U=e.i(500330),R=e.i(591025),$=e.i(594772),I=e.i(378044),P=e.i(980187),z=e.i(362024);e.i(622826);var B=e.i(964471),V=e.i(291542);let W=[{title:"Model",dataIndex:"model",key:"model",render:e=>e||"-"},{title:"Spend (USD)",dataIndex:"spend",key:"spend",render:e=>(0,s.jsx)(B.MoneyCell,{value:e,decimals:2})},{title:"Successful",dataIndex:"successful_requests",key:"successful_requests",render:e=>(0,s.jsx)("span",{className:"text-green-600",children:e?.toLocaleString()||0})},{title:"Failed",dataIndex:"failed_requests",key:"failed_requests",render:e=>(0,s.jsx)("span",{className:"text-red-600",children:e?.toLocaleString()||0})},{title:"Tokens",dataIndex:"tokens",key:"tokens",render:e=>e?.toLocaleString()||0}],H=({topModels:e})=>{let[t,a]=(0,N.useState)("table");return 0===e.length?null:(0,s.jsxs)(w.Card,{className:"mt-4",children:[(0,s.jsxs)(w.CardHeader,{children:[(0,s.jsx)(w.CardTitle,{className:"text-base font-semibold",children:"Model Usage"}),(0,s.jsx)(w.CardAction,{children:(0,s.jsxs)("div",{className:"flex space-x-2",children:[(0,s.jsx)("button",{onClick:()=>a("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"}),(0,s.jsx)("button",{onClick:()=>a("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"})]})})]}),(0,s.jsx)(w.CardContent,{children:"chart"===t?(0,s.jsx)("div",{className:"max-h-[234px] overflow-y-auto",children:(0,s.jsx)(C.BarChart,{style:{height:40*e.length},data:e.map(e=>({key:e.model,spend:e.spend})),index:"key",categories:["spend"],colors:["cyan"],valueFormatter:e=>`$${(0,U.formatNumberWithCommas)(e,2)}`,layout:"vertical",yAxisWidth:180,tickGap:5,showLegend:!1})}):(0,s.jsx)(V.Table,{columns:W,dataSource:e,rowKey:"model",size:"small",pagination:!1,scroll:e.length>5?{y:195}:void 0})})]})};function K(e){return e>=1e9?(e/1e9).toFixed(2)+"B":e>=1e6?(e/1e6).toFixed(2)+"M":e>=1e3?e/1e3+"k":e.toString()}function G(e){return 0===e?"$0":e>=1e9?"$"+parseFloat((e/1e9).toFixed(2))+"B":e>=1e6?"$"+parseFloat((e/1e6).toFixed(2))+"M":e>=1e3?"$"+e/1e3+"k":"$"+e}let Z=({modelName:e,metrics:t,hidePromptCachingMetrics:a=!1})=>(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)(m.Grid,{numItems:4,className:"gap-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Requests"}),(0,s.jsx)(j.Title,{children:t.total_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Successful Requests"}),(0,s.jsx)(j.Title,{children:t.total_successful_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Tokens"}),(0,s.jsx)(j.Title,{children:t.total_tokens.toLocaleString()}),(0,s.jsxs)(_.Text,{children:[Math.round(t.total_tokens/t.total_successful_requests)," avg per successful request"]})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Spend"}),(0,s.jsxs)(j.Title,{children:["$",(0,U.formatNumberWithCommas)(t.total_spend,2)]}),(0,s.jsxs)(_.Text,{children:["$",(0,U.formatNumberWithCommas)(t.total_spend/t.total_successful_requests,3)," per successful request"]})]})]}),t.top_api_keys&&t.top_api_keys.length>0&&(0,s.jsxs)(o.Card,{className:"mt-4",children:[(0,s.jsx)(j.Title,{children:"Top Virtual Keys by Spend"}),(0,s.jsx)("div",{className:"mt-3",children:(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2",children:t.top_api_keys.map((e,t)=>(0,s.jsxs)("div",{className:"flex justify-between items-center p-3 bg-gray-50 rounded-lg",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"font-medium",children:e.key_alias||`${e.api_key.substring(0,10)}...`}),e.team_id&&(0,s.jsxs)(_.Text,{className:"text-xs text-gray-500",children:["Team: ",e.team_id]})]}),(0,s.jsxs)("div",{className:"text-right",children:[(0,s.jsxs)(_.Text,{className:"font-medium",children:["$",(0,U.formatNumberWithCommas)(e.spend,2)]}),(0,s.jsxs)(_.Text,{className:"text-xs text-gray-500",children:[e.requests.toLocaleString()," requests | ",e.tokens.toLocaleString()," tokens"]})]})]},e.api_key))})})]}),t.top_models&&t.top_models.length>0&&(0,s.jsx)(H,{topModels:t.top_models}),(0,s.jsxs)(o.Card,{className:"mt-4",children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Spend per day"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.spend"],colors:["green"]})]}),(0,s.jsx)(C.BarChart,{className:"mt-4",data:t.daily_data,index:"date",categories:["metrics.spend"],colors:["green"],valueFormatter:e=>`$${(0,U.formatNumberWithCommas)(e,2,!0)}`,yAxisWidth:72})]}),(0,s.jsxs)(m.Grid,{numItems:2,className:"gap-4 mt-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Total Tokens"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.prompt_tokens","metrics.completion_tokens","metrics.total_tokens"],colors:["blue","cyan","indigo"]})]}),(0,s.jsx)(R.AreaChart,{className:"mt-4",data:t.daily_data,index:"date",categories:["metrics.prompt_tokens","metrics.completion_tokens","metrics.total_tokens"],colors:["blue","cyan","indigo"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Requests per day"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.api_requests"],colors:["blue"]})]}),(0,s.jsx)(C.BarChart,{className:"mt-4",data:t.daily_data,index:"date",categories:["metrics.api_requests"],colors:["blue"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Success vs Failed Requests"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.successful_requests","metrics.failed_requests"],colors:["green","red"]})]}),(0,s.jsx)(R.AreaChart,{className:"mt-4",data:t.daily_data,index:"date",categories:["metrics.successful_requests","metrics.failed_requests"],colors:["green","red"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1})]}),!a&&(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Prompt Caching Metrics"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.cache_read_input_tokens","metrics.cache_creation_input_tokens"],colors:["cyan","purple"]})]}),(0,s.jsxs)("div",{className:"mb-2",children:[(0,s.jsxs)(_.Text,{children:["Cache Read: ",t.total_cache_read_input_tokens?.toLocaleString()||0," tokens"]}),(0,s.jsxs)(_.Text,{children:["Cache Creation: ",t.total_cache_creation_input_tokens?.toLocaleString()||0," tokens"]})]}),(0,s.jsx)(R.AreaChart,{className:"mt-4",data:t.daily_data,index:"date",categories:["metrics.cache_read_input_tokens","metrics.cache_creation_input_tokens"],colors:["cyan","purple"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1})]})]})]}),J=({modelMetrics:e,hidePromptCachingMetrics:t=!1})=>{let a=Object.keys(e).sort((s,t)=>""===s?1:""===t?-1:e[t].total_spend-e[s].total_spend),l={total_requests:0,total_successful_requests:0,total_tokens:0,total_spend:0,total_cache_read_input_tokens:0,total_cache_creation_input_tokens:0,daily_data:{}};Object.values(e).forEach(e=>{l.total_requests+=e.total_requests,l.total_successful_requests+=e.total_successful_requests,l.total_tokens+=e.total_tokens,l.total_spend+=e.total_spend,l.total_cache_read_input_tokens+=e.total_cache_read_input_tokens||0,l.total_cache_creation_input_tokens+=e.total_cache_creation_input_tokens||0,e.daily_data.forEach(e=>{l.daily_data[e.date]||(l.daily_data[e.date]={prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,spend:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),l.daily_data[e.date].prompt_tokens+=e.metrics.prompt_tokens,l.daily_data[e.date].completion_tokens+=e.metrics.completion_tokens,l.daily_data[e.date].total_tokens+=e.metrics.total_tokens,l.daily_data[e.date].api_requests+=e.metrics.api_requests,l.daily_data[e.date].spend+=e.metrics.spend,l.daily_data[e.date].successful_requests+=e.metrics.successful_requests,l.daily_data[e.date].failed_requests+=e.metrics.failed_requests,l.daily_data[e.date].cache_read_input_tokens+=e.metrics.cache_read_input_tokens||0,l.daily_data[e.date].cache_creation_input_tokens+=e.metrics.cache_creation_input_tokens||0})});let r=Object.entries(l.daily_data).map(([e,s])=>({date:e,metrics:s})).sort((e,s)=>new Date(e.date).getTime()-new Date(s.date).getTime());return(0,s.jsxs)("div",{className:"space-y-8",children:[(0,s.jsxs)("div",{className:"border rounded-lg p-4",children:[(0,s.jsx)(j.Title,{children:"Overall Usage"}),(0,s.jsxs)(m.Grid,{numItems:4,className:"gap-4 mb-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Requests"}),(0,s.jsx)(j.Title,{children:l.total_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Successful Requests"}),(0,s.jsx)(j.Title,{children:l.total_successful_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Tokens"}),(0,s.jsx)(j.Title,{children:l.total_tokens.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(_.Text,{children:"Total Spend"}),(0,s.jsxs)(j.Title,{children:["$",(0,U.formatNumberWithCommas)(l.total_spend,2)]})]})]}),(0,s.jsxs)(m.Grid,{numItems:2,className:"gap-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Total Tokens Over Time"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.prompt_tokens","metrics.completion_tokens","metrics.total_tokens"],colors:["blue","cyan","indigo"]})]}),(0,s.jsx)(R.AreaChart,{className:"mt-4",data:r,index:"date",categories:["metrics.prompt_tokens","metrics.completion_tokens","metrics.total_tokens"],colors:["blue","cyan","indigo"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1,yAxisWidth:80})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"Total Requests Over Time"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.successful_requests","metrics.failed_requests"],colors:["emerald","red"]})]}),(0,s.jsx)(R.AreaChart,{className:"mt-4",data:r,index:"date",categories:["metrics.successful_requests","metrics.failed_requests"],colors:["emerald","red"],valueFormatter:K,customTooltip:I.CustomTooltip,showLegend:!1,yAxisWidth:80})]})]})]}),(0,s.jsx)(z.Collapse,{defaultActiveKey:a[0],children:a.map(a=>(0,s.jsx)(z.Collapse.Panel,{header:(0,s.jsxs)("div",{className:"flex justify-between items-center w-full",children:[(0,s.jsx)(j.Title,{children:e[a].label||"Unknown Item"}),(0,s.jsxs)("div",{className:"flex space-x-4 text-sm text-gray-500",children:[(0,s.jsxs)("span",{children:["$",(0,U.formatNumberWithCommas)(e[a].total_spend,2)]}),(0,s.jsxs)("span",{children:[e[a].total_requests.toLocaleString()," requests"]})]})]}),children:(0,s.jsx)(Z,{modelName:a||"Unknown Model",metrics:e[a],hidePromptCachingMetrics:t})},a))})]})},Y=(e,s,t=[])=>{let a={};return e.results.forEach(e=>{Object.entries(e.breakdown[s]||{}).forEach(([l,r])=>{a[l]||(a[l]={label:"api_keys"===s?((e,s,t)=>{let a=e.metadata.key_alias||`key-hash-${s}`,l=e.metadata.team_id;if(l){let e=(0,P.resolveTeamAliasFromTeamID)(l,t);return e?`${a} (team: ${e})`:`${a} (team_id: ${l})`}return a})(r,l,t):"entities"===s&&(r.metadata?.agent_name||r.metadata?.team_alias)||l,total_requests:0,total_successful_requests:0,total_failed_requests:0,total_tokens:0,prompt_tokens:0,completion_tokens:0,total_spend:0,total_cache_read_input_tokens:0,total_cache_creation_input_tokens:0,top_api_keys:[],top_models:[],daily_data:[]}),a[l].total_requests+=r.metrics.api_requests,a[l].prompt_tokens+=r.metrics.prompt_tokens,a[l].completion_tokens+=r.metrics.completion_tokens,a[l].total_tokens+=r.metrics.total_tokens,a[l].total_spend+=r.metrics.spend,a[l].total_successful_requests+=r.metrics.successful_requests,a[l].total_failed_requests+=r.metrics.failed_requests,a[l].total_cache_read_input_tokens+=r.metrics.cache_read_input_tokens||0,a[l].total_cache_creation_input_tokens+=r.metrics.cache_creation_input_tokens||0,a[l].daily_data.push({date:e.date,metrics:{prompt_tokens:r.metrics.prompt_tokens,completion_tokens:r.metrics.completion_tokens,total_tokens:r.metrics.total_tokens,api_requests:r.metrics.api_requests,spend:r.metrics.spend,successful_requests:r.metrics.successful_requests,failed_requests:r.metrics.failed_requests,cache_read_input_tokens:r.metrics.cache_read_input_tokens||0,cache_creation_input_tokens:r.metrics.cache_creation_input_tokens||0}})})}),"api_keys"!==s&&Object.entries(a).forEach(([t,l])=>{let r={};e.results.forEach(e=>{let a=e.breakdown[s]?.[t];a&&"api_key_breakdown"in a&&Object.entries(a.api_key_breakdown||{}).forEach(([e,s])=>{r[e]||(r[e]={api_key:e,key_alias:s.metadata.key_alias,team_id:s.metadata.team_id,spend:0,requests:0,tokens:0}),r[e].spend+=s.metrics.spend,r[e].requests+=s.metrics.api_requests,r[e].tokens+=s.metrics.total_tokens})}),a[t].top_api_keys=Object.values(r).sort((e,s)=>s.spend-e.spend).slice(0,5)}),"api_keys"===s&&Object.entries(a).forEach(([s,t])=>{let l={};e.results.forEach(e=>{Object.entries(e.breakdown.models||{}).forEach(([e,t])=>{if(t&&"api_key_breakdown"in t){let a=t.api_key_breakdown?.[s];a&&(l[e]||(l[e]={model:e,spend:0,requests:0,successful_requests:0,failed_requests:0,tokens:0}),l[e].spend+=a.metrics.spend,l[e].requests+=a.metrics.api_requests,l[e].successful_requests+=a.metrics.successful_requests||0,l[e].failed_requests+=a.metrics.failed_requests||0,l[e].tokens+=a.metrics.total_tokens)}})}),a[s].top_models=Object.values(l).sort((e,s)=>s.spend-e.spend)}),Object.values(a).forEach(e=>{e.daily_data.sort((e,s)=>new Date(e.date).getTime()-new Date(s.date).getTime())}),a};var Q=e.i(994388),X=e.i(366283),ee=e.i(779241),es=e.i(212931),et=e.i(808613),ea=e.i(482725),el=e.i(727749);let er=({isOpen:e,onClose:t,accessToken:a})=>{let[l]=et.Form.useForm(),[r,i]=(0,N.useState)(!1),[n,c]=(0,N.useState)(null),[o,d]=(0,N.useState)(!1),[m,u]=(0,N.useState)("cloudzero"),[x,h]=(0,N.useState)(!1);(0,N.useEffect)(()=>{e&&a&&p()},[e,a]);let p=async()=>{d(!0);try{let e=await fetch("/cloudzero/settings",{method:"GET",headers:{[(0,F.getGlobalLitellmHeaderName)()]:`Bearer ${a}`,"Content-Type":"application/json"}});if(e.ok){let s=await e.json();c(s),l.setFieldsValue({connection_id:s.connection_id})}else if(404!==e.status){let s=await e.json();el.default.fromBackend(`Failed to load existing settings: ${s.error||"Unknown error"}`)}}catch(e){console.error("Error loading CloudZero settings:",e),el.default.fromBackend("Failed to load existing settings")}finally{d(!1)}},g=async e=>{if(!a)return void el.default.fromBackend("No access token available");i(!0);try{let s=n?"/cloudzero/settings":"/cloudzero/init",t=n?"PUT":"POST",l={...e,timezone:"UTC"},r=await fetch(s,{method:t,headers:{[(0,F.getGlobalLitellmHeaderName)()]:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify(l)}),i=await r.json();if(r.ok)return el.default.success(i.message||"CloudZero settings saved successfully"),c({api_key_masked:e.api_key.substring(0,4)+"****"+e.api_key.slice(-4),connection_id:e.connection_id,status:"configured"}),!0;return el.default.fromBackend(i.error||"Failed to save CloudZero settings"),!1}catch(e){return console.error("Error saving CloudZero settings:",e),el.default.fromBackend("Failed to save CloudZero settings"),!1}finally{i(!1)}},j=async()=>{if(!a)return void el.default.fromBackend("No access token available");h(!0);try{let e=await fetch("/cloudzero/export",{method:"POST",headers:{[(0,F.getGlobalLitellmHeaderName)()]:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({limit:1e5,operation:"replace_hourly"})}),s=await e.json();e.ok?(el.default.success(s.message||"Export to CloudZero completed successfully"),t()):el.default.fromBackend(s.error||"Failed to export to CloudZero")}catch(e){console.error("Error exporting to CloudZero:",e),el.default.fromBackend("Failed to export to CloudZero")}finally{h(!1)}},f=async()=>{h(!0);try{el.default.info("CSV export functionality coming soon!"),t()}catch(e){console.error("Error exporting CSV:",e),el.default.fromBackend("Failed to export CSV")}finally{h(!1)}},y=async()=>{if("cloudzero"===m){if(!n){let e=await l.validateFields();if(!await g(e))return}await j()}else await f()},b=()=>{l.resetFields(),u("cloudzero"),c(null),t()},v=[{value:"cloudzero",label:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("img",{src:"/cloudzero.png",alt:"CloudZero",className:"w-5 h-5",onError:e=>{e.target.style.display="none"}}),(0,s.jsx)("span",{children:"Export to CloudZero"})]})},{value:"csv",label:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})}),(0,s.jsx)("span",{children:"Export to CSV"})]})}];return(0,s.jsx)(es.Modal,{title:"Export Data",open:e,onCancel:b,footer:null,width:600,destroyOnHidden:!0,children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"font-medium mb-2 block",children:"Export Destination"}),(0,s.jsx)(k.Select,{value:m,onChange:u,options:v,className:"w-full",size:"large"})]}),"cloudzero"===m&&(0,s.jsx)("div",{children:o?(0,s.jsx)("div",{className:"flex justify-center py-8",children:(0,s.jsx)(ea.Spin,{size:"large"})}):(0,s.jsxs)(s.Fragment,{children:[n&&(0,s.jsx)(X.Callout,{title:"Existing CloudZero Configuration",icon:()=>(0,s.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})}),color:"green",className:"mb-4",children:(0,s.jsxs)(_.Text,{children:["API Key: ",n.api_key_masked,(0,s.jsx)("br",{}),"Connection ID: ",n.connection_id]})}),!n&&(0,s.jsxs)(et.Form,{form:l,layout:"vertical",children:[(0,s.jsx)(et.Form.Item,{label:"CloudZero API Key",name:"api_key",rules:[{required:!0,message:"Please enter your CloudZero API key"}],children:(0,s.jsx)(ee.TextInput,{type:"password",placeholder:"Enter your CloudZero API key"})}),(0,s.jsx)(et.Form.Item,{label:"Connection ID",name:"connection_id",rules:[{required:!0,message:"Please enter the CloudZero connection ID"}],children:(0,s.jsx)(ee.TextInput,{placeholder:"Enter CloudZero connection ID"})})]})]})}),"csv"===m&&(0,s.jsx)(X.Callout,{title:"CSV Export",icon:()=>(0,s.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 6v6m0 0v6m0-6h6m-6 0H6"})}),color:"blue",children:(0,s.jsx)(_.Text,{children:"Export your usage data as a CSV file for analysis in spreadsheet applications."})}),(0,s.jsxs)("div",{className:"flex justify-end space-x-2 pt-4",children:[(0,s.jsx)(Q.Button,{variant:"secondary",onClick:b,children:"Cancel"}),(0,s.jsx)(Q.Button,{onClick:y,loading:r||x,disabled:r||x,children:"cloudzero"===m?"Export to CloudZero":"Export CSV"})]})]})})};var ei=e.i(785242),en=e.i(981339);let ec=({value:e,onChange:t})=>(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"text-sm font-medium text-gray-700 block mb-2",children:"Format"}),(0,s.jsx)(k.Select,{value:e,onChange:t,className:"w-full",options:[{value:"csv",label:"CSV (Excel, Google Sheets)"},{value:"json",label:"JSON (includes metadata)"}]})]}),eo=({dateRange:e,selectedFilters:t})=>(0,s.jsxs)("div",{className:"text-sm text-gray-500",children:[e.from?.toLocaleDateString()," - ",e.to?.toLocaleDateString(),t.length>0&&` \xb7 ${t.length} filter${t.length>1?"s":""}`]});var ed=e.i(91739);let em=({value:e,onChange:t,entityType:a})=>(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"text-sm font-medium text-gray-700 block mb-2",children:"Export type"}),(0,s.jsx)(ed.Radio.Group,{value:e,onChange:e=>t(e.target.value),className:"w-full",children:(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)("label",{className:"flex items-start p-3 border border-gray-200 rounded-lg hover:bg-gray-50 cursor-pointer transition-colors",children:[(0,s.jsx)(ed.Radio,{value:"daily",className:"mt-0.5"}),(0,s.jsxs)("div",{className:"ml-3 flex-1",children:[(0,s.jsxs)("div",{className:"font-medium text-sm",children:["Day-by-day breakdown by ",a]}),(0,s.jsxs)("div",{className:"text-xs text-gray-500 mt-0.5",children:["Daily metrics for each ",a]})]})]}),(0,s.jsxs)("label",{className:"flex items-start p-3 border border-gray-200 rounded-lg hover:bg-gray-50 cursor-pointer transition-colors",children:[(0,s.jsx)(ed.Radio,{value:"daily_with_keys",className:"mt-0.5"}),(0,s.jsxs)("div",{className:"ml-3 flex-1",children:[(0,s.jsxs)("div",{className:"font-medium text-sm",children:["Day-by-day breakdown by ",a," and key"]}),(0,s.jsxs)("div",{className:"text-xs text-gray-500 mt-0.5",children:["Daily metrics for each ",a,", split by API key"]})]})]}),(0,s.jsxs)("label",{className:"flex items-start p-3 border border-gray-200 rounded-lg hover:bg-gray-50 cursor-pointer transition-colors",children:[(0,s.jsx)(ed.Radio,{value:"daily_with_models",className:"mt-0.5"}),(0,s.jsxs)("div",{className:"ml-3 flex-1",children:[(0,s.jsxs)("div",{className:"font-medium text-sm",children:["Day-by-day by ",a," and model"]}),(0,s.jsx)("div",{className:"text-xs text-gray-500 mt-0.5",children:"Daily metrics split by model"})]})]})]})})]});var eu=e.i(59935);let ex=(e,s)=>({id:e,alias:s[e]||e}),eh=["spend","api_requests","successful_requests","failed_requests","total_tokens","prompt_tokens","completion_tokens","cache_read_input_tokens","cache_creation_input_tokens"],ep=e=>{let s=e.entities;return s&&Object.keys(s).length>0?s:(e=>{let s=e.api_keys;if(!s||0===Object.keys(s).length)return{};let t={};for(let[e,a]of Object.entries(s)){let s=a?.metadata?.team_id||"Unassigned";t[s]||(t[s]={metrics:Object.fromEntries(eh.map(e=>[e,0])),api_key_breakdown:{}});let l=t[s].metrics,r=a?.metrics||{};for(let e of eh)l[e]+=r[e]||0;t[s].api_key_breakdown[e]=a}return t})(e)},eg=(e,s,t,a={})=>{switch(s){case"daily":default:return((e,s,t={})=>{let a=[];return e.results.forEach(e=>{Object.entries(ep(e.breakdown)).forEach(([l,r])=>{let{id:i,alias:n}=ex(l,t);a.push({Date:e.date,[s]:n,[`${s} ID`]:i,"Spend ($)":(0,U.formatNumberWithCommas)(r.metrics.spend,4),Requests:r.metrics.api_requests,"Successful Requests":r.metrics.successful_requests,"Failed Requests":r.metrics.failed_requests,"Total Tokens":r.metrics.total_tokens,"Prompt Tokens":r.metrics.prompt_tokens||0,"Completion Tokens":r.metrics.completion_tokens||0,"Cache Read Input Tokens":r.metrics.cache_read_input_tokens||0,"Cache Creation Input Tokens":r.metrics.cache_creation_input_tokens||0})})}),a.sort((e,s)=>new Date(e.Date).getTime()-new Date(s.Date).getTime())})(e,t,a);case"daily_with_keys":return((e,s,t={})=>{let a={};return e.results.forEach(e=>{Object.entries(ep(e.breakdown)).forEach(([s,l])=>{let{id:r,alias:i}=ex(s,t);Object.entries(l.api_key_breakdown||{}).forEach(([s,t])=>{let l=t?.metadata?.key_alias||null,n=`${e.date}_${r}_${s}`;a[n]?(a[n].metrics.spend+=t.metrics?.spend||0,a[n].metrics.api_requests+=t.metrics?.api_requests||0,a[n].metrics.successful_requests+=t.metrics?.successful_requests||0,a[n].metrics.failed_requests+=t.metrics?.failed_requests||0,a[n].metrics.total_tokens+=t.metrics?.total_tokens||0,a[n].metrics.prompt_tokens+=t.metrics?.prompt_tokens||0,a[n].metrics.completion_tokens+=t.metrics?.completion_tokens||0,a[n].metrics.cache_read_input_tokens+=t.metrics?.cache_read_input_tokens||0,a[n].metrics.cache_creation_input_tokens+=t.metrics?.cache_creation_input_tokens||0):a[n]={Date:e.date,entityId:r,entityAlias:i,keyId:s,keyAlias:l,metrics:{spend:t.metrics?.spend||0,api_requests:t.metrics?.api_requests||0,successful_requests:t.metrics?.successful_requests||0,failed_requests:t.metrics?.failed_requests||0,total_tokens:t.metrics?.total_tokens||0,prompt_tokens:t.metrics?.prompt_tokens||0,completion_tokens:t.metrics?.completion_tokens||0,cache_read_input_tokens:t.metrics?.cache_read_input_tokens||0,cache_creation_input_tokens:t.metrics?.cache_creation_input_tokens||0}}})})}),Object.values(a).map(e=>({Date:e.Date,[s]:e.entityAlias,[`${s} ID`]:e.entityId,"Key Alias":e.keyAlias||"-","Key ID":e.keyId,"Spend ($)":(0,U.formatNumberWithCommas)(e.metrics.spend,4),Requests:e.metrics.api_requests,"Successful Requests":e.metrics.successful_requests,"Failed Requests":e.metrics.failed_requests,"Total Tokens":e.metrics.total_tokens,"Prompt Tokens":e.metrics.prompt_tokens,"Completion Tokens":e.metrics.completion_tokens,"Cache Read Input Tokens":e.metrics.cache_read_input_tokens,"Cache Creation Input Tokens":e.metrics.cache_creation_input_tokens})).sort((e,s)=>new Date(e.Date).getTime()-new Date(s.Date).getTime())})(e,t,a);case"daily_with_models":return((e,s,t={})=>{let a=[];return e.results.forEach(e=>{let l={};Object.entries(ep(e.breakdown)).forEach(([s,t])=>{l[s]||(l[s]={}),Object.entries(e.breakdown.models||{}).forEach(([e,a])=>{let r=t.api_key_breakdown||{},i=a.api_key_breakdown||{};Object.keys(r).forEach(t=>{let a=i[t]?.metrics;a&&(l[s][e]||(l[s][e]={spend:0,requests:0,successful:0,failed:0,tokens:0,promptTokens:0,completionTokens:0,cacheReadInputTokens:0,cacheCreationInputTokens:0}),l[s][e].spend+=a.spend||0,l[s][e].requests+=a.api_requests||0,l[s][e].successful+=a.successful_requests||0,l[s][e].failed+=a.failed_requests||0,l[s][e].tokens+=a.total_tokens||0,l[s][e].promptTokens+=a.prompt_tokens||0,l[s][e].completionTokens+=a.completion_tokens||0,l[s][e].cacheReadInputTokens+=a.cache_read_input_tokens||0,l[s][e].cacheCreationInputTokens+=a.cache_creation_input_tokens||0)})})}),Object.entries(l).forEach(([l,r])=>{let{id:i,alias:n}=ex(l,t);Object.entries(r).forEach(([t,l])=>{a.push({Date:e.date,[s]:n,[`${s} ID`]:i,Model:t,"Spend ($)":(0,U.formatNumberWithCommas)(l.spend,4),Requests:l.requests,Successful:l.successful,Failed:l.failed,"Total Tokens":l.tokens,"Prompt Tokens":l.promptTokens,"Completion Tokens":l.completionTokens,"Cache Read Input Tokens":l.cacheReadInputTokens,"Cache Creation Input Tokens":l.cacheCreationInputTokens})})})}),a.sort((e,s)=>new Date(e.Date).getTime()-new Date(s.Date).getTime())})(e,t,a)}},e_=({isOpen:e,onClose:t,entityType:a,spendData:l,dateRange:r,selectedFilters:i,customTitle:n})=>{let[c,o]=(0,N.useState)("csv"),[d,m]=(0,N.useState)("daily"),[u,x]=(0,N.useState)(!1),{data:h,isLoading:p}=(0,ei.useTeams)(),g=a.charAt(0).toUpperCase()+a.slice(1),_=n||`Export ${g} Usage`,j=(0,N.useMemo)(()=>(0,P.createTeamAliasMap)(h),[h]),f=async e=>{let s=e||c;x(!0);try{"csv"===s?(((e,s,t,a,l={})=>{let r=eg(e,s,t,l),i=new Blob([eu.default.unparse(r)],{type:"text/csv;charset=utf-8;"}),n=window.URL.createObjectURL(i),c=document.createElement("a");c.href=n,c.download=`${a}_usage_${s}_${new Date().toISOString().split("T")[0]}.csv`,document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(n)})(l,d,g,a,j),el.default.success(`${g} usage data exported successfully as CSV`)):(((e,s,t,a,l,r,i={})=>{let n=eg(e,s,t,i),c={export_date:new Date().toISOString(),entity_type:a,date_range:{from:l.from?.toISOString(),to:l.to?.toISOString()},filters_applied:r.length>0?r:"None",export_scope:s,summary:{total_spend:e.metadata.total_spend,total_requests:e.metadata.total_api_requests,successful_requests:e.metadata.total_successful_requests,failed_requests:e.metadata.total_failed_requests,total_tokens:e.metadata.total_tokens}},o=new Blob([JSON.stringify({metadata:c,data:n},null,2)],{type:"application/json"}),d=window.URL.createObjectURL(o),m=document.createElement("a");m.href=d,m.download=`${a}_usage_${s}_${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(m),m.click(),document.body.removeChild(m),window.URL.revokeObjectURL(d)})(l,d,g,a,r,i,j),el.default.success(`${g} usage data exported successfully as JSON`)),t()}catch(e){console.error("Error exporting data:",e),el.default.fromBackend("Failed to export data")}finally{x(!1)}};return(0,s.jsx)(es.Modal,{title:(0,s.jsx)("span",{className:"text-base font-semibold",children:_}),open:e,onCancel:t,footer:null,width:480,children:(0,s.jsxs)("div",{className:"space-y-5 py-2",children:[p?(0,s.jsx)(en.Skeleton,{active:!0}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(eo,{dateRange:r,selectedFilters:i}),(0,s.jsx)(em,{value:d,onChange:m,entityType:a}),(0,s.jsx)(ec,{value:c,onChange:o})]}),p?(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-4 border-t",children:[(0,s.jsx)(en.Skeleton.Button,{active:!0}),(0,s.jsx)(en.Skeleton.Button,{active:!0})]}):(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-4 border-t",children:[(0,s.jsx)(y.Button,{variant:"outlined",onClick:t,disabled:u,children:"Cancel"}),(0,s.jsx)(y.Button,{onClick:()=>f(),loading:u||p,disabled:u||p,type:"primary",children:u?"Exporting...":`Export ${c.toUpperCase()}`})]})]})})},ej=({dateValue:e,entityType:t,spendData:a,showFilters:l=!1,filterLabel:r,filterPlaceholder:i,selectedFilters:n=[],onFiltersChange:c,filterOptions:o=[],filterMode:d="multiple",customTitle:m,compactLayout:u=!1,teams:x=[]})=>{let[h,p]=(0,N.useState)(!1);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsxs)("div",{className:`grid ${l&&o.length>0?"grid-cols-[1fr_auto]":"grid-cols-[auto]"} items-end gap-4`,children:[l&&o.length>0&&(0,s.jsxs)("div",{children:[r&&(0,s.jsx)(_.Text,{className:"mb-2",children:r}),(0,s.jsx)(k.Select,{mode:"single"===d?void 0:"multiple",style:{width:"100%"},placeholder:i,value:"single"===d?n[0]??void 0:n,onChange:e=>{"single"===d?c?.(e?[e]:[]):c?.(e)},options:o,allowClear:!0})]}),(0,s.jsx)("div",{className:"justify-self-end",children:(0,s.jsx)(Q.Button,{onClick:()=>p(!0),icon:()=>(0,s.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})}),children:"Export Data"})})]})}),(0,s.jsx)(e_,{isOpen:h,onClose:()=>p(!1),entityType:t,spendData:a,dateRange:e,selectedFilters:n,customTitle:m,teams:x})]})};var ef=e.i(973706),ey=e.i(571303);let eb=({isDateChanging:e=!1})=>(0,s.jsx)("div",{className:"flex items-center justify-center h-40",children:(0,s.jsxs)("div",{className:"flex items-center justify-center gap-3",children:[(0,s.jsx)(ey.UiLoadingSpinner,{className:"size-5"}),(0,s.jsxs)("div",{className:"flex flex-col",children:[(0,s.jsx)("span",{className:"text-gray-600 text-sm font-medium",children:e?"Processing date selection...":"Loading chart data..."}),(0,s.jsx)("span",{className:"text-gray-400 text-xs mt-1",children:e?"This will only take a moment":"Fetching your data"})]})]})});var ek=e.i(290571),ev=e.i(95779),eT=e.i(444755),eN=e.i(673706);let eC=N.default.forwardRef((e,s)=>{let{color:t,children:a,className:l}=e,r=(0,ek.__rest)(e,["color","children","className"]);return N.default.createElement("p",Object.assign({ref:s,className:(0,eT.tremorTwMerge)("font-semibold text-tremor-metric",t?(0,eN.getColorClassNames)(t,ev.colorPalette.darkText).textColor:"text-tremor-content-strong dark:text-dark-tremor-content-strong",l)},r),a)});eC.displayName="Metric";var ew=e.i(37091),eq=e.i(269200),eS=e.i(427612),eL=e.i(496020),eA=e.i(64848),eD=e.i(942232),eF=e.i(977572);let eE=({accessToken:e,selectedTags:t,formatAbbreviatedNumber:a})=>{let l,r,i,n,[c,o]=(0,N.useState)({results:[],total_count:0,page:1,page_size:50,total_pages:0}),[d,m]=(0,N.useState)(!1),[f,y]=(0,N.useState)(1),b=async()=>{if(e){m(!0);try{let s=await (0,F.perUserAnalyticsCall)(e,f,50,t.length>0?t:void 0);o(s)}catch(e){console.error("Failed to fetch per-user data:",e)}finally{m(!1)}}};return(0,N.useEffect)(()=>{b()},[e,t,f]),(0,s.jsxs)("div",{className:"mb-6",children:[(0,s.jsx)(j.Title,{children:"Per User Usage"}),(0,s.jsx)(ew.Subtitle,{children:"Individual developer usage metrics"}),(0,s.jsxs)(x.TabGroup,{children:[(0,s.jsxs)(h.TabList,{className:"mb-6",children:[(0,s.jsx)(u.Tab,{children:"User Details"}),(0,s.jsx)(u.Tab,{children:"Usage Distribution"})]}),(0,s.jsxs)(g.TabPanels,{children:[(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsxs)(eq.Table,{children:[(0,s.jsx)(eS.TableHead,{children:(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eA.TableHeaderCell,{children:"User ID"}),(0,s.jsx)(eA.TableHeaderCell,{children:"User Email"}),(0,s.jsx)(eA.TableHeaderCell,{children:"User Agent"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-right",children:"Success Generations"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-right",children:"Total Tokens"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-right",children:"Failed Requests"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-right",children:"Total Cost"})]})}),(0,s.jsx)(eD.TableBody,{children:c.results.slice(0,10).map((e,t)=>(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(_.Text,{className:"font-medium",children:e.user_id})}),(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(_.Text,{children:e.user_email||"N/A"})}),(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(_.Text,{children:e.user_agent||"Unknown"})}),(0,s.jsx)(eF.TableCell,{className:"text-right",children:(0,s.jsx)(_.Text,{children:a(e.successful_requests)})}),(0,s.jsx)(eF.TableCell,{className:"text-right",children:(0,s.jsx)(_.Text,{children:a(e.total_tokens)})}),(0,s.jsx)(eF.TableCell,{className:"text-right",children:(0,s.jsx)(_.Text,{children:a(e.failed_requests)})}),(0,s.jsx)(eF.TableCell,{className:"text-right",children:(0,s.jsxs)(_.Text,{children:["$",a(e.spend,4)]})})]},t))})]}),c.results.length>10&&(0,s.jsxs)("div",{className:"mt-4 flex justify-between items-center",children:[(0,s.jsxs)(_.Text,{className:"text-sm text-gray-500",children:["Showing 10 of ",c.total_count," results"]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(Q.Button,{size:"sm",variant:"secondary",onClick:()=>{f>1&&y(f-1)},disabled:1===f,children:"Previous"}),(0,s.jsx)(Q.Button,{size:"sm",variant:"secondary",onClick:()=>{f=c.total_pages,children:"Next"})]})]})]}),(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsxs)("div",{className:"mb-4",children:[(0,s.jsx)(j.Title,{className:"text-lg",children:"User Usage Distribution"}),(0,s.jsx)(ew.Subtitle,{children:"Number of users by successful request frequency"})]}),(0,s.jsx)(C.BarChart,{data:(l=new Map,c.results.forEach(e=>{let s=e.user_agent||"Unknown";l.set(s,(l.get(s)||0)+1)}),r=Array.from(l.entries()).sort(([,e],[,s])=>s-e).slice(0,8).map(([e])=>e),i={"1-9 requests":{range:[1,9],agents:{}},"10-99 requests":{range:[10,99],agents:{}},"100-999 requests":{range:[100,999],agents:{}},"1K-9.9K requests":{range:[1e3,9999],agents:{}},"10K-99.9K requests":{range:[1e4,99999],agents:{}},"100K+ requests":{range:[1e5,1/0],agents:{}}},c.results.forEach(e=>{let s=e.successful_requests,t=e.user_agent||"Unknown";r.includes(t)&&Object.entries(i).forEach(([e,a])=>{s>=a.range[0]&&s<=a.range[1]&&(a.agents[t]||(a.agents[t]=0),a.agents[t]++)})}),Object.entries(i).map(([e,s])=>{let t={category:e};return r.forEach(e=>{t[e]=s.agents[e]||0}),t})),index:"category",categories:(n=new Map,c.results.forEach(e=>{let s=e.user_agent||"Unknown";n.set(s,(n.get(s)||0)+1)}),Array.from(n.entries()).sort(([,e],[,s])=>s-e).slice(0,8).map(([e])=>e)),colors:["blue","green","orange","red","purple","yellow","pink","indigo"],valueFormatter:e=>`${e} users`,yAxisWidth:80,showLegend:!0,stack:!0})]})]})]})]})},eO=({accessToken:e,userRole:t,dateValue:a,onDateChange:l})=>{let[r,i]=(0,N.useState)({results:[]}),[n,c]=(0,N.useState)({results:[]}),[d,f]=(0,N.useState)({results:[]}),[y,b]=(0,N.useState)({results:[]}),[T,w]=(0,N.useState)(""),[q,S]=(0,N.useState)([]),[L,A]=(0,N.useState)([]),[D,E]=(0,N.useState)(!1),[O,M]=(0,N.useState)(!1),[U,R]=(0,N.useState)(!1),[$,I]=(0,N.useState)(!1),[P,z]=(0,N.useState)(!1),B=new Date,V=async()=>{if(e){E(!0);try{let s=await (0,F.tagDistinctCall)(e);S(s.results.map(e=>e.tag))}catch(e){console.error("Failed to fetch available tags:",e)}finally{E(!1)}}},W=async()=>{if(e){M(!0);try{let s=await (0,F.tagDauCall)(e,B,T||void 0,L.length>0?L:void 0);i(s)}catch(e){console.error("Failed to fetch DAU data:",e)}finally{M(!1)}}},H=async()=>{if(e){R(!0);try{let s=await (0,F.tagWauCall)(e,B,T||void 0,L.length>0?L:void 0);c(s)}catch(e){console.error("Failed to fetch WAU data:",e)}finally{R(!1)}}},K=async()=>{if(e){I(!0);try{let s=await (0,F.tagMauCall)(e,B,T||void 0,L.length>0?L:void 0);f(s)}catch(e){console.error("Failed to fetch MAU data:",e)}finally{I(!1)}}},G=async()=>{if(e&&a.from&&a.to){z(!0);try{let s=await (0,F.userAgentSummaryCall)(e,a.from,a.to,L.length>0?L:void 0);b(s)}catch(e){console.error("Failed to fetch user agent summary data:",e)}finally{z(!1)}}};(0,N.useEffect)(()=>{V()},[e]),(0,N.useEffect)(()=>{if(!e)return;let s=setTimeout(()=>{W(),H(),K()},50);return()=>clearTimeout(s)},[e,T,L]),(0,N.useEffect)(()=>{if(!a.from||!a.to)return;let e=setTimeout(()=>{G()},50);return()=>clearTimeout(e)},[e,a,L]);let Z=e=>e.startsWith("User-Agent: ")?e.replace("User-Agent: ",""):e,J=e=>Object.entries(e.reduce((e,s)=>(e[s.tag]=(e[s.tag]||0)+s.active_users,e),{})).sort(([,e],[,s])=>s-e).map(([e])=>e),Y=J(r.results).slice(0,10),Q=J(n.results).slice(0,10),X=J(d.results).slice(0,10),ee=(()=>{let e=[],s=new Date;for(let t=6;t>=0;t--){let a=new Date(s);a.setDate(a.getDate()-t);let l={date:a.toISOString().split("T")[0]};Y.forEach(e=>{l[Z(e)]=0}),e.push(l)}return r.results.forEach(s=>{let t=Z(s.tag),a=e.find(e=>e.date===s.date);a&&(a[t]=s.active_users)}),e})(),es=(()=>{let e=[];for(let s=1;s<=7;s++){let t={week:`Week ${s}`};Q.forEach(e=>{t[Z(e)]=0}),e.push(t)}return n.results.forEach(s=>{let t=Z(s.tag),a=s.date.match(/Week (\d+)/);if(a){let l=`Week ${a[1]}`,r=e.find(e=>e.week===l);r&&(r[t]=s.active_users)}}),e})(),et=(()=>{let e=[];for(let s=1;s<=7;s++){let t={month:`Month ${s}`};X.forEach(e=>{t[Z(e)]=0}),e.push(t)}return d.results.forEach(s=>{let t=Z(s.tag),a=s.date.match(/Month (\d+)/);if(a){let l=`Month ${a[1]}`,r=e.find(e=>e.month===l);r&&(r[t]=s.active_users)}}),e})(),ea=(e,s=0)=>{if(e>=1e8||e>=1e7)return(e/1e6).toFixed(s)+"M";if(e>=1e6)return(e/1e6).toFixed(s)+"M";if(e>=1e4)return(e/1e3).toFixed(s)+"K";if(e>=1e3)return(e/1e3).toFixed(s)+"K";else return e.toFixed(s)};return(0,s.jsxs)("div",{className:"space-y-6 mt-6",children:[(0,s.jsx)(o.Card,{children:(0,s.jsxs)("div",{className:"space-y-6",children:[(0,s.jsxs)("div",{className:"flex justify-between items-start",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(j.Title,{children:"Summary by User Agent"}),(0,s.jsx)(ew.Subtitle,{children:"Performance metrics for different user agents"})]}),(0,s.jsxs)("div",{className:"w-96",children:[(0,s.jsx)(_.Text,{className:"text-sm font-medium block mb-2",children:"Filter by User Agents"}),(0,s.jsx)(k.Select,{mode:"multiple",placeholder:"All User Agents",value:L,onChange:A,style:{width:"100%"},showSearch:!0,allowClear:!0,loading:D,optionFilterProp:"label",className:"rounded-md",maxTagCount:"responsive",children:q.map(e=>{let t=Z(e),a=t.length>50?`${t.substring(0,50)}...`:t;return(0,s.jsx)(k.Select.Option,{value:e,label:a,title:t,children:a},e)})})]})]}),P?(0,s.jsx)(eb,{isDateChanging:!1}):(0,s.jsxs)(m.Grid,{numItems:4,className:"gap-4",children:[(y.results||[]).slice(0,4).map((e,t)=>{let a=Z(e.tag),l=a.length>15?a.substring(0,15)+"...":a;return(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(v.Tooltip,{title:a,placement:"top",children:(0,s.jsx)(j.Title,{className:"truncate",children:l})}),(0,s.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Success Requests"}),(0,s.jsx)(eC,{className:"text-lg",children:ea(e.successful_requests)})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Total Tokens"}),(0,s.jsx)(eC,{className:"text-lg",children:ea(e.total_tokens)})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Total Cost"}),(0,s.jsxs)(eC,{className:"text-lg",children:["$",ea(e.total_spend,4)]})]})]})]},t)}),Array.from({length:Math.max(0,4-(y.results||[]).length)}).map((e,t)=>(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"No Data"}),(0,s.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Success Requests"}),(0,s.jsx)(eC,{className:"text-lg",children:"-"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Total Tokens"}),(0,s.jsx)(eC,{className:"text-lg",children:"-"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)(_.Text,{className:"text-sm text-gray-600",children:"Total Cost"}),(0,s.jsx)(eC,{className:"text-lg",children:"-"})]})]})]},`empty-${t}`))]})]})}),(0,s.jsx)(o.Card,{children:(0,s.jsxs)(x.TabGroup,{children:[(0,s.jsxs)(h.TabList,{className:"mb-6",children:[(0,s.jsx)(u.Tab,{children:"DAU/WAU/MAU"}),(0,s.jsx)(u.Tab,{children:"Per User Usage (Last 30 Days)"})]}),(0,s.jsxs)(g.TabPanels,{children:[(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsxs)("div",{className:"mb-6",children:[(0,s.jsx)(j.Title,{children:"DAU, WAU & MAU per Agent"}),(0,s.jsx)(ew.Subtitle,{children:"Active users across different time periods"})]}),(0,s.jsxs)(x.TabGroup,{children:[(0,s.jsxs)(h.TabList,{className:"mb-6",children:[(0,s.jsx)(u.Tab,{children:"DAU"}),(0,s.jsx)(u.Tab,{children:"WAU"}),(0,s.jsx)(u.Tab,{children:"MAU"})]}),(0,s.jsxs)(g.TabPanels,{children:[(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)(j.Title,{className:"text-lg",children:"Daily Active Users - Last 7 Days"})}),O?(0,s.jsx)(eb,{isDateChanging:!1}):(0,s.jsx)(C.BarChart,{data:ee,index:"date",categories:Y.map(Z),valueFormatter:e=>ea(e),yAxisWidth:60,showLegend:!0,stack:!0})]}),(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)(j.Title,{className:"text-lg",children:"Weekly Active Users - Last 7 Weeks"})}),U?(0,s.jsx)(eb,{isDateChanging:!1}):(0,s.jsx)(C.BarChart,{data:es,index:"week",categories:Q.map(Z),valueFormatter:e=>ea(e),yAxisWidth:60,showLegend:!0,stack:!0})]}),(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)(j.Title,{className:"text-lg",children:"Monthly Active Users - Last 7 Months"})}),$?(0,s.jsx)(eb,{isDateChanging:!1}):(0,s.jsx)(C.BarChart,{data:et,index:"month",categories:X.map(Z),valueFormatter:e=>ea(e),yAxisWidth:60,showLegend:!0,stack:!0})]})]})]})]}),(0,s.jsx)(p.TabPanel,{children:(0,s.jsx)(eE,{accessToken:e,selectedTags:L,formatAbbreviatedNumber:ea})})]})]})})]})};var eM=e.i(617802),eU=e.i(567425);let eR=({endpointData:e})=>{let t=N.default.useMemo(()=>Object.entries(e||{}).map(([e,s])=>({endpoint:e,"metrics.successful_requests":s.metrics.successful_requests,"metrics.failed_requests":s.metrics.failed_requests,metrics:{successful_requests:s.metrics.successful_requests,failed_requests:s.metrics.failed_requests}})),[e]);return(0,s.jsxs)(w.Card,{children:[(0,s.jsx)(w.CardHeader,{children:(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(w.CardTitle,{className:"text-base font-semibold",children:"Success vs Failed Requests by Endpoint"}),(0,s.jsx)($.CustomLegend,{categories:["metrics.successful_requests","metrics.failed_requests"],colors:["green","red"]})]})}),(0,s.jsx)(w.CardContent,{children:(0,s.jsx)(C.BarChart,{data:t,index:"endpoint",categories:["metrics.successful_requests","metrics.failed_requests"],colors:["green","red"],valueFormatter:e=>e.toLocaleString(),customTooltip:I.CustomTooltip,showLegend:!1,stack:!0,yAxisWidth:60})})]})};var e$=e.i(564207);let eI=function({dailyData:e}){let t=(0,N.useMemo)(()=>{var s;let t,a;return e?.results&&0!==e.results.length?(s=e.results,t=[],a=new Set,s.forEach(e=>{e.breakdown.endpoints&&Object.keys(e.breakdown.endpoints).forEach(e=>a.add(e))}),s.forEach(e=>{let s={date:new Date(e.date).toLocaleDateString("en-US",{month:"short",day:"numeric"})};a.forEach(t=>{let a=e.breakdown.endpoints?.[t];s[t]=a?.metrics.api_requests||0}),t.push(s)}),t.reverse()):[]},[e]),a=(0,N.useMemo)(()=>0===t.length?[]:Object.keys(t[0]).filter(e=>"date"!==e),[t]);return(0,s.jsxs)(w.Card,{className:"mb-6",children:[(0,s.jsx)(w.CardHeader,{children:(0,s.jsx)(w.CardTitle,{className:"text-base font-semibold",children:"Endpoint Usage Trends"})}),(0,s.jsx)(w.CardContent,{children:(0,s.jsx)(e$.LineChart,{className:"h-80",data:t,index:"date",categories:a,colors:["blue","cyan","indigo","violet","purple","fuchsia","pink","rose","red","orange"].slice(0,a.length),valueFormatter:e=>e.toLocaleString(),showLegend:!0,showGridLines:!0,yAxisWidth:60,connectNulls:!0,curveType:"natural"})})]})};var eP=e.i(497650);let ez=({endpointData:e})=>{let t=Object.entries(e).map(([e,s])=>{var t,a;return{key:e,endpoint:e,successful_requests:s.metrics.successful_requests,failed_requests:s.metrics.failed_requests,api_requests:s.metrics.api_requests,total_tokens:s.metrics.total_tokens,spend:s.metrics.spend,successRate:(t=s.metrics.successful_requests,0===(a=s.metrics.api_requests)?0:t/a*100)}}),a=[{title:"Endpoint",dataIndex:"endpoint",key:"endpoint",render:e=>(0,s.jsx)("span",{className:"font-medium",children:e})},{title:"Successful / Failed",key:"requests",render:(e,t)=>{let a=t.api_requests>0?t.successful_requests/t.api_requests*100:0,l=t.api_requests>0?t.failed_requests/t.api_requests*100:0,r={"0%":"#22c55e"};return a>0&&a<100&&(r[`${a}%`]="#22c55e",r[`${a+.01}%`]="#ef4444"),r["100%"]=l>0?"#ef4444":"#22c55e",(0,s.jsxs)("div",{className:"flex items-center space-x-3",children:[(0,s.jsx)("div",{className:"flex-1 relative",children:(0,s.jsx)(eP.Progress,{percent:a+l,size:"small",strokeColor:r,showInfo:!1})}),(0,s.jsxs)("div",{className:"flex items-center space-x-2 text-sm min-w-[100px]",children:[(0,s.jsx)("span",{className:"text-green-600 font-medium",children:t.successful_requests.toLocaleString()}),(0,s.jsx)("span",{className:"text-gray-400",children:"/"}),(0,s.jsx)("span",{className:"text-red-600 font-medium",children:t.failed_requests.toLocaleString()})]})]})}},{title:"Total Request",dataIndex:"api_requests",key:"api_requests",render:e=>e.toLocaleString()},{title:"Success Rate",dataIndex:"successRate",key:"successRate",render:e=>{let t=e.toFixed(2);return(0,s.jsxs)("span",{className:e>=95?"text-green-600 font-medium":e>=80?"text-yellow-600 font-medium":"text-red-600 font-medium",children:[t,"%"]})}},{title:"Total Tokens",dataIndex:"total_tokens",key:"total_tokens",render:e=>e.toLocaleString()},{title:"Spend",dataIndex:"spend",key:"spend",render:e=>(0,s.jsx)(B.MoneyCell,{value:e,decimals:2})}];return(0,s.jsx)(V.Table,{columns:a,dataSource:t,pagination:!1})},eB=({userSpendData:e})=>{let t=(0,N.useMemo)(()=>{let s={};return e?.results&&e.results.forEach(e=>{Object.entries(e.breakdown.endpoints||{}).forEach(([e,t])=>{s[e]||(s[e]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:t.metadata||{},api_key_breakdown:{}}),s[e].metrics.spend+=t.metrics.spend,s[e].metrics.prompt_tokens+=t.metrics.prompt_tokens,s[e].metrics.completion_tokens+=t.metrics.completion_tokens,s[e].metrics.total_tokens+=t.metrics.total_tokens,s[e].metrics.api_requests+=t.metrics.api_requests,s[e].metrics.successful_requests+=t.metrics.successful_requests||0,s[e].metrics.failed_requests+=t.metrics.failed_requests||0,s[e].metrics.cache_read_input_tokens+=t.metrics.cache_read_input_tokens||0,s[e].metrics.cache_creation_input_tokens+=t.metrics.cache_creation_input_tokens||0})}),s},[e]);return(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsx)(ez,{endpointData:t}),(0,s.jsx)(eR,{endpointData:t}),(0,s.jsx)(eI,{dailyData:e})]})};var eV=e.i(214541),eW=e.i(325738);let{Text:eH}=T.Typography,eK=({value:e=[],onChange:t,disabled:a,organizationId:l,pageSize:i=20,placeholder:o="Search teams by alias..."})=>{let[d,m]=(0,N.useState)(""),[u,x]=(0,n.useDebouncedState)("",{wait:c.DEBOUNCE_WAIT_MS}),{data:h,fetchNextPage:p,hasNextPage:g,isFetchingNextPage:_,isLoading:j}=(0,ei.useInfiniteTeams)(i,u||void 0,l),f=(0,N.useMemo)(()=>{if(!h?.pages)return[];let e=new Set,s=[];for(let t of h.pages)for(let a of t.teams)e.has(a.team_id)||(e.add(a.team_id),s.push(a));return s},[h]);return(0,s.jsx)(k.Select,{mode:"multiple",showSearch:!0,placeholder:o,value:e,onChange:e=>t?.(e),disabled:a,allowClear:!0,filterOption:!1,onSearch:e=>{m(e),x(e)},searchValue:d,onPopupScroll:e=>{let s=e.currentTarget;(s.scrollTop+s.clientHeight)/s.scrollHeight>=.8&&g&&!_&&p()},loading:j,notFoundContent:j?(0,s.jsx)(r.LoadingOutlined,{spin:!0}):"No teams found",style:{width:"100%"},popupRender:e=>(0,s.jsxs)(s.Fragment,{children:[e,_&&(0,s.jsx)("div",{style:{textAlign:"center",padding:8},children:(0,s.jsx)(r.LoadingOutlined,{spin:!0})})]}),children:f.map(e=>(0,s.jsxs)(k.Select.Option,{value:e.team_id,children:[(0,s.jsx)("span",{className:"font-medium",children:e.team_alias})," ",(0,s.jsxs)(eH,{type:"secondary",children:["(",e.team_id,")"]})]},e.team_id))})};var eG=e.i(174553);let eZ=[{value:"groups",label:"Public Model Name"},{value:"individual",label:"Litellm Model Name"}];function eJ({value:e,onChange:t}){return(0,s.jsx)("div",{className:"flex bg-gray-100 rounded-lg p-1",children:eZ.map(a=>(0,s.jsx)("button",{className:`px-3 py-1 text-sm rounded-md transition-colors ${e===a.value?"bg-white shadow-xs text-gray-900":"text-gray-600 hover:text-gray-900"}`,onClick:()=>t(a.value),children:a.label},a.value))})}var eY=e.i(1023),eQ=e.i(149121);function eX({topModels:e,topModelsLimit:t,setTopModelsLimit:a}){let[l,r]=(0,N.useState)("table"),i=[{header:"Model",accessorKey:"key",cell:e=>e.getValue()||"-"},{header:"Spend (USD)",accessorKey:"spend",meta:{numeric:!0},cell:e=>(0,s.jsx)(B.MoneyCell,{value:e.getValue(),decimals:2})},{header:"Successful",accessorKey:"successful_requests",meta:{numeric:!0},cell:e=>(0,s.jsx)("span",{className:"text-green-600",children:e.getValue()?.toLocaleString()||0})},{header:"Failed",accessorKey:"failed_requests",meta:{numeric:!0},cell:e=>(0,s.jsx)("span",{className:"text-red-600",children:e.getValue()?.toLocaleString()||0})},{header:"Tokens",accessorKey:"tokens",meta:{numeric:!0},cell:e=>e.getValue()?.toLocaleString()||0}],n=e.slice(0,t);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"mb-4 flex justify-between items-center",children:[(0,s.jsx)(b.Segmented,{options:[{label:"5",value:5},{label:"10",value:10},{label:"25",value:25},{label:"50",value:50}],value:t,onChange:e=>a(e)}),(0,s.jsxs)("div",{className:"flex space-x-2",children:[(0,s.jsx)("button",{onClick:()=>r("table"),className:`px-3 py-1 text-sm rounded-md ${"table"===l?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Table View"}),(0,s.jsx)("button",{onClick:()=>r("chart"),className:`px-3 py-1 text-sm rounded-md ${"chart"===l?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Chart View"})]})]}),"chart"===l?(0,s.jsx)("div",{className:"relative max-h-[600px] overflow-y-auto",children:(0,s.jsx)(C.BarChart,{className:"mt-4 cursor-pointer hover:opacity-90",style:{height:52*Math.min(n.length,t)},data:n,index:"key",categories:["spend"],colors:["cyan"],valueFormatter:e=>`$${(0,U.formatNumberWithCommas)(e,2)}`,layout:"vertical",yAxisWidth:200,tickGap:5,showLegend:!1})}):(0,s.jsx)("div",{className:"border rounded-lg overflow-hidden max-h-[600px] overflow-y-auto",children:(0,s.jsx)(eQ.DataTable,{columns:i,data:n,isLoading:!1})})]})}let e0={tag:F.tagDailyActivityCall,team:F.teamDailyActivityCall,organization:F.organizationDailyActivityCall,customer:F.customerDailyActivityCall,agent:F.agentDailyActivityCall,user:F.userDailyActivityCall},e1=({accessToken:e,entityType:t,entityId:l,entityList:i,dateValue:n})=>{let c,b,k,{teams:v}=(0,eV.default)(),[T,q]=(0,N.useState)([]),[S,L]=(0,N.useState)("groups"),[A,D]=(0,N.useState)(5),[E,O]=(0,N.useState)(5),[M,R]=(0,N.useState)(5),$=(0,N.useMemo)(()=>n.from?new Date(n.from):null,[n.from]),I=(0,N.useMemo)(()=>n.to?new Date(n.to):null,[n.to]),P=(0,N.useMemo)(()=>"user"===t?T.length>0?T[0]:null:T.length>0?T:null,[t,T]),z=e0[t],V=!!e&&!!$&&!!I,{data:W,isFetchingMore:H,progress:K,cancelled:Z,cancel:Q}=(0,eU.usePaginatedDailyActivity)({fetchFn:z,args:[e,$,I,P],enabled:V}),{data:X,isFetchingMore:ee,progress:es,cancelled:et,cancel:ea}=(0,eU.usePaginatedDailyActivity)({fetchFn:F.agentDailyActivityCall,args:[e,$,I,null],enabled:V&&"team"===t}),el="groups"===S?"model_groups":"models",er=Y(W,el,v||[]),ei=Y(W,"api_keys",v||[]),en="team"===t?Y(X,"entities",v||[]):{},ec=()=>{let e={};return W.results.forEach(s=>{Object.entries(s.breakdown.providers||{}).forEach(([s,t])=>{e[s]||(e[s]={provider:s,spend:0,requests:0,successful_requests:0,failed_requests:0,tokens:0});try{e[s].spend+=t.metrics.spend,e[s].requests+=t.metrics.api_requests,e[s].successful_requests+=t.metrics.successful_requests,e[s].failed_requests+=t.metrics.failed_requests,e[s].tokens+=t.metrics.total_tokens}catch(e){console.error(`Error processing provider ${s}: ${e}`)}})}),Object.values(e).filter(e=>e.spend>0).sort((e,s)=>s.spend-e.spend)},eo=(e,s)=>{if(i){let s=i.find(s=>s.value===e);if(s)return s.label}return s?.team_alias?s.team_alias:s?.user_email?s.user_email:s?.user_alias?s.user_alias:e},ed=()=>{var e;let s={};return W.results.forEach(e=>{Object.entries(e.breakdown.entities||{}).forEach(([e,t])=>{s[e]||(s[e]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{alias:eo(e,t.metadata),id:e}}),s[e].metrics.spend+=t.metrics.spend,s[e].metrics.api_requests+=t.metrics.api_requests,s[e].metrics.successful_requests+=t.metrics.successful_requests,s[e].metrics.failed_requests+=t.metrics.failed_requests,s[e].metrics.total_tokens+=t.metrics.total_tokens})}),e=Object.values(s).sort((e,s)=>s.metrics.spend-e.metrics.spend),0===T.length?e:e.filter(e=>T.includes(e.metadata.id))},em=t.charAt(0).toUpperCase()+t.slice(1),eu="groups"===S?"Top Public Model Names":"Top Litellm Models",ex=[{key:"cost",label:"Cost",content:(0,s.jsxs)(m.Grid,{numItems:2,className:"gap-2 w-full",children:[(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)(j.Title,{children:[em," Spend Overview"]}),(0,s.jsxs)(m.Grid,{numItems:5,className:"gap-4 mt-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Total Spend"}),(0,s.jsxs)(_.Text,{className:"text-2xl font-bold mt-2",children:["$",(0,U.formatNumberWithCommas)(W.metadata.total_spend,2)]})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Total Requests"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2",children:W.metadata.total_api_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Successful Requests"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-green-600",children:W.metadata.total_successful_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Failed Requests"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-red-600",children:W.metadata.total_failed_requests.toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Total Tokens"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2",children:W.metadata.total_tokens.toLocaleString()})]})]})]})}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsxs)(w.Card,{children:[(0,s.jsx)(w.CardHeader,{children:(0,s.jsx)(w.CardTitle,{className:"text-base font-semibold",children:"Daily Spend"})}),(0,s.jsx)(w.CardContent,{children:(0,s.jsx)(C.BarChart,{data:[...W.results].sort((e,s)=>new Date(e.date).getTime()-new Date(s.date).getTime()),index:"date",categories:["metrics.spend"],colors:["cyan"],valueFormatter:G,yAxisWidth:100,showLegend:!1,customTooltip:({payload:e,active:t})=>{if(!t||!e?.[0])return null;let a=e[0].payload,l=Object.keys(a.breakdown.entities||{}).length;return(0,s.jsxs)("div",{className:"bg-white p-4 shadow-lg rounded-lg border",children:[(0,s.jsx)("p",{className:"font-bold",children:a.date}),(0,s.jsxs)("p",{className:"text-cyan-500",children:["Total Spend: $",(0,U.formatNumberWithCommas)(a.metrics.spend,2)]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Total Requests: ",a.metrics.api_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Successful: ",a.metrics.successful_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Failed: ",a.metrics.failed_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Total Tokens: ",a.metrics.total_tokens]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Total ",em,"s: ",l]}),(0,s.jsxs)("div",{className:"mt-2 border-t pt-2",children:[(0,s.jsxs)("p",{className:"font-semibold",children:["Spend by ",em,":"]}),Object.entries(a.breakdown.entities||{}).sort(([,e],[,s])=>{let t=e.metrics.spend;return s.metrics.spend-t}).slice(0,5).map(([e,t])=>(0,s.jsxs)("p",{className:"text-sm text-gray-600",children:[eo(e,t.metadata),": $",(0,U.formatNumberWithCommas)(t.metrics.spend,2)]},e)),l>5&&(0,s.jsxs)("p",{className:"text-sm text-gray-500 italic",children:["...and ",l-5," more"]})]})]})}})})]})}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsx)(o.Card,{children:(0,s.jsxs)("div",{className:"flex flex-col space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-col space-y-2",children:[(0,s.jsxs)(j.Title,{children:["Spend Per ",em]}),(0,s.jsx)(ew.Subtitle,{className:"text-xs",children:"Showing Top 5 by Spend"}),(0,s.jsxs)("div",{className:"flex items-center text-sm text-gray-500",children:[(0,s.jsxs)("span",{children:["Get Started by Tracking cost per ",em," "]}),(0,s.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/enterprise#spend-tracking",className:"text-blue-500 hover:text-blue-700 ml-1",children:"here"})]})]}),(0,s.jsxs)(m.Grid,{numItems:2,className:"gap-6",children:[(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsx)(C.BarChart,{className:"mt-4 h-52",data:ed().slice(0,5).map(e=>({...e,metadata:{...e.metadata,alias_display:e.metadata.alias&&e.metadata.alias.length>15?`${e.metadata.alias.slice(0,15)}...`:e.metadata.alias}})),index:"metadata.alias_display",categories:["metrics.spend"],colors:["cyan"],valueFormatter:G,layout:"vertical",showLegend:!1,yAxisWidth:150,customTooltip:({payload:e,active:t})=>{if(!t||!e?.[0])return null;let a=e[0].payload;return(0,s.jsxs)("div",{className:"bg-white p-4 shadow-lg rounded-lg border",children:[(0,s.jsx)("p",{className:"font-bold",children:a.metadata.alias}),(0,s.jsxs)("p",{className:"text-cyan-500",children:["Spend: $",(0,U.formatNumberWithCommas)(a.metrics.spend,4)]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Requests: ",a.metrics.api_requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-green-600",children:["Successful: ",a.metrics.successful_requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-red-600",children:["Failed: ",a.metrics.failed_requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Tokens: ",a.metrics.total_tokens.toLocaleString()]})]})}})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsx)("div",{className:"h-52 overflow-y-auto",children:(0,s.jsxs)(eq.Table,{children:[(0,s.jsx)(eS.TableHead,{children:(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eA.TableHeaderCell,{children:em}),(0,s.jsx)(eA.TableHeaderCell,{children:"Spend"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-green-600",children:"Successful"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-red-600",children:"Failed"}),(0,s.jsx)(eA.TableHeaderCell,{children:"Tokens"})]})}),(0,s.jsx)(eD.TableBody,{children:ed().filter(e=>e.metrics.spend>0).map(e=>(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eF.TableCell,{children:e.metadata.alias}),(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(B.MoneyCell,{value:e.metrics.spend,decimals:4})}),(0,s.jsx)(eF.TableCell,{className:"text-green-600",children:e.metrics.successful_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{className:"text-red-600",children:e.metrics.failed_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{children:e.metrics.total_tokens.toLocaleString()})]},e.metadata.id))})]})})})]})]})})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Top Virtual Keys"}),(0,s.jsx)(eY.default,{topKeys:(c={},W.results.forEach(e=>{let{breakdown:s}=e,{entities:t}=s,a=Object.keys(t).reduce((e,s)=>{let{api_key_breakdown:a}=t[s];return Object.keys(a).forEach(t=>{let l={tag:s,usage:a[t].metrics.spend};e[t]?e[t].push(l):e[t]=[l]}),e},{});Object.entries(e.breakdown.api_keys||{}).forEach(([e,s])=>{c[e]||(c[e]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{key_alias:s.metadata.key_alias,team_id:s.metadata.team_id||null,tags:a[e]||[]}}),c[e].metrics.spend+=s.metrics.spend,c[e].metrics.prompt_tokens+=s.metrics.prompt_tokens,c[e].metrics.completion_tokens+=s.metrics.completion_tokens,c[e].metrics.total_tokens+=s.metrics.total_tokens,c[e].metrics.api_requests+=s.metrics.api_requests,c[e].metrics.successful_requests+=s.metrics.successful_requests,c[e].metrics.failed_requests+=s.metrics.failed_requests,c[e].metrics.cache_read_input_tokens+=s.metrics.cache_read_input_tokens||0,c[e].metrics.cache_creation_input_tokens+=s.metrics.cache_creation_input_tokens||0})}),Object.entries(c).map(([e,s])=>({api_key:e,key_alias:s.metadata.key_alias||"-",tags:s.metadata.tags||"-",spend:s.metrics.spend})).sort((e,s)=>s.spend-e.spend).slice(0,A)),teams:null,showTags:"tag"===t,topKeysLimit:A,setTopKeysLimit:D})]})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsx)(j.Title,{children:"agent"===t?"Top Agents":eu}),(0,s.jsx)(eJ,{value:S,onChange:L})]}),(0,s.jsx)(eX,{topModels:(b={},W.results.forEach(e=>{Object.entries(e.breakdown[el]||{}).forEach(([e,s])=>{b[e]||(b[e]={spend:0,requests:0,successful_requests:0,failed_requests:0,tokens:0});try{b[e].spend+=s.metrics.spend}catch(t){console.error(`Error adding spend for ${e}: ${t}, got metrics: ${JSON.stringify(s)}`)}b[e].requests+=s.metrics.api_requests,b[e].successful_requests+=s.metrics.successful_requests,b[e].failed_requests+=s.metrics.failed_requests,b[e].tokens+=s.metrics.total_tokens})}),Object.entries(b).map(([e,s])=>({key:e,...s})).sort((e,s)=>s.spend-e.spend).slice(0,E)),topModelsLimit:E,setTopModelsLimit:O})]})}),"team"===t&&(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Top Agents Driving Spend"}),(0,s.jsx)(eX,{topModels:(k={},X.results.forEach(e=>{Object.entries(e.breakdown.entities||{}).forEach(([e,s])=>{k[e]||(k[e]={spend:0,requests:0,successful_requests:0,failed_requests:0,tokens:0,agent_name:s.metadata?.agent_name||e}),k[e].spend+=s.metrics.spend,k[e].requests+=s.metrics.api_requests,k[e].successful_requests+=s.metrics.successful_requests,k[e].failed_requests+=s.metrics.failed_requests,k[e].tokens+=s.metrics.total_tokens})}),Object.entries(k).map(([e,s])=>({key:s.agent_name,...s})).sort((e,s)=>s.spend-e.spend).slice(0,M)),topModelsLimit:M,setTopModelsLimit:R})]})}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsx)(o.Card,{children:(0,s.jsxs)("div",{className:"flex flex-col space-y-4",children:[(0,s.jsx)(j.Title,{children:"Provider Usage"}),(0,s.jsxs)(m.Grid,{numItems:2,children:[(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsx)(eW.DonutChart,{className:"mt-4 h-40",data:ec(),index:"provider",category:"spend",valueFormatter:e=>`$${(0,U.formatNumberWithCommas)(e,2)}`,colors:["cyan","blue","indigo","violet","purple"],showLabel:!0,startAngle:90,endAngle:-270})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(eq.Table,{children:[(0,s.jsx)(eS.TableHead,{children:(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eA.TableHeaderCell,{children:"Provider"}),(0,s.jsx)(eA.TableHeaderCell,{children:"Spend"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-green-600",children:"Successful"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-red-600",children:"Failed"}),(0,s.jsx)(eA.TableHeaderCell,{children:"Tokens"})]})}),(0,s.jsx)(eD.TableBody,{children:ec().map(e=>(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eF.TableCell,{children:(0,s.jsxs)("div",{className:"flex items-center space-x-2",children:[e.provider&&(0,s.jsx)(eG.Logo,{provider:e.provider,className:"w-4 h-4"}),(0,s.jsx)("span",{children:e.provider})]})}),(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(B.MoneyCell,{value:e.spend,decimals:2})}),(0,s.jsx)(eF.TableCell,{className:"text-green-600",children:e.successful_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{className:"text-red-600",children:e.failed_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{children:e.tokens.toLocaleString()})]},e.provider))})]})})]})]})})})]})},{key:"models",label:"agent"===t?"Request / Token Consumption":"Model Activity",content:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"flex justify-end mt-2 mb-4",children:(0,s.jsx)(eJ,{value:S,onChange:L})}),(0,s.jsx)(J,{modelMetrics:er,hidePromptCachingMetrics:"agent"===t})]})},..."team"===t?[{key:"agents",label:"Agent Activity",content:(0,s.jsx)(J,{modelMetrics:en})}]:[],{key:"keys",label:"Key Activity",content:(0,s.jsx)(J,{modelMetrics:ei,hidePromptCachingMetrics:"agent"===t})},{key:"endpoints",label:"Endpoint Activity",content:(0,s.jsx)(eB,{userSpendData:W})}];return(0,s.jsxs)("div",{style:{width:"100%"},className:"relative",children:[H&&(0,s.jsx)(f.Alert,{banner:!0,type:"warning",className:"mb-2",message:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("span",{children:[(0,s.jsx)(r.LoadingOutlined,{spin:!0,className:"mr-2"}),"Currently fetching spend data: fetched ",K.currentPage," / ",K.totalPages," pages. Charts will update periodically as data loads. Moving off of this page will stop and reset this. To continue using the UI in the meantime,"," ",(0,s.jsxs)("a",{href:window.location.href,target:"_blank",rel:"noopener noreferrer",children:["open a new tab ",(0,s.jsx)(a.ExportOutlined,{})]}),"."]}),(0,s.jsx)(y.Button,{type:"primary",danger:!0,onClick:Q,children:"Stop"})]})}),Z&&(0,s.jsx)(f.Alert,{banner:!0,type:"info",className:"mb-2",message:(0,s.jsxs)("span",{children:["Showing partial data (",K.currentPage,"/",K.totalPages," pages loaded)"]})}),ee&&"team"===t&&(0,s.jsx)(f.Alert,{banner:!0,type:"warning",className:"mb-2",message:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("span",{children:[(0,s.jsx)(r.LoadingOutlined,{spin:!0,className:"mr-2"}),"Currently fetching agent data: fetched ",es.currentPage," / ",es.totalPages," pages. Charts will update periodically as data loads. Moving off of this page will stop and reset this. To continue using the UI in the meantime,"," ",(0,s.jsxs)("a",{href:window.location.href,target:"_blank",rel:"noopener noreferrer",children:["open a new tab ",(0,s.jsx)(a.ExportOutlined,{})]}),"."]}),(0,s.jsx)(y.Button,{type:"primary",danger:!0,onClick:ea,children:"Stop"})]})}),et&&"team"===t&&(0,s.jsx)(f.Alert,{banner:!0,type:"info",className:"mb-2",message:(0,s.jsxs)("span",{children:["Showing partial agent data (",es.currentPage,"/",es.totalPages," pages loaded)"]})}),"team"===t&&(0,s.jsxs)("div",{className:"mb-4",children:[(0,s.jsx)(_.Text,{className:"mb-2",children:"Filter by team"}),(0,s.jsx)(eK,{value:T,onChange:q})]}),(0,s.jsx)(ej,{dateValue:n,entityType:t,spendData:W,showFilters:"team"!==t&&null!==i&&i.length>0,filterLabel:`Filter by ${t}`,filterPlaceholder:`Select ${t} to filter...`,selectedFilters:T,onFiltersChange:q,filterOptions:(()=>{if(i)return i})()||void 0,filterMode:"user"===t?"single":"multiple",teams:v||[]}),(0,s.jsxs)(x.TabGroup,{children:[(0,s.jsx)(h.TabList,{variant:"solid",className:"mt-1",children:ex.map(({key:e,label:t})=>(0,s.jsx)(u.Tab,{children:t},e))}),(0,s.jsx)(g.TabPanels,{children:ex.map(({key:e,content:t})=>(0,s.jsx)(p.TabPanel,{children:t},e))})]})]})};var e2=e.i(793130),e4=e.i(418371);let e6=({loading:e,isDateChanging:t,providerSpend:a})=>{let[r,i]=(0,N.useState)(!1),[n,c]=(0,N.useState)(!1),u=a.filter(e=>e.provider?.toLowerCase()==="unknown"?n:!!r||e.spend>0);return(0,s.jsxs)(o.Card,{className:"h-full",children:[(0,s.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,s.jsx)(j.Title,{children:"Spend by Provider"}),(0,s.jsxs)("div",{className:"flex items-center gap-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("label",{className:"text-sm text-gray-700",children:"Show Zero Spend"}),(0,s.jsx)(e2.Switch,{checked:r,onChange:i})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[(0,s.jsx)("label",{className:"text-sm text-gray-700",children:"Show Unknown"}),(0,s.jsx)(v.Tooltip,{title:"Requests that failed to route to a provider",children:(0,s.jsx)(l.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-600"})})]}),(0,s.jsx)(e2.Switch,{checked:n,onChange:c})]})]})]}),e?(0,s.jsx)(eb,{isDateChanging:t}):(0,s.jsxs)(m.Grid,{numItems:2,children:[(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsx)(eW.DonutChart,{className:"mt-4 h-40",data:u,index:"provider",category:"spend",valueFormatter:e=>`$${(0,U.formatNumberWithCommas)(e,2)}`,colors:["cyan"],showLabel:!0,startAngle:90,endAngle:-270})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(eq.Table,{children:[(0,s.jsx)(eS.TableHead,{children:(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eA.TableHeaderCell,{children:"Provider"}),(0,s.jsx)(eA.TableHeaderCell,{children:"Spend"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-green-600",children:"Successful"}),(0,s.jsx)(eA.TableHeaderCell,{className:"text-red-600",children:"Failed"}),(0,s.jsx)(eA.TableHeaderCell,{children:"Tokens"})]})}),(0,s.jsx)(eD.TableBody,{children:u.map(e=>(0,s.jsxs)(eL.TableRow,{children:[(0,s.jsx)(eF.TableCell,{children:(0,s.jsxs)("div",{className:"flex items-center space-x-2",children:[e.provider&&(0,s.jsx)(e4.ProviderLogo,{provider:e.provider,className:"w-4 h-4"}),(0,s.jsx)("span",{children:e.provider})]})}),(0,s.jsx)(eF.TableCell,{children:(0,s.jsx)(B.MoneyCell,{value:e.spend,decimals:2})}),(0,s.jsx)(eF.TableCell,{className:"text-green-600",children:e.successful_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{className:"text-red-600",children:e.failed_requests.toLocaleString()}),(0,s.jsx)(eF.TableCell,{children:e.tokens.toLocaleString()})]},e.provider))})]})})]})]})};var e5=e.i(311451),e3=e.i(918789);let{TextArea:e8}=e5.Input,e7={get_usage_data:"📊",get_team_usage_data:"👥",get_tag_usage_data:"🏷️"},e9=({step:e})=>{let t=e7[e.tool_name]||"🔧",a=e.arguments,l=a.start_date&&a.end_date?`${a.start_date} → ${a.end_date}`:"",r=a.team_ids||a.tags||a.user_id||"";return(0,s.jsxs)("div",{className:"flex items-start gap-2 px-3 py-2 rounded-lg bg-gray-100 border border-gray-200 text-xs",children:[(0,s.jsx)("span",{className:"shrink-0 mt-0.5",children:"running"===e.status?(0,s.jsx)(ea.Spin,{size:"small"}):"error"===e.status?(0,s.jsx)("span",{className:"text-red-500",children:"✗"}):(0,s.jsx)("span",{className:"text-green-600",children:"✓"})}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsxs)("div",{className:"font-medium text-gray-700",children:[t," ",e.tool_label]}),l&&(0,s.jsx)("div",{className:"text-gray-500 mt-0.5",children:l}),r&&(0,s.jsxs)("div",{className:"text-gray-500 mt-0.5",children:["Filter: ",r]}),"error"===e.status&&e.error&&(0,s.jsx)("div",{className:"text-red-600 mt-0.5",children:e.error})]})]})},se=({content:e})=>(0,s.jsx)(e3.default,{components:{p:({children:e})=>(0,s.jsx)("p",{className:"mb-2 last:mb-0",children:e}),strong:({children:e})=>(0,s.jsx)("strong",{className:"font-semibold",children:e}),ul:({children:e})=>(0,s.jsx)("ul",{className:"list-disc pl-4 mb-2 space-y-0.5",children:e}),ol:({children:e})=>(0,s.jsx)("ol",{className:"list-decimal pl-4 mb-2 space-y-0.5",children:e}),li:({children:e})=>(0,s.jsx)("li",{children:e}),h1:({children:e})=>(0,s.jsx)("h4",{className:"font-semibold text-sm mt-2 mb-1",children:e}),h2:({children:e})=>(0,s.jsx)("h4",{className:"font-semibold text-sm mt-2 mb-1",children:e}),h3:({children:e})=>(0,s.jsx)("h4",{className:"font-semibold text-sm mt-2 mb-1",children:e}),code:({children:e,className:t})=>t?.includes("language-")?(0,s.jsx)("pre",{className:"bg-gray-100 rounded-sm p-2 my-1 overflow-x-auto text-xs",children:(0,s.jsx)("code",{children:e})}):(0,s.jsx)("code",{className:"px-1 py-0.5 rounded-sm bg-gray-100 text-xs font-mono",children:e}),table:({children:e})=>(0,s.jsx)("div",{className:"overflow-x-auto my-2",children:(0,s.jsx)("table",{className:"text-xs border-collapse w-full",children:e})}),th:({children:e})=>(0,s.jsx)("th",{className:"border border-gray-200 px-2 py-1 bg-gray-50 font-medium text-left",children:e}),td:({children:e})=>(0,s.jsx)("td",{className:"border border-gray-200 px-2 py-1",children:e})},children:e}),ss=({open:e,onClose:t,accessToken:a})=>{let[l,r]=(0,N.useState)([]),[i,n]=(0,N.useState)(""),[c,o]=(0,N.useState)(!1),[d,m]=(0,N.useState)(void 0),[u,x]=(0,N.useState)([]),[h,p]=(0,N.useState)(!1),[g,_]=(0,N.useState)(""),[j,f]=(0,N.useState)(null),[b,v]=(0,N.useState)([]),T=(0,N.useRef)(null),C=(0,N.useRef)(null);(0,N.useEffect)(()=>{e&&0===u.length&&w()},[e]),(0,N.useEffect)(()=>{"function"==typeof T.current?.scrollIntoView&&T.current.scrollIntoView({behavior:"smooth"})},[l,g,b,j]);let w=async()=>{if(a){p(!0);try{let e=await (0,F.modelHubCall)(a);if(e?.data?.length>0){let s=e.data.map(e=>e.model_group).sort();x(s)}}catch(e){console.error("Failed to load models:",e)}finally{p(!1)}}},q=async()=>{if(!a||!i.trim()||c)return;let e=[...l,{role:"user",content:i.trim()}];r(e),n(""),o(!0),_(""),f(null),v([]);let s=new AbortController;C.current=s;let t="",m=[];try{await (0,F.usageAiChatStream)(a,e.slice(-20).map(e=>({role:e.role,content:e.content})),d||"",e=>{f(null),t+=e,_(t)},()=>{f(null),v([]),r(e=>[...e,{role:"assistant",content:t,toolCalls:m.length>0?[...m]:void 0}]),_("")},e=>{f(null),v([]),r(s=>[...s,{role:"assistant",content:`Error: ${e}`}]),_("")},e=>{f(e)},e=>{let s=m.findIndex(s=>s.tool_name===e.tool_name);s>=0?m[s]={...e}:m.push({...e}),v([...m])},s.signal)}catch(t){if(t?.name==="AbortError"||s.signal.aborted)return;let e=t?.message||"Failed to get response. Please try again.";r(s=>[...s,{role:"assistant",content:`Error: ${e}`}]),_("")}finally{o(!1),C.current=null}};return(0,s.jsxs)("div",{"data-testid":"usage-ai-chat-panel",className:`fixed top-0 right-0 h-full bg-white border-l border-gray-200 shadow-2xl z-50 flex flex-col transition-transform duration-300 ease-in-out ${e?"translate-x-0":"translate-x-full"}`,style:{width:420},children:[(0,s.jsxs)("div",{className:"px-5 pt-5 pb-3 border-b border-gray-100 shrink-0",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("svg",{className:"w-5 h-5 text-blue-600",viewBox:"0 0 16 16",fill:"currentColor",children:(0,s.jsx)("path",{d:"M8 1l1.5 3.5L13 6l-3.5 1.5L8 11 6.5 7.5 3 6l3.5-1.5L8 1zm4 7l.75 1.75L14.5 10.5l-1.75.75L12 13l-.75-1.75L9.5 10.5l1.75-.75L12 8zM4 9l.75 1.75L6.5 11.5l-1.75.75L4 14l-.75-1.75L1.5 11.5l1.75-.75L4 9z"})}),(0,s.jsx)("h3",{className:"text-base font-semibold text-gray-900",children:"Ask AI"})]}),(0,s.jsx)("button",{onClick:()=>{C.current&&C.current.abort(),t()},className:"text-gray-400 hover:text-gray-600 transition-colors p-1 rounded-md hover:bg-gray-100",children:(0,s.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),(0,s.jsx)("p",{className:"text-xs text-gray-500",children:"Ask about your spend, models, keys, and trends"})]}),(0,s.jsx)("div",{className:"px-5 py-3 border-b border-gray-100 shrink-0",children:(0,s.jsx)(k.Select,{placeholder:"Select a model (optional, defaults to gpt-4o-mini)",value:d,onChange:e=>m(e),loading:h,showSearch:!0,allowClear:!0,size:"small",className:"w-full",options:u.map(e=>({label:e,value:e})),filterOption:(e,s)=>(s?.label??"").toLowerCase().includes(e.toLowerCase())})}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto p-4 space-y-3 bg-gray-50",children:[0===l.length&&!g&&!c&&(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center h-full text-gray-400",children:[(0,s.jsx)("svg",{className:"w-8 h-8 mb-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"})}),(0,s.jsx)("p",{className:"text-sm font-medium",children:"Ask a question about your usage"}),(0,s.jsx)("p",{className:"text-xs mt-1",children:'e.g. "Which model costs me the most?"'})]}),l.map((e,t)=>(0,s.jsx)("div",{children:"user"===e.role?(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)("div",{className:"max-w-[88%] rounded-xl px-3.5 py-2 text-sm leading-relaxed bg-blue-600 text-white",children:e.content})}):(0,s.jsxs)("div",{className:"space-y-2",children:[e.toolCalls&&e.toolCalls.length>0&&(0,s.jsx)("div",{className:"space-y-1.5",children:e.toolCalls.map((e,t)=>(0,s.jsx)(e9,{step:e},t))}),(0,s.jsx)("div",{className:"max-w-[95%] rounded-xl px-3.5 py-2.5 text-sm leading-relaxed bg-white border border-gray-200 text-gray-800",children:(0,s.jsx)(se,{content:e.content})})]})},t)),c&&b.length>0&&(0,s.jsx)("div",{className:"space-y-1.5",children:b.map((e,t)=>(0,s.jsx)(e9,{step:e},t))}),c&&!g&&(0,s.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 text-xs text-gray-500",children:[(0,s.jsx)(ea.Spin,{size:"small"}),(0,s.jsx)("span",{className:"italic",children:j||"Thinking..."})]}),g&&(0,s.jsx)("div",{className:"max-w-[95%] rounded-xl px-3.5 py-2.5 text-sm leading-relaxed bg-white border border-gray-200 text-gray-800",children:(0,s.jsx)(se,{content:g})}),(0,s.jsx)("div",{ref:T})]}),(0,s.jsxs)("div",{className:"px-4 py-3 border-t border-gray-200 bg-white shrink-0",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(e8,{value:i,onChange:e=>n(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),q())},placeholder:"Ask about your usage...",autoSize:{minRows:1,maxRows:3},className:"flex-1",disabled:c}),(0,s.jsx)(y.Button,{type:"primary",onClick:q,disabled:!i.trim()||c,loading:c,children:"Send"})]}),(0,s.jsxs)("div",{className:"flex justify-between items-center mt-2",children:[(0,s.jsx)("button",{onClick:()=>{r([]),_(""),v([]),f(null)},className:"text-xs text-gray-400 hover:text-gray-600 transition-colors",disabled:0===l.length,children:"Clear chat"}),(0,s.jsx)("span",{className:"text-xs text-gray-400",children:"Enter to send"})]})]})]})};e.i(247167);var st=e.i(931067);let sa={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M894 462c30.9 0 43.8-39.7 18.7-58L530.8 126.2a31.81 31.81 0 00-37.6 0L111.3 404c-25.1 18.2-12.2 58 18.8 58H192v374h-72c-4.4 0-8 3.6-8 8v52c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-52c0-4.4-3.6-8-8-8h-72V462h62zM512 196.7l271.1 197.2H240.9L512 196.7zM264 462h117v374H264V462zm189 0h117v374H453V462zm307 374H642V462h118v374z"}}]},name:"bank",theme:"outlined"};var sl=e.i(9583),sr=N.forwardRef(function(e,s){return N.createElement(sl.default,(0,st.default)({},e,{ref:s,icon:sa}))});let si={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-600-80h56c4.4 0 8-3.6 8-8V560c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V384c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v320c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V462c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v242c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v400c0 4.4 3.6 8 8 8z"}}]},name:"bar-chart",theme:"outlined"};var sn=N.forwardRef(function(e,s){return N.createElement(sl.default,(0,st.default)({},e,{ref:s,icon:si}))}),sc=e.i(160818);let so={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM305.8 637.7c3.1 3.1 8.1 3.1 11.3 0l138.3-137.6L583 628.5c3.1 3.1 8.2 3.1 11.3 0l275.4-275.3c3.1-3.1 3.1-8.2 0-11.3l-39.6-39.6a8.03 8.03 0 00-11.3 0l-230 229.9L461.4 404a8.03 8.03 0 00-11.3 0L266.3 586.7a8.03 8.03 0 000 11.3l39.5 39.7z"}}]},name:"line-chart",theme:"outlined"};var sd=N.forwardRef(function(e,s){return N.createElement(sl.default,(0,st.default)({},e,{ref:s,icon:so}))}),sm=e.i(983561);let su={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M922.9 701.9H327.4l29.9-60.9 496.8-.9c16.8 0 31.2-12 34.2-28.6l68.8-385.1c1.8-10.1-.9-20.5-7.5-28.4a34.99 34.99 0 00-26.6-12.5l-632-2.1-5.4-25.4c-3.4-16.2-18-28-34.6-28H96.5a35.3 35.3 0 100 70.6h125.9L246 312.8l58.1 281.3-74.8 122.1a34.96 34.96 0 00-3 36.8c6 11.9 18.1 19.4 31.5 19.4h62.8a102.43 102.43 0 00-20.6 61.7c0 56.6 46 102.6 102.6 102.6s102.6-46 102.6-102.6c0-22.3-7.4-44-20.6-61.7h161.1a102.43 102.43 0 00-20.6 61.7c0 56.6 46 102.6 102.6 102.6s102.6-46 102.6-102.6c0-22.3-7.4-44-20.6-61.7H923c19.4 0 35.3-15.8 35.3-35.3a35.42 35.42 0 00-35.4-35.2zM305.7 253l575.8 1.9-56.4 315.8-452.3.8L305.7 253zm96.9 612.7c-17.4 0-31.6-14.2-31.6-31.6 0-17.4 14.2-31.6 31.6-31.6s31.6 14.2 31.6 31.6a31.6 31.6 0 01-31.6 31.6zm325.1 0c-17.4 0-31.6-14.2-31.6-31.6 0-17.4 14.2-31.6 31.6-31.6s31.6 14.2 31.6 31.6a31.6 31.6 0 01-31.6 31.6z"}}]},name:"shopping-cart",theme:"outlined"};var sx=N.forwardRef(function(e,s){return N.createElement(sl.default,(0,st.default)({},e,{ref:s,icon:su}))}),sh=e.i(232164),sp=e.i(645526),sg=e.i(771674),s_=e.i(906579);let sj=[{value:"global",label:"Global Usage",showForAdmin:"Global Usage",showForNonAdmin:"Your Usage",description:"View usage across all resources",descriptionForAdmin:"View usage across all resources",descriptionForNonAdmin:"View your usage",icon:(0,s.jsx)(sc.GlobalOutlined,{style:{fontSize:"16px"}})},{value:"my-usage",label:"Your Usage",description:"View your own usage",icon:(0,s.jsx)(sg.UserOutlined,{style:{fontSize:"16px"}}),adminOnly:!0},{value:"organization",label:"Organization Usage",showForAdmin:"Organization Usage",showForNonAdmin:"Your Organization Usage",description:"View organization-level usage",descriptionForAdmin:"View usage across all organizations",descriptionForNonAdmin:"View your organization's usage",icon:(0,s.jsx)(sr,{style:{fontSize:"16px"}})},{value:"team",label:"Team Usage",description:"View usage by team",icon:(0,s.jsx)(sp.TeamOutlined,{style:{fontSize:"16px"}})},{value:"customer",label:"Customer Usage",description:"View usage by customer accounts",icon:(0,s.jsx)(sx,{style:{fontSize:"16px"}}),adminOnly:!0},{value:"tag",label:"Tag Usage",description:"View usage grouped by tags",icon:(0,s.jsx)(sh.TagsOutlined,{style:{fontSize:"16px"}}),adminOnly:!0},{value:"agent",label:"Agent Usage (A2A)",description:"View usage by AI agents",icon:(0,s.jsx)(sm.RobotOutlined,{style:{fontSize:"16px"}}),adminOnly:!0},{value:"user",label:"User Usage",description:"View usage by individual users",icon:(0,s.jsx)(sg.UserOutlined,{style:{fontSize:"16px"}}),adminOnly:!0},{value:"user-agent-activity",label:"User Agent Activity",description:"View detailed user agent activity logs",icon:(0,s.jsx)(sd,{style:{fontSize:"16px"}}),adminOnly:!0}],sf=({value:e,onChange:t,isAdmin:a,canViewTagUsage:l=!1,title:r="Usage View",description:i="Select the usage data you want to view","data-id":n})=>{let c=sj.filter(e=>"tag"===e.value&&!!l||!e.adminOnly||!!a).map(e=>{let s=e.label,t=e.description;return e.showForAdmin&&e.showForNonAdmin&&(s=a?e.showForAdmin:e.showForNonAdmin),e.descriptionForAdmin&&e.descriptionForNonAdmin&&(t=a?e.descriptionForAdmin:e.descriptionForNonAdmin),{value:e.value,label:s,description:t,icon:e.icon,badgeText:e.badgeText}});return(0,s.jsx)("div",{className:"w-full","data-id":n,children:(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-start gap-4",children:[(0,s.jsxs)("div",{className:"flex items-stretch gap-2 min-w-0",children:[(0,s.jsx)("div",{className:"shrink-0 flex items-center",children:(0,s.jsx)(sn,{style:{fontSize:"32px"}})}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-0.5 leading-tight",children:r}),(0,s.jsx)("p",{className:"text-xs text-gray-600 leading-tight",children:i})]})]}),(0,s.jsx)("div",{className:"shrink-0",children:(0,s.jsx)(k.Select,{value:e,onChange:t,className:"w-54 sm:w-64 md:w-72",size:"large",options:c.map(e=>({value:e.value,label:e.label})),optionRender:e=>{let t=c.find(s=>s.value===e.value);return t?(0,s.jsxs)("div",{className:"flex items-center gap-2 py-1",children:[(0,s.jsx)("div",{className:"shrink-0 mt-0.5",children:t.icon}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("div",{className:"text-sm font-medium text-gray-900",children:t.label}),(0,s.jsx)("div",{className:"text-xs text-gray-600 mt-0.5",children:t.description})]}),t.badgeText&&(0,s.jsx)("div",{className:"items-center",children:(0,s.jsx)(s_.Badge,{color:"blue",count:t.badgeText})})]}):e.label},labelRender:e=>{let t=c.find(s=>s.value===e.value);return t?(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("div",{children:t.icon}),(0,s.jsx)("span",{className:"text-sm",children:t.label})]}):e.label}})})]})})},sy=({teams:e,organizations:R})=>{let $,{accessToken:I,userRole:P,userId:z,premiumUser:B}=(0,A.default)(),[V,W]=(0,N.useState)(null),[H,K]=(0,N.useState)(!1),[Z,Q]=(0,N.useState)(!1),[X,ee]=(0,N.useState)(!1),es=(0,N.useMemo)(()=>new Date(Date.now()-6048e5),[]),et=(0,N.useMemo)(()=>new Date,[]),[ea,el]=(0,N.useState)({from:es,to:et}),[ei,en]=(0,N.useState)([]),{data:ec=[]}=(()=>{let{accessToken:e,userRole:s}=(0,A.default)();return S.$api.useQuery("get","/customer/list",{},{enabled:!!e&&L.all_admin_roles.includes(s),select:e=>e??[]})})(),{data:eo}=(0,q.useAgents)(),{data:ed}=(0,D.useCurrentUser)(),em=L.all_admin_roles.includes(P||""),eu=em||L.internalUserRoles.includes(P||""),[ex,eh]=(0,N.useState)(""),[ep,eg]=(0,n.useDebouncedState)("",{wait:c.DEBOUNCE_WAIT_MS}),{data:ej,fetchNextPage:ey,hasNextPage:ek,isFetchingNextPage:ev,isLoading:eT}=((e=M,s)=>{let{accessToken:t,userRole:a}=(0,A.default)();return(0,E.useInfiniteQuery)({queryKey:O.list({filters:{pageSize:e,...s&&{searchEmail:s}}}),queryFn:async({pageParam:a})=>await (0,F.userListCall)(t,null,a,e,s||null),initialPageParam:1,getNextPageParam:e=>{if(e.page{if(!ej?.pages)return[];let e=new Set,s=[];for(let t of ej.pages)for(let a of t.users)e.has(a.user_id)||(e.add(a.user_id),s.push({value:a.user_id,label:a.user_alias?`${a.user_alias} (${a.user_id})`:a.user_email?`${a.user_email} (${a.user_id})`:a.user_id}));return s},[ej]),[eC,ew]=(0,N.useState)(em?null:z||null),[eq,eS]=(0,N.useState)("groups"),[eL,eA]=(0,N.useState)(!1),[eD,eF]=(0,N.useState)(!1),[eE,eR]=(0,N.useState)(!1),[e$,eI]=(0,N.useState)("global"),[eP,ez]=(0,N.useState)(!0),[eV,eW]=(0,N.useState)(5),[eH,eK]=(0,N.useState)(5),[eG,eZ]=(0,N.useState)(!1);(0,N.useEffect)(()=>{!em&&z&&ew(z)},[em,z]);let eQ="my-usage"!==e$&&em?eC:z||null,eX=(0,N.useMemo)(()=>ea.from?new Date(ea.from):null,[ea.from]),e0=(0,N.useMemo)(()=>ea.to?new Date(ea.to):null,[ea.to]);(0,N.useEffect)(()=>{if(!I)return;let e=!1;return(async()=>{try{let s=await (0,F.tagListCall)(I,eX,e0);if(e)return;en(Object.values(s).map(e=>({label:e.name,value:e.name})))}catch(s){e||console.error("Failed to fetch tag list",s)}})(),()=>{e=!0}},[I,eX,e0]);let e2=(0,N.useRef)(0);(0,N.useEffect)(()=>{if(!I||!eX||!e0)return;let e=++e2.current;Q(!0),K(!1),W(null),(0,F.userDailyActivityAggregatedCall)(I,eX,e0,eQ).then(s=>{e2.current===e&&(W(s),Q(!1),ee(!1))}).catch(()=>{e2.current===e&&(K(!0),Q(!1))})},[I,eX,e0,eQ]);let e4=(0,eU.usePaginatedDailyActivity)({fetchFn:F.userDailyActivityCall,args:[I,eX,e0,eQ],enabled:H&&!!I&&!!eX&&!!e0}),e5=(0,N.useMemo)(()=>V||(H?e4.data:{results:[],metadata:{}}),[V,H,e4.data]),e3=Z||e4.loading;(0,N.useEffect)(()=>{H&&!e4.loading&&e4.data.results.length>0&&ee(!1)},[H,e4.loading,e4.data.results.length]);let e8=(0,N.useCallback)(e=>{ee(!0),el(e)},[]),e7=e5.metadata?.total_spend||0,e9=(0,N.useMemo)(()=>{let e={};return e5.results.forEach(s=>{Object.entries(s.breakdown.models||{}).forEach(([s,t])=>{e[s]||(e[s]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{},api_key_breakdown:{}}),e[s].metrics.spend+=t.metrics.spend,e[s].metrics.prompt_tokens+=t.metrics.prompt_tokens,e[s].metrics.completion_tokens+=t.metrics.completion_tokens,e[s].metrics.total_tokens+=t.metrics.total_tokens,e[s].metrics.api_requests+=t.metrics.api_requests,e[s].metrics.successful_requests+=t.metrics.successful_requests||0,e[s].metrics.failed_requests+=t.metrics.failed_requests||0,e[s].metrics.cache_read_input_tokens+=t.metrics.cache_read_input_tokens||0,e[s].metrics.cache_creation_input_tokens+=t.metrics.cache_creation_input_tokens||0})}),Object.entries(e).map(([e,s])=>({key:e,spend:s.metrics.spend,requests:s.metrics.api_requests,successful_requests:s.metrics.successful_requests,failed_requests:s.metrics.failed_requests,tokens:s.metrics.total_tokens})).sort((e,s)=>s.spend-e.spend).slice(0,eH)},[e5.results,eH]),se=(0,N.useMemo)(()=>{let e={};return e5.results.forEach(s=>{Object.entries(s.breakdown.model_groups||{}).forEach(([s,t])=>{e[s]||(e[s]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{},api_key_breakdown:{}}),e[s].metrics.spend+=t.metrics.spend,e[s].metrics.prompt_tokens+=t.metrics.prompt_tokens,e[s].metrics.completion_tokens+=t.metrics.completion_tokens,e[s].metrics.total_tokens+=t.metrics.total_tokens,e[s].metrics.api_requests+=t.metrics.api_requests,e[s].metrics.successful_requests+=t.metrics.successful_requests||0,e[s].metrics.failed_requests+=t.metrics.failed_requests||0,e[s].metrics.cache_read_input_tokens+=t.metrics.cache_read_input_tokens||0,e[s].metrics.cache_creation_input_tokens+=t.metrics.cache_creation_input_tokens||0})}),Object.entries(e).map(([e,s])=>({key:e,spend:s.metrics.spend,requests:s.metrics.api_requests,successful_requests:s.metrics.successful_requests,failed_requests:s.metrics.failed_requests,tokens:s.metrics.total_tokens})).sort((e,s)=>s.spend-e.spend).slice(0,eH)},[e5.results,eH]),st=(0,N.useMemo)(()=>{let e={};return e5.results.forEach(s=>{Object.entries(s.breakdown.providers||{}).forEach(([s,t])=>{e[s]||(e[s]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{},api_key_breakdown:{}}),e[s].metrics.spend+=t.metrics.spend,e[s].metrics.prompt_tokens+=t.metrics.prompt_tokens,e[s].metrics.completion_tokens+=t.metrics.completion_tokens,e[s].metrics.total_tokens+=t.metrics.total_tokens,e[s].metrics.api_requests+=t.metrics.api_requests,e[s].metrics.successful_requests+=t.metrics.successful_requests||0,e[s].metrics.failed_requests+=t.metrics.failed_requests||0,e[s].metrics.cache_read_input_tokens+=t.metrics.cache_read_input_tokens||0,e[s].metrics.cache_creation_input_tokens+=t.metrics.cache_creation_input_tokens||0})}),Object.entries(e).map(([e,s])=>({provider:e,spend:s.metrics.spend,requests:s.metrics.api_requests,successful_requests:s.metrics.successful_requests,failed_requests:s.metrics.failed_requests,tokens:s.metrics.total_tokens}))},[e5.results]),sa=(0,N.useMemo)(()=>{let e={};return e5.results.forEach(s=>{Object.entries(s.breakdown.api_keys||{}).forEach(([s,t])=>{e[s]||(e[s]={metrics:{spend:0,prompt_tokens:0,completion_tokens:0,total_tokens:0,api_requests:0,successful_requests:0,failed_requests:0,cache_read_input_tokens:0,cache_creation_input_tokens:0},metadata:{key_alias:t.metadata.key_alias,team_id:null,tags:t.metadata.tags||[]}}),e[s].metrics.spend+=t.metrics.spend,e[s].metrics.prompt_tokens+=t.metrics.prompt_tokens,e[s].metrics.completion_tokens+=t.metrics.completion_tokens,e[s].metrics.total_tokens+=t.metrics.total_tokens,e[s].metrics.api_requests+=t.metrics.api_requests,e[s].metrics.successful_requests+=t.metrics.successful_requests,e[s].metrics.failed_requests+=t.metrics.failed_requests,e[s].metrics.cache_read_input_tokens+=t.metrics.cache_read_input_tokens||0,e[s].metrics.cache_creation_input_tokens+=t.metrics.cache_creation_input_tokens||0})}),Object.entries(e).map(([e,s])=>({api_key:e,key_alias:s.metadata.key_alias||"-",tags:s.metadata.tags||[],spend:s.metrics.spend})).sort((e,s)=>s.spend-e.spend).slice(0,eV)},[e5.results,eV]),sl=(0,N.useMemo)(()=>[...e5.results].sort((e,s)=>new Date(e.date).getTime()-new Date(s.date).getTime()),[e5.results]),sr=(0,N.useMemo)(()=>Y(e5,"groups"===eq?"model_groups":"models",e),[e5,eq,e]),si=(0,N.useMemo)(()=>Y(e5,"api_keys",e),[e5,e]),sn=(0,N.useMemo)(()=>Y(e5,"mcp_servers",e),[e5,e]);return(0,s.jsxs)("div",{style:{width:"100%"},className:"p-8 relative",children:[(0,s.jsx)("div",{className:"flex items-end justify-between gap-6 mb-6",children:(0,s.jsxs)("div",{className:"flex-1",children:[(0,s.jsxs)("div",{className:"flex items-end justify-between gap-6 mb-4 w-full",children:[(0,s.jsx)(sf,{value:e$,onChange:e=>eI(e),isAdmin:em,canViewTagUsage:eu}),(0,s.jsx)(ef.default,{value:ea,onValueChange:e8})]}),e4.isFetchingMore&&(0,s.jsx)(f.Alert,{banner:!0,type:"warning",className:"mb-2",message:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("span",{children:[(0,s.jsx)(r.LoadingOutlined,{spin:!0,className:"mr-2"}),"Currently fetching spend data: fetched ",e4.progress.currentPage," /"," ",e4.progress.totalPages," pages. Charts will update periodically as data loads. Moving off of this page will stop and reset this. To continue using the UI in the meantime,"," ",(0,s.jsxs)("a",{href:window.location.href,target:"_blank",rel:"noopener noreferrer",children:["open a new tab ",(0,s.jsx)(a.ExportOutlined,{})]}),"."]}),(0,s.jsx)(y.Button,{type:"primary",danger:!0,onClick:e4.cancel,children:"Stop"})]})}),e4.cancelled&&(0,s.jsx)(f.Alert,{banner:!0,type:"info",className:"mb-2",message:(0,s.jsxs)("span",{children:["Showing partial data (",e4.progress.currentPage,"/",e4.progress.totalPages," ","pages loaded)"]})}),("global"===e$||"my-usage"===e$)&&(0,s.jsxs)(s.Fragment,{children:[em&&"global"===e$&&(0,s.jsxs)("div",{className:"mb-4",children:[(0,s.jsx)(_.Text,{className:"mb-2",children:"Filter by user"}),(0,s.jsx)(k.Select,{showSearch:!0,allowClear:!0,style:{width:"100%"},placeholder:"Select user to filter...",value:eC,onChange:e=>ew(e??null),filterOption:!1,onSearch:e=>{eh(e),eg(e)},searchValue:ex,onPopupScroll:e=>{let s=e.currentTarget;(s.scrollTop+s.clientHeight)/s.scrollHeight>=.8&&ek&&!ev&&ey()},loading:eT,notFoundContent:eT?(0,s.jsx)(r.LoadingOutlined,{spin:!0}):"No users found",options:eN,popupRender:e=>(0,s.jsxs)(s.Fragment,{children:[e,ev&&(0,s.jsx)("div",{style:{textAlign:"center",padding:8},children:(0,s.jsx)(r.LoadingOutlined,{spin:!0})})]})})]}),(0,s.jsxs)(x.TabGroup,{children:[(0,s.jsxs)("div",{className:"flex justify-between items-center",children:[(0,s.jsxs)(h.TabList,{variant:"solid",className:"mt-1",children:[(0,s.jsx)(u.Tab,{children:"Cost"}),(0,s.jsx)(u.Tab,{children:"Model Activity"}),(0,s.jsx)(u.Tab,{children:"Key Activity"}),(0,s.jsx)(u.Tab,{children:"MCP Server Activity"}),(0,s.jsx)(u.Tab,{children:"Endpoint Activity"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(y.Button,{onClick:()=>eR(!0),icon:(0,s.jsx)("svg",{className:"w-4 h-4",viewBox:"0 0 16 16",fill:"currentColor",children:(0,s.jsx)("path",{d:"M8 1l1.5 3.5L13 6l-3.5 1.5L8 11 6.5 7.5 3 6l3.5-1.5L8 1zm4 7l.75 1.75L14.5 10.5l-1.75.75L12 13l-.75-1.75L9.5 10.5l1.75-.75L12 8zM4 9l.75 1.75L6.5 11.5l-1.75.75L4 14l-.75-1.75L1.5 11.5l1.75-.75L4 9z"})}),children:"Ask AI"}),(0,s.jsx)(y.Button,{onClick:()=>eF(!0),icon:(0,s.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,s.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})}),children:"Export Data"})]})]}),(0,s.jsxs)(g.TabPanels,{children:[(0,s.jsx)(p.TabPanel,{children:(0,s.jsxs)(m.Grid,{numItems:2,className:"gap-2 w-full",children:[(0,s.jsxs)(d.Col,{numColSpan:2,children:[(0,s.jsx)("div",{className:"flex items-center gap-4 mt-2 mb-2",children:(0,s.jsxs)(_.Text,{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content text-lg",children:["Project Spend"," ",ea.from&&ea.to&&(0,s.jsxs)(s.Fragment,{children:[ea.from.toLocaleDateString("en-US",{month:"short",day:"numeric",year:ea.from.getFullYear()!==ea.to.getFullYear()?"numeric":void 0})," - ",ea.to.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})]})]})}),(0,s.jsx)(eM.default,{userSpend:e7,selectedTeam:null,userMaxBudget:ed?.max_budget||null})]}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Usage Metrics"}),(0,s.jsxs)(m.Grid,{numItems:5,className:"gap-4 mt-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Total Requests"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2",children:e5.metadata?.total_api_requests?.toLocaleString()||0})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Successful Requests"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-green-600",children:e5.metadata?.total_successful_requests?.toLocaleString()||0})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(j.Title,{children:"Failed Requests"}),(0,s.jsx)(v.Tooltip,{title:"Includes requests that failed to route to a provider, tool usage failures, and other request errors where the provider cannot be determined.",children:(0,s.jsx)(l.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-600"})})]}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-red-600",children:e5.metadata?.total_failed_requests?.toLocaleString()||0})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Average Cost per Request"}),(0,s.jsxs)(_.Text,{className:"text-2xl font-bold mt-2",children:["$",(0,U.formatNumberWithCommas)((e7||0)/(e5.metadata?.total_api_requests||1),4)]})]}),(0,s.jsxs)(o.Card,{className:"cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>eZ(!eG),children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(j.Title,{children:"Total Tokens"}),eG?(0,s.jsx)(t.DownOutlined,{className:"text-gray-400 text-xs"}):(0,s.jsx)(i.RightOutlined,{className:"text-gray-400 text-xs"})]}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2",children:e5.metadata?.total_tokens?.toLocaleString()||0})]})]}),eG&&(0,s.jsxs)(m.Grid,{numItems:4,className:"gap-4 mt-4",children:[(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Input Tokens"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-blue-600",children:(e5.metadata?.total_prompt_tokens||0).toLocaleString()})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Output Tokens"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-cyan-600",children:e5.metadata?.total_completion_tokens?.toLocaleString()||0})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Cache Read Tokens"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-green-600",children:e5.metadata?.total_cache_read_input_tokens?.toLocaleString()||0})]}),(0,s.jsxs)(o.Card,{children:[(0,s.jsx)(j.Title,{children:"Cache Write Tokens"}),(0,s.jsx)(_.Text,{className:"text-2xl font-bold mt-2 text-purple-600",children:e5.metadata?.total_cache_creation_input_tokens?.toLocaleString()||0})]})]})]})}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsxs)(w.Card,{children:[(0,s.jsx)(w.CardHeader,{children:(0,s.jsx)(w.CardTitle,{className:"text-base font-semibold",children:"Daily Spend"})}),(0,s.jsx)(w.CardContent,{children:e3?(0,s.jsx)(eb,{isDateChanging:X}):(0,s.jsx)(C.BarChart,{data:sl,index:"date",categories:["metrics.spend"],colors:["cyan"],valueFormatter:G,yAxisWidth:100,showLegend:!1,customTooltip:({payload:e,active:t})=>{if(!t||!e?.[0])return null;let a=e[0].payload;return(0,s.jsxs)("div",{className:"bg-white p-4 shadow-lg rounded-lg border",children:[(0,s.jsx)("p",{className:"font-bold",children:a.date}),(0,s.jsxs)("p",{className:"text-cyan-500",children:["Spend: $",(0,U.formatNumberWithCommas)(a.metrics.spend,2)]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Requests: ",a.metrics.api_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Successful: ",a.metrics.successful_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Failed: ",a.metrics.failed_requests]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Tokens: ",a.metrics.total_tokens]})]})}})})]})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(o.Card,{className:"h-full",children:[(0,s.jsx)(j.Title,{children:"Top Virtual Keys"}),(0,s.jsx)(eY.default,{topKeys:sa,teams:null,topKeysLimit:eV,setTopKeysLimit:eW})]})}),(0,s.jsx)(d.Col,{numColSpan:1,children:(0,s.jsxs)(o.Card,{className:"h-full",children:[(0,s.jsx)(j.Title,{children:"groups"===eq?"Top Public Model Names":"Top Litellm Models"}),(0,s.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,s.jsx)(b.Segmented,{options:[{label:"5",value:5},{label:"10",value:10},{label:"25",value:25},{label:"50",value:50}],value:eH,onChange:e=>eK(e)}),(0,s.jsx)(eJ,{value:eq,onChange:eS})]}),e3?(0,s.jsx)(eb,{isDateChanging:X}):(0,s.jsx)("div",{className:"relative max-h-[600px] overflow-y-auto",children:($="groups"===eq?se:e9,(0,s.jsx)(C.BarChart,{className:"mt-4",style:{height:52*Math.min($.length,eH)},data:$,index:"key",categories:["spend"],colors:["cyan"],valueFormatter:G,layout:"vertical",yAxisWidth:200,showLegend:!1,customTooltip:({payload:e,active:t})=>{if(!t||!e?.[0])return null;let a=e[0].payload;return(0,s.jsxs)("div",{className:"bg-white p-4 shadow-lg rounded-lg border",children:[(0,s.jsx)("p",{className:"font-bold",children:a.key}),(0,s.jsxs)("p",{className:"text-cyan-500",children:["Spend: $",(0,U.formatNumberWithCommas)(a.spend,2)]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Total Requests: ",a.requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-green-600",children:["Successful: ",a.successful_requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-red-600",children:["Failed: ",a.failed_requests.toLocaleString()]}),(0,s.jsxs)("p",{className:"text-gray-600",children:["Tokens: ",a.tokens.toLocaleString()]})]})}}))})]})}),(0,s.jsx)(d.Col,{numColSpan:2,children:(0,s.jsx)(e6,{loading:e3,isDateChanging:X,providerSpend:st})})]})}),(0,s.jsxs)(p.TabPanel,{children:[(0,s.jsx)("div",{className:"flex justify-end mt-2 mb-4",children:(0,s.jsx)(eJ,{value:eq,onChange:eS})}),(0,s.jsx)(J,{modelMetrics:sr})]}),(0,s.jsx)(p.TabPanel,{children:(0,s.jsx)(J,{modelMetrics:si})}),(0,s.jsx)(p.TabPanel,{children:(0,s.jsx)(J,{modelMetrics:sn})}),(0,s.jsx)(p.TabPanel,{children:(0,s.jsx)(eB,{userSpendData:e5})})]})]})]}),"organization"===e$&&(0,s.jsx)(e1,{accessToken:I,entityType:"organization",userID:z,userRole:P,dateValue:ea,entityList:R?.map(e=>({label:e.organization_alias,value:e.organization_id}))||null,premiumUser:B}),"team"===e$&&(0,s.jsx)(e1,{accessToken:I,entityType:"team",userID:z,userRole:P,entityList:e?.map(e=>({label:e.team_alias,value:e.team_id}))||null,premiumUser:B,dateValue:ea}),"customer"===e$&&(0,s.jsx)(e1,{accessToken:I,entityType:"customer",userID:z,userRole:P,entityList:ec?.map(e=>({label:e.alias||e.user_id,value:e.user_id}))||null,premiumUser:B,dateValue:ea}),"tag"===e$&&(0,s.jsxs)(s.Fragment,{children:[eP&&(0,s.jsx)(f.Alert,{banner:!0,type:"info",message:"Reusable credentials are automatically tracked as tags",description:(0,s.jsxs)(T.Typography.Text,{children:["When a reusable credential is used, it will appear as a tag prefixed with"," ",(0,s.jsx)(T.Typography.Text,{code:!0,children:"Credential: "}),"in this view."]}),closable:!0,onClose:()=>ez(!1),className:"mb-5"}),(0,s.jsx)(e1,{accessToken:I,entityType:"tag",userID:z,userRole:P,entityList:ei,premiumUser:B,dateValue:ea})]}),"agent"===e$&&(0,s.jsx)(e1,{accessToken:I,entityType:"agent",userID:z,userRole:P,entityList:eo?.agents?.map(e=>({label:e.agent_name,value:e.agent_id}))||null,premiumUser:B,dateValue:ea}),"user"===e$&&(0,s.jsx)(e1,{accessToken:I,entityType:"user",userID:z,userRole:P,entityList:eN.length>0?eN:null,premiumUser:B,dateValue:ea}),"user-agent-activity"===e$&&(0,s.jsx)(eO,{accessToken:I,userRole:P,dateValue:ea})]})}),(0,s.jsx)(er,{isOpen:eL,onClose:()=>eA(!1),accessToken:I}),(0,s.jsx)(e_,{isOpen:eD,onClose:()=>eF(!1),entityType:"team",spendData:{results:e5.results,metadata:e5.metadata},dateRange:ea,selectedFilters:[],customTitle:"Export Usage Data"}),(0,s.jsx)(ss,{open:eE,onClose:()=>eR(!1),accessToken:I})]})};var sb=e.i(109799);e.s(["default",0,function(){(0,A.default)();let{data:e}=(0,ei.useTeams)(),{data:t}=(0,sb.useOrganizations)();return(0,s.jsx)(sy,{teams:e??[],organizations:t??[]})}],986888)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0kzod24rqslaj.js b/litellm/proxy/_experimental/out/_next/static/chunks/0kzod24rqslaj.js new file mode 100644 index 00000000000..99aa3f28218 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0kzod24rqslaj.js @@ -0,0 +1,23 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},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])},204258,e=>{"use strict";var t,n,r,o=e.i(843476);e.s([],958842),e.i(958842),e.i(247167);var s=e.i(271645),i=e.i(667865),a=e.i(552245),l=e.i(951437),c=e.i(788015),d=e.i(675606),u=e.i(56434),p=e.i(223910),f=e.i(733332);let m=s.createContext(void 0);function h(){let e=s.useContext(m);if(void 0===e)throw Error((0,f.default)(15));return e}var g=e.i(209407);let x=((t={}).open="data-open",t.closed="data-closed",t[t.startingStyle=g.TransitionStatusDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=g.TransitionStatusDataAttributes.endingStyle]="endingStyle",t),b=((n={}).panelOpen="data-panel-open",n),v={[x.open]:""},y={[x.closed]:""},S={open:e=>e?v:y,...g.transitionStatusMapping},j=s.forwardRef(function(e,t){let{render:n,className:r,defaultOpen:f=!1,disabled:h=!1,onOpenChange:g,open:x,style:b,...v}=e,y=(0,i.useStableCallback)(g),j=function(e){let{open:t,defaultOpen:n,onOpenChange:r,disabled:o}=e,[a,f]=(0,l.useControlled)({controlled:t,default:n,name:"Collapsible",state:"open"}),{mounted:m,setMounted:h,transitionStatus:g}=(0,p.useTransitionStatus)(a,!0,!0),x=(0,c.useBaseUiId)(),[b,v]=s.useState(),y=b??x,S=(0,i.useStableCallback)(e=>{let t=!a,n=(0,d.createChangeEventDetails)(u.REASONS.triggerPress,e.nativeEvent);r(t,n),n.isCanceled||f(t)});return s.useMemo(()=>({disabled:o,handleTrigger:S,mounted:m,open:a,panelId:y,setMounted:h,setOpen:f,setPanelIdState:v,transitionStatus:g}),[o,S,m,a,y,h,f,v,g])}({open:x,defaultOpen:f,onOpenChange:y,disabled:h}),w=s.useMemo(()=>({open:j.open,disabled:j.disabled,transitionStatus:j.transitionStatus}),[j.open,j.disabled,j.transitionStatus]),C=s.useMemo(()=>({...j,onOpenChange:y,state:w}),[j,y,w]),k=(0,a.useRenderElement)("div",e,{state:w,ref:t,props:v,stateAttributesMapping:S});return(0,o.jsx)(m.Provider,{value:C,children:k})});var w=e.i(540886);let C={open:e=>e?{[b.panelOpen]:""}:null,...g.transitionStatusMapping},k=s.forwardRef(function(e,t){let{panelId:n,open:r,handleTrigger:o,state:s,disabled:i}=h(),{className:l,disabled:c=i,render:d,nativeButton:u=!0,style:p,...f}=e,{getButtonProps:m,buttonRef:g}=(0,w.useButton)({disabled:c,focusableWhenDisabled:!0,native:u});return(0,a.useRenderElement)("button",e,{state:s,ref:[t,g],props:[{"aria-controls":r?n:void 0,"aria-expanded":r,onClick:o},f,m],stateAttributesMapping:C})});var _=e.i(146376),R=e.i(377570),N=e.i(574735),E=e.i(828918),T=e.i(708445),O=e.i(446265),P=e.i(333848),M=e.i(137584),z=e.i(222640);let A={height:void 0,width:void 0};function I(e){return{height:e.scrollHeight,width:e.scrollWidth}}function F(e){return e.split(",").map(e=>e.trim()).some(e=>""!==e&&Number.parseFloat(e)>0)}function B(e,t,n){let r=e.style.getPropertyValue(t),o=e.style.getPropertyPriority(t);return e.style.setProperty(t,n),()=>{""===r?e.style.removeProperty(t):e.style.setProperty(t,r,o)}}let H=((r={}).collapsiblePanelHeight="--collapsible-panel-height",r.collapsiblePanelWidth="--collapsible-panel-width",r),L=s.forwardRef(function(e,t){let{className:n,hiddenUntilFound:r,keepMounted:o,render:l,id:c,style:p,...f}=e,{mounted:m,onOpenChange:g,open:b,panelId:v,setMounted:y,setPanelIdState:j,setOpen:w,state:C,transitionStatus:k}=h();(0,_.useIsoLayoutEffect)(()=>{if(c)return j(c),()=>{j(void 0)}},[c,j]);let{height:L,props:D,ref:W,shouldPreventOpenAnimation:$,shouldRender:V,transitionStatus:K,width:U}=function(e){let{externalRef:t,hiddenUntilFound:n,id:r,keepMounted:o,mounted:a,onOpenChange:l,open:c,setMounted:p,setOpen:f,transitionStatus:m}=e,h=s.useRef(null),g=s.useRef(null),[b,v]=s.useState(A),y=s.useRef(A),S=s.useRef(!1),j=s.useRef(c),w=s.useRef(!1),[C,k]=s.useState(!1),R=s.useRef(null),H=(0,E.useMergedRefs)(t,h),L=(0,O.useValueAsRef)({mounted:a,open:c}),D=(0,z.useAnimationsFinished)(h,!1,!1),W=!c&&!a,$=C?"idle":m,V=c&&(j.current||w.current),K=!c&&a&&"css-animation"===g.current&&void 0===b.height&&void 0===b.width?y.current:b,U=n&&W&&"css-animation"!==g.current,q=(0,i.useStableCallback)((e,t=!0)=>{t&&(y.current=e),v(e)}),G=(0,i.useStableCallback)(()=>{R.current?.(),R.current=null}),J=(0,i.useStableCallback)(e=>{G(),R.current=()=>{R.current=null,e()}}),Y=(0,i.useStableCallback)(()=>{c&&a&&"css-animation"===g.current&&(w.current=!0)});(0,_.useIsoLayoutEffect)(()=>{C&&"starting"!==m&&k(!1)},[C,m]),s.useEffect(()=>()=>{Y(),G()},[Y,G]),(0,_.useIsoLayoutEffect)(()=>{let e=h.current;if(!e)return;!c&&R.current&&G();let t=function(e,t=!1){let n=(0,P.ownerWindow)(e).getComputedStyle(e),r=(n.animationName.split(",").map(e=>e.trim()).some(e=>""!==e&&"none"!==e)||t)&&F(n.animationDuration),o=F(n.transitionDuration);return r&&o||o?"css-transition":r?"css-animation":"none"}(e,V);if(g.current=t,c&&"idle"===m&&j.current&&"css-animation"===t){y.current=I(e);return}if(c&&"starting"===m){let n=S.current;if(S.current=!1,"none"===t){q(I(e)),k(!0);return}if("css-transition"===t){let t=function(e){let t={"justify-content":e.style.justifyContent,"align-items":e.style.alignItems,"align-content":e.style.alignContent,"justify-items":e.style.justifyItems};function n(){Object.entries(t).forEach(([t,n])=>{""===n?e.style.removeProperty(t):e.style.setProperty(t,n)})}Object.keys(t).forEach(t=>{e.style.setProperty(t,"initial","important")});let r=T.AnimationFrame.request(n);return()=>{T.AnimationFrame.cancel(r),n()}}(e);return q(I(e)),n&&(J(B(e,"transition-duration","0s")),k(!0)),t}if("css-animation"===t){if(q(I(e)),!n)return void B(e,"animation-name","none")();let t=B(e,"animation-name","none"),r=B(e,"animation-duration","0s");return t(),J(r),k(!0),void 0}}if(!c&&a&&("idle"===m||"starting"===m)){if(j.current=!1,w.current=!1,"none"===t){q(A,!1),p(!1);return}q(I(e));return}if("ending"!==m)return;if("none"===t)return void p(!1);let n=I(e);(n.height??0)>0||(n.width??0)>0?(q(n),"css-animation"===t&&B(e,"animation-name","none")()):p(!1)},[a,c,G,q,p,J,V,m]),(0,M.useOpenChangeComplete)({enabled:c&&a&&"idle"===$,open:!0,ref:h,onComplete(){c&&q(A,!1)}}),s.useEffect(()=>{if(c||!a||"ending"!==$||!h.current)return;let e=new AbortController,t=-1;function n(){L.current.open||(p(!1),q(A,!1))}return t=T.AnimationFrame.request(()=>{e.signal.aborted||D(n,e.signal)}),()=>{T.AnimationFrame.cancel(t),e.abort()}},[L,a,c,$,D,q,p]),(0,_.useIsoLayoutEffect)(()=>{let e=h.current;e&&n&&W&&e.setAttribute("hidden","until-found")},[W,n]),s.useEffect(function(){let e=h.current;if(e)return(0,N.addEventListener)(e,"beforematch",function(e){let t=(0,d.createChangeEventDetails)(u.REASONS.none,e);l(!0,t),t.isCanceled||(S.current=!0,f(!0))})},[l,f]);let X=o||n||a||c;return{height:K.height,props:{...U?{[x.startingStyle]:""}:void 0,hidden:W,id:r},ref:H,shouldPreventOpenAnimation:V,shouldRender:X,transitionStatus:$,width:K.width}}({externalRef:t,hiddenUntilFound:r??!1,id:v,keepMounted:o??!1,mounted:m,onOpenChange:g,open:b,setMounted:y,setOpen:w,transitionStatus:k}),q={...C,transitionStatus:K},G=(0,R.resolveStyle)(p,q),J=(0,a.useRenderElement)("div",{...e,style:void 0},{state:q,ref:W,props:[D,{style:{[H.collapsiblePanelHeight]:void 0===L?"auto":`${L}px`,[H.collapsiblePanelWidth]:void 0===U?"auto":`${U}px`}},f,G?{style:G}:void 0,$?{style:{animationName:"none"}}:void 0],stateAttributesMapping:S});return V?J:null});e.s(["Panel",0,L,"Root",0,j,"Trigger",0,k],596315);var D=e.i(596315),D=D;e.s(["Collapsible",0,function({...e}){return(0,o.jsx)(D.Root,{"data-slot":"collapsible",...e})},"CollapsibleContent",0,function({...e}){return(0,o.jsx)(D.Panel,{"data-slot":"collapsible-content",...e})},"CollapsibleTrigger",0,function({...e}){return(0,o.jsx)(D.Trigger,{"data-slot":"collapsible-trigger",...e})}],204258)},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)},699375,e=>{"use strict";var t,n=e.i(843476);e.s([],924305),e.i(924305),e.i(247167);var r=e.i(271645),o=e.i(951437),s=e.i(828918),i=e.i(146376),a=e.i(502077),l=e.i(956789),c=e.i(333848),d=e.i(552245),u=e.i(176782),p=e.i(788015),f=e.i(540886),m=e.i(733332);let h=r.createContext(void 0);var g=e.i(875812);let x=((t={}).checked="data-checked",t.unchecked="data-unchecked",t.disabled="data-disabled",t.readonly="data-readonly",t.required="data-required",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),b={...g.fieldValidityMapping,checked:e=>e?{[x.checked]:""}:{[x.unchecked]:""}};var v=e.i(469690),y=e.i(381104),S=e.i(884708),j=e.i(247778),w=e.i(31421),C=e.i(538489),k=e.i(675606),_=e.i(56434),R=e.i(606039);let N=r.forwardRef(function(e,t){let{checked:m,className:g,defaultChecked:x,"aria-labelledby":N,form:E,id:T,inputRef:O,name:P,nativeButton:M=!1,onCheckedChange:z,readOnly:A=!1,required:I=!1,disabled:F=!1,render:B,uncheckedValue:H,value:L,style:D,...W}=e,{clearErrors:$}=(0,S.useFormContext)(),{state:V,setTouched:K,setDirty:U,validityData:q,setFilled:G,setFocused:J,validationMode:Y,disabled:X,name:Q,validation:Z}=(0,v.useFieldRootContext)(),{labelId:ee}=(0,j.useLabelableContext)(),et=X||F,en=Q??P,er=r.useRef(null),eo=(0,s.useMergedRefs)(er,O,Z.inputRef),es=r.useRef(null),ei=(0,p.useBaseUiId)(),ea=(0,C.useLabelableId)({id:T,implicit:!1,controlRef:es}),el=M?void 0:ea,[ec,ed]=(0,o.useControlled)({controlled:m,default:!!x,name:"Switch",state:"checked"});(0,y.useRegisterFieldControl)(es,ei,ec,void 0,!et,P),(0,i.useIsoLayoutEffect)(()=>{er.current&&G(er.current.checked)},[er,G]),(0,R.useValueChanged)(ec,()=>{$(en),U(ec!==q.initialValue),G(ec),Z.change(ec)});let{getButtonProps:eu,buttonRef:ep}=(0,f.useButton)({disabled:et,native:M}),ef=(0,w.useAriaLabelledBy)(N,ee,er,!M,el),em=(0,u.mergeProps)({checked:ec,disabled:et,form:E,id:el,name:en,required:I,style:en?a.visuallyHiddenInput:a.visuallyHidden,tabIndex:-1,type:"checkbox","aria-hidden":!0,ref:eo,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(A)return void e.preventDefault();let t=e.currentTarget.checked,n=(0,k.createChangeEventDetails)(_.REASONS.none,e.nativeEvent);z?.(t,n),n.isCanceled||ed(t)},onFocus(){es.current?.focus()}},e=>Z.getValidationProps(et,e),void 0!==L?{value:L}:l.EMPTY_OBJECT),eh=r.useMemo(()=>({...V,checked:ec,disabled:et,readOnly:A,required:I}),[V,ec,et,A,I]),eg=(0,d.useRenderElement)("span",e,{state:eh,ref:[t,es,ep],props:[{id:M?ea:ei,role:"switch","aria-checked":ec,"aria-readonly":A||void 0,"aria-required":I||void 0,"aria-labelledby":ef,onFocus(){et||J(!0)},onBlur(){let e=er.current;e&&!et&&(K(!0),J(!1),"onBlur"===Y&&Z.commit(e.checked))},onClick(e){if(A||et)return;e.preventDefault();let t=er.current;t&&t.dispatchEvent(new((0,c.ownerWindow)(t)).PointerEvent("click",{bubbles:!0,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey}))}},W,eu,e=>Z.getValidationProps(et,e)],stateAttributesMapping:b});return(0,n.jsxs)(h.Provider,{value:eh,children:[eg,!ec&&en&&void 0!==H&&(0,n.jsx)("input",{type:"hidden",form:E,name:en,value:H,disabled:et}),(0,n.jsx)("input",{...em,suppressHydrationWarning:!0})]})}),E=r.forwardRef(function(e,t){let{render:n,className:o,style:s,...i}=e,a=function(){let e=r.useContext(h);if(void 0===e)throw Error((0,m.default)(63));return e}();return(0,d.useRenderElement)("span",e,{state:a,ref:t,stateAttributesMapping:b,props:i})});e.s(["Root",0,N,"Thumb",0,E],450994);var T=e.i(450994),T=T,O=e.i(115504);e.s(["Switch",0,function({className:e,size:t="default",...r}){return(0,n.jsx)(T.Root,{"data-slot":"switch","data-size":t,className:(0,O.cn)("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",e),...r,children:(0,n.jsx)(T.Thumb,{"data-slot":"switch-thumb",className:"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"})})}],699375)},337822,e=>{"use strict";var t,n=e.i(843476);e.s([],158421),e.i(158421);var r=e.i(271645),o=e.i(956789),s=e.i(17989),i=e.i(46420);e.i(247167);var a=e.i(733332);let l=r.createContext(void 0);function c(e){let t=r.useContext(l);if(void 0===t&&!e)throw Error((0,a.default)(47));return t}var d=e.i(174080),u=e.i(301252),p=e.i(616269),f=e.i(439957),m=e.i(56434),h=e.i(264111),g=e.i(116786),x=e.i(990627),b=e.i(638396);let v={...g.popupStoreSelectors,disabled:(0,p.createSelector)(e=>e.disabled),instantType:(0,p.createSelector)(e=>e.instantType),openMethod:(0,p.createSelector)(e=>e.openMethod),openChangeReason:(0,p.createSelector)(e=>e.openChangeReason),modal:(0,p.createSelector)(e=>e.modal),focusManagerModal:(0,p.createSelector)(e=>e.focusManagerModal),stickIfOpen:(0,p.createSelector)(e=>e.stickIfOpen),titleElementId:(0,p.createSelector)(e=>e.titleElementId),descriptionElementId:(0,p.createSelector)(e=>e.descriptionElementId),openOnHover:(0,p.createSelector)(e=>e.openOnHover),closeDelay:(0,p.createSelector)(e=>e.closeDelay),hasViewport:(0,p.createSelector)(e=>e.hasViewport)};class y extends u.ReactStore{constructor(e,t,n=!1){const o={...(0,g.createInitialPopupStoreState)(),disabled:!1,modal:!1,focusManagerModal:!1,instantType:void 0,openMethod:null,openChangeReason:null,titleElementId:void 0,descriptionElementId:void 0,stickIfOpen:!0,nested:!1,openOnHover:!1,closeDelay:0,hasViewport:!1,...e},s=new x.PopupTriggerMap;o.open&&e?.mounted===void 0&&(o.mounted=!0),o.floatingRootContext=(0,g.createPopupFloatingRootContext)(s,t,n),super(o,{popupRef:r.createRef(),backdropRef:r.createRef(),internalBackdropRef:r.createRef(),onOpenChange:void 0,onOpenChangeComplete:void 0,triggerFocusTargetRef:r.createRef(),beforeContentFocusGuardRef:r.createRef(),stickIfOpenTimeout:new f.Timeout,triggerElements:s},v)}setOpen=(e,t)=>{let n=t.reason===m.REASONS.triggerHover,r=t.reason===m.REASONS.triggerPress&&0===t.event.detail,o=!e&&(t.reason===m.REASONS.escapeKey||null==t.reason),s=(0,h.attachPreventUnmountOnClose)(t),i=this.select("activeTriggerId");if(e||t.reason!==m.REASONS.closePress||null!=t.trigger||null==i||(t.trigger=this.context.triggerElements.getById(i)??this.select("activeTriggerElement")??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let a=()=>{let n={open:e,openChangeReason:t.reason};(0,h.setPopupOpenState)(n,e,t.trigger,s()),this.update(n)};n?(this.set("stickIfOpen",!0),this.context.stickIfOpenTimeout.start(b.PATIENT_CLICK_THRESHOLD,()=>{this.set("stickIfOpen",!1)}),d.flushSync(a)):a(),r||o?this.set("instantType",r?"click":"dismiss"):t.reason===m.REASONS.focusOut?this.set("instantType","focus"):this.set("instantType",void 0)};static useStore(e,t){let{store:n,internalStore:o}=(0,h.usePopupStore)(e,(e,n)=>new y(t,e,n));return r.useEffect(()=>o?.disposeEffect(),[o]),n}disposeEffect=()=>this.context.stickIfOpenTimeout.disposeEffect()}var S=e.i(675606),j=e.i(176782);function w({props:e}){let{children:t,open:o,defaultOpen:s=!1,onOpenChange:a,onOpenChangeComplete:c,modal:d=!1,handle:u,triggerId:p,defaultTriggerId:f=null}=e,g=y.useStore(u?.store,{modal:d,open:s,openProp:o,activeTriggerId:f,triggerIdProp:p});(0,h.useInitialOpenSync)(g,o,s,f),g.useControlledProp("openProp",o),g.useControlledProp("triggerIdProp",p);let x=g.useState("open"),b=g.useState("mounted"),v=g.useState("payload"),j=null!=(0,i.useFloatingParentNodeId)();g.useContextCallback("onOpenChange",a),g.useContextCallback("onOpenChangeComplete",c),(0,h.usePopupRootSync)(g,x),(0,h.useImplicitActiveTrigger)(g);let{forceUnmount:k}=(0,h.useOpenStateTransitions)(x,g,()=>{g.update({stickIfOpen:!0,openChangeReason:null})});g.useSyncedValues({modal:d,nested:j}),r.useEffect(()=>{x||g.context.stickIfOpenTimeout.clear()},[g,x]);let _=r.useCallback(()=>{g.setOpen(!1,(0,S.createChangeEventDetails)(m.REASONS.imperativeAction))},[g]);r.useImperativeHandle(e.actionsRef,()=>({unmount:k,close:_}),[k,_]);let R=x||b,N=r.useMemo(()=>({store:g}),[g]);return(0,n.jsxs)(l.Provider,{value:N,children:[R&&(0,n.jsx)(C,{store:g,modal:d}),"function"==typeof t?t({payload:v}):t]})}function C({store:e,modal:t}){let n=e.useState("floatingRootContext"),i=(0,s.useDismiss)(n,{outsidePressEvent:{mouse:"trap-focus"===t?"sloppy":"intentional",touch:"sloppy"}}),a=i.reference??o.EMPTY_OBJECT,l=i.trigger??o.EMPTY_OBJECT,c=r.useMemo(()=>(0,j.mergeProps)(h.FOCUSABLE_POPUP_PROPS,i.floating),[i.floating]);return(0,h.usePopupInteractionProps)(e,{activeTriggerProps:a,inactiveTriggerProps:l,popupProps:c}),null}var k=e.i(540886),_=e.i(405005),R=e.i(552245),N=e.i(650316),E=e.i(385689),T=e.i(872135),O=e.i(788015),P=e.i(152535),M=e.i(346570),z=e.i(32199);let A=r.forwardRef(function(e,t){let{render:o,className:s,style:i,disabled:l=!1,nativeButton:d=!0,handle:u,payload:p,openOnHover:f=!1,delay:g=300,closeDelay:x=0,id:v,...y}=e,S=c(!0),j=u?.store??S?.store;if(!j)throw Error((0,a.default)(74));let w=(0,O.useBaseUiId)(v),C=j.useState("isTriggerActive",w),A=j.useState("floatingRootContext"),I=j.useState("isOpenedByTrigger",w),F=j.useState("triggerPopupId",w),B=r.useRef(null),{registerTrigger:H,isMountedByThisTrigger:L}=(0,h.useTriggerDataForwarding)(w,B,j,{payload:p,disabled:l,openOnHover:f,closeDelay:x}),D=j.useState("openChangeReason"),W=j.useState("stickIfOpen"),$=j.useState("openMethod"),V=j.useState("focusManagerModal"),K=(0,T.useHoverReferenceInteraction)(A,{enabled:!l&&null!=A&&f&&("touch"!==$||D!==m.REASONS.triggerPress),mouseOnly:!0,move:!1,handleClose:(0,N.safePolygon)(),restMs:g,delay:{close:x},triggerElementRef:B,isActiveTrigger:C,isClosing:()=>"ending"===j.select("transitionStatus")}),U=(0,E.useClick)(A,{enabled:null!=A,stickIfOpen:W}),q=(0,z.useOpenMethodTriggerProps)(()=>j.select("open"),e=>{j.set("openMethod",e)}),G=j.useState("triggerProps",L),{getButtonProps:J,buttonRef:Y}=(0,k.useButton)({disabled:l,native:d}),{preFocusGuardRef:X,handlePreFocusGuardFocus:Q,handleFocusTargetFocus:Z}=(0,M.useTriggerFocusGuards)(j,B),ee=(0,R.useRenderElement)("button",e,{state:{disabled:l,open:I},ref:[Y,t,H,B],props:[U.reference,K,G,q,{[b.CLICK_TRIGGER_IDENTIFIER]:"",id:w,"aria-haspopup":"dialog","aria-expanded":I,"aria-controls":F},y,J],stateAttributesMapping:{open:e=>e&&D===m.REASONS.triggerPress?_.pressableTriggerOpenStateMapping.open(e):_.triggerOpenStateMapping.open(e)}});return L&&!V?(0,n.jsxs)(r.Fragment,{children:[(0,n.jsx)(P.FocusGuard,{ref:X,onFocus:Q}),(0,n.jsx)(r.Fragment,{children:ee},w),(0,n.jsx)(P.FocusGuard,{ref:j.context.triggerFocusTargetRef,onFocus:Z})]}):(0,n.jsx)(r.Fragment,{children:ee},w)});var I=e.i(726674);let F=r.createContext(void 0),B=r.forwardRef(function(e,t){let{keepMounted:r=!1,...o}=e,{store:s}=c();return s.useState("mounted")||r?(0,n.jsx)(F.Provider,{value:r,children:(0,n.jsx)(I.FloatingPortal,{ref:t,...o})}):null});var H=e.i(144394),L=e.i(146376);let D=r.createContext(void 0);function W(){let e=r.useContext(D);if(!e)throw Error((0,a.default)(46));return e}var $=e.i(329365),V=e.i(426),K=e.i(222640),U=e.i(360495),q=e.i(789579),G=e.i(33383);let J=r.forwardRef(function(e,t){let{render:o,className:s,style:l,anchor:d,positionMethod:u="absolute",side:p="bottom",align:f="center",sideOffset:h=0,alignOffset:g=0,collisionBoundary:x="clipping-ancestors",collisionPadding:v=5,arrowPadding:y=5,sticky:S=!1,disableAnchorTracking:j=!1,collisionAvoidance:w=b.POPUP_COLLISION_AVOIDANCE,...C}=e,{store:k}=c(),_=function(){let e=r.useContext(F);if(void 0===e)throw Error((0,a.default)(45));return e}(),R=(0,i.useFloatingNodeId)(),N=k.useState("floatingRootContext"),E=k.useState("mounted"),T=k.useState("open"),O=k.useState("openChangeReason"),P=k.useState("activeTriggerElement"),M=k.useState("modal"),z=k.useState("openMethod"),A=k.useState("positionerElement"),I=k.useState("instantType"),B=k.useState("transitionStatus"),W=k.useState("hasViewport"),J=r.useRef(null),Y=(0,K.useAnimationsFinished)(A,!1,!1),X=(0,$.useAnchorPositioning)({anchor:d,floatingRootContext:N,positionMethod:u,mounted:E,side:p,sideOffset:h,align:f,alignOffset:g,arrowPadding:y,collisionBoundary:x,collisionPadding:v,sticky:S,disableAnchorTracking:j,keepMounted:_,nodeId:R,collisionAvoidance:w,adaptiveOrigin:W?U.adaptiveOrigin:void 0}),Q=N.useState("domReferenceElement");(0,L.useIsoLayoutEffect)(()=>{let e=J.current;if(Q&&(J.current=Q),e&&Q&&Q!==e){k.set("instantType",void 0);let e=new AbortController;return Y(()=>{k.set("instantType","trigger-change")},e.signal),()=>{e.abort()}}},[Q,Y,k]),(0,G.useAnchoredPopupScrollLock)(T&&!0===M&&O!==m.REASONS.triggerHover,"touch"===z,A,P);let Z=r.useCallback(e=>{k.set("positionerElement",e)},[k]),ee={open:T,side:X.side,align:X.align,anchorHidden:X.anchorHidden,instant:I},et=(0,q.usePositioner)(e,ee,{styles:X.positionerStyles,transitionStatus:B,props:C,refs:[t,Z],hidden:!E,inert:!T});return(0,n.jsxs)(D.Provider,{value:X,children:[E&&!0===M&&O!==m.REASONS.triggerHover&&(0,n.jsx)(V.InternalBackdrop,{ref:k.context.internalBackdropRef,inert:(0,H.inertValue)(!T),cutout:P}),(0,n.jsx)(i.FloatingNode,{id:R,children:et})]})});var Y=e.i(229315),X=e.i(61487),Q=e.i(431157),Z=e.i(209407),ee=e.i(137584),et=e.i(673327),en=e.i(96533),er=e.i(815982),eo=e.i(667865);let es=r.createContext(void 0);function ei(e){let{value:t,children:r}=e;return(0,n.jsx)(es.Provider,{value:t,children:r})}let ea={..._.popupStateMapping,...Z.transitionStatusMapping},el=r.forwardRef(function(e,t){let{render:o,className:s,style:i,initialFocus:a,finalFocus:l,...d}=e,{store:u}=c(),p=W(),f=null!=(0,en.useToolbarRootContext)(!0),{context:g,hasClosePart:x}=function(){let[e,t]=r.useState(0),n=(0,eo.useStableCallback)(()=>(t(e=>e+1),()=>{t(e=>Math.max(0,e-1))}));return{context:r.useMemo(()=>({register:n}),[n]),hasClosePart:e>0}}(),b=u.useState("open"),v=u.useState("openMethod"),y=u.useState("instantType"),S=u.useState("transitionStatus"),j=u.useState("popupProps"),w=u.useState("titleElementId"),C=u.useState("descriptionElementId"),k=u.useState("modal"),_=u.useState("mounted"),N=u.useState("openChangeReason"),E=u.useState("activeTriggerElement"),T=u.useState("floatingRootContext"),O=T.useState("floatingId"),P=u.useState("disabled"),M=u.useState("openOnHover"),z=u.useState("closeDelay"),A=d.id??O;(0,ee.useOpenChangeComplete)({open:b,ref:u.context.popupRef,onComplete(){b&&u.context.onOpenChangeComplete?.(!0)}}),(0,Q.useHoverFloatingInteraction)(T,{enabled:M&&!P,closeDelay:z});let I=void 0===a?(0,h.createDefaultInitialFocus)(u.context.popupRef):a,F=!1!==k&&x;u.useSyncedValue("focusManagerModal",F);let B=r.useCallback(e=>{u.set("popupElement",e)},[u]),H={open:b,side:p.side,align:p.align,instant:y,transitionStatus:S},L=(0,R.useRenderElement)("div",e,{state:H,ref:[t,u.context.popupRef,B],props:[j,{id:A,role:"dialog",...h.FOCUSABLE_POPUP_PROPS,"aria-labelledby":w,"aria-describedby":C,onKeyDown(e){f&&et.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()}},(0,er.getDisabledMountTransitionStyles)(S),d],stateAttributesMapping:ea});return(0,n.jsx)(X.FloatingFocusManager,{context:T,openInteractionType:v,modal:F,disabled:!_||N===m.REASONS.triggerHover,initialFocus:I,returnFocus:l,restoreFocus:"popup",previousFocusableElement:(0,Y.isHTMLElement)(E)?E:void 0,nextFocusableElement:u.context.triggerFocusTargetRef,beforeContentFocusGuardRef:u.context.beforeContentFocusGuardRef,children:(0,n.jsx)(ei,{value:g,children:L})})}),ec=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...s}=e,{store:i}=c(),a=i.useState("open"),{arrowRef:l,side:d,align:u,arrowUncentered:p,arrowStyles:f}=W();return(0,R.useRenderElement)("div",e,{state:{open:a,side:d,align:u,uncentered:p},ref:[t,l],props:[{style:f,"aria-hidden":!0},s],stateAttributesMapping:_.popupStateMapping})}),ed={..._.popupStateMapping,...Z.transitionStatusMapping},eu=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...s}=e,{store:i}=c(),a=i.useState("open"),l=i.useState("mounted"),d=i.useState("transitionStatus"),u=i.useState("openChangeReason");return(0,R.useRenderElement)("div",e,{state:{open:a,transitionStatus:d},ref:[i.context.backdropRef,t],props:[{role:"presentation",hidden:!l,style:{pointerEvents:u===m.REASONS.triggerHover?"none":void 0,userSelect:"none",WebkitUserSelect:"none"}},s],stateAttributesMapping:ed})}),ep=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...s}=e,{store:i}=c(),a=(0,O.useBaseUiId)(s.id);return i.useSyncedValueWithCleanup("titleElementId",a),(0,R.useRenderElement)("h2",e,{ref:t,props:[{id:a},s]})}),ef=r.forwardRef(function(e,t){let{render:n,className:r,style:o,...s}=e,{store:i}=c(),a=(0,O.useBaseUiId)(s.id);return i.useSyncedValueWithCleanup("descriptionElementId",a),(0,R.useRenderElement)("p",e,{ref:t,props:[{id:a},s]})}),em=r.forwardRef(function(e,t){let n,{render:o,className:s,style:i,disabled:a=!1,nativeButton:l=!0,...d}=e,{buttonRef:u,getButtonProps:p}=(0,k.useButton)({disabled:a,focusableWhenDisabled:!1,native:l}),{store:f}=c();return n=r.useContext(es),(0,L.useIsoLayoutEffect)(()=>n?.register(),[n]),(0,R.useRenderElement)("button",e,{ref:[t,u],props:[{onClick(e){f.setOpen(!1,(0,S.createChangeEventDetails)(m.REASONS.closePress,e.nativeEvent))}},d,p]})}),eh=((t={}).popupWidth="--popup-width",t.popupHeight="--popup-height",t);var eg=e.i(818390);let ex={activationDirection:e=>e?{"data-activation-direction":e}:null},eb=r.forwardRef(function(e,t){let{render:n,className:r,style:o,children:s,...i}=e,{store:a}=c(),{side:l}=W(),d=a.useState("instantType"),{children:u,state:p}=(0,eg.usePopupViewport)({store:a,side:l,cssVars:eh,children:s}),f={activationDirection:p.activationDirection,transitioning:p.transitioning,instant:d};return(0,R.useRenderElement)("div",e,{state:f,ref:t,props:[i,{children:u}],stateAttributesMapping:ex})});class ev{constructor(){this.store=new y}open(e){let t=e?this.store.context.triggerElements.getById(e)??void 0:void 0;if(e&&!t)throw Error((0,a.default)(80,e));this.store.setOpen(!0,(0,S.createChangeEventDetails)(m.REASONS.imperativeAction,void 0,t))}close(){this.store.setOpen(!1,(0,S.createChangeEventDetails)(m.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",0,ec,"Backdrop",0,eu,"Close",0,em,"Description",0,ef,"Handle",0,ev,"Popup",0,el,"Portal",0,B,"Positioner",0,J,"Root",0,function(e){return c(!0)?(0,n.jsx)(w,{props:e}):(0,n.jsx)(i.FloatingTree,{children:(0,n.jsx)(w,{props:e})})},"Title",0,ep,"Trigger",0,A,"Viewport",0,eb,"createHandle",0,function(){return new ev}],466914);var ey=e.i(466914),ey=ey,eS=e.i(115504);e.s(["Popover",0,function({...e}){return(0,n.jsx)(ey.Root,{"data-slot":"popover",...e})},"PopoverContent",0,function({className:e,align:t="center",alignOffset:r=0,side:o="bottom",sideOffset:s=4,...i}){return(0,n.jsx)(ey.Portal,{children:(0,n.jsx)(ey.Positioner,{align:t,alignOffset:r,side:o,sideOffset:s,className:"isolate z-50",children:(0,n.jsx)(ey.Popup,{"data-slot":"popover-content",className:(0,eS.cn)("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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),...i})})})},"PopoverTrigger",0,function({...e}){return(0,n.jsx)(ey.Trigger,{"data-slot":"popover-trigger",...e})}],337822)},516015,(e,t,n)=>{},898547,(e,t,n)=>{var r=e.i(247167);e.r(516015);var o=e.r(271645),s=o&&"object"==typeof o&&"default"in o?o:{default:o},i=void 0!==r.default&&r.default.env&&!0,a=function(e){return"[object String]"===Object.prototype.toString.call(e)},l=function(){function e(e){var t=void 0===e?{}:e,n=t.name,r=void 0===n?"stylesheet":n,o=t.optimizeForSpeed,s=void 0===o?i:o;c(a(r),"`name` must be a string"),this._name=r,this._deletedRulePlaceholder="#"+r+"-deleted-rule____{}",c("boolean"==typeof s,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=s,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var l="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=l?l.getAttribute("content"):null}var t,n=e.prototype;return n.setOptimizeForSpeed=function(e){c("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),c(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},n.isOptimizeForSpeed=function(){return this._optimizeForSpeed},n.inject=function(){var e=this;if(c(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(i||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,n){return"number"==typeof n?e._serverSheet.cssRules[n]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),n},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},n.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;ttypeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!n.cssRules[e])return e;n.deleteRule(e);try{n.insertRule(t,e)}catch(r){i||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),n.insertRule(this._deletedRulePlaceholder,e)}}else{var r=this._tags[e];c(r,"old rule at index `"+e+"` not found"),r.textContent=t}return e},n.deleteRule=function(e){if("u"typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},n.cssRules=function(){var e=this;return"u">>0},u={};function p(e,t){if(!t)return"jsx-"+e;var n=String(t),r=e+n;return u[r]||(u[r]="jsx-"+d(e+"-"+n)),u[r]}function f(e,t){"u"typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var n=this.getIdAndRules(e),r=n.styleId,o=n.rules;if(r in this._instancesCounts){this._instancesCounts[r]+=1;return}var s=o.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[r]=s,this._instancesCounts[r]=1},t.remove=function(e){var t=this,n=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(n in this._instancesCounts,"styleId: `"+n+"` not found"),this._instancesCounts[n]-=1,this._instancesCounts[n]<1){var r=this._fromServer&&this._fromServer[n];r?(r.parentNode.removeChild(r),delete this._fromServer[n]):(this._indices[n].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[n]),delete this._instancesCounts[n]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],n=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return n[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,n;return t=this.cssRules(),void 0===(n=e)&&(n={}),t.map(function(e){var t=e[0],r=e[1];return s.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:n.nonce?n.nonce:void 0,dangerouslySetInnerHTML:{__html:r}})})},t.getIdAndRules=function(e){var t=e.children,n=e.dynamic,r=e.id;if(n){var o=p(r,n);return{styleId:o,rules:Array.isArray(t)?t.map(function(e){return f(o,e)}):[f(o,t)]}}return{styleId:p(r),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),h=o.createContext(null);function g(){return new m}function x(){return o.useContext(h)}h.displayName="StyleSheetContext";var b=s.default.useInsertionEffect||s.default.useLayoutEffect,v="u">typeof window?g():void 0;function y(e){var t=v||x();return t&&("u"{t.exports=e.r(898547).style},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),n=e.i(271645);let r={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),s=n.forwardRef(function(e,s){return n.createElement(o.default,(0,t.default)({},e,{ref:s,icon:r}))});e.s(["BulbOutlined",0,s],812618)},936772,e=>{"use strict";var t=e.i(843476),n=e.i(271645),r=e.i(464571),o=e.i(918789),s=e.i(650056),i=e.i(219470),a=e.i(755151),l=e.i(240647),c=e.i(812618);e.s(["default",0,({reasoningContent:e})=>{let[d,u]=(0,n.useState)(!0);return e?(0,t.jsxs)("div",{className:"reasoning-content mt-1 mb-2",children:[(0,t.jsxs)(r.Button,{type:"text",className:"flex items-center text-xs text-gray-500 hover:text-gray-700",onClick:()=>u(!d),icon:(0,t.jsx)(c.BulbOutlined,{}),children:[d?"Hide reasoning":"Show reasoning",d?(0,t.jsx)(a.DownOutlined,{className:"ml-1"}):(0,t.jsx)(l.RightOutlined,{className:"ml-1"})]}),d&&(0,t.jsx)("div",{className:"mt-2 p-3 bg-gray-50 border border-gray-200 rounded-md text-sm text-gray-700 max-w-full overflow-x-auto whitespace-pre-wrap break-words",style:{wordBreak:"break-word",overflowWrap:"break-word"},children:(0,t.jsx)(o.default,{components:{code({node:e,inline:n,className:r,children:o,...a}){let l=/language-(\w+)/.exec(r||"");return!n&&l?(0,t.jsx)(s.Prism,{style:i.coy,language:l[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...a,children:String(o).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${r} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...a,children:o})},pre:({node:e,...n})=>(0,t.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...n})},children:e})})]}):null}])},499569,e=>{"use strict";var t=e.i(843476),n=e.i(437902),r=e.i(362024);let{Panel:o}=r.Collapse;e.s(["default",0,({events:e,className:s})=>{if(!e||0===e.length)return null;let i=e.find(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_list_tools"&&e.item.tools&&e.item.tools.length>0),a=e.filter(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_call");return i||0!==a.length?(0,t.jsxs)("div",{className:`jsx-32b14b04f420f3ac mcp-events-display ${s||""}`,children:[(0,t.jsx)(n.default,{id:"32b14b04f420f3ac",children:".openai-mcp-tools.jsx-32b14b04f420f3ac{margin:0;padding:0;position:relative}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse.jsx-32b14b04f420f3ac,.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-item.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac{color:#9ca3af!important;background:0 0!important;border:none!important;min-height:20px!important;padding:0 0 0 20px!important;font-size:14px!important;font-weight:400!important;line-height:20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac:hover{color:#6b7280!important;background:0 0!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content-box.jsx-32b14b04f420f3ac{padding:4px 0 0 20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac{color:#9ca3af!important;justify-content:center!important;align-items:center!important;width:16px!important;height:16px!important;font-size:10px!important;display:flex!important;position:absolute!important;top:2px!important;left:2px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac:hover{color:#6b7280!important}.openai-vertical-line.jsx-32b14b04f420f3ac{opacity:.8;background-color:#f3f4f6;width:.5px;position:absolute;top:18px;bottom:0;left:9px}.tool-item.jsx-32b14b04f420f3ac{color:#4b5563;z-index:1;background:#fff;margin:0;padding:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:18px;position:relative}.mcp-section.jsx-32b14b04f420f3ac{z-index:1;background:#fff;margin-bottom:12px;position:relative}.mcp-section.jsx-32b14b04f420f3ac:last-child{margin-bottom:0}.mcp-section-header.jsx-32b14b04f420f3ac{color:#6b7280;margin-bottom:4px;font-size:13px;font-weight:500}.mcp-code-block.jsx-32b14b04f420f3ac{background:#f9fafb;border:1px solid #f3f4f6;border-radius:6px;padding:8px;font-size:12px}.mcp-json.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;word-wrap:break-word;margin:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcp-approved.jsx-32b14b04f420f3ac{color:#6b7280;align-items:center;font-size:13px;display:flex}.mcp-checkmark.jsx-32b14b04f420f3ac{color:#10b981;margin-right:6px;font-weight:700}.mcp-response-content.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:1.5}"}),(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac openai-mcp-tools",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac openai-vertical-line"}),(0,t.jsxs)(r.Collapse,{ghost:!0,size:"small",expandIconPosition:"start",defaultActiveKey:i?["list-tools"]:a.map((e,t)=>`mcp-call-${t}`),children:[i&&(0,t.jsx)(o,{header:"List tools",children:(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac",children:i.item?.tools?.map((e,n)=>(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac tool-item",children:e.name},n))})},"list-tools"),a.map((e,n)=>(0,t.jsx)(o,{header:e.item?.name||"Tool call",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac",children:[(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Request"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-code-block",children:e.item?.arguments&&(0,t.jsx)("pre",{className:"jsx-32b14b04f420f3ac mcp-json",children:(()=>{try{return JSON.stringify(JSON.parse(e.item.arguments),null,2)}catch(t){return e.item.arguments}})()})})]}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-approved",children:[(0,t.jsx)("span",{className:"jsx-32b14b04f420f3ac mcp-checkmark",children:"✓"})," Approved"]})}),e.item?.output&&(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Response"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-response-content",children:e.item.output})]})]})},`mcp-call-${n}`))]})]})]}):null}])},459161,e=>{"use strict";e.i(247167);var t=e.i(356449),n=e.i(602869),r=e.i(727749);async function o(e,s,i,a,l=[],c,d,u,p,f,m,h,g,x,b,v,y,S,j,w,C,k,_,R=!0,N){if(!a)throw Error("Virtual Key is required");if(!i||""===i.trim())throw Error("Model is required. Please select a model before sending a request.");console.log=function(){};let E=w||(0,n.getProxyBaseUrl)(),T={};l&&l.length>0&&(T["x-litellm-tags"]=l.join(","));let O=new t.default.OpenAI({apiKey:a,baseURL:E,dangerouslyAllowBrowser:!0,defaultHeaders:T});try{let t,n,r,o=Date.now(),a=!1,l=e.map(e=>(Array.isArray(e.content),{role:e.role,content:e.content,type:"message"})),w=[];x&&x.length>0&&(x.includes("__all__")?w.push({type:"mcp",server_label:"litellm",server_url:`${E}/mcp`,require_approval:"never"}):x.forEach(e=>{if(e.startsWith("toolset:")){let t=e.slice(8),n=_?.find(e=>e.toolset_id===t),r=n?.toolset_name||t;w.push({type:"mcp",server_label:r,server_url:`${E}/mcp/${encodeURIComponent(r)}`,require_approval:"never"})}else{let t=C?.find(t=>t.server_id===e),n=t?.server_name||e,r=k?.[e]||[];w.push({type:"mcp",server_label:n,server_url:`${E}/mcp/${encodeURIComponent(n)}`,require_approval:"never",...r.length>0?{allowed_tools:r}:{}})}})),S&&w.push({type:"code_interpreter",container:{type:"auto"}});let T={model:i,input:l,litellm_trace_id:f,...b?{previous_response_id:b}:{},...m?{vector_store_ids:m}:{},...h?{guardrails:h}:{},...g?{policies:g}:{},...w.length>0?{tools:w,tool_choice:"auto"}:{}},z=await O.responses.create({...T,stream:R},{signal:c}),A=R?z:(n=(t=z.output??[]).filter(e=>"message"===e.type).flatMap(e=>e.content??[]).filter(e=>"output_text"===e.type).map(e=>e.text??"").join(""),r=t.filter(e=>"reasoning"===e.type).flatMap(e=>e.summary??[]).map(e=>e.text??"").join(""),[...t.map(e=>({type:"response.output_item.done",item:e})),...r?[{type:"response.reasoning.delta",delta:r}]:[],...n?[{type:"response.output_text.delta",delta:n}]:[],{type:"response.completed",response:z}]),I="",F={code:"",containerId:""};for await(let e of A)if("object"==typeof e&&null!==e){if((e.type?.startsWith("response.mcp_")||"response.output_item.done"===e.type&&(e.item?.type==="mcp_list_tools"||e.item?.type==="mcp_call"))&&y){let t={type:e.type,sequence_number:e.sequence_number,output_index:e.output_index,item_id:e.item_id||e.item?.id,item:e.item,delta:e.delta,arguments:e.arguments,timestamp:Date.now()};y(t)}"response.output_item.done"===e.type&&e.item?.type==="mcp_call"&&e.item?.name&&(I=e.item.name),P=F;var P,M=F="response.output_item.done"===e.type&&e.item?.type==="code_interpreter_call"?{code:e.item.code||"",containerId:e.item.container_id||""}:P;if("response.output_item.done"===e.type&&e.item?.type==="message"&&e.item?.content&&j){for(let t of e.item.content)if("output_text"===t.type&&t.annotations){let e=t.annotations.filter(e=>"container_file_citation"===e.type);(e.length>0||M.code)&&j({code:M.code,containerId:M.containerId,annotations:e})}}if("response.role.delta"===e.type)continue;if("response.output_text.delta"===e.type&&"string"==typeof e.delta){let t=e.delta;if(t.length>0&&(s("assistant",t,i),!a)){a=!0;let e=Date.now()-o;u&&R&&u(e)}}if("response.reasoning.delta"===e.type&&"delta"in e){let t=e.delta;"string"==typeof t&&d&&d(t)}if("response.completed"===e.type&&"response"in e){let t=e.response,n=t.usage;if(t.id&&v&&v(t.id),n&&p){let e={completionTokens:n.output_tokens,promptTokens:n.input_tokens,totalTokens:n.total_tokens};n.completion_tokens_details?.reasoning_tokens&&(e.reasoningTokens=n.completion_tokens_details.reasoning_tokens),p(e,I)}}}return N&&N(Date.now()-o),z}catch(e){throw c?.aborted||r.default.fromBackend(`Error occurred while generating model response. Please try again. Error: ${e}`),e}}e.s(["makeOpenAIResponsesRequest",0,o],459161)},321443,e=>{"use strict";var t=e.i(843476),n=e.i(271645),r=e.i(107233),o=e.i(664659),s=e.i(643531),i=e.i(37727),a=e.i(337822),l=e.i(302747),c=e.i(759684),d=e.i(793479),u=e.i(519455),p=e.i(888259),f=e.i(618566),m=e.i(405033),h=e.i(360179),g=e.i(195116),x=e.i(174886),b=e.i(788699),v=e.i(746798),y=e.i(204258),S=e.i(918789),j=e.i(742531),w=e.i(650056),C=e.i(219470),k=e.i(936772),_=e.i(499569);let R=/token|key|secret|password|auth/i;function N(e){let t=new Date(e),n=String(t.getHours()).padStart(2,"0"),r=String(t.getMinutes()).padStart(2,"0");return`${n}:${r}`}function E({node:e,className:n,children:r,...o}){let s=/language-(\w+)/.exec(n||"");return s?(0,t.jsx)(w.Prism,{style:C.coy,language:s[1],PreTag:"div",className:"rounded-md my-2",...o,children:String(r).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${n??""} px-1.5 py-0.5 rounded bg-muted text-sm font-mono`,...o,children:r})}function T({message:e,onEdit:r,isStreaming:o}){let[s,i]=(0,n.useState)(!1),[a,l]=(0,n.useState)(!1),[c,d]=(0,n.useState)(e.content),p=(0,n.useRef)(null);(0,n.useEffect)(()=>{a&&p.current&&(p.current.focus(),p.current.selectionStart=p.current.value.length)},[a]),(0,n.useEffect)(()=>{let e=p.current;e&&(e.style.height="auto",e.style.height=`${e.scrollHeight}px`)},[c,a]);let f=()=>{let t=c.trim();t&&t!==e.content&&r&&r(e.id,t),l(!1)};return a?(0,t.jsx)("div",{className:"flex flex-col items-end",children:(0,t.jsxs)("div",{className:"w-[72%] bg-background border-2 border-primary rounded-xl overflow-hidden shadow-[0_0_0_3px_rgba(var(--primary)/0.1)]",children:[(0,t.jsx)("textarea",{ref:p,value:c,onChange:e=>d(e.target.value),onKeyDown:t=>{"Enter"!==t.key||t.shiftKey||(t.preventDefault(),f()),"Escape"===t.key&&(d(e.content),l(!1))},className:"w-full px-3.5 py-2.5 border-none outline-none resize-none text-sm leading-relaxed text-foreground font-[inherit] bg-transparent box-border min-h-[40px]"}),(0,t.jsxs)("div",{className:"flex justify-end gap-2 px-2.5 py-1.5 border-t",children:[(0,t.jsx)(u.Button,{variant:"outline",size:"sm",onClick:()=>{d(e.content),l(!1)},children:"Cancel"}),(0,t.jsx)(u.Button,{size:"sm",onClick:f,disabled:!c.trim(),children:"Save & Send"})]})]})}):(0,t.jsxs)("div",{className:"flex flex-col items-end w-full",onMouseEnter:()=>i(!0),onMouseLeave:()=>i(!1),children:[(0,t.jsxs)("div",{className:"flex items-end gap-1.5 max-w-[72%]",children:[s&&!o&&r&&(0,t.jsx)(v.TooltipProvider,{delay:300,children:(0,t.jsxs)(v.Tooltip,{children:[(0,t.jsx)(v.TooltipTrigger,{render:(0,t.jsx)(u.Button,{variant:"ghost",size:"icon-xs",onClick:()=>{d(e.content),l(!0)},className:"text-muted-foreground hover:text-foreground shrink-0",children:(0,t.jsx)(b.Pencil,{className:"size-3.5"})})}),(0,t.jsx)(v.TooltipContent,{children:(0,t.jsx)("p",{children:"Edit message"})})]})}),(0,t.jsx)("div",{className:"bg-muted rounded-2xl px-3.5 py-2.5 text-sm leading-relaxed whitespace-pre-wrap break-words text-foreground",children:e.content})]}),(0,t.jsx)("span",{className:"text-[11px] text-muted-foreground mt-1",children:N(e.timestamp)})]})}function O({message:e,isLastMessage:r,isStreaming:o,isTypingIndicator:s,mcpEvents:i}){let[a,l]=(0,n.useState)(0),c=(0,n.useRef)(o);(0,n.useEffect)(()=>{c.current&&!o&&l(e=>e+1),c.current=o},[o]);let d=r&&o&&!e.reasoningContent,u=!!e.reasoningContent||d;if(s)return(0,t.jsx)("div",{className:"flex flex-col items-start",children:(0,t.jsx)("div",{className:"flex items-center gap-1 px-1 py-2.5",children:(0,t.jsx)(z,{})})});let p=e.content,f=!1;return p.endsWith("[stopped]")&&(p=p.slice(0,-9),f=!0),(0,t.jsxs)("div",{className:"flex flex-col items-start max-w-[80%]",children:[u&&(d?(0,t.jsx)(M,{}):(0,t.jsx)(k.default,{reasoningContent:e.reasoningContent},a)),(0,t.jsxs)("div",{className:"text-sm leading-[1.7] text-foreground break-words",children:[(0,t.jsx)(S.default,{remarkPlugins:[j.default],components:{code:E},children:p}),f&&(0,t.jsx)("span",{className:"text-muted-foreground italic",children:" [stopped]"})]}),(0,t.jsx)(P,{text:p}),i&&i.length>0&&(0,t.jsx)("div",{className:"mt-2 max-w-full",children:(0,t.jsx)(_.default,{events:i})})]})}function P({text:e}){let[r,o]=(0,n.useState)(!1);return(0,t.jsx)("div",{className:"flex items-center gap-1 mt-1.5",children:(0,t.jsx)(v.TooltipProvider,{delay:300,children:(0,t.jsxs)(v.Tooltip,{children:[(0,t.jsx)(v.TooltipTrigger,{render:(0,t.jsx)(u.Button,{variant:"ghost",size:"icon-xs",onClick:()=>{navigator.clipboard.writeText(e).then(()=>{o(!0),setTimeout(()=>o(!1),2e3)}).catch(()=>{})},className:r?"text-emerald-600":"text-muted-foreground hover:text-foreground",children:r?(0,t.jsx)(s.Check,{className:"size-3.5"}):(0,t.jsx)(x.Copy,{className:"size-3.5"})})}),(0,t.jsx)(v.TooltipContent,{children:(0,t.jsx)("p",{children:r?"Copied!":"Copy"})})]})})})}function M(){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("style",{children:` + @keyframes thinking-pulse { + 0%, 100% { opacity: 0.4; } + 50% { opacity: 1; } + } + .chat-thinking-text { + animation: thinking-pulse 1.4s ease-in-out infinite; + } + `}),(0,t.jsx)("div",{className:"inline-flex items-center gap-1.5 px-2.5 mb-2 bg-muted/50 border rounded-lg text-xs text-muted-foreground",children:(0,t.jsx)("span",{className:"chat-thinking-text py-1",children:"Thinking..."})})]})}function z(){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("style",{children:` + @keyframes chat-typing-bounce { + 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } + 30% { transform: translateY(-4px); opacity: 1; } + } + .chat-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background-color: var(--color-muted-foreground); + animation: chat-typing-bounce 1.2s ease-in-out infinite; + } + .chat-dot:nth-child(2) { animation-delay: 0.2s; } + .chat-dot:nth-child(3) { animation-delay: 0.4s; } + `}),(0,t.jsx)("div",{className:"chat-dot"}),(0,t.jsx)("div",{className:"chat-dot"}),(0,t.jsx)("div",{className:"chat-dot"})]})}function A({message:e}){let r=e.toolArgs?function e(t){let n={};for(let[r,o]of Object.entries(t))R.test(r)?n[r]="[redacted]":Array.isArray(o)?n[r]=o.map(t=>null===t||"object"!=typeof t||Array.isArray(t)?t:e(t)):null!==o&&"object"==typeof o?n[r]=e(o):n[r]=o;return n}(e.toolArgs):void 0,[o,s]=(0,n.useState)(!1);return(0,t.jsxs)("div",{className:"max-w-[80%]",children:[(0,t.jsxs)(y.Collapsible,{open:o,onOpenChange:s,children:[(0,t.jsxs)(y.CollapsibleTrigger,{className:"flex items-center gap-1.5 text-[13px] px-3 py-2 border rounded-lg bg-muted/50 hover:bg-muted transition-colors w-full text-left",children:[(0,t.jsx)(g.Wrench,{className:"h-3.5 w-3.5 text-muted-foreground"}),(0,t.jsx)("span",{className:"font-medium text-foreground",children:e.toolName??"Tool call"})]}),(0,t.jsxs)(y.CollapsibleContent,{className:"border border-t-0 rounded-b-lg px-3 py-2 bg-muted/30",children:[void 0!==r&&(0,t.jsxs)("div",{className:e.toolResult?"mb-3":"",children:[(0,t.jsx)("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground mb-1",children:"Arguments"}),(0,t.jsx)("pre",{className:"m-0 p-2 bg-muted rounded-md text-xs font-mono whitespace-pre-wrap break-words text-foreground",children:JSON.stringify(r,null,2)})]}),e.toolResult&&(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground mb-1",children:"Result"}),(0,t.jsx)("div",{className:"text-[13px] text-foreground whitespace-pre-wrap break-words font-mono",children:e.toolResult})]})]})]}),(0,t.jsx)("div",{className:"text-[11px] text-muted-foreground mt-1",children:N(e.timestamp)})]})}let I=({messages:e,isStreaming:n,onEditMessage:r})=>{let o=e.length-1,s=e[o]??null,i=n&&null!==s&&"assistant"===s.role&&""===s.content;return(0,t.jsx)("div",{className:"flex flex-col gap-4",children:e.map((e,s)=>{let a=s===o;return"user"===e.role?(0,t.jsx)(T,{message:e,onEdit:r,isStreaming:n},e.id):"tool"===e.role?(0,t.jsx)(A,{message:e},e.id):(0,t.jsx)(O,{message:e,isLastMessage:a,isStreaming:n,isTypingIndicator:a&&i,mcpEvents:e.mcpEvents},e.id)})})};var F=e.i(531278),B=e.i(699375),H=e.i(174553),L=e.i(602869);let D=({accessToken:e,selectedServers:r,onChange:o})=>{let[s,i]=(0,n.useState)([]),[a,c]=(0,n.useState)(!0),[d,u]=(0,n.useState)(new Set);(0,n.useEffect)(()=>{let t=!1;return(async()=>{c(!0);try{let n=await (0,L.fetchMCPServers)(e);if(t)return;let r=Array.isArray(n)?n:n?.data??[];i(r)}catch{t||i([])}finally{t||c(!1)}})(),()=>{t=!0}},[e]);let f=async(t,n)=>{if(!n)return void o(r.filter(e=>e!==t));u(e=>new Set(e).add(t));try{let n=await (0,L.listMCPTools)(e,t);if(n?.error)return void p.default.warning(`Could not load tools for ${t} \u2014 it will be excluded from this message.`);o([...r,t])}catch{p.default.warning(`Could not load tools for ${t} \u2014 it will be excluded from this message.`)}finally{u(e=>{let n=new Set(e);return n.delete(t),n})}};return(0,t.jsx)("div",{className:"max-w-[320px] max-h-[400px] overflow-y-auto py-2",children:a?(0,t.jsx)("div",{className:"flex flex-col gap-1",children:Array.from({length:3}).map((e,n)=>(0,t.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 gap-3",children:[(0,t.jsxs)("div",{className:"flex items-start gap-3 flex-1 min-w-0",children:[(0,t.jsx)(l.Skeleton,{className:"h-6 w-6 rounded-md shrink-0"}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5 flex-1 min-w-0",children:[(0,t.jsx)(l.Skeleton,{className:"h-3.5 w-24"}),(0,t.jsx)(l.Skeleton,{className:"h-3 w-32"})]})]}),(0,t.jsx)(l.Skeleton,{className:"h-3.5 w-6 rounded-full shrink-0"})]},n))}):0===s.length?(0,t.jsx)("div",{className:"px-3 py-4 text-muted-foreground text-[13px] text-center",children:"No MCP servers configured"}):s.map(e=>{let n=e.server_name??e.alias??e.server_id,o=r.includes(n),s=d.has(n);return(0,t.jsxs)("div",{className:"flex items-start justify-between px-3 py-2 gap-3",children:[e.mcp_info?.logo_url&&(0,t.jsx)(H.Logo,{src:e.mcp_info.logo_url,label:n,className:"w-6 h-6 rounded-md object-contain shrink-0 mt-0.5"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("div",{className:"font-medium text-[13px] text-foreground truncate",children:n}),e.description&&(0,t.jsx)("div",{className:"text-xs text-muted-foreground mt-0.5 truncate",children:e.description})]}),(0,t.jsx)("div",{className:"relative shrink-0",children:s?(0,t.jsx)(F.Loader2,{className:"h-4 w-4 animate-spin text-muted-foreground"}):(0,t.jsx)(B.Switch,{checked:o,onCheckedChange:e=>f(n,e),className:"scale-75"})})]},e.server_id)})})};var W=e.i(695411),$=e.i(459161),V=e.i(916925);let K=["Write","Learn","Code","Brainstorm"],U="litellm_chat_selected_model";function q(){let e=new Date().getHours();return e>=5&&e<12?"Good morning":e>=12&&e<17?"Good afternoon":"Good evening"}function G(e){if(!e)return"";let t=e.toLowerCase(),n=t.indexOf("/");return n>0?t.slice(0,n):t.includes("claude")?"anthropic":t.includes("gemini")?"gemini":t.includes("gpt")||t.includes("chatgpt")||/^o[0-9]/.test(t)?"openai":t.includes("mistral")||t.includes("codestral")?"mistral":t.includes("llama")?"meta_llama":t.includes("deepseek")?"deepseek":t.includes("grok")?"xai":t.includes("command")?"cohere":t.includes("nova")||t.includes("titan")?"bedrock":""}e.s(["default",0,function(){let e=(0,f.useRouter)(),{accessToken:g,userId:x,userEmail:b,selectedMCPServers:v,setSelectedMCPServers:y,activeConversationId:S,activeConversation:j,storageUnavailable:w,staleId:C,createConversation:k,appendMessage:_,updateLastAssistantMessage:R,truncateFromMessage:N}=(0,m.useChatShell)(),[E,T]=(0,n.useState)(null),[O,P]=(0,n.useState)([]),[M,z]=(0,n.useState)(!0),[A,F]=(0,n.useState)(!1),[B,H]=(0,n.useState)(""),[L,J]=(0,n.useState)(null),[Y,X]=(0,n.useState)(S),[Q,Z]=(0,n.useState)(!1),[ee,et]=(0,n.useState)(""),[en,er]=(0,n.useState)(!1),[eo,es]=(0,n.useState)(!1),ei=(0,n.useRef)(null),ea=(0,n.useRef)(null),el=(0,n.useRef)(null),[ec,ed]=(0,n.useState)(!1),eu=(0,n.useRef)(null);(0,n.useEffect)(()=>{C&&e.replace((0,h.getChatRoutes)().chats)},[C,e]),(0,n.useEffect)(()=>{g&&(0,W.fetchAvailableModels)(g).then(e=>{let t=(e||[]).map(e=>e.model_group??"").filter(Boolean);P(t);try{let e=localStorage.getItem(U);if(e&&t.includes(e))return void T(e)}catch{}t.length>0&&(T(t[0]),localStorage.setItem(U,t[0]))}).catch(()=>p.default.error("Could not load models")).finally(()=>z(!1))},[g]),S!==Y&&(X(S),J(null));let ep=(0,n.useCallback)(e=>{T(e),localStorage.setItem(U,e),F(!1),H("")},[]),ef=(0,n.useCallback)(async(e,t)=>{let n=e.trim();if(!n||!E||Q)return;et("");let r=S;r||(r=k(E),J(null),window.history.pushState(null,"",`${window.location.pathname}?id=${r}`)),_(r,{role:"user",content:n}),_(r,{role:"assistant",content:""}),Z(!0),ei.current=new AbortController,t&&J(null);let o=t?null:L,s=t?[...t,{role:"user",content:n}]:o?[{role:"user",content:n}]:[...(j?.messages??[]).filter(e=>"user"===e.role||"assistant"===e.role).map(e=>({role:e.role,content:e.content})),{role:"user",content:n}],i="",a="",l=[],c=!1;try{await (0,$.makeOpenAIResponsesRequest)(s,(e,t)=>{i+=t,R(r,{content:i})},E,g,void 0,ei.current.signal,e=>{a+=e,R(r,{reasoningContent:a})},void 0,void 0,void 0,void 0,void 0,void 0,v.length>0?v:void 0,o,e=>J(e),e=>{l.push(e)}),c=!0}catch(e){e instanceof Error&&"AbortError"===e.name?R(r,{content:i+" [stopped]"}):R(r,{content:"[Something went wrong. The partial response has been saved.]"})}finally{l.length>0&&c&&R(r,{mcpEvents:l}),Z(!1),ei.current=null}},[S,j,E,v,g,k,_,R,Q,L]),em=(0,n.useCallback)(()=>{ei.current?.abort()},[]),eh=(0,n.useCallback)((e,t)=>{if(!S||Q)return;let n=j?.messages??[],r=n.findIndex(t=>t.id===e),o=(-1===r?n:n.slice(0,r)).filter(e=>"user"===e.role||"assistant"===e.role).map(e=>({role:e.role,content:e.content}));N(S,e),ef(t,o)},[S,Q,j,N,ef]),eg=e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),ef(ee))};(0,n.useEffect)(()=>{let e=ea.current;e&&(e.style.height="auto",e.style.height=`${Math.min(e.scrollHeight,180)}px`)},[ee]),(0,n.useEffect)(()=>{let e=el.current;if(!e)return;let t=()=>{ed(e.scrollHeight-e.scrollTop-e.clientHeight>120),null!==eu.current&&(eu.current=e.scrollTop)};return e.addEventListener("scroll",t,{passive:!0}),()=>e.removeEventListener("scroll",t)},[j]),(0,n.useEffect)(()=>{let e=el.current;Q?eu.current=e?.scrollTop??0:eu.current=null},[Q]),(0,n.useLayoutEffect)(()=>{if(null===eu.current)return;let e=el.current;e&&(e.scrollTop=eu.current)});let ex=(0,n.useRef)(0);(0,n.useLayoutEffect)(()=>{let e=j?.messages?.length??0,t=ex.current;if(ex.current=e,e>t){let e=el.current;e&&(e.scrollTop=e.scrollHeight)}},[j?.messages]);let eb=!j||0===j.messages.length,ev=b?.split("@")[0]??x??"",ey=ev?`${q()}, ${ev}`:q(),eS=(B?O.filter(e=>e.toLowerCase().includes(B.toLowerCase())):O).sort((e,t)=>e===E?-1:+(t===E)),ej=(0,t.jsxs)("div",{className:"w-[280px] h-[400px] flex flex-col overflow-hidden",children:[(0,t.jsx)("div",{className:"p-2 pb-1",children:(0,t.jsx)(d.Input,{autoFocus:!0,value:B,onChange:e=>H(e.target.value),placeholder:"Search models...",className:"h-8 text-[13px]"})}),(0,t.jsx)(c.ScrollArea,{className:"flex-1 h-0",children:eS.map(e=>{let n=e===E,r=G(e),{logo:o}=r?(0,V.getProviderLogoAndName)(r):{logo:""};return(0,t.jsxs)(u.Button,{variant:"ghost",onClick:()=>ep(e),className:`h-auto w-full justify-start gap-2 rounded px-3 py-[7px] font-normal ${n?"bg-accent":""}`,children:[o?(0,t.jsx)("img",{src:o,alt:"",className:"w-4 h-4 object-contain shrink-0",onError:e=>{e.currentTarget.style.display="none"}}):(0,t.jsx)("span",{className:"w-4 shrink-0"}),(0,t.jsx)("span",{className:"flex-1 text-left text-[13px] text-foreground overflow-hidden text-ellipsis whitespace-nowrap",children:e}),n&&(0,t.jsx)(s.Check,{className:"h-3.5 w-3.5 text-primary shrink-0"})]},e)})})]}),ew=M?(0,t.jsx)(l.Skeleton,{className:"w-40 h-8"}):(0,t.jsxs)(a.Popover,{open:A,onOpenChange:e=>{F(e),e||H("")},children:[(0,t.jsx)(a.PopoverTrigger,{render:(0,t.jsxs)(u.Button,{variant:"outline",size:"sm",className:"max-w-[240px] justify-start gap-1.5 overflow-hidden",children:[E?(0,t.jsxs)(t.Fragment,{children:[(()=>{let e=G(E),{logo:n}=e?(0,V.getProviderLogoAndName)(e):{logo:""};return n?(0,t.jsx)("img",{src:n,alt:"",className:"w-4 h-4 object-contain shrink-0",onError:e=>{e.currentTarget.style.display="none"}}):null})(),(0,t.jsx)("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap",children:E})]}):(0,t.jsx)("span",{className:"text-muted-foreground",children:"Select model"}),(0,t.jsx)(o.ChevronDown,{className:"h-3 w-3 text-muted-foreground shrink-0"})]})}),(0,t.jsx)(a.PopoverContent,{align:"start",side:"top",className:"p-0 w-auto",children:ej})]}),eC=e=>(0,t.jsxs)("div",{className:"bg-background rounded-xl border shadow-[0_1px_6px_rgba(0,0,0,0.06)] overflow-hidden",children:[(0,t.jsx)("textarea",{ref:ea,value:ee,onChange:e=>et(e.target.value),onKeyDown:eg,placeholder:e?"Send a message...":"How can I help you today?",className:"w-full border-none outline-none resize-none text-[15px] text-foreground bg-transparent font-[inherit] box-border",style:{minHeight:e?52:80,padding:e?"16px 20px 8px":"20px 20px 8px"}}),(0,t.jsxs)("div",{className:"flex items-center justify-between border-t",style:{padding:e?"4px 12px 10px":"8px 12px 12px"},children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[ew,(0,t.jsxs)(a.Popover,{open:en,onOpenChange:er,children:[(0,t.jsx)(a.PopoverTrigger,{render:(0,t.jsxs)(u.Button,{variant:"outline",size:"sm",className:"gap-1 px-2.5 text-muted-foreground",children:[(0,t.jsx)(r.Plus,{className:"h-3.5 w-3.5"}),v.length>0&&(0,t.jsx)("span",{className:"text-xs text-primary font-medium",children:v.length})]})}),(0,t.jsx)(a.PopoverContent,{side:"top",align:"start",className:"p-0 w-auto",children:(0,t.jsx)(D,{accessToken:g,selectedServers:v,onChange:y})})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[e&&v.length>0&&(0,t.jsxs)("span",{className:"text-xs text-muted-foreground max-w-[160px] overflow-hidden text-ellipsis whitespace-nowrap",children:[v.length," tool",v.length>1?"s":""," connected"]}),Q?(0,t.jsx)(u.Button,{variant:"outline",size:"icon-sm",onClick:em,className:"rounded-full shrink-0",children:(0,t.jsx)("div",{className:"w-2.5 h-2.5 bg-foreground rounded-[2px]"})}):(0,t.jsx)(u.Button,{size:"sm",onClick:()=>ef(ee),disabled:!ee.trim()||M||!E,children:"Send"})]})]})]});return(0,t.jsxs)(t.Fragment,{children:[w&&!eo&&(0,t.jsxs)("div",{className:"bg-amber-50 border-b border-amber-200 px-5 py-1.5 text-[13px] text-amber-800 flex justify-between items-center",children:[(0,t.jsx)("span",{children:"Chat history won't be saved in this browser session"}),(0,t.jsx)(u.Button,{variant:"ghost",size:"icon-xs",onClick:()=>es(!0),className:"text-amber-800 hover:bg-amber-100 hover:text-amber-800",children:(0,t.jsx)(i.X,{className:"size-3.5"})})]}),(0,t.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden flex flex-col bg-background",children:eb?(0,t.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center px-6 pb-20",children:[(0,t.jsx)("h1",{className:"m-0 mb-8 text-[28px] font-semibold text-foreground tracking-tight text-center",children:ey}),(0,t.jsxs)("p",{className:"-mt-4 mb-7 text-sm text-muted-foreground text-center max-w-[520px] leading-relaxed",children:["Chat with 100+ LLMs + MCP tools; authenticate once, use them here."," ",(0,t.jsx)(u.Button,{variant:"link",onClick:()=>e.push((0,h.getChatRoutes)().integrations),className:"h-auto p-0 text-sm font-medium",children:"Open Integrations ->"})]}),(0,t.jsx)("div",{className:"w-full max-w-[680px]",children:eC(!1)}),(0,t.jsx)("div",{className:"flex gap-2 mt-3.5 flex-wrap justify-center",children:K.map(e=>(0,t.jsx)(u.Button,{variant:"outline",size:"sm",onClick:()=>et(e+": "),className:"rounded-full px-4 text-muted-foreground",children:e},e))})]}):(0,t.jsxs)("div",{className:"flex-1 min-h-0 flex flex-col mx-auto w-full px-6 relative",style:{maxWidth:760},children:[(0,t.jsx)("div",{ref:el,className:"flex-1 min-h-0 overflow-auto pt-6",style:{overflowAnchor:"none"},children:(0,t.jsx)(I,{messages:j.messages,isStreaming:Q,onEditMessage:eh})}),ec&&(0,t.jsx)(u.Button,{variant:"ghost",size:"icon",onClick:()=>{let e=el.current;e&&(e.scrollTo({top:e.scrollHeight,behavior:"smooth"}),null!==eu.current&&(eu.current=e.scrollHeight))},className:"absolute bottom-[100px] left-1/2 -translate-x-1/2 z-10 rounded-full border bg-background/75 text-muted-foreground shadow-sm backdrop-blur-md hover:bg-background/95 hover:text-muted-foreground","aria-label":"Scroll to bottom",children:(0,t.jsx)(o.ChevronDown,{className:"h-3 w-3"})}),(0,t.jsx)("div",{className:"py-3 pb-6",children:eC(!0)})]})})]})}],321443)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0l9ditwxvhpn1.js b/litellm/proxy/_experimental/out/_next/static/chunks/0l9ditwxvhpn1.js deleted file mode 100644 index acd74a78ca5..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0l9ditwxvhpn1.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},784774,e=>{"use strict";var t=e.i(843476),a=e.i(271645),s=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,s.cn)("w-full caption-bottom text-sm",e),...a})}));r.displayName="Table";let n=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("thead",{ref:r,"data-slot":"table-header",className:(0,s.cn)("[&_tr]:border-b",e),...a}));n.displayName="TableHeader";let o=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tbody",{ref:r,"data-slot":"table-body",className:(0,s.cn)("[&_tr:last-child]:border-0",e),...a}));o.displayName="TableBody";let l=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tfoot",{ref:r,"data-slot":"table-footer",className:(0,s.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a}));l.displayName="TableFooter";let i=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tr",{ref:r,"data-slot":"table-row",className:(0,s.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...a}));i.displayName="TableRow";let d=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("th",{ref:r,"data-slot":"table-head",className:(0,s.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}));d.displayName="TableHead";let u=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("td",{ref:r,"data-slot":"table-cell",className:(0,s.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",e),...a}));u.displayName="TableCell",a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("caption",{ref:r,"data-slot":"table-caption",className:(0,s.cn)("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption",e.s(["Table",0,r,"TableBody",0,o,"TableCell",0,u,"TableFooter",0,l,"TableHead",0,d,"TableHeader",0,n,"TableRow",0,i])},302747,e=>{"use strict";var t=e.i(843476),a=e.i(271645),s=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("div",{ref:r,"data-slot":"skeleton",className:(0,s.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 s=a.createContext(!1),r=a.createContext(void 0);e.s(["DialogRootContext",0,r,"IsDrawerContext",0,s,"useDialogRootContext",0,function(e){let s=a.useContext(r);if(!1===e&&void 0===s)throw Error((0,t.default)(27));return s}])},402820,156736,209793,625834,784324,264951,e=>{"use strict";e.i(247167);var t,a,s=e.i(271645),r=e.i(108821),n=e.i(552245),o=e.i(405005),l=e.i(209407);let i={...o.popupStateMapping,...l.transitionStatusMapping},d=s.forwardRef(function(e,t){let{render:a,className:s,style:o,forceRender:l=!1,...d}=e,{store:u}=(0,r.useDialogRootContext)(),c=u.useState("open"),p=u.useState("nested"),x=u.useState("mounted"),g=u.useState("transitionStatus");return(0,n.useRenderElement)("div",e,{state:{open:c,transitionStatus:g},ref:[u.context.backdropRef,t],stateAttributesMapping:i,props:[{role:"presentation",hidden:!x,style:{userSelect:"none",WebkitUserSelect:"none"}},d],enabled:l||!p})});e.s(["DialogBackdrop",0,d],402820);var u=e.i(540886),c=e.i(675606),p=e.i(56434);let x=s.forwardRef(function(e,t){let{render:a,className:s,style:o,disabled:l=!1,nativeButton:i=!0,...d}=e,{store:x}=(0,r.useDialogRootContext)(),g=x.useState("open"),{getButtonProps:m,buttonRef:f}=(0,u.useButton)({disabled:l,native:i});return(0,n.useRenderElement)("button",e,{state:{disabled:l},ref:[t,f],props:[{onClick:function(e){g&&x.setOpen(!1,(0,c.createChangeEventDetails)(p.REASONS.closePress,e.nativeEvent))}},d,m]})});e.s(["DialogClose",0,x],156736);var g=e.i(788015);let m=s.forwardRef(function(e,t){let{render:a,className:s,style:o,id:l,...i}=e,{store:d}=(0,r.useDialogRootContext)(),u=(0,g.useBaseUiId)(l);return d.useSyncedValueWithCleanup("descriptionElementId",u),(0,n.useRenderElement)("p",e,{ref:t,props:[{id:u},i]})});e.s(["DialogDescription",0,m],209793);var f=e.i(61487);let h=((t={}).nestedDialogs="--nested-dialogs",t),b=((a={})[a.open=o.CommonPopupDataAttributes.open]="open",a[a.closed=o.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=o.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=o.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var v=e.i(733332);let S=s.createContext(void 0);function j(){let e=s.useContext(S);if(void 0===e)throw Error((0,v.default)(26));return e}e.s(["DialogPortalContext",0,S,"useDialogPortalContext",0,j],625834);var w=e.i(137584),y=e.i(673327),C=e.i(264111),D=e.i(843476);let N={...o.popupStateMapping,...l.transitionStatusMapping,nestedDialogOpen:e=>e?{[b.nestedDialogOpen]:""}:null},R=s.forwardRef(function(e,t){let{render:a,className:s,style:o,finalFocus:l,initialFocus:i,...d}=e,{store:u}=(0,r.useDialogRootContext)(),c=u.useState("descriptionElementId"),p=u.useState("disablePointerDismissal"),x=u.useState("floatingRootContext"),g=u.useState("popupProps"),m=u.useState("modal"),b=u.useState("mounted"),v=u.useState("nested"),S=u.useState("nestedOpenDialogCount"),R=u.useState("open"),k=u.useState("openMethod"),T=u.useState("titleElementId"),O=u.useState("transitionStatus"),P=u.useState("role"),_=x.useState("floatingId"),E=d.id??_;j(),(0,w.useOpenChangeComplete)({open:R,ref:u.context.popupRef,onComplete(){R&&u.context.onOpenChangeComplete?.(!0)}});let I=void 0===i?(0,C.createDefaultInitialFocus)(u.context.popupRef):i,M=u.useStateSetter("popupElement"),F=(0,n.useRenderElement)("div",e,{state:{open:R,nested:v,transitionStatus:O,nestedDialogOpen:S>0},props:[g,{id:E,"aria-labelledby":T??void 0,"aria-describedby":c??void 0,role:P,...C.FOCUSABLE_POPUP_PROPS,hidden:!b,onKeyDown(e){y.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[h.nestedDialogs]:S}},d],ref:[t,u.context.popupRef,M],stateAttributesMapping:N});return(0,D.jsx)(f.FloatingFocusManager,{context:x,openInteractionType:k,disabled:!b,closeOnFocusOut:!p,initialFocus:I,returnFocus:l,modal:!1!==m,restoreFocus:"popup",children:F})});e.s(["DialogPopup",0,R],784324);var k=e.i(144394),T=e.i(726674),O=e.i(426);let P=s.forwardRef(function(e,t){let{keepMounted:a=!1,...s}=e,{store:n}=(0,r.useDialogRootContext)(),o=n.useState("mounted"),l=n.useState("modal"),i=n.useState("open");return o||a?(0,D.jsx)(S.Provider,{value:a,children:(0,D.jsxs)(T.FloatingPortal,{ref:t,...s,children:[o&&!0===l&&(0,D.jsx)(O.InternalBackdrop,{ref:n.context.internalBackdropRef,inert:(0,k.inertValue)(!i)}),e.children]})}):null});e.s(["DialogPortal",0,P],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),s=e.i(956789),r=e.i(17989),n=e.i(647554),o=e.i(675606),l=e.i(56434),i=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:o,isDrawer:l}){let d=e.useState("open"),u=e.useState("disablePointerDismissal"),c=e.useState("modal"),p=e.useState("popupElement"),x=e.useState("floatingRootContext"),[g,m]=t.useState(0),[f,h]=t.useState(0),b=0===g,v=(0,r.useDismiss)(x,{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,n.getTarget)(t);return!!b&&!u&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,n.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:b});(0,a.useScrollLock)(d&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{m(e),h(t)}),e.useContextCallback("onNestedDialogClose",()=>{m(0),h(0)}),t.useEffect(()=>(o?.onNestedDialogOpen&&d&&o.onNestedDialogOpen(g+1,f+ +!!l),o?.onNestedDialogClose&&!d&&o.onNestedDialogClose(),()=>{o?.onNestedDialogClose&&d&&o.onNestedDialogClose()}),[l,d,g,f,o]);let S=v.reference??s.EMPTY_OBJECT,j=v.trigger??s.EMPTY_OBJECT,w=v.floating??s.EMPTY_OBJECT;return(0,i.usePopupInteractionProps)(e,{activeTriggerProps:S,inactiveTriggerProps:j,popupProps:w,nestedOpenDialogCount:g,nestedOpenDrawerCount:f}),null},"useDialogRoot",0,function(e){let{store:a,actionsRef:s}=e,r=a.useState("open");(0,i.usePopupRootSync)(a,r),(0,i.useImplicitActiveTrigger)(a);let{forceUnmount:n}=(0,i.useOpenStateTransitions)(r,a),d=t.useCallback(()=>{a.setOpen(!1,(0,o.createChangeEventDetails)(l.REASONS.imperativeAction))},[a]);t.useImperativeHandle(s,()=>({unmount:n,close:d}),[n,d])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),s=e.i(67530),r=e.i(108821),n=e.i(616269),o=e.i(301252),l=e.i(116786),i=e.i(990627),d=e.i(264111);let u={...l.popupStoreSelectors,modal:(0,n.createSelector)(e=>e.modal),nested:(0,n.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,n.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,n.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,n.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,n.createSelector)(e=>e.openMethod),descriptionElementId:(0,n.createSelector)(e=>e.descriptionElementId),titleElementId:(0,n.createSelector)(e=>e.titleElementId),viewportElement:(0,n.createSelector)(e=>e.viewportElement),role:(0,n.createSelector)(e=>e.role)};class c extends o.ReactStore{constructor(e,a,s=!1){const r=new i.PopupTriggerMap,n=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);n.floatingRootContext=(0,l.createPopupFloatingRootContext)(r,a,s),super(n,{popupRef:t.createRef(),backdropRef:t.createRef(),internalBackdropRef:t.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:r,onOpenChange:void 0,onOpenChangeComplete:void 0},u)}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,d.setPopupOpenState)(a,e,t.trigger),this.update(a)};static useStore(e,t){return(0,d.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,n="dialog"){let{children:o,open:l,defaultOpen:i=!1,onOpenChange:d,onOpenChangeComplete:u,disablePointerDismissal:x=!1,modal:g=!0,actionsRef:m,handle:f,triggerId:h,defaultTriggerId:b=null}=e,v="alert-dialog"===n,S=(0,r.useDialogRootContext)(!0),j={modal:!!v||g,disablePointerDismissal:v||x,nested:!!S,role:v?"alertdialog":"dialog"},w=c.useStore(f?.store,{open:i,openProp:l,activeTriggerId:b,triggerIdProp:h,...j});(0,a.useOnFirstRender)(()=>{let e=void 0===l&&!1===w.state.open&&!0===i?{open:!0,activeTriggerId:b}:null;v?w.update(e?{...j,...e}:j):e&&w.update(e)}),w.useControlledProp("openProp",l),w.useControlledProp("triggerIdProp",h),w.useSyncedValues(j),w.useContextCallback("onOpenChange",d),w.useContextCallback("onOpenChangeComplete",u);let y=w.useState("open"),C=w.useState("mounted"),D=w.useState("payload");(0,s.useDialogRoot)({store:w,actionsRef:m});let N=t.useMemo(()=>({store:w}),[w]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:N,children:[(y||C)&&(0,p.jsx)(s.DialogInteractions,{store:w,parentContext:S?.store.context,isDrawer:"drawer"===n}),"function"==typeof o?o({payload:D}):o]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),s=e.i(552245),r=e.i(405005),n=e.i(209407),o=e.i(108821),l=e.i(625834);let i=((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),d={...r.popupStateMapping,...n.transitionStatusMapping,nested:e=>e?{[i.nested]:""}:null,nestedDialogOpen:e=>e?{[i.nestedDialogOpen]:""}:null},u=a.forwardRef(function(e,t){let{render:a,className:r,style:n,children:i,...u}=e,c=(0,l.useDialogPortalContext)(),{store:p}=(0,o.useDialogRootContext)(),x=p.useState("open"),g=p.useState("nested"),m=p.useState("transitionStatus"),f=p.useState("nestedOpenDialogCount"),h=p.useState("mounted"),b=p.useStateSetter("viewportElement");return(0,s.useRenderElement)("div",e,{enabled:c||h,state:{open:x,nested:g,transitionStatus:m,nestedDialogOpen:f>0},ref:[t,b],stateAttributesMapping:d,props:[{role:"presentation",hidden:!h,style:{pointerEvents:x?void 0:"none"},children:i},u]})});e.s(["DialogViewport",0,u],974217)},77173,313488,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(108821),s=e.i(552245),r=e.i(788015);let n=t.forwardRef(function(e,t){let{render:n,className:o,style:l,id:i,...d}=e,{store:u}=(0,a.useDialogRootContext)(),c=(0,r.useBaseUiId)(i);return u.useSyncedValueWithCleanup("titleElementId",c),(0,s.useRenderElement)("h2",e,{ref:t,props:[{id:c},d]})});e.s(["DialogTitle",0,n],77173);var o=e.i(733332),l=e.i(540886),i=e.i(405005),d=e.i(638396),u=e.i(264111),c=e.i(385689),p=e.i(32199);let x=t.forwardRef(function(e,n){let{render:x,className:g,style:m,disabled:f=!1,nativeButton:h=!0,id:b,payload:v,handle:S,...j}=e,w=(0,a.useDialogRootContext)(!0),y=S?.store??w?.store;if(!y)throw Error((0,o.default)(79));let C=(0,r.useBaseUiId)(b),D=y.useState("floatingRootContext"),N=y.useState("isOpenedByTrigger",C),R=y.useState("triggerPopupId",C),k=t.useRef(null),{registerTrigger:T,isMountedByThisTrigger:O}=(0,u.useTriggerDataForwarding)(C,k,y,{payload:v}),{getButtonProps:P,buttonRef:_}=(0,l.useButton)({disabled:f,native:h}),E=(0,c.useClick)(D,{enabled:null!=D}),I=(0,p.useOpenMethodTriggerProps)(()=>y.select("open"),e=>{y.set("openMethod",e)}),M=y.useState("triggerProps",O);return(0,s.useRenderElement)("button",e,{state:{disabled:f,open:N},ref:[_,n,T,k],props:[E.reference,M,I,{[d.CLICK_TRIGGER_IDENTIFIER]:"",id:C,"aria-haspopup":"dialog","aria-expanded":N,"aria-controls":R},j,P],stateAttributesMapping:i.triggerOpenStateMapping})});e.s(["DialogTrigger",0,x],313488)},325326,e=>{"use strict";var t=e.i(301807),a=e.i(675606),s=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)(s.REASONS.imperativeAction,void 0,t))}openWithPayload(e){this.store.set("payload",e),this.store.setOpen(!0,(0,a.createChangeEventDetails)(s.REASONS.imperativeAction,void 0,void 0))}close(){this.store.setOpen(!1,(0,a.createChangeEventDetails)(s.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["DialogHandle",0,r,"createDialogHandle",0,function(){return new r}])},353753,e=>{"use strict";e.s([],914651),e.i(914651);var t=e.i(402820),a=e.i(156736),s=e.i(209793),r=e.i(784324),n=e.i(264951),o=e.i(271645),l=e.i(108821),i=e.i(366250),d=e.i(974217),u=e.i(77173),c=e.i(313488),p=e.i(325326);e.s(["Backdrop",()=>t.DialogBackdrop,"Close",()=>a.DialogClose,"Description",()=>s.DialogDescription,"Handle",()=>p.DialogHandle,"Popup",()=>r.DialogPopup,"Portal",()=>n.DialogPortal,"Root",0,function(e){let t=o.useContext(l.IsDrawerContext)?"drawer":"dialog";return(0,i.useRenderDialogRoot)(e,t)},"Title",()=>u.DialogTitle,"Trigger",()=>c.DialogTrigger,"Viewport",()=>d.DialogViewport,"createHandle",()=>p.createDialogHandle],828376);var x=e.i(828376);e.s(["Dialog",0,x],353753)},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)},110204,e=>{"use strict";var t=e.i(843476),a=e.i(271645),s=e.i(115504);let r=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("label",{ref:r,"data-slot":"label",className:(0,s.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])},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])},871689,e=>{"use strict";var t=e.i(180127);e.s(["ArrowLeft",()=>t.default])},541202,e=>{"use strict";var t=e.i(843476),a=e.i(522016),s=e.i(560445);e.s(["DeprecationBanner",0,({featureName:e})=>(0,t.jsx)(s.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}})])},425656,e=>{"use strict";var t=e.i(843476),a=e.i(271645),s=e.i(871689),r=e.i(664659),n=e.i(16715),o=e.i(602869);e.i(707701);var l=e.i(807235),i=e.i(981080),d=e.i(531649),u=e.i(519455),c=e.i(204258),p=e.i(793479),x=e.i(967489),g=e.i(980376),m=e.i(746798),f=e.i(571303),h=e.i(115504);let b={pending:"bg-gray-400",running:"bg-blue-500",paused:"bg-amber-500",completed:"bg-green-500",failed:"bg-red-500"},v=["pending","running","paused","completed","failed"],S={pending:"Pending",running:"Running",paused:"Paused",completed:"Completed",failed:"Failed"},j={"step.started":{bar:"border-green-300 bg-green-50",text:"text-green-600"},"step.failed":{bar:"border-red-300 bg-red-50",text:"text-red-600"},"hook.waiting":{bar:"border-amber-300 bg-amber-50",text:"text-amber-600"},"hook.received":{bar:"border-blue-300 bg-blue-50",text:"text-blue-600"}};function w(e){let t=Date.now()-new Date(e).getTime();if(isNaN(t))return e;let a=Math.floor(t/1e3);if(a<60)return`${a}s ago`;let s=Math.floor(a/60);if(s<60)return`${s}m ago`;let r=Math.floor(s/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`}function y(e){return e<0?"":e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function C(e){let t=e.metadata?.title;return t?String(t):e.workflow_type??e.run_id.slice(0,8)}function D(e){return e.slice(0,8)}let N=({status:e,className:a})=>(0,t.jsx)("span",{className:(0,h.cn)("inline-block flex-none rounded-full",b[e]??"bg-gray-400",a)}),R=({value:e})=>{let[s,r]=(0,a.useState)(!1);return e.length<=120?(0,t.jsx)("span",{className:"break-all text-foreground",children:e}):(0,t.jsxs)("span",{className:"break-all text-foreground",children:[s?e:e.slice(0,120)+"…",(0,t.jsx)(u.Button,{variant:"link",size:"xs",className:"h-auto px-1 py-0 text-[11px]",onClick:()=>r(e=>!e),children:s?"less":"more"})]})},k=({run:e})=>{let a=e.metadata??{},s=[{key:"state",label:"state"},{key:"worktree_path",label:"worktree"},{key:"grill_session_id",label:"grill session"},{key:"session_id",label:"session"}],r=new Set(["title",...s.map(e=>e.key)]),n=Object.entries(a).filter(([e,t])=>!r.has(e)&&null!=t&&""!==t);return(0,t.jsxs)("div",{className:"mb-4 overflow-hidden rounded-lg border",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5 border-b px-5 py-3.5",children:[(0,t.jsx)(N,{status:e.status,className:"size-2.5"}),(0,t.jsx)("span",{className:"flex-1 text-sm font-semibold text-foreground",children:C(e)}),(0,t.jsx)("span",{className:"rounded bg-muted px-2 py-0.5 font-mono text-[11px] text-muted-foreground",children:D(e.run_id)}),(0,t.jsx)("span",{className:"rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground",children:e.workflow_type})]}),(0,t.jsxs)("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(220px,1fr))] gap-x-6 gap-y-2 px-5 py-3 font-mono text-xs",children:[(0,t.jsx)(T,{label:"status",children:(0,t.jsx)("span",{className:"capitalize text-foreground",children:e.status})}),(0,t.jsx)(T,{label:"created",children:(0,t.jsx)("span",{className:"text-foreground",children:w(e.created_at)})}),a.pr_url&&(0,t.jsx)(T,{label:"pr",children:(0,t.jsx)("a",{href:String(a.pr_url),target:"_blank",rel:"noopener noreferrer",className:"break-all text-primary underline-offset-4 hover:underline",children:String(a.pr_url)})}),s.map(({key:e,label:s})=>{let r=a[e];if(null==r||""===r)return null;let n="object"==typeof r?JSON.stringify(r):String(r);return(0,t.jsx)(T,{label:s,children:(0,t.jsx)(R,{value:n})},e)}),n.map(([e,a])=>{let s="object"==typeof a?JSON.stringify(a):String(a);return(0,t.jsx)(T,{label:e,children:(0,t.jsx)(R,{value:s})},e)})]})]})},T=({label:e,children:a})=>(0,t.jsxs)("div",{className:"flex flex-col gap-px",children:[(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-[0.06em] text-muted-foreground",children:e}),(0,t.jsx)("span",{className:"text-xs",children:a})]}),O=({run:e,events:s})=>{if(0===s.length)return(0,t.jsx)("div",{className:"py-4 font-mono text-xs text-muted-foreground",children:"No events recorded"});let r=new Date(e.created_at).getTime(),n=Math.max(...s.map(e=>new Date(e.created_at).getTime())),o=Math.max(n-r,1),l=y(n-r);return(0,t.jsx)(m.TooltipProvider,{delay:300,children:(0,t.jsxs)("div",{className:"font-mono text-xs",children:[(0,t.jsxs)("div",{className:"mb-0.5 grid grid-cols-[160px_minmax(0,1fr)] gap-x-3",children:[(0,t.jsx)("div",{}),(0,t.jsxs)("div",{className:"relative h-4",children:[(0,t.jsx)("span",{className:"absolute left-0 text-[10px] text-muted-foreground",children:"0"}),(0,t.jsx)("span",{className:"absolute left-full -translate-x-full text-[10px] text-muted-foreground",children:l})]})]}),(0,t.jsxs)("div",{className:"mb-1 grid grid-cols-[160px_minmax(0,1fr)] gap-x-3",children:[(0,t.jsx)("div",{className:"truncate pt-0.5 text-foreground",children:C(e)}),(0,t.jsx)("div",{className:"flex h-6 items-center rounded border bg-muted pl-2",children:(0,t.jsx)("span",{className:"text-[11px] text-muted-foreground",children:l})})]}),(0,t.jsx)("div",{className:"grid grid-cols-[160px_minmax(0,1fr)] gap-x-3 gap-y-[3px]",children:s.map(e=>{let l=new Date(e.created_at).getTime(),i=(l-r)/o*100,d=s.findIndex(t=>t.sequence_number>e.sequence_number),u=d>=0?new Date(s[d].created_at).getTime():n+Math.max(.12*o,500),c=Math.max(8,(u-l)/o*100),p=j[e.event_type]??{bar:"border-border bg-muted",text:"text-muted-foreground"},x=y(u-l);return(0,t.jsxs)(a.default.Fragment,{children:[(0,t.jsx)("div",{className:(0,h.cn)("truncate pt-0.5 pl-3",p.text),children:e.step_name||e.event_type}),(0,t.jsx)("div",{className:"relative h-6",children:(0,t.jsxs)(m.Tooltip,{children:[(0,t.jsxs)(m.TooltipTrigger,{render:(0,t.jsx)("div",{className:(0,h.cn)("absolute h-full cursor-default gap-1.5 overflow-hidden rounded border pl-2","flex items-center",p.bar),style:{left:`${Math.min(i,92)}%`,width:`${Math.min(c,100-Math.min(i,92))}%`}}),children:[(0,t.jsx)("span",{className:(0,h.cn)("whitespace-nowrap text-[11px]",p.text),children:e.event_type}),x&&(0,t.jsx)("span",{className:"whitespace-nowrap text-[11px] text-muted-foreground",children:x})]}),(0,t.jsx)(m.TooltipContent,{className:"font-mono text-[11px] leading-relaxed",children:(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"opacity-70",children:"type: "}),(0,t.jsx)("span",{children:e.event_type})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"opacity-70",children:"step: "}),e.step_name]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"opacity-70",children:"seq: "}),e.sequence_number]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"opacity-70",children:"time: "}),w(e.created_at)]}),e.data&&Object.keys(e.data).length>0&&(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"opacity-70",children:"data: "}),JSON.stringify(e.data)]})]})})]})})]},e.event_id)})})]})})},P={user:"text-blue-600",assistant:"text-green-600",system:"text-violet-600",tool_result:"text-amber-600"},_=({msg:e})=>(0,t.jsxs)("div",{className:"grid grid-cols-[80px_minmax(0,1fr)] items-start gap-x-4 border-b py-2.5 font-mono text-xs",children:[(0,t.jsxs)("span",{className:(0,h.cn)("pt-px",P[e.role]??"text-muted-foreground"),children:["[",e.role,"]"]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"block whitespace-pre-wrap break-words leading-relaxed text-foreground",children:e.content}),(0,t.jsx)("span",{className:"mt-0.5 block text-[11px] text-muted-foreground",children:w(e.created_at)})]})]}),E=({title:e,meta:a,defaultOpen:s=!1,children:n})=>(0,t.jsxs)(c.Collapsible,{defaultOpen:s,children:[(0,t.jsxs)(c.CollapsibleTrigger,{className:"group flex w-full items-center gap-2 px-4 py-3 text-left text-xs font-medium text-foreground hover:bg-muted/50",children:[(0,t.jsx)(r.ChevronDown,{className:"size-3.5 -rotate-90 text-muted-foreground transition-transform group-data-[panel-open]:rotate-0"}),(0,t.jsxs)("span",{children:[e,(0,t.jsx)("span",{className:"ml-1.5 text-[11px] font-normal text-muted-foreground",children:a})]})]}),(0,t.jsx)(c.CollapsibleContent,{className:"px-4 pb-3",children:n})]}),I=({accessToken:e})=>{let[r,c]=(0,a.useState)([]),[m,h]=(0,a.useState)(!1),[b,j]=(0,a.useState)(null),[y,R]=(0,a.useState)([]),[T,P]=(0,a.useState)([]),[I,M]=(0,a.useState)(!1),[F,B]=(0,a.useState)(!1),[A,$]=(0,a.useState)([]),[H,L]=(0,a.useState)(""),[z,U]=(0,a.useState)(!1),q=(0,a.useCallback)(async()=>{if(e){h(!0);try{let t=await fetch(`${o.proxyBaseUrl??""}/v1/workflows/runs?limit=100`,{headers:{[(0,o.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!t.ok)throw Error(`HTTP ${t.status}`);let a=await t.json();c(a.runs??[])}catch(e){console.error("workflow runs fetch failed:",e)}finally{h(!1)}}},[e]),V=(0,a.useCallback)(async t=>{if(e){j(t),B(!0),M(!0),R([]),P([]);try{let a=o.proxyBaseUrl??"",[s,r]=await Promise.all([fetch(`${a}/v1/workflows/runs/${t.run_id}/events`,{headers:{[(0,o.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}}),fetch(`${a}/v1/workflows/runs/${t.run_id}/messages`,{headers:{[(0,o.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}})]),n=s.ok?await s.json():{events:[]},l=r.ok?await r.json():{messages:[]};R([...n.events??[]].sort((e,t)=>e.sequence_number-t.sequence_number)),P([...l.messages??[]].sort((e,t)=>e.sequence_number-t.sequence_number))}catch(e){console.error("workflow run detail fetch failed:",e)}finally{M(!1)}}},[e]);(0,a.useEffect)(()=>{q()},[q]);let K=(0,a.useMemo)(()=>[{id:"run",accessorFn:e=>`${C(e)} ${e.run_id}`,header:"Run",meta:{title:"Run",skeleton:"twoLine"},cell:({row:e})=>{let a=e.original;return(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(N,{status:a.status,className:"size-[7px]"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[13px] font-medium leading-snug text-foreground",children:C(a)}),(0,t.jsx)("div",{className:"font-mono text-[11px] text-muted-foreground",children:D(a.run_id)})]})]})}},{accessorKey:"workflow_type",header:"Type",meta:{title:"Type"},filterFn:"includesString",cell:({row:e})=>(0,t.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:e.original.workflow_type})},{id:"status",accessorKey:"status",header:"Status",meta:{title:"Status"},filterFn:"equalsString",cell:({row:e})=>{let a=e.original;return(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(N,{status:a.status,className:"size-[7px]"}),(0,t.jsx)("span",{className:"text-xs capitalize text-muted-foreground",children:a.metadata?.state??a.status})]})}},{accessorKey:"created_at",header:"Created",meta:{title:"Created"},cell:({row:e})=>(0,t.jsx)("span",{className:"text-xs text-muted-foreground",children:w(e.original.created_at)})}],[]);return(0,t.jsxs)("div",{className:"w-full px-8 py-6",children:[(0,t.jsxs)("div",{className:"mb-5",children:[(0,t.jsx)("div",{className:"text-lg font-semibold text-foreground",children:"Workflow Runs"}),(0,t.jsx)("div",{className:"mt-0.5 text-[13px] text-muted-foreground",children:"Durable state tracking for agents and automated workflows"})]}),(0,t.jsx)(l.DataTable,{data:r,columns:K,getRowId:e=>e.run_id,isLoading:m,loadingMessage:"Loading workflow runs…",noDataMessage:(0,t.jsx)("div",{className:"py-6 text-center text-[13px] text-muted-foreground",children:"No workflow runs yet"}),paginationMode:"client",pageSizeOptions:[50,100],filterMode:"client",columnFilters:A,onColumnFiltersChange:$,globalFilter:H,onGlobalFilterChange:L,onRowClick:V,size:"compact",toolbar:e=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d.DataTableToolbar,{table:e,searchValue:H,onSearchChange:L,searchPlaceholder:"Search runs…",onRefresh:q,isRefreshing:m,onOpenFilters:()=>U(!0)}),(0,t.jsx)(i.DataTableFilterDrawer,{table:e,open:z,onOpenChange:U,title:"Filters",description:"Narrow down workflow runs",children:({get:e,set:a})=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.DataTableFilterField,{label:"Status",children:(0,t.jsxs)(x.Select,{items:S,value:e("status")||null,onValueChange:e=>a("status",e??""),children:[(0,t.jsx)(x.SelectTrigger,{className:"w-full",children:(0,t.jsx)(x.SelectValue,{placeholder:"All statuses"})}),(0,t.jsxs)(x.SelectContent,{children:[(0,t.jsx)(x.SelectItem,{value:null,children:"All statuses"}),v.map(e=>(0,t.jsx)(x.SelectItem,{value:e,children:S[e]},e))]})]})}),(0,t.jsx)(i.DataTableFilterField,{label:"Type",children:(0,t.jsx)(p.Input,{value:e("workflow_type")??"",onChange:e=>a("workflow_type",e.target.value),placeholder:"Filter by type…"})})]})})]})}),(0,t.jsx)(g.Sheet,{open:F,onOpenChange:B,children:(0,t.jsxs)(g.SheetContent,{showCloseButton:!1,className:"overflow-y-auto p-0 data-[side=right]:w-full data-[side=right]:sm:max-w-[680px]",children:[(0,t.jsx)(g.SheetTitle,{className:"sr-only",children:"Workflow run details"}),(0,t.jsx)(g.SheetDescription,{className:"sr-only",children:"Metadata, timeline and messages for the selected workflow run"}),b?I?(0,t.jsx)("div",{className:"flex justify-center py-20",children:(0,t.jsx)(f.UiLoadingSpinner,{className:"size-8 text-muted-foreground"})}):(0,t.jsxs)("div",{className:"px-7 py-6",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsxs)(u.Button,{variant:"ghost",size:"sm",className:"px-0 text-xs font-normal text-muted-foreground hover:bg-transparent",onClick:()=>B(!1),children:[(0,t.jsx)(s.ArrowLeft,{}),"close"]}),(0,t.jsxs)(u.Button,{variant:"outline",size:"sm",onClick:()=>V(b),children:[(0,t.jsx)(n.RefreshCw,{}),"Refresh"]})]}),(0,t.jsx)(k,{run:b}),(0,t.jsxs)("div",{className:"divide-y overflow-hidden rounded-lg border",children:[(0,t.jsx)(E,{title:"Timeline",meta:(0,t.jsxs)(t.Fragment,{children:[y.length," ",1===y.length?"event":"events"]}),defaultOpen:!0,children:(0,t.jsx)(O,{run:b,events:y})}),(0,t.jsx)(E,{title:"Messages",meta:T.length,children:0===T.length?(0,t.jsx)("div",{className:"py-3 font-mono text-xs text-muted-foreground",children:"No messages"}):(0,t.jsx)("div",{children:T.map(e=>(0,t.jsx)(_,{msg:e},e.message_id))})})]})]}):null]})})]})};var M=e.i(541202),F=e.i(135214);e.s(["default",0,function(){let{accessToken:e}=(0,F.default)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(M.DeprecationBanner,{featureName:"Workflows"}),(0,t.jsx)(I,{accessToken:e})]})}],425656)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0lrifevwaw-qj.js b/litellm/proxy/_experimental/out/_next/static/chunks/0lrifevwaw-qj.js new file mode 100644 index 00000000000..1c2d3c42516 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0lrifevwaw-qj.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},755146,e=>{"use strict";var t=e.i(843476),i=e.i(451512),a=e.i(115504);e.i(233565),e.i(678784),e.s(["DropdownMenu",0,function({...e}){return(0,t.jsx)(i.Menu.Root,{"data-slot":"dropdown-menu",...e})},"DropdownMenuContent",0,function({align:e="start",alignOffset:n=0,side:l="bottom",sideOffset:r=4,className:o,...s}){return(0,t.jsx)(i.Menu.Portal,{children:(0,t.jsx)(i.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:n,side:l,sideOffset:r,children:(0,t.jsx)(i.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",o),...s})})})},"DropdownMenuItem",0,function({className:e,inset:n,variant:l="default",...r}){return(0,t.jsx)(i.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),...r})},"DropdownMenuSeparator",0,function({className:e,...n}){return(0,t.jsx)(i.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)(i.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},541071,373488,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(["default",0,t],373488),e.s(["MoreHorizontal",0,t],541071)},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)},655063,e=>{"use strict";var t=e.i(399029),i=e.i(271645);e.s(["useDebouncedValue",0,function(e,a,n){let[l,r,o]=(0,t.useDebouncedState)(e,a,n);return(0,i.useEffect)(()=>{r(e)},[e,r]),[l,o]}])},118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},21548,e=>{"use strict";var t=e.i(616303);e.s(["Empty",()=>t.default])},928685,e=>{"use strict";var t=e.i(38953);e.s(["SearchOutlined",()=>t.default])},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])},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},518617,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={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),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["CloseCircleOutlined",0,l],518617)},19732,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:"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),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["ExperimentOutlined",0,l],19732)},826910,e=>{"use strict";var t=e.i(201072);e.s(["CheckCircleFilled",()=>t.default])},988846,181692,438100,e=>{"use strict";var t=e.i(54943);e.s(["SearchIcon",()=>t.default],988846);let i=(0,e.i(475254).default)("key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);e.s(["default",0,i],181692),e.s(["KeyIcon",0,i],438100)},302202,e=>{"use strict";var t=e.i(953651);e.s(["ServerIcon",()=>t.default])},168118,e=>{"use strict";var t=e.i(879664);e.s(["InfoIcon",()=>t.default])},462433,e=>{e.q("/litellm-asset-prefix/_next/static/media/aim_security.15w_gpz3t43v3.jpeg")},80967,e=>{e.q("/litellm-asset-prefix/_next/static/media/akto.3jgaivqd683t4.svg")},20698,e=>{e.q("/litellm-asset-prefix/_next/static/media/aporia.2e_nhf0zf8oli.png")},509105,e=>{e.q("/litellm-asset-prefix/_next/static/media/cato_networks.1awrzn_1otwbt.svg")},648931,e=>{e.q("/litellm-asset-prefix/_next/static/media/cisco.0pf2ni7nes2im.png")},689521,e=>{e.q("/litellm-asset-prefix/_next/static/media/deepkeep.0k6ge0vqyxdi0.svg")},579477,e=>{e.q("/litellm-asset-prefix/_next/static/media/enkrypt_ai.3_-p3-cd2dkrp.avif")},872799,e=>{e.q("/litellm-asset-prefix/_next/static/media/guardrails_ai.0c_76h1qg_2ff.jpeg")},616667,e=>{e.q("/litellm-asset-prefix/_next/static/media/javelin.300c2jc378vi4.png")},356349,e=>{e.q("/litellm-asset-prefix/_next/static/media/lakeraai.2xbgu6-fr-5ca.jpeg")},855305,e=>{e.q("/litellm-asset-prefix/_next/static/media/lasso.1elqma2u3h-qi.png")},480509,e=>{e.q("/litellm-asset-prefix/_next/static/media/litellm_logo.2q-1n9v95d189.jpg")},622024,e=>{e.q("/litellm-asset-prefix/_next/static/media/noma_security.07ydrwasze5i8.png")},818207,e=>{e.q("/litellm-asset-prefix/_next/static/media/palo_alto_networks.3t0xwyuc-6s43.jpeg")},896626,e=>{e.q("/litellm-asset-prefix/_next/static/media/pangea.0ldsllwi7dvjg.png")},297290,e=>{e.q("/litellm-asset-prefix/_next/static/media/pillar.09s1gdql9yppp.jpeg")},414170,e=>{e.q("/litellm-asset-prefix/_next/static/media/prompt_security.34ps_5vqhm25q.png")},923884,e=>{e.q("/litellm-asset-prefix/_next/static/media/promptguard.0m31gz-559aca.svg")},295045,e=>{e.q("/litellm-asset-prefix/_next/static/media/qohash.14emr-wtp42k3.jpg")},145645,e=>{e.q("/litellm-asset-prefix/_next/static/media/repelloai.3ossrsdbm80kg.png")},205897,e=>{e.q("/litellm-asset-prefix/_next/static/media/straiker.0hnk6y758t2jh.svg")},926168,e=>{e.q("/litellm-asset-prefix/_next/static/media/xecguard.317q_7yg6brag.svg")},583306,e=>{e.q("/litellm-asset-prefix/_next/static/media/zscaler.42cagyicgk81q.svg")},788191,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:"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:"M719.4 499.1l-296.1-215A15.9 15.9 0 00398 297v430c0 13.1 14.8 20.5 25.3 12.9l296.1-215a15.9 15.9 0 000-25.8zm-257.6 134V390.9L628.5 512 461.8 633.1z"}}]},name:"play-circle",theme:"outlined"};var n=e.i(9583),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["PlayCircleOutlined",0,l],788191)},987432,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:"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=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["SaveOutlined",0,l],987432)},750113,e=>{"use strict";var t=e.i(684024);e.s(["QuestionCircleOutlined",()=>t.default])},266537,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:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};var n=e.i(9583),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["ArrowRightOutlined",0,l],266537)},758472,634831,e=>{"use strict";let t=(0,e.i(475254).default)("code",[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]);e.s(["Code",0,t],758472);var i=e.i(546467);e.s(["ExternalLinkIcon",()=>i.default],634831)},328196,e=>{"use strict";var t=e.i(361653);e.s(["AlertCircleIcon",()=>t.default])},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let a={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 n=e.i(9583),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["ExportOutlined",0,l],872934)},245094,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:"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 n=e.i(9583),l=i.forwardRef(function(e,l){return i.createElement(n.default,(0,t.default)({},e,{ref:l,icon:a}))});e.s(["CodeOutlined",0,l],245094)},573421,e=>{"use strict";e.i(247167);var t=e.i(8211),i=e.i(271645),a=e.i(343794),n=e.i(887719),l=e.i(908206),r=e.i(242064),o=e.i(721132),s=e.i(517455),d=e.i(281256),c=e.i(150073),m=e.i(165370),u=e.i(244451);let f=i.default.createContext({});f.Consumer;var p=e.i(763731),g=e.i(211576),v=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[n]]=e[a[n]]);return i};let h=i.default.forwardRef((e,t)=>{let n,{prefixCls:l,children:o,actions:s,extra:d,styles:c,className:m,classNames:u,colStyle:h}=e,x=v(e,["prefixCls","children","actions","extra","styles","className","classNames","colStyle"]),{grid:$,itemLayout:y}=(0,i.useContext)(f),{getPrefixCls:b,list:S}=(0,i.useContext)(r.ConfigContext),k=e=>{var t,i;return(0,a.default)(null==(i=null==(t=null==S?void 0:S.item)?void 0:t.classNames)?void 0:i[e],null==u?void 0:u[e])},w=e=>{var t,i;return Object.assign(Object.assign({},null==(i=null==(t=null==S?void 0:S.item)?void 0:t.styles)?void 0:i[e]),null==c?void 0:c[e])},z=b("list",l),C=s&&s.length>0&&i.default.createElement("ul",{className:(0,a.default)(`${z}-item-action`,k("actions")),key:"actions",style:w("actions")},s.map((e,t)=>i.default.createElement("li",{key:`${z}-item-action-${t}`},e,t!==s.length-1&&i.default.createElement("em",{className:`${z}-item-action-split`})))),E=i.default.createElement($?"div":"li",Object.assign({},x,$?{}:{ref:t},{className:(0,a.default)(`${z}-item`,{[`${z}-item-no-flex`]:!("vertical"===y?!!d:(n=!1,i.Children.forEach(o,e=>{"string"==typeof e&&(n=!0)}),!(n&&i.Children.count(o)>1)))},m)}),"vertical"===y&&d?[i.default.createElement("div",{className:`${z}-item-main`,key:"content"},o,C),i.default.createElement("div",{className:(0,a.default)(`${z}-item-extra`,k("extra")),key:"extra",style:w("extra")},d)]:[o,C,(0,p.cloneElement)(d,{key:"extra"})]);return $?i.default.createElement(g.Col,{ref:t,flex:1,style:h},E):E});h.Meta=e=>{var{prefixCls:t,className:n,avatar:l,title:o,description:s}=e,d=v(e,["prefixCls","className","avatar","title","description"]);let{getPrefixCls:c}=(0,i.useContext)(r.ConfigContext),m=c("list",t),u=(0,a.default)(`${m}-item-meta`,n),f=i.default.createElement("div",{className:`${m}-item-meta-content`},o&&i.default.createElement("h4",{className:`${m}-item-meta-title`},o),s&&i.default.createElement("div",{className:`${m}-item-meta-description`},s));return i.default.createElement("div",Object.assign({},d,{className:u}),l&&i.default.createElement("div",{className:`${m}-item-meta-avatar`},l),(o||s)&&f)},e.i(296059);var x=e.i(915654),$=e.i(183293),y=e.i(246422),b=e.i(838378);let S=(0,y.genStyleHooks)("List",e=>{let t=(0,b.mergeToken)(e,{listBorderedCls:`${e.componentCls}-bordered`,minHeight:e.controlHeightLG});return[(e=>{let{componentCls:t,antCls:i,controlHeight:a,minHeight:n,paddingSM:l,marginLG:r,padding:o,itemPadding:s,colorPrimary:d,itemPaddingSM:c,itemPaddingLG:m,paddingXS:u,margin:f,colorText:p,colorTextDescription:g,motionDurationSlow:v,lineWidth:h,headerBg:y,footerBg:b,emptyTextPadding:S,metaMarginBottom:k,avatarMarginRight:w,titleMarginBottom:z,descriptionFontSize:C}=e;return{[t]:Object.assign(Object.assign({},(0,$.resetComponent)(e)),{position:"relative","--rc-virtual-list-scrollbar-bg":e.colorSplit,"*":{outline:"none"},[`${t}-header`]:{background:y},[`${t}-footer`]:{background:b},[`${t}-header, ${t}-footer`]:{paddingBlock:l},[`${t}-pagination`]:{marginBlockStart:r,[`${i}-pagination-options`]:{textAlign:"start"}},[`${t}-spin`]:{minHeight:n,textAlign:"center"},[`${t}-items`]:{margin:0,padding:0,listStyle:"none"},[`${t}-item`]:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:s,color:p,[`${t}-item-meta`]:{display:"flex",flex:1,alignItems:"flex-start",maxWidth:"100%",[`${t}-item-meta-avatar`]:{marginInlineEnd:w},[`${t}-item-meta-content`]:{flex:"1 0",width:0,color:p},[`${t}-item-meta-title`]:{margin:`0 0 ${(0,x.unit)(e.marginXXS)} 0`,color:p,fontSize:e.fontSize,lineHeight:e.lineHeight,"> a":{color:p,transition:`all ${v}`,"&:hover":{color:d}}},[`${t}-item-meta-description`]:{color:g,fontSize:C,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,x.unit)(u)}`,color:g,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,x.unit)(o)} 0`,color:g,fontSize:e.fontSizeSM,textAlign:"center"},[`${t}-empty-text`]:{padding:S,color:e.colorTextDisabled,fontSize:e.fontSize,textAlign:"center"},[`${t}-item-no-flex`]:{display:"block"}}),[`${t}-grid ${i}-col > ${t}-item`]:{display:"block",maxWidth:"100%",marginBlockEnd:f,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:k,[`${t}-item-meta-title`]:{marginBlockStart:0,marginBlockEnd:z,color:p,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}},[`${t}-item-action`]:{marginBlockStart:o,marginInlineStart:"auto","> li":{padding:`0 ${(0,x.unit)(o)}`,"&:first-child":{paddingInlineStart:0}}}},[`${t}-split ${t}-item`]:{borderBlockEnd:`${(0,x.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"&:last-child":{borderBlockEnd:"none"}},[`${t}-split ${t}-header`]:{borderBlockEnd:`${(0,x.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-split${t}-empty ${t}-footer`]:{borderTop:`${(0,x.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-loading ${t}-spin-nested-loading`]:{minHeight:a},[`${t}-split${t}-something-after-last-item ${i}-spin-container > ${t}-items > ${t}-item:last-child`]:{borderBlockEnd:`${(0,x.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`},[`${t}-lg ${t}-item`]:{padding:m},[`${t}-sm ${t}-item`]:{padding:c},[`${t}:not(${t}-vertical)`]:{[`${t}-item-no-flex`]:{[`${t}-item-action`]:{float:"right"}}}}})(t),(e=>{let{listBorderedCls:t,componentCls:i,paddingLG:a,margin:n,itemPaddingSM:l,itemPaddingLG:r,marginLG:o,borderRadiusLG:s}=e,d=(0,x.unit)(e.calc(s).sub(e.lineWidth).equal());return{[t]:{border:`${(0,x.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:s,[`${i}-header`]:{borderRadius:`${d} ${d} 0 0`},[`${i}-footer`]:{borderRadius:`0 0 ${d} ${d}`},[`${i}-header,${i}-footer,${i}-item`]:{paddingInline:a},[`${i}-pagination`]:{margin:`${(0,x.unit)(n)} ${(0,x.unit)(o)}`}},[`${t}${i}-sm`]:{[`${i}-item,${i}-header,${i}-footer`]:{padding:l}},[`${t}${i}-lg`]:{[`${i}-item,${i}-header,${i}-footer`]:{padding:r}}}})(t),(e=>{let{componentCls:t,screenSM:i,screenMD:a,marginLG:n,marginSM:l,margin:r}=e;return{[`@media screen and (max-width:${a}px)`]:{[t]:{[`${t}-item`]:{[`${t}-item-action`]:{marginInlineStart:n}}},[`${t}-vertical`]:{[`${t}-item`]:{[`${t}-item-extra`]:{marginInlineStart:n}}}},[`@media screen and (max-width: ${i}px)`]:{[t]:{[`${t}-item`]:{flexWrap:"wrap",[`${t}-action`]:{marginInlineStart:l}}},[`${t}-vertical`]:{[`${t}-item`]:{flexWrap:"wrap-reverse",[`${t}-item-main`]:{minWidth:e.contentWidth},[`${t}-item-extra`]:{margin:`auto auto ${(0,x.unit)(r)}`}}}}}})(t)]},e=>({contentWidth:220,itemPadding:`${(0,x.unit)(e.paddingContentVertical)} 0`,itemPaddingSM:`${(0,x.unit)(e.paddingContentVerticalSM)} ${(0,x.unit)(e.paddingContentHorizontal)}`,itemPaddingLG:`${(0,x.unit)(e.paddingContentVerticalLG)} ${(0,x.unit)(e.paddingContentHorizontalLG)}`,headerBg:"transparent",footerBg:"transparent",emptyTextPadding:e.padding,metaMarginBottom:e.padding,avatarMarginRight:e.padding,titleMarginBottom:e.paddingSM,descriptionFontSize:e.fontSize}));var k=function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&0>t.indexOf(a)&&(i[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])&&(i[a[n]]=e[a[n]]);return i};let w=i.forwardRef(function(e,p){let{pagination:g=!1,prefixCls:v,bordered:h=!1,split:x=!0,className:$,rootClassName:y,style:b,children:w,itemLayout:z,loadMore:C,grid:E,dataSource:O=[],size:j,header:M,footer:_,loading:q=!1,rowKey:N,renderItem:I,locale:B}=e,H=k(e,["pagination","prefixCls","bordered","split","className","rootClassName","style","children","itemLayout","loadMore","grid","dataSource","size","header","footer","loading","rowKey","renderItem","locale"]),L=g&&"object"==typeof g?g:{},[V,P]=i.useState(L.defaultCurrent||1),[R,T]=i.useState(L.defaultPageSize||10),{getPrefixCls:A,direction:W,className:D,style:G}=(0,r.useComponentConfig)("list"),{renderEmpty:X}=i.useContext(r.ConfigContext),K=e=>(t,i)=>{var a;P(t),T(i),g&&(null==(a=null==g?void 0:g[e])||a.call(g,t,i))},F=K("onChange"),J=K("onShowSizeChange"),U=!!(C||g||_),Q=A("list",v),[Y,Z,ee]=S(Q),et=q;"boolean"==typeof et&&(et={spinning:et});let ei=!!(null==et?void 0:et.spinning),ea=(0,s.default)(j),en="";switch(ea){case"large":en="lg";break;case"small":en="sm"}let el=(0,a.default)(Q,{[`${Q}-vertical`]:"vertical"===z,[`${Q}-${en}`]:en,[`${Q}-split`]:x,[`${Q}-bordered`]:h,[`${Q}-loading`]:ei,[`${Q}-grid`]:!!E,[`${Q}-something-after-last-item`]:U,[`${Q}-rtl`]:"rtl"===W},D,$,y,Z,ee),er=(0,n.default)({current:1,total:0,position:"bottom"},{total:O.length,current:V,pageSize:R},g||{}),eo=Math.ceil(er.total/er.pageSize);er.current=Math.min(er.current,eo);let es=g&&i.createElement("div",{className:(0,a.default)(`${Q}-pagination`)},i.createElement(m.default,Object.assign({align:"end"},er,{onChange:F,onShowSizeChange:J}))),ed=(0,t.default)(O);g&&O.length>(er.current-1)*er.pageSize&&(ed=(0,t.default)(O).splice((er.current-1)*er.pageSize,er.pageSize));let ec=Object.keys(E||{}).some(e=>["xs","sm","md","lg","xl","xxl"].includes(e)),em=(0,c.default)(ec),eu=i.useMemo(()=>{for(let e=0;e{if(!E)return;let e=eu&&E[eu]?E[eu]:E.column;if(e)return{width:`${100/e}%`,maxWidth:`${100/e}%`}},[JSON.stringify(E),eu]),ep=ei&&i.createElement("div",{style:{minHeight:53}});if(ed.length>0){let e=ed.map((e,t)=>{let a;return I?((a="function"==typeof N?N(e):N?e[N]:e.key)||(a=`list-item-${t}`),i.createElement(i.Fragment,{key:a},I(e,t))):null});ep=E?i.createElement(d.Row,{gutter:E.gutter},i.Children.map(e,e=>i.createElement("div",{key:null==e?void 0:e.key,style:ef},e))):i.createElement("ul",{className:`${Q}-items`},e)}else w||ei||(ep=i.createElement("div",{className:`${Q}-empty-text`},(null==B?void 0:B.emptyText)||(null==X?void 0:X("List"))||i.createElement(o.default,{componentName:"List"})));let eg=er.position,ev=i.useMemo(()=>({grid:E,itemLayout:z}),[JSON.stringify(E),z]);return Y(i.createElement(f.Provider,{value:ev},i.createElement("div",Object.assign({ref:p,style:Object.assign(Object.assign({},G),b),className:el},H),("top"===eg||"both"===eg)&&es,M&&i.createElement("div",{className:`${Q}-header`},M),i.createElement(u.default,Object.assign({},et),ep,w),_&&i.createElement("div",{className:`${Q}-footer`},_),C||("bottom"===eg||"both"===eg)&&es)))});w.Item=h,e.s(["List",0,w],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/0nobv49ll5nyv.js b/litellm/proxy/_experimental/out/_next/static/chunks/0nobv49ll5nyv.js deleted file mode 100644 index 688a61a6b83..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0nobv49ll5nyv.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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,373488,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(["default",0,t],373488),e.s(["MoreHorizontal",0,t],541071)},755146,e=>{"use strict";var t=e.i(843476),r=e.i(451512),s=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:a=0,side:n="bottom",sideOffset:i=4,className:l,...o}){return(0,t.jsx)(r.Menu.Portal,{children:(0,t.jsx)(r.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:a,side:n,sideOffset:i,children:(0,t.jsx)(r.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,s.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),...o})})})},"DropdownMenuItem",0,function({className:e,inset:a,variant:n="default",...i}){return(0,t.jsx)(r.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":a,"data-variant":n,className:(0,s.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)(r.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,s.cn)("-mx-1 my-1 h-px bg-border",e),...a})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(r.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},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)},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])},952571,e=>{"use strict";var t=e.i(879664);e.s(["Info",()=>t.default])},655063,e=>{"use strict";var t=e.i(399029),r=e.i(271645);e.s(["useDebouncedValue",0,function(e,s,a){let[n,i,l]=(0,t.useDebouncedState)(e,s,a);return(0,r.useEffect)(()=>{i(e)},[e,i]),[n,l]}])},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])},776639,e=>{"use strict";var t=e.i(843476),r=e.i(353753),s=e.i(115504),a=e.i(519455),n=e.i(995926);function i({...e}){return(0,t.jsx)(r.Dialog.Portal,{"data-slot":"dialog-portal",...e})}function l({className:e,...a}){return(0,t.jsx)(r.Dialog.Backdrop,{"data-slot":"dialog-overlay",className:(0,s.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...a})}e.s(["Dialog",0,function({...e}){return(0,t.jsx)(r.Dialog.Root,{"data-slot":"dialog",...e})},"DialogContent",0,function({className:e,children:o,showCloseButton:d=!0,...c}){return(0,t.jsxs)(i,{children:[(0,t.jsx)(l,{}),(0,t.jsxs)(r.Dialog.Popup,{"data-slot":"dialog-content",className:(0,s.cn)("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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),...c,children:[o,d&&(0,t.jsxs)(r.Dialog.Close,{"data-slot":"dialog-close",render:(0,t.jsx)(a.Button,{variant:"ghost",className:"absolute top-4 right-4",size:"icon-sm"}),children:[(0,t.jsx)(n.XIcon,{}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})},"DialogDescription",0,function({className:e,...a}){return(0,t.jsx)(r.Dialog.Description,{"data-slot":"dialog-description",className:(0,s.cn)("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...a})},"DialogFooter",0,function({className:e,showCloseButton:n=!1,children:i,...l}){return(0,t.jsxs)("div",{"data-slot":"dialog-footer",className:(0,s.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...l,children:[i,n&&(0,t.jsx)(r.Dialog.Close,{render:(0,t.jsx)(a.Button,{variant:"outline"}),children:"Close"})]})},"DialogHeader",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"dialog-header",className:(0,s.cn)("flex flex-col gap-2",e),...r})},"DialogTitle",0,function({className:e,...a}){return(0,t.jsx)(r.Dialog.Title,{"data-slot":"dialog-title",className:(0,s.cn)("leading-none font-medium",e),...a})}])},118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},21548,e=>{"use strict";var t=e.i(616303);e.s(["Empty",()=>t.default])},72713,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let s={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z"}}]},name:"calendar",theme:"outlined"};var a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["CalendarOutlined",0,n],72713)},278587,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:"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"}))});e.s(["RefreshIcon",0,r],278587)},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)},502547,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 5l7 7-7 7"}))});e.s(["ChevronRightIcon",0,r],502547)},953960,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(599724),a=e.i(389083);let n=r.forwardRef(function(e,t){return r.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),r.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 i=e.i(871943),l=e.i(502547),o=e.i(592968),d=e.i(602869),c=e.i(234713);e.s(["default",0,function({mcpServers:e,mcpAccessGroups:u=[],mcpToolPermissions:m={},mcpToolsets:h=[],accessToken:f}){let[p,g]=(0,r.useState)([]),[v,x]=(0,r.useState)([]),[b,y]=(0,r.useState)(new Set),[w,j]=(0,r.useState)(new Set);(0,r.useEffect)(()=>{(async()=>{if(f&&e.length>0)try{let e=await (0,d.fetchMCPServers)(f);e&&Array.isArray(e)?g(e):e.data&&Array.isArray(e.data)&&g(e.data)}catch(e){console.error("Error fetching MCP servers:",e)}})()},[f,e.length]),(0,r.useEffect)(()=>{(async()=>{if(f&&h.length>0)try{let e=await (0,d.fetchMCPToolsets)(f),t=Array.isArray(e)?e.filter(e=>h.includes(e.toolset_id)):[];x(t)}catch(e){console.error("Error fetching toolsets:",e)}})()},[f,h.length]);let S=e.includes(c.NO_MCP_SERVERS_SENTINEL),_=e.includes(c.ALL_PROXY_MCP_SERVERS_SENTINEL),C=[...e.filter(e=>e!==c.NO_MCP_SERVERS_SENTINEL&&e!==c.ALL_PROXY_MCP_SERVERS_SENTINEL).map(e=>({type:"server",value:e})),...u.map(e=>({type:"accessGroup",value:e}))],k=C.length+h.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)(n,{className:"h-4 w-4 text-blue-600"}),(0,t.jsx)(s.Text,{className:"font-semibold text-gray-900",children:"MCP Servers"}),(0,t.jsx)(a.Badge,{color:S?"red":"blue",size:"xs",children:S?"Blocked":_?"All":k})]}),S?(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)(n,{className:"h-4 w-4 text-red-400"}),(0,t.jsx)(s.Text,{className:"text-red-700 text-sm",children:"No MCP servers — this key is blocked from all MCP servers, including its team's servers"})]}):_?(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)(n,{className:"h-4 w-4 text-blue-400"}),(0,t.jsx)(s.Text,{className:"text-blue-700 text-sm",children:"All Proxy MCP Servers"})]}):k>0?(0,t.jsxs)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:[C.map((e,r)=>{let s="server"===e.type?m[e.value]:void 0,a=s&&s.length>0,n=b.has(e.value);return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>{var t;return a&&(t=e.value,void y(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 ${a?"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)(o.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=p.find(t=>t.server_id===e);if(t){let r=e.length>7?`${e.slice(0,3)}...${e.slice(-4)}`:e;return`${t.alias||t.server_name||e} (${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"})]})}),a&&(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:s.length}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===s.length?"tool":"tools"}),n?(0,t.jsx)(i.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(l.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),a&&n&&(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:s.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)}),h.length>0&&h.map((e,r)=>{let s=v.find(t=>t.toolset_id===e),a=w.has(e),n=s?.tools.length??0;return(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{onClick:()=>n>0&&void j(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 ${n>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:s?.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"})]}),n>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:n}),(0,t.jsx)("span",{className:"text-xs text-gray-500",children:1===n?"tool":"tools"}),a?(0,t.jsx)(i.ChevronDownIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"}):(0,t.jsx)(l.ChevronRightIcon,{className:"h-3.5 w-3.5 text-gray-400 ml-0.5"})]})]}),n>0&&a&&s&&(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:s.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)(n,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(s.Text,{className:"text-gray-500 text-sm",children:"No MCP servers, access groups, or toolsets configured"})]})]})}],953960)},384767,e=>{"use strict";var t=e.i(843476),r=e.i(599724),s=e.i(271645),a=e.i(389083);let n=s.forwardRef(function(e,t){return s.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),s.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 i=e.i(602869);let l=function({vectorStores:e,accessToken:l}){let[o,d]=(0,s.useState)([]);return(0,s.useEffect)(()=>{(async()=>{if(l&&0!==e.length)try{let e=await (0,i.vectorStoreListCall)(l);e.data&&d(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)}})()},[l,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)(n,{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)(a.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 s;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:(s=o.find(t=>t.vector_store_id===e))?`${s.vector_store_name||s.vector_store_id} (${s.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)(n,{className:"h-4 w-4 text-gray-400"}),(0,t.jsx)(r.Text,{className:"text-gray-500 text-sm",children:"No vector stores configured"})]})]})};var o=e.i(953960);let d=s.forwardRef(function(e,t){return s.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),s.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"}))});var c=e.i(592968);let u=function({agents:e,agentAccessGroups:n=[],accessToken:l}){let[o,u]=(0,s.useState)([]);(0,s.useEffect)(()=>{(async()=>{if(l&&e.length>0)try{let e=await (0,i.getAgentsList)(l);e&&e.agents&&Array.isArray(e.agents)&&u(e.agents)}catch(e){console.error("Error fetching agents:",e)}})()},[l,e.length]);let m=[...e.map(e=>({type:"agent",value:e})),...n.map(e=>({type:"accessGroup",value:e}))],h=m.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)(d,{className:"h-4 w-4 text-purple-600"}),(0,t.jsx)(r.Text,{className:"font-semibold text-gray-900",children:"Agents"}),(0,t.jsx)(a.Badge,{color:"purple",size:"xs",children:h})]}),h>0?(0,t.jsx)("div",{className:"max-h-[400px] overflow-y-auto space-y-2 pr-1",children:m.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)(c.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)(d,{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:s="card",className:a="",accessToken:n}){let i=e?.vector_stores||[],d=e?.mcp_servers||[],c=e?.mcp_access_groups||[],m=e?.mcp_tool_permissions||{},h=e?.mcp_toolsets||[],f=e?.agents||[],p=e?.agent_access_groups||[],g=e?.search_tools||[],v=(0,t.jsxs)("div",{className:"card"===s?"grid grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-3 gap-6":"space-y-4",children:[(0,t.jsx)(l,{vectorStores:i,accessToken:n}),(0,t.jsx)(o.default,{mcpServers:d,mcpAccessGroups:c,mcpToolPermissions:m,mcpToolsets:h,accessToken:n}),(0,t.jsx)(u,{agents:f,agentAccessGroups:p,accessToken:n}),(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===g.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:g.join(", ")})]})]});return"card"===s?(0,t.jsxs)("div",{className:`@container bg-white border border-gray-200 rounded-lg p-6 ${a}`,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"})]})}),v]}):(0,t.jsxs)("div",{className:`${a}`,children:[(0,t.jsx)(r.Text,{className:"font-medium text-gray-900 mb-3",children:"Object Permissions"}),v]})}],384767)},891547,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(199133),a=e.i(602869);e.s(["default",0,({onChange:e,value:n,className:i,accessToken:l,disabled:o})=>{let[d,c]=(0,r.useState)([]),[u,m]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(l){m(!0);try{let e=await (0,a.getGuardrailsList)(l);e.guardrails&&c(e.guardrails)}catch(e){console.error("Error fetching guardrails:",e)}finally{m(!1)}}})()},[l]),(0,t.jsx)("div",{children:(0,t.jsx)(s.Select,{mode:"multiple",disabled:o,placeholder:o?"Setting guardrails is a premium feature.":"Select guardrails",onChange:t=>{e(t)},value:n,loading:u,className:i,allowClear:!0,options:d.map(e=>({label:`${e.guardrail_name}`,value:e.guardrail_name})),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})}])},921511,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(199133),a=e.i(602869);function n(e){return e.filter(e=>(e.version_status??"draft")!=="draft").map(e=>{var t;let r=e.version_number??1,s=e.version_status??"draft";return{label:`${e.policy_name} — v${r} (${s})${e.description?` — ${e.description}`:""}`,value:"production"===s?e.policy_name:e.policy_id?(t=e.policy_id,`policy_${t}`):e.policy_name}})}e.s(["default",0,({onChange:e,value:i,className:l,accessToken:o,disabled:d,onPoliciesLoaded:c})=>{let[u,m]=(0,r.useState)([]),[h,f]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(o){f(!0);try{let e=await (0,a.getPoliciesList)(o);e.policies&&(m(e.policies),c?.(e.policies))}catch(e){console.error("Error fetching policies:",e)}finally{f(!1)}}})()},[o,c]),(0,t.jsx)("div",{children:(0,t.jsx)(s.Select,{mode:"multiple",disabled:d,placeholder:d?"Setting policies is a premium feature.":"Select policies (production or published versions)",onChange:t=>{e(t)},value:i,loading:h,className:l,allowClear:!0,options:n(u),optionFilterProp:"label",showSearch:!0,style:{width:"100%"}})})},"getPolicyOptionEntries",0,n])},595727,234662,677241,281092,688594,e=>{"use strict";let t=Symbol.for("constructDateFrom");function r(e,r){return"function"==typeof e?e(r):e&&"object"==typeof e&&t in e?e[t](r):e instanceof Date?new e.constructor(r):new Date(r)}function s(e,t){return r(t||e,e)}e.s(["constructFromSymbol",0,t,"millisecondsInDay",0,864e5,"millisecondsInHour",0,36e5,"millisecondsInMinute",0,6e4,"millisecondsInSecond",0,1e3,"millisecondsInWeek",0,6048e5],234662),e.s(["constructFrom",0,r],677241),e.s(["toDate",0,s],281092),e.s(["addDays",0,function(e,t,a){let n=s(e,a?.in);return isNaN(t)?r(a?.in||e,NaN):(t&&n.setDate(n.getDate()+t),n)}],595727),e.s(["addMonths",0,function(e,t,a){let n=s(e,a?.in);if(isNaN(t))return r(a?.in||e,NaN);if(!t)return n;let i=n.getDate(),l=r(a?.in||e,n.getTime());return(l.setMonth(n.getMonth()+t+1,0),i>=l.getDate())?l:(n.setFullYear(l.getFullYear(),l.getMonth(),i),n)}],688594)},24529,e=>{"use strict";var t=e.i(595727),r=e.i(688594),s=e.i(677241),a=e.i(281092);function n(e,n,i){let{years:l=0,months:o=0,weeks:d=0,days:c=0,hours:u=0,minutes:m=0,seconds:h=0}=n,f=(0,a.toDate)(e,i?.in),p=o||l?(0,r.addMonths)(f,o+12*l):f,g=c||d?(0,t.addDays)(p,c+7*d):p;return(0,s.constructFrom)(i?.in||e,+g+1e3*(h+60*(m+60*u)))}let i=/[zZ]$|[+-]\d{2}:?\d{2}$/;function l(e){return Date.parse(i.test(e)?e:`${e}Z`)}e.s(["calculateExpiryPreviewFromDuration",0,function(e){if(!e)return null;try{let t,r=parseInt(e);if(Number.isNaN(r))throw Error("Invalid duration format");let s=new Date;if(e.endsWith("mo"))t=n(s,{months:r});else if(e.endsWith("s"))t=n(s,{seconds:r});else if(e.endsWith("m"))t=n(s,{minutes:r});else if(e.endsWith("h"))t=n(s,{hours:r});else if(e.endsWith("d"))t=n(s,{days:r});else if(e.endsWith("w"))t=n(s,{weeks:r});else throw Error("Invalid duration format");return t.toLocaleString()}catch{return null}},"formatExpiresUtc",0,function(e){let t=l(e);return Number.isNaN(t)?e:new Date(t).toLocaleString()},"isKeyExpired",0,function(e){if(!e)return!1;let t=l(e);return!Number.isNaN(t)&&t{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(115504);let a=r.forwardRef(({className:e,...r},a)=>(0,t.jsx)("textarea",{ref:a,"data-slot":"textarea",className:(0,s.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground 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 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...r}));a.displayName="Textarea",e.s(["Textarea",0,a])},950594,e=>{"use strict";var t=e.i(843476),r=e.i(271645),s=e.i(115504),a=e.i(519455),n=e.i(793479),i=e.i(624687);let l=(0,s.cva)({base:"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",variants:{align:{"inline-start":"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}}),o=(0,s.cva)({base:"flex items-center gap-2 text-sm shadow-none",variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}}),d=r.forwardRef(({className:e,type:r="button",variant:n="ghost",size:i="xs",...l},d)=>(0,t.jsx)(a.Button,{ref:d,type:r,"data-size":i,variant:n,className:(0,s.cn)(o({size:i}),e),...l}));d.displayName="InputGroupButton";let c=r.forwardRef(({className:e,...r},a)=>(0,t.jsx)(n.Input,{ref:a,"data-slot":"input-group-control",className:(0,s.cn)("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r}));c.displayName="InputGroupInput",r.forwardRef(({className:e,...r},a)=>(0,t.jsx)(i.Textarea,{ref:a,"data-slot":"input-group-control",className:(0,s.cn)("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r})).displayName="InputGroupTextarea",e.s(["InputGroup",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"input-group",role:"group",className:(0,s.cn)("group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...r})},"InputGroupAddon",0,function({className:e,align:r="inline-start",...a}){return(0,t.jsx)("div",{role:"group","data-slot":"input-group-addon","data-align":r,className:(0,s.cn)(l({align:r}),e),onClick:e=>{e.target.closest("button")||e.currentTarget.parentElement?.querySelector("input")?.focus()},...a})},"InputGroupButton",0,d,"InputGroupInput",0,c,"InputGroupText",0,function({className:e,...r}){return(0,t.jsx)("span",{className:(0,s.cn)("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...r})}])},552546,e=>{"use strict";var t=e.i(843476),r=e.i(131792);let s=(e,t)=>{let r=t.trim().toLowerCase();return!r||e.label.toLowerCase().includes(r)||(e.sublabel?.toLowerCase().includes(r)??!1)};e.s(["SearchSelect",0,function({options:e,value:a,onValueChange:n,placeholder:i="Select…",emptyText:l="No results",disabled:o=!1,className:d}){let c=e.find(e=>e.value===a)??null;return(0,t.jsxs)(r.Combobox,{items:e,value:c,onValueChange:e=>n(e?.value??""),isItemEqualToValue:(e,t)=>e.value===t.value,itemToStringLabel:e=>e.label,filter:s,disabled:o,children:[(0,t.jsx)(r.ComboboxInput,{placeholder:i,showClear:null!=a&&""!==a,className:`w-full ${d??""}`}),(0,t.jsxs)(r.ComboboxContent,{children:[(0,t.jsx)(r.ComboboxEmpty,{children:l}),(0,t.jsx)(r.ComboboxList,{children:e=>(0,t.jsx)(r.ComboboxItem,{value:e,children:(0,t.jsxs)("span",{className:"flex min-w-0 flex-col",children:[(0,t.jsx)("span",{className:"truncate",children:e.label}),null!=e.sublabel&&""!==e.sublabel&&(0,t.jsx)("span",{className:"truncate text-xs text-muted-foreground",children:e.sublabel})]})},e.value)})]})]})}])},611363,e=>{"use strict";e.s(["navigateWithParams",0,function(e,t="push"){let r=new URLSearchParams(window.location.search);e(r);let s=r.toString(),a=s?`${window.location.pathname}?${s}`:window.location.pathname;"replace"===t?window.history.replaceState(null,"",a):window.history.pushState(null,"",a)}])},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 s={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 a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["SaveOutlined",0,n],987432)},564897,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let s={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 a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["MinusCircleOutlined",0,n],564897)},822315,(e,t,r)=>{e.e,t.exports=function(){"use strict";var e="millisecond",t="second",r="minute",s="hour",a="week",n="month",i="quarter",l="year",o="date",d="Invalid Date",c=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,u=/\[([^\]]+)]|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 s=String(e);return!s||s.length>=t?e:""+Array(t+1-s.length).join(r)+e},h="en",f={};f[h]={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])},v=function e(t,r,s){var a;if(!t)return h;if("string"==typeof t){var n=t.toLowerCase();f[n]&&(a=n),r&&(f[n]=r,a=n);var i=t.split("-");if(!a&&i.length>1)return e(i[0])}else{var l=t.name;f[l]=t,a=l}return!s&&a&&(h=a),a||!s&&h},x=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)},b={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";var t=e.i(684024);e.s(["QuestionCircleOutlined",()=>t.default])},446428,854056,e=>{"use strict";let t;var r=e.i(290571),s=e.i(271645);e.s(["default",0,e=>{var t=(0,r.__rest)(e,[]);return s.default.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),s.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 a=e.i(746725),n=e.i(914189),i=e.i(553521),l=e.i(835696),o=e.i(941444),d=e.i(178677),c=e.i(294316),u=e.i(83733),m=e.i(233137),h=e.i(732607),f=e.i(397701),p=e.i(700020);function g(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||(null!=(t=e.as)?t:j)!==s.Fragment||1===s.default.Children.count(e.children)}let v=(0,s.createContext)(null);v.displayName="TransitionContext";var x=((t=x||{}).Visible="visible",t.Hidden="hidden",t);let b=(0,s.createContext)(null);function y(e){return"children"in e?y(e.children):e.current.filter(({el:e})=>null!==e.current).filter(({state:e})=>"visible"===e).length>0}function w(e,t){let r=(0,o.useLatestValue)(e),l=(0,s.useRef)([]),d=(0,i.useIsMounted)(),c=(0,a.useDisposables)(),u=(0,n.useEvent)((e,t=p.RenderStrategy.Hidden)=>{let s=l.current.findIndex(({el:t})=>t===e);-1!==s&&((0,f.match)(t,{[p.RenderStrategy.Unmount](){l.current.splice(s,1)},[p.RenderStrategy.Hidden](){l.current[s].state="hidden"}}),c.microTask(()=>{var e;!y(l)&&d.current&&(null==(e=r.current)||e.call(r))}))}),m=(0,n.useEvent)(e=>{let t=l.current.find(({el:t})=>t===e);return t?"visible"!==t.state&&(t.state="visible"):l.current.push({el:e,state:"visible"}),()=>u(e,p.RenderStrategy.Unmount)}),h=(0,s.useRef)([]),g=(0,s.useRef)(Promise.resolve()),v=(0,s.useRef)({enter:[],leave:[]}),x=(0,n.useEvent)((e,r,s)=>{h.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=>{h.current.push(e)})]),null==t||t.chains.current[r].push([e,new Promise(e=>{Promise.all(v.current[r].map(([e,t])=>t)).then(()=>e())})]),"enter"===r?g.current=g.current.then(()=>null==t?void 0:t.wait.current).then(()=>s(r)):s(r)}),b=(0,n.useEvent)((e,t,r)=>{Promise.all(v.current[t].splice(0).map(([e,t])=>t)).then(()=>{var e;null==(e=h.current.shift())||e()}).then(()=>r(t))});return(0,s.useMemo)(()=>({children:l,register:m,unregister:u,onStart:x,onStop:b,wait:g,chains:v}),[m,u,l,x,b,v,g])}b.displayName="NestingContext";let j=s.Fragment,S=p.RenderFeatures.RenderStrategy,_=(0,p.forwardRefWithAs)(function(e,t){let{show:r,appear:a=!1,unmount:i=!0,...o}=e,u=(0,s.useRef)(null),h=g(e),f=(0,c.useSyncRefs)(...h?[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[j,_]=(0,s.useState)(r?"visible":"hidden"),k=w(()=>{r||_("hidden")}),[N,M]=(0,s.useState)(!0),E=(0,s.useRef)([r]);(0,l.useIsoMorphicEffect)(()=>{!1!==N&&E.current[E.current.length-1]!==r&&(E.current.push(r),M(!1))},[E,r]);let T=(0,s.useMemo)(()=>({show:r,appear:a,initial:N}),[r,a,N]);(0,l.useIsoMorphicEffect)(()=>{r?_("visible"):y(k)||null===u.current||_("hidden")},[r,k]);let R={unmount:i},z=(0,n.useEvent)(()=>{var t;N&&M(!1),null==(t=e.beforeEnter)||t.call(e)}),$=(0,n.useEvent)(()=>{var t;N&&M(!1),null==(t=e.beforeLeave)||t.call(e)}),O=(0,p.useRender)();return s.default.createElement(b.Provider,{value:k},s.default.createElement(v.Provider,{value:T},O({ourProps:{...R,as:s.Fragment,children:s.default.createElement(C,{ref:f,...R,...o,beforeEnter:z,beforeLeave:$})},theirProps:{},defaultTag:s.Fragment,features:S,visible:"visible"===j,name:"Transition"})))}),C=(0,p.forwardRefWithAs)(function(e,t){var r,a;let{transition:i=!0,beforeEnter:o,afterEnter:x,beforeLeave:_,afterLeave:C,enter:k,enterFrom:N,enterTo:M,entered:E,leave:T,leaveFrom:R,leaveTo:z,...$}=e,[O,D]=(0,s.useState)(null),I=(0,s.useRef)(null),L=g(e),P=(0,c.useSyncRefs)(...L?[I,t,D]:null===t?[]:[t]),F=null==(r=$.unmount)||r?p.RenderStrategy.Unmount:p.RenderStrategy.Hidden,{show:A,appear:H,initial:B}=function(){let e=(0,s.useContext)(v);if(null===e)throw Error("A is used but it is missing a parent or .");return e}(),[V,U]=(0,s.useState)(A?"visible":"hidden"),W=function(){let e=(0,s.useContext)(b);if(null===e)throw Error("A is used but it is missing a parent or .");return e}(),{register:G,unregister:Y}=W;(0,l.useIsoMorphicEffect)(()=>G(I),[G,I]),(0,l.useIsoMorphicEffect)(()=>{if(F===p.RenderStrategy.Hidden&&I.current)return A&&"visible"!==V?void U("visible"):(0,f.match)(V,{hidden:()=>Y(I),visible:()=>G(I)})},[V,I,G,Y,A,F]);let q=(0,d.useServerHandoffComplete)();(0,l.useIsoMorphicEffect)(()=>{if(L&&q&&"visible"===V&&null===I.current)throw Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[I,V,q,L]);let K=B&&!H,Q=H&&A&&B,X=(0,s.useRef)(!1),Z=w(()=>{X.current||(U("hidden"),Y(I))},W),J=(0,n.useEvent)(e=>{X.current=!0,Z.onStart(I,e?"enter":"leave",e=>{"enter"===e?null==o||o():"leave"===e&&(null==_||_())})}),ee=(0,n.useEvent)(e=>{let t=e?"enter":"leave";X.current=!1,Z.onStop(I,t,e=>{"enter"===e?null==x||x():"leave"===e&&(null==C||C())}),"leave"!==t||y(Z)||(U("hidden"),Y(I))});(0,s.useEffect)(()=>{L&&i||(J(A),ee(A))},[A,L,i]);let et=!(!i||!L||!q||K),[,er]=(0,u.useTransition)(et,O,A,{start:J,end:ee}),es=(0,p.compact)({ref:P,className:(null==(a=(0,h.classNames)($.className,Q&&k,Q&&N,er.enter&&k,er.enter&&er.closed&&N,er.enter&&!er.closed&&M,er.leave&&T,er.leave&&!er.closed&&R,er.leave&&er.closed&&z,!er.transition&&A&&E))?void 0:a.trim())||void 0,...(0,u.transitionDataAttributes)(er)}),ea=0;"visible"===V&&(ea|=m.State.Open),"hidden"===V&&(ea|=m.State.Closed),er.enter&&(ea|=m.State.Opening),er.leave&&(ea|=m.State.Closing);let en=(0,p.useRender)();return s.default.createElement(b.Provider,{value:Z},s.default.createElement(m.OpenClosedProvider,{value:ea},en({ourProps:es,theirProps:$,defaultTag:j,features:S,visible:"visible"===V,name:"Transition.Child"})))}),k=(0,p.forwardRefWithAs)(function(e,t){let r=null!==(0,s.useContext)(v),a=null!==(0,m.useOpenClosed)();return s.default.createElement(s.default.Fragment,null,!r&&a?s.default.createElement(_,{ref:t,...e}):s.default.createElement(C,{ref:t,...e}))}),N=Object.assign(_,{Child:k,Root:_});e.s(["Transition",0,N],854056)},888288,e=>{"use strict";var t=e.i(271645);e.s(["default",0,(e,r)=>{let s=void 0!==r,[a,n]=(0,t.useState)(e);return[s?r:a,e=>{s||n(e)}]}])},793130,e=>{"use strict";var t=e.i(290571),r=e.i(783222),s=e.i(433336),a=e.i(271645),n=e.i(394487),i=e.i(503269),l=e.i(214520),o=e.i(746725),d=e.i(914189),c=e.i(144279),u=e.i(294316),m=e.i(601893),h=e.i(140721),f=e.i(942803),p=e.i(233538),g=e.i(694421),v=e.i(700020),x=e.i(35889),b=e.i(998348),y=e.i(722678);let w=(0,a.createContext)(null);w.displayName="GroupContext";let j=a.Fragment,S=Object.assign((0,v.forwardRefWithAs)(function(e,t){var j;let S=(0,a.useId)(),_=(0,f.useProvidedId)(),C=(0,m.useDisabled)(),{id:k=_||`headlessui-switch-${S}`,disabled:N=C||!1,checked:M,defaultChecked:E,onChange:T,name:R,value:z,form:$,autoFocus:O=!1,...D}=e,I=(0,a.useContext)(w),[L,P]=(0,a.useState)(null),F=(0,a.useRef)(null),A=(0,u.useSyncRefs)(F,t,null===I?null:I.setSwitch,P),H=(0,l.useDefaultValue)(E),[B,V]=(0,i.useControllable)(M,T,null!=H&&H),U=(0,o.useDisposables)(),[W,G]=(0,a.useState)(!1),Y=(0,d.useEvent)(()=>{G(!0),null==V||V(!B),U.nextFrame(()=>{G(!1)})}),q=(0,d.useEvent)(e=>{if((0,p.isDisabledReactIssue7711)(e.currentTarget))return e.preventDefault();e.preventDefault(),Y()}),K=(0,d.useEvent)(e=>{e.key===b.Keys.Space?(e.preventDefault(),Y()):e.key===b.Keys.Enter&&(0,g.attemptSubmit)(e.currentTarget)}),Q=(0,d.useEvent)(e=>e.preventDefault()),X=(0,y.useLabelledBy)(),Z=(0,x.useDescribedBy)(),{isFocusVisible:J,focusProps:ee}=(0,r.useFocusRing)({autoFocus:O}),{isHovered:et,hoverProps:er}=(0,s.useHover)({isDisabled:N}),{pressed:es,pressProps:ea}=(0,n.useActivePress)({disabled:N}),en=(0,a.useMemo)(()=>({checked:B,disabled:N,hover:et,focus:J,active:es,autofocus:O,changing:W}),[B,et,J,es,N,W,O]),ei=(0,v.mergeProps)({id:k,ref:A,role:"switch",type:(0,c.useResolveButtonType)(e,L),tabIndex:-1===e.tabIndex?0:null!=(j=e.tabIndex)?j:0,"aria-checked":B,"aria-labelledby":X,"aria-describedby":Z,disabled:N||void 0,autoFocus:O,onClick:q,onKeyUp:K,onKeyPress:Q},ee,er,ea),el=(0,a.useCallback)(()=>{if(void 0!==H)return null==V?void 0:V(H)},[V,H]),eo=(0,v.useRender)();return a.default.createElement(a.default.Fragment,null,null!=R&&a.default.createElement(h.FormFields,{disabled:N,data:{[R]:z||"on"},overrides:{type:"checkbox",checked:B},form:$,onReset:el}),eo({ourProps:ei,theirProps:D,slot:en,defaultTag:"button",name:"Switch"}))}),{Group:function(e){var t;let[r,s]=(0,a.useState)(null),[n,i]=(0,y.useLabels)(),[l,o]=(0,x.useDescriptions)(),d=(0,a.useMemo)(()=>({switch:r,setSwitch:s}),[r,s]),c=(0,v.useRender)();return a.default.createElement(o,{name:"Switch.Description",value:l},a.default.createElement(i,{name:"Switch.Label",value:n,props:{htmlFor:null==(t=d.switch)?void 0:t.id,onClick(e){r&&(e.currentTarget instanceof HTMLLabelElement&&e.preventDefault(),r.click(),r.focus({preventScroll:!0}))}}},a.default.createElement(w.Provider,{value:d},c({ourProps:{},theirProps:e,slot:{},defaultTag:j,name:"Switch.Group"}))))},Label:y.Label,Description:x.Description});var _=e.i(888288),C=e.i(95779),k=e.i(444755),N=e.i(673706),M=e.i(829087);let E=(0,N.makeClassName)("Switch"),T=a.default.forwardRef((e,r)=>{let{checked:s,defaultChecked:n=!1,onChange:i,color:l,name:o,error:d,errorMessage:c,disabled:u,required:m,tooltip:h,id:f}=e,p=(0,t.__rest)(e,["checked","defaultChecked","onChange","color","name","error","errorMessage","disabled","required","tooltip","id"]),g={bgColor:l?(0,N.getColorClassNames)(l,C.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",ringColor:l?(0,N.getColorClassNames)(l,C.colorPalette.ring).ringColor:"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"},[v,x]=(0,_.default)(n,s),[b,y]=(0,a.useState)(!1),{tooltipProps:w,getReferenceProps:j}=(0,M.useTooltip)(300);return a.default.createElement("div",{className:"flex flex-row items-center justify-start"},a.default.createElement(M.default,Object.assign({text:h},w)),a.default.createElement("div",Object.assign({ref:(0,N.mergeRefs)([r,w.refs.setReference]),className:(0,k.tremorTwMerge)(E("root"),"flex flex-row relative h-5")},p,j),a.default.createElement("input",{type:"checkbox",className:(0,k.tremorTwMerge)(E("input"),"absolute w-5 h-5 cursor-pointer left-0 top-0 opacity-0"),name:o,required:m,checked:v,onChange:e=>{e.preventDefault()}}),a.default.createElement(S,{checked:v,onChange:e=>{x(e),null==i||i(e)},disabled:u,className:(0,k.tremorTwMerge)(E("switch"),"w-10 h-5 group relative inline-flex shrink-0 cursor-pointer items-center justify-center rounded-tremor-full","focus:outline-none",u?"cursor-not-allowed":""),onFocus:()=>y(!0),onBlur:()=>y(!1),id:f},a.default.createElement("span",{className:(0,k.tremorTwMerge)(E("sr-only"),"sr-only")},"Switch ",v?"on":"off"),a.default.createElement("span",{"aria-hidden":"true",className:(0,k.tremorTwMerge)(E("background"),v?g.bgColor:"bg-tremor-border dark:bg-dark-tremor-border","pointer-events-none absolute mx-auto h-3 w-9 rounded-tremor-full transition-colors duration-100 ease-in-out")}),a.default.createElement("span",{"aria-hidden":"true",className:(0,k.tremorTwMerge)(E("round"),v?(0,k.tremorTwMerge)(g.bgColor,"translate-x-5 border-tremor-background dark:border-dark-tremor-background"):"translate-x-0 bg-tremor-border dark:bg-dark-tremor-border border-tremor-background dark:border-dark-tremor-background","pointer-events-none absolute left-0 inline-block h-5 w-5 transform rounded-tremor-full border-2 shadow-tremor-input duration-100 ease-in-out transition",b?(0,k.tremorTwMerge)("ring-2",g.ringColor):"")}))),d&&c?a.default.createElement("p",{className:(0,k.tremorTwMerge)(E("errorMessage"),"text-sm text-red-500 mt-1 ")},c):null)});T.displayName="Switch",e.s(["Switch",0,T],793130)},418371,e=>{"use strict";var t=e.i(843476),r=e.i(174553);e.s(["ProviderLogo",0,({provider:e,className:s="w-4 h-4"})=>(0,t.jsx)(r.Logo,{provider:e,className:s})])},91979,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let s={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 a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["ReloadOutlined",0,n],91979)},368670,e=>{"use strict";var t=e.i(602869),r=e.i(266027);let s=(0,e.i(243652).createQueryKeys)("modelCostMap");e.s(["useModelCostMap",0,()=>(0,r.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,t.modelCostMap)(),staleTime:6e4,gcTime:6e4})])},728889,e=>{"use strict";var t=e.i(290571),r=e.i(271645),s=e.i(829087),a=e.i(480731),n=e.i(444755),i=e.i(673706),l=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"}},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:h,variant:f="simple",tooltip:p,size:g=a.Sizes.SM,color:v,className:x}=e,b=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),y=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,i.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,i.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,i.getColorClassNames)(t,l.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,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,i.getColorClassNames)(t,l.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,l.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,n.tremorTwMerge)((0,i.getColorClassNames)(t,l.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,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,n.tremorTwMerge)((0,i.getColorClassNames)(t,l.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,i.getColorClassNames)(t,l.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,n.tremorTwMerge)((0,i.getColorClassNames)(t,l.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(f,v),{tooltipProps:w,getReferenceProps:j}=(0,s.useTooltip)();return r.default.createElement("span",Object.assign({ref:(0,i.mergeRefs)([m,w.refs.setReference]),className:(0,n.tremorTwMerge)(u("root"),"inline-flex shrink-0 items-center justify-center",y.bgColor,y.textColor,y.borderColor,y.ringColor,c[f].rounded,c[f].border,c[f].shadow,c[f].ring,o[g].paddingX,o[g].paddingY,x)},j,b),r.default.createElement(s.default,Object.assign({text:p},w)),r.default.createElement(h,{className:(0,n.tremorTwMerge)(u("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)},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)},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)},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),s=e.i(122577),a=e.i(278587),n=e.i(68155),i=e.i(360820),l=e.i(871943),o=e.i(434626),d=e.i(271645);let c=d.forwardRef(function(e,t){return d.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),d.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"}))});var u=e.i(592968),m=e.i(115504),h=e.i(752978);function f({icon:e,onClick:r,className:s,disabled:a,dataTestId:n}){return a?(0,t.jsx)(h.Icon,{icon:e,size:"sm",className:"opacity-50 cursor-not-allowed","data-testid":n}):(0,t.jsx)(h.Icon,{icon:e,size:"sm",onClick:r,className:(0,m.cx)("cursor-pointer",s),"data-testid":n})}let p={Edit:{icon:r.PencilAltIcon,className:"hover:text-blue-600"},Delete:{icon:n.TrashIcon,className:"hover:text-red-600"},Test:{icon:s.PlayIcon,className:"hover:text-blue-600"},Regenerate:{icon:a.RefreshIcon,className:"hover:text-green-600"},Up:{icon:i.ChevronUpIcon,className:"hover:text-blue-600"},Down:{icon:l.ChevronDownIcon,className:"hover:text-blue-600"},Open:{icon:o.ExternalLinkIcon,className:"hover:text-green-600"},Copy:{icon:c,className:"hover:text-blue-600"}};e.s(["default",0,function({onClick:e,tooltipText:r,disabled:s=!1,disabledTooltipText:a,dataTestId:n,variant:i}){let{icon:l,className:o}=p[i];return(0,t.jsx)(u.Tooltip,{title:s?a:r,children:(0,t.jsx)("span",{children:(0,t.jsx)(f,{icon:l,onClick:e,className:o,disabled:s,dataTestId:n})})})}],902555)},738014,e=>{"use strict";var t=e.i(135214),r=e.i(602869),s=e.i(266027);let a=(0,e.i(243652).createQueryKeys)("users");e.s(["useCurrentUser",0,()=>{let{accessToken:e,userId:n}=(0,t.default)();return(0,s.useQuery)({queryKey:a.detail(n),queryFn:async()=>await (0,r.userGetInfoV2)(e),enabled:!!(e&&n)})}])},162386,e=>{"use strict";var t=e.i(843476),r=e.i(625901),s=e.i(109799),a=e.i(785242),n=e.i(738014),i=e.i(199133),l=e.i(981339),o=e.i(592968);let d={label:"All Proxy Models",value:"all-proxy-models"},c={label:"No Default Models",value:"no-default-models"},u=[d,c],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(["MODEL_SENTINEL_OPTIONS",0,u,"ModelSelect",0,e=>{let{teamID:h,organizationID:f,options:p,context:g,dataTestId:v,value:x=[],onChange:b,style:y}=e,{includeUserModels:w,showAllTeamModelsOption:j,showAllProxyModelsOverride:S,includeSpecialOptions:_}=p||{},{data:C,isLoading:k}=(0,r.useAllProxyModels)(),{data:N,isLoading:M}=(0,a.useTeam)(h),{data:E,isLoading:T}=(0,s.useOrganization)(f),{data:R,isLoading:z}=(0,n.useCurrentUser)(),$=e=>u.some(t=>t.value===e),O=x.some($),D=E?.models.includes(d.value)||E?.models.length===0;if(k||M||T||z)return(0,t.jsx)(l.Skeleton.Input,{active:!0,block:!0});let{wildcard:I,regular:L}=(e=>{let t=[],r=[];for(let s of e)s.endsWith("/*")?t.push(s):r.push(s);return{wildcard:t,regular:r}})(((e,t,r)=>{let s=Array.from(new Map(e.map(e=>[e.id,e])).values()).map(e=>e.id);if(t.options?.showAllProxyModelsOverride)return s;let a=m[t.context];return a?a({allProxyModels:s,...r,options:t.options}):[]})(C?.data??[],e,{selectedTeam:N,selectedOrganization:E,userModels:R?.models}));return(0,t.jsx)(i.Select,{"data-testid":v,value:x,onChange:e=>{let t=e.filter($);b(t.length>0?[t[t.length-1]]:e)},style:y,options:[..._?[{label:(0,t.jsx)("span",{children:"Special Options"}),title:"Special Options",options:[...S||D&&_||"global"===g?[{label:(0,t.jsx)("span",{children:"All Proxy Models"}),value:d.value,disabled:x.length>0&&x.some(e=>$(e)&&e!==d.value),key:d.value}]:[],{label:(0,t.jsx)("span",{children:"No Default Models"}),value:c.value,disabled:x.length>0&&x.some(e=>$(e)&&e!==c.value),key:c.value}]}]:[],...I.length>0?[{label:(0,t.jsx)("span",{children:"Wildcard Options"}),title:"Wildcard Options",options:I.map(e=>{let r=e.replace("/*",""),s=r.charAt(0).toUpperCase()+r.slice(1);return{label:(0,t.jsx)("span",{children:`All ${s} models`}),value:e,disabled:O}})}]:[],{label:(0,t.jsx)("span",{children:"Models"}),title:"Models",options:L.map(e=>({label:(0,t.jsx)("span",{children:e}),value:e,disabled:O}))}],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),s=e.i(212931),a=e.i(808613),n=e.i(464571),i=e.i(199133),l=e.i(592968),o=e.i(560445),d=e.i(213205),c=e.i(343488),u=e.i(602869),m=e.i(741466);e.s(["default",0,({isVisible:e,onCancel:h,onSubmit:f,accessToken:p,title:g="Add Team Member",roles:v=[{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[y]=a.Form.useForm(),[w,j]=(0,r.useState)([]),[S,_]=(0,r.useState)(!1),[C,k]=(0,r.useState)("user_email"),[N,M]=(0,r.useState)(!1),E=async(e,t)=>{if(!e)return void j([]);_(!0);try{let r=new URLSearchParams;if(r.append(t,e),b&&r.append("team_id",b),null==p)return;let s=(await (0,u.userFilterUICall)(p,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}));j(s)}catch(e){console.error("Error fetching users:",e)}finally{_(!1)}},T=(0,c.useDebouncedCallback)((e,t)=>E(e,t),{wait:m.DEBOUNCE_WAIT_MS}),R=(e,t)=>{k(t),T(e,t)},z=(e,t)=>{let r=t.user;y.setFieldsValue({user_email:r.user_email,user_id:r.user_id,role:y.getFieldValue("role")})},$=async e=>{M(!0);try{await f(e)}finally{M(!1)}};return(0,t.jsx)(s.Modal,{title:g,open:e,onCancel:()=>{y.resetFields(),j([]),h()},footer:null,width:800,maskClosable:!N,children:(0,t.jsxs)(a.Form,{form:y,onFinish:$,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:{role:x},children:[(0,t.jsx)(o.Alert,{type:"info",showIcon:!0,className:"mb-4",message:"Search selects from users that already exist. To add someone new, ask a proxy admin to create their account first.","data-testid":"member-existing-users-notice"}),(0,t.jsx)(a.Form.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,t.jsx)(i.Select,{showSearch:!0,className:"w-full",placeholder:"Search by email",filterOption:!1,onSearch:e=>R(e,"user_email"),onSelect:(e,t)=>z(e,t),options:"user_email"===C?w:[],loading:S,allowClear:!0,"data-testid":"member-email-search"})}),(0,t.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,t.jsx)(a.Form.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,t.jsx)(i.Select,{showSearch:!0,className:"w-full",placeholder:"Search by user ID",filterOption:!1,onSearch:e=>R(e,"user_id"),onSelect:(e,t)=>z(e,t),options:"user_id"===C?w:[],loading:S,allowClear:!0})}),(0,t.jsx)(a.Form.Item,{label:"Member Role",name:"role",className:"mb-4",children:(0,t.jsx)(i.Select,{defaultValue:x,children:v.map(e=>(0,t.jsx)(i.Select.Option,{value:e.value,children:(0,t.jsxs)(l.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)(n.Button,{type:"primary",htmlType:"submit",icon:(0,t.jsx)(d.UserAddOutlined,{}),loading:N,children:N?"Adding...":"Add Member"})})]})})}],907308);var h=e.i(599724),f=e.i(779241),p=e.i(435451),g=e.i(860585);e.s(["default",0,({visible:e,onCancel:l,onSubmit:o,initialData:d,mode:c,config:u})=>{let m,[v]=a.Form.useForm(),[x,b]=(0,r.useState)(!1);(0,r.useEffect)(()=>{if(e)if("edit"===c&&d){let e={...d,role:d.role||u.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||[]};v.setFieldsValue(e)}else v.resetFields(),v.setFieldsValue({role:u.defaultRole||u.roleOptions[0]?.value})},[e,d,c,v,u.defaultRole,u.roleOptions]);let y=async e=>{try{b(!0);let t=Object.entries(e).reduce((e,[t,r])=>{if("string"==typeof r){let s=r.trim();return""===s&&("max_budget_in_team"===t||"tpm_limit"===t||"rpm_limit"===t)?{...e,[t]:null}:{...e,[t]:s}}return{...e,[t]:r}},{});await Promise.resolve(o(t)),v.resetFields()}catch(e){console.error("Form submission error:",e)}finally{b(!1)}};return(0,t.jsx)(s.Modal,{title:u.title||("add"===c?"Add Member":"Edit Member"),open:e,width:1e3,footer:null,onCancel:l,children:(0,t.jsxs)(a.Form,{form:v,onFinish:y,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[u.showEmail&&(0,t.jsx)(a.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"})}),u.showEmail&&u.showUserId&&(0,t.jsx)("div",{className:"text-center mb-4",children:(0,t.jsx)(h.Text,{children:"OR"})}),u.showUserId&&(0,t.jsx)(a.Form.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,t.jsx)(f.TextInput,{placeholder:"user_123"})}),(0,t.jsx)(a.Form.Item,{label:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{children:"Role"}),"edit"===c&&d&&(0,t.jsxs)("span",{className:"text-gray-500 text-sm",children:["(Current: ",(m=d.role,u.roleOptions.find(e=>e.value===m)?.label||m),")"]})]}),name:"role",className:"mb-4",rules:[{required:!0,message:"Please select a role!"}],children:(0,t.jsx)(i.Select,{children:"edit"===c&&d?[...u.roleOptions.filter(e=>e.value===d.role),...u.roleOptions.filter(e=>e.value!==d.role)].map(e=>(0,t.jsx)(i.Select.Option,{value:e.value,children:e.label},e.value)):u.roleOptions.map(e=>(0,t.jsx)(i.Select.Option,{value:e.value,children:e.label},e.value))})}),u.additionalFields?.map(e=>(0,t.jsx)(a.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)(p.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)(i.Select,{children:e.options?.map(e=>(0,t.jsx)(i.Select.Option,{value:e.value,children:e.label},e.value))});case"multi-select":return(0,t.jsx)(i.Select,{mode:"multiple",placeholder:e.placeholder||"Select options",options:e.options,allowClear:!0});case"budget-duration":return(0,t.jsx)(g.default,{});default:return null}})(e)},e.name)),(0,t.jsxs)("div",{className:"text-right mt-6",children:[(0,t.jsx)(n.Button,{onClick:l,className:"mr-2",disabled:x,children:"Cancel"}),(0,t.jsx)(n.Button,{type:"default",htmlType:"submit",loading:x,children:"add"===c?x?"Adding...":"Add Member":x?"Saving...":"Save Changes"})]})]})})}],276173)},294612,e=>{"use strict";var t=e.i(843476),r=e.i(100486),s=e.i(827252),a=e.i(213205),n=e.i(771674),i=e.i(464571),l=e.i(770914),o=e.i(291542),d=e.i(262218),c=e.i(592968),u=e.i(898586),m=e.i(902555);let{Text:h}=u.Typography;e.s(["default",0,function({members:e,canEdit:u,onEdit:f,onDelete:p,onAddMember:g,roleColumnTitle:v="Role",roleTooltip:x,extraColumns:b=[],showDeleteForMember:y,emptyText:w}){let j=[{title:"User Email",dataIndex:"user_email",key:"user_email",render:e=>(0,t.jsx)(h,{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)(h,{children:e||"-"})},{title:x?(0,t.jsxs)(l.Space,{direction:"horizontal",children:[v,(0,t.jsx)(c.Tooltip,{title:x,children:(0,t.jsx)(s.InfoCircleOutlined,{})})]}):v,dataIndex:"role",key:"role",render:e=>(0,t.jsxs)(l.Space,{children:[e?.toLowerCase()==="admin"||e?.toLowerCase()==="org_admin"?(0,t.jsx)(r.CrownOutlined,{}):(0,t.jsx)(n.UserOutlined,{}),(0,t.jsx)(h,{style:{textTransform:"capitalize"},children:e||"-"})]})},...b,{title:"Actions",key:"actions",fixed:"right",width:120,render:(e,r)=>u?(0,t.jsxs)(l.Space,{children:[(0,t.jsx)(m.default,{variant:"Edit",tooltipText:"Edit member",dataTestId:"edit-member",onClick:()=>f(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)(l.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:j,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&&u&&(0,t.jsx)(i.Button,{icon:(0,t.jsx)(a.UserAddOutlined,{}),type:"primary",onClick:g,children:"Add Member"})]})}])},286536,e=>{"use strict";let t=(0,e.i(475254).default)("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Eye",0,t],286536)},77705,e=>{"use strict";let t=(0,e.i(475254).default)("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);e.s(["EyeOff",0,t],77705)},153472,e=>{"use strict";var t,r,s=e.i(266027),a=e.i(954616),n=e.i(912598),i=e.i(243652),l=e.i(135214),o=e.i(602869),d=e.i(431703),c=((t={}).GENERAL_SETTINGS="general_settings",t),u=((r={}).MAXIMUM_SPEND_LOGS_RETENTION_PERIOD="maximum_spend_logs_retention_period",r);let m=async(e,t)=>{try{let r=o.proxyBaseUrl?`${o.proxyBaseUrl}/config/list?config_type=${t}`:`/config/list?config_type=${t}`,s=await fetch(r,{method:"GET",headers:{[(0,o.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!s.ok){let e=await s.json(),t=(0,d.deriveErrorMessage)(e);throw(0,o.handleError)(t),Error(t)}return await s.json()}catch(e){throw console.error(`Failed to get proxy config for ${t}:`,e),e}},h=(0,i.createQueryKeys)("proxyConfig"),f=async(e,t)=>{try{let r=o.proxyBaseUrl?`${o.proxyBaseUrl}/config/field/delete`:"/config/field/delete",s=await fetch(r,{method:"POST",headers:{[(0,o.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!s.ok){let e=await s.json(),t=(0,d.deriveErrorMessage)(e);throw(0,o.handleError)(t),Error(t)}return await s.json()}catch(e){throw console.error(`Failed to delete proxy config field ${t.field_name}:`,e),e}};e.s(["ConfigType",()=>c,"GeneralSettingsFieldName",()=>u,"proxyConfigKeys",0,h,"useDeleteProxyConfigField",0,()=>{let{accessToken:e}=(0,l.default)(),t=(0,n.useQueryClient)();return(0,a.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return await f(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:h.all})}})},"useProxyConfig",0,e=>{let{accessToken:t}=(0,l.default)();return(0,s.useQuery)({queryKey:h.list({filters:{configType:e}}),queryFn:async()=>await m(t,e),enabled:!!t})}])},160818,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let s={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 a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["GlobalOutlined",0,n],160818)},37091,e=>{"use strict";var t=e.i(290571),r=e.i(95779),s=e.i(444755),a=e.i(673706),n=e.i(271645);let i=n.default.forwardRef((e,i)=>{let{color:l,children:o,className:d}=e,c=(0,t.__rest)(e,["color","children","className"]);return n.default.createElement("p",Object.assign({ref:i,className:(0,s.tremorTwMerge)(l?(0,a.getColorClassNames)(l,r.colorPalette.lightText).textColor:"text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",d)},c),o)});i.displayName="Subtitle",e.s(["Subtitle",0,i],37091)},516015,(e,t,r)=>{},898547,(e,t,r)=>{var s=e.i(247167);e.r(516015);var a=e.r(271645),n=a&&"object"==typeof a&&"default"in a?a:{default:a},i=void 0!==s.default&&s.default.env&&!0,l=function(e){return"[object String]"===Object.prototype.toString.call(e)},o=function(){function e(e){var t=void 0===e?{}:e,r=t.name,s=void 0===r?"stylesheet":r,a=t.optimizeForSpeed,n=void 0===a?i:a;d(l(s),"`name` must be a string"),this._name=s,this._deletedRulePlaceholder="#"+s+"-deleted-rule____{}",d("boolean"==typeof n,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=n,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var o="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=o?o.getAttribute("content"):null}var t,r=e.prototype;return r.setOptimizeForSpeed=function(e){d("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),d(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},r.isOptimizeForSpeed=function(){return this._optimizeForSpeed},r.inject=function(){var e=this;if(d(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(i||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,r){return"number"==typeof r?e._serverSheet.cssRules[r]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),r},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},r.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;ttypeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!r.cssRules[e])return e;r.deleteRule(e);try{r.insertRule(t,e)}catch(s){i||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),r.insertRule(this._deletedRulePlaceholder,e)}}else{var s=this._tags[e];d(s,"old rule at index `"+e+"` not found"),s.textContent=t}return e},r.deleteRule=function(e){if("u"typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},r.cssRules=function(){var e=this;return"u">>0},u={};function m(e,t){if(!t)return"jsx-"+e;var r=String(t),s=e+r;return u[s]||(u[s]="jsx-"+c(e+"-"+r)),u[s]}function h(e,t){"u"typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var r=this.getIdAndRules(e),s=r.styleId,a=r.rules;if(s in this._instancesCounts){this._instancesCounts[s]+=1;return}var n=a.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[s]=n,this._instancesCounts[s]=1},t.remove=function(e){var t=this,r=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(r in this._instancesCounts,"styleId: `"+r+"` not found"),this._instancesCounts[r]-=1,this._instancesCounts[r]<1){var s=this._fromServer&&this._fromServer[r];s?(s.parentNode.removeChild(s),delete this._fromServer[r]):(this._indices[r].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[r]),delete this._instancesCounts[r]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],r=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return r[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,r;return t=this.cssRules(),void 0===(r=e)&&(r={}),t.map(function(e){var t=e[0],s=e[1];return n.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:r.nonce?r.nonce:void 0,dangerouslySetInnerHTML:{__html:s}})})},t.getIdAndRules=function(e){var t=e.children,r=e.dynamic,s=e.id;if(r){var a=m(s,r);return{styleId:a,rules:Array.isArray(t)?t.map(function(e){return h(a,e)}):[h(a,t)]}}return{styleId:m(s),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),p=a.createContext(null);function g(){return new f}function v(){return a.useContext(p)}p.displayName="StyleSheetContext";var x=n.default.useInsertionEffect||n.default.useLayoutEffect,b="u">typeof window?g():void 0;function y(e){var t=b||v();return t&&("u"{t.exports=e.r(898547).style},431343,e=>{"use strict";let t=(0,e.i(475254).default)("play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);e.s(["Play",0,t],431343)},800374,218129,210612,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645),s={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M573 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40zm-280 0c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40z"}},{tag:"path",attrs:{d:"M894 345a343.92 343.92 0 00-189-130v.1c-17.1-19-36.4-36.5-58-52.1-163.7-119-393.5-82.7-513 81-96.3 133-92.2 311.9 6 439l.8 132.6c0 3.2.5 6.4 1.5 9.4a31.95 31.95 0 0040.1 20.9L309 806c33.5 11.9 68.1 18.7 102.5 20.6l-.5.4c89.1 64.9 205.9 84.4 313 49l127.1 41.4c3.2 1 6.5 1.6 9.9 1.6 17.7 0 32-14.3 32-32V753c88.1-119.6 90.4-284.9 1-408zM323 735l-12-5-99 31-1-104-8-9c-84.6-103.2-90.2-251.9-11-361 96.4-132.2 281.2-161.4 413-66 132.2 96.1 161.5 280.6 66 412-80.1 109.9-223.5 150.5-348 102zm505-17l-8 10 1 104-98-33-12 5c-56 20.8-115.7 22.5-171 7l-.2-.1A367.31 367.31 0 00729 676c76.4-105.3 88.8-237.6 44.4-350.4l.6.4c23 16.5 44.1 37.1 62 62 72.6 99.6 68.5 235.2-8 330z"}},{tag:"path",attrs:{d:"M433 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40z"}}]},name:"comment",theme:"outlined"},a=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(a.default,(0,t.default)({},e,{ref:n,icon:s}))});e.s(["CommentOutlined",0,n],800374);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M917.7 148.8l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 00-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 000 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3 2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4zM769.1 441.7l-59.4 59.4-186.8-186.8 59.4-59.4c24.9-24.9 58.1-38.7 93.4-38.7 35.3 0 68.4 13.7 93.4 38.7 24.9 24.9 38.7 58.1 38.7 93.4 0 35.3-13.8 68.4-38.7 93.4zm-190.2 105a8.03 8.03 0 00-11.3 0L501 613.3 410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 00-11.3 0L363 475.3l-43-43a7.85 7.85 0 00-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2c-68.9 69-77 175.7-24.3 253.5l-76.1 76.1a8.03 8.03 0 000 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3 51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43 66.7-66.7c3.1-3.1 3.1-8.2 0-11.3l-36.6-36.2zM441.7 769.1a131.32 131.32 0 01-93.4 38.7c-35.3 0-68.4-13.7-93.4-38.7a131.32 131.32 0 01-38.7-93.4c0-35.3 13.7-68.4 38.7-93.4l59.4-59.4 186.8 186.8-59.4 59.4z"}}]},name:"api",theme:"outlined"};var l=r.forwardRef(function(e,s){return r.createElement(a.default,(0,t.default)({},e,{ref:s,icon:i}))});e.s(["ApiOutlined",0,l],218129);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-600 72h560v208H232V136zm560 480H232V408h560v208zm0 272H232V680h560v208zM304 240a40 40 0 1080 0 40 40 0 10-80 0zm0 272a40 40 0 1080 0 40 40 0 10-80 0zm0 272a40 40 0 1080 0 40 40 0 10-80 0z"}}]},name:"database",theme:"outlined"};var d=r.forwardRef(function(e,s){return r.createElement(a.default,(0,t.default)({},e,{ref:s,icon:o}))});e.s(["DatabaseOutlined",0,d],210612)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0o4-g_7x79zs_.js b/litellm/proxy/_experimental/out/_next/static/chunks/0o4-g_7x79zs_.js new file mode 100644 index 00000000000..e8e03a7db91 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0o4-g_7x79zs_.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,309426,e=>{"use strict";var t=e.i(290571),l=e.i(444755),a=e.i(673706),s=e.i(271645),i=e.i(46757);let r=(0,a.makeClassName)("Col"),n=s.default.forwardRef((e,a)=>{let n,o,d,c,{numColSpan:u=1,numColSpanSm:m,numColSpanMd:g,numColSpanLg:p,children:h,className:x}=e,y=(0,t.__rest)(e,["numColSpan","numColSpanSm","numColSpanMd","numColSpanLg","children","className"]),b=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"";return s.default.createElement("div",Object.assign({ref:a,className:(0,l.tremorTwMerge)(r("root"),(n=b(u,i.colSpan),o=b(m,i.colSpanSm),d=b(g,i.colSpanMd),c=b(p,i.colSpanLg),(0,l.tremorTwMerge)(n,o,d,c)),x)},y),h)});n.displayName="Col",e.s(["Col",0,n],309426)},510674,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(431703),i=e.i(135214),r=e.i(708347);let n=(0,l.createQueryKeys)("projects"),o=[...r.all_admin_roles,...r.internalUserRoles],d=async e=>{let t=(0,a.getProxyBaseUrl)(),l=`${t}/project/list`,i=await fetch(l,{method:"GET",headers:{[(0,a.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let e=await i.json(),t=(0,s.deriveErrorMessage)(e);throw(0,a.handleError)(t),Error(t)}return i.json()};e.s(["projectKeys",0,n,"useProjects",0,()=>{let{accessToken:e,userRole:l}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list({}),queryFn:async()=>d(e),enabled:!!e&&o.includes(l)})}])},557662,e=>{"use strict";let t={src:e.i(196361).default,width:823,height:807,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABCUlEQVR42k2Ov0sCYRjH3/f09c68NOuiLg+NvMM6qIaIhgKDlgbBBiH7ARbkFAr+wEFwUBzUSRwUN3+Am4Kbg4sIIg4iOugiguDm5F/gvaLiF57l83yf5/sFYC0VQdJJnS0bObUkSCgnwa4ggPD94O57KkYX46vw/HVftECMNzKRJ2JL8A+KekelfO6s1Y3utl6hNayWahmlznIfhQbv6V4oGP6aOrvtCIFRnH1LKQmkBC7G7BtehmZWzY0NRxEAEo7Dhz/MvrT3P6BvCk5irDVJQURhAx5aKpzh7Pkm7+2BZ1p4YeT0MYIy5Dx6/P+UrvAXFml0TyqjeVtUytsrGX6rac6ew+YNXwKfsTPy4XOyEQAAAABJRU5ErkJggg=="},l={src:e.i(614148).default,width:600,height:450,blurWidth:0,blurHeight:0},a={src:e.i(858236).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqklEQVR42mXOzQqCQBQF4NG8PVKLalNRrxW01EgUghZm4Tu0aV3gopBCaDDoh8LMyubaCzQzLj2c1fk2h/zwyZvjI8NTmtMXHj94yfBG5JqE0WrsDWyv70eLGOkbrwJotG316lDVeJvd2pouE3YW4M4nAEBkADTD1eOvBNPUFUUpQAMwplbK7gJsa6hWVG58bXTam0OAmAjYBT63kWk4Myeke2TiJynulvsHOZp6y2XrD90AAAAASUVORK5CYII="},s={src:e.i(508296).default,width:180,height:180,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvXivVvITItyZVvSwKFmDRbjjPYDB/SutONn6fiaaH/9k="},i={src:e.i(324755).default,width:48,height:48,blurWidth:0,blurHeight:0},r={src:e.i(475151).default,width:14,height:16,blurWidth:0,blurHeight:0},n={src:e.i(274286).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA/ElEQVR42m3Pz0vCUADA8ed7a3uBjb0sx5C1Ri1oIDJSKEdJgyEFtbwFgScpsGNR1CmyS0Ho0ZOggv+A4F3B30f9HwRRwYMICupNPPg5fa9fANazLQtCtC0jdGbSdFSmN6+Ry/tIHd/+w52jOwyRCDRZL+UJ6eREdXauR0dq8HtiBl7mD25r+MtyLfBO+Fpm19UXTsJ17LnPWhyf+rNvVWOiu38j+Zrgk/CNuHDYtfsiRUa1khYnpH9Y0viQtIGxf1oGfsVoFxzOYULR51f+p6lifo09wdjs0hvuvbKkAhDF7GkUFYpgnLhg8DPtOAghOfAGiWRs2KBz/dqKBVIdOzeF2+/ZAAAAAElFTkSuQmCC"},o={src:e.i(436494).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAnElEQVR42oXOsQqCUACF4ftWvUFbBFFzQSVRLQ5RmRDkUJFTIUFNEQgNDWFTNURjgyAiOgiiCF7FQRCcVFQQJ1H4t284B1gwzA0UAS/A2+N7pp8nmrne3yynJ6Cp3mBBoARZbfcqjVZ3tkSwlSw7QFHc5gitI+M1delM8LhafyhKNjCN4PPjsR2Fk8f59jDd7JnXHxp+Oh5zVsmrCGlHlzZm+jq8AAAAAElFTkSuQmCC"},d={src:e.i(204086).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhElEQVR42oWPuw0DIRBEr6g7aIGQAAQSEiTk1EAHVILogIQAQUPOxoKT5cSfYDbYedqdOc7zfFzXhU9a3vHNfGkDhBB472GMQQgB1lo45/Z+A4wx9N6Rc8acE7VWpJRuYI0YI1prW6UUjDHAOb9fLEAIAaXUPi2lhNYalNJ3hp8h/9V8AqCAe6iqrOaAAAAAAElFTkSuQmCC"},c={src:e.i(531150).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA40lEQVR42lWOvesBcQDGz0/9VmUl/4lSyqaUic5gM0jKSBlISgaXwWCwGc7gFPKeIikUMXAldec9Wdx5uft+v3KFMzzL8/k89WAIIUweyLG6W9tRFNmKGUHw9wMfAvgfDBfWddWbv5aNE5Gtmr9LiBSNzgq3uQv7UKzY2tZ9uXvfl/4IxxOvyeZn/niyQkWJJkXTjB7ez2oJHk6cNpzo5ohUjeTHRICnSScEQPliGIKistef23FPYUNSo6CwJHGw6xgQggpJEBYZ12UQiY2njOnCPVSv528oCWDbNopMySIv5XkCtum3l9/HqzEAAAAASUVORK5CYII="},u=[{id:"arize",displayName:"Arize",logo:t.src,supports_key_team_logging:!0,dynamic_params:{arize_api_key:"password",arize_space_id:"password"},description:"Arize Logging Integration"},{id:"braintrust",displayName:"Braintrust",logo:a.src,supports_key_team_logging:!1,dynamic_params:{braintrust_api_key:"password",braintrust_project_name:"text"},description:"Braintrust Logging Integration"},{id:"custom_callback_api",displayName:"Custom Callback API",supports_key_team_logging:!0,dynamic_params:{custom_callback_api_url:"text",custom_callback_api_headers:"text"},description:"Custom Callback API Logging Integration"},{id:"galileo",displayName:"Galileo",logo:i.src,supports_key_team_logging:!1,dynamic_params:{GALILEO_API_KEY:"password",GALILEO_PROJECT_ID:"text",GALILEO_LOG_STREAM_ID:"text",GALILEO_BASE_URL:"text",GALILEO_USERNAME:"text",GALILEO_PASSWORD:"password"},description:"Galileo AI Observability Integration"},{id:"datadog",displayName:"Datadog",logo:s.src,supports_key_team_logging:!1,dynamic_params:{dd_api_key:"password",dd_site:"text"},description:"Datadog Logging Integration"},{id:"lago",displayName:"Lago",logo:r.src,supports_key_team_logging:!1,dynamic_params:{lago_api_url:"text",lago_api_key:"password"},description:"Lago Billing Logging Integration"},{id:"langfuse",displayName:"Langfuse",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v2 Logging Integration"},{id:"langfuse_otel",displayName:"Langfuse OTEL",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v3 OTEL Logging Integration"},{id:"langsmith",displayName:"LangSmith",logo:o.src,supports_key_team_logging:!0,dynamic_params:{langsmith_api_key:"password",langsmith_project:"text",langsmith_base_url:"text",langsmith_sampling_rate:"number"},description:"Langsmith Logging Integration"},{id:"openmeter",displayName:"OpenMeter",logo:d.src,supports_key_team_logging:!1,dynamic_params:{openmeter_api_key:"password",openmeter_base_url:"text"},description:"OpenMeter Logging Integration"},{id:"otel",displayName:"Open Telemetry",logo:c.src,supports_key_team_logging:!1,dynamic_params:{otel_endpoint:"text",otel_headers:"text"},description:"OpenTelemetry Logging Integration"},{id:"s3",displayName:"S3",logo:l.src,supports_key_team_logging:!1,dynamic_params:{s3_bucket_name:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"S3 Bucket (AWS) Logging Integration"},{id:"SQS",displayName:"SQS",logo:l.src,supports_key_team_logging:!1,dynamic_params:{sqs_queue_url:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"SQS Queue (AWS) Logging Integration"}],m=u.reduce((e,t)=>(e[t.displayName]=t,e),{}),g=u.reduce((e,t)=>(e[t.displayName]=t.id,e),{}),p=u.reduce((e,t)=>(e[t.id]=t.displayName,e),{});e.s(["callbackInfo",0,m,"callback_map",0,g,"mapDisplayToInternalNames",0,e=>e.map(e=>g[e]||e),"mapInternalToDisplayNames",0,e=>e.map(e=>p[e]||e),"reverse_callback_map",0,p],557662)},810757,477386,e=>{"use strict";var t=e.i(271645);let l=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}))});e.s(["CogIcon",0,l],810757);let a=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"}))});e.s(["BanIcon",0,a],477386)},207082,e=>{"use strict";var t=e.i(619273),l=e.i(266027),a=e.i(243652),s=e.i(602869),i=e.i(431703),r=e.i(135214);let n=(0,a.createQueryKeys)("keys"),o=async(e,t,l,a={})=>{try{let r=(0,s.getProxyBaseUrl)(),n=new URLSearchParams(Object.entries({team_id:a.teamID,project_id:a.projectID,agent_id:a.agentID,organization_id:a.organizationID,key_alias:a.selectedKeyAlias,key_hash:a.keyHash,user_id:a.userID,page:t,size:l,sort_by:a.sortBy,sort_order:a.sortOrder,expand:a.expand,status:a.status,return_full_object:"true",include_team_keys:"true",include_created_by_keys:"true",substring_matching:"true"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),o=`${r?`${r}/key/list`:"/key/list"}?${n}`,d=await fetch(o,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!d.ok){let e=await d.json(),t=(0,i.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await d.json()}catch(e){throw console.error("Failed to list keys:",e),e}},d=(0,a.createQueryKeys)("deletedKeys");e.s(["keyKeys",0,n,"useDeletedKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:d.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,{...s,status:"deleted"}),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})},"useKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:n.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,s),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})}])},552130,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select agents",disabled:d=!1})=>{let[c,u]=(0,l.useState)([]),[m,g]=(0,l.useState)([]),[p,h]=(0,l.useState)(!1);(0,l.useEffect)(()=>{(async()=>{if(n){h(!0);try{let e=await (0,s.getAgentsList)(n),t=e?.agents||[];u(t);let l=new Set;t.forEach(e=>{let t=e.agent_access_groups;t&&Array.isArray(t)&&t.forEach(e=>l.add(e))}),g(Array.from(l))}catch(e){console.error("Error fetching agents:",e)}finally{h(!1)}}})()},[n]);let x=[...m.map(e=>({label:e,value:`group:${e}`,isAccessGroup:!0,searchText:`${e} Access Group`})),...c.map(e=>({label:`${e.agent_name||e.agent_id}`,value:e.agent_id,isAccessGroup:!1,searchText:`${e.agent_name||e.agent_id} ${e.agent_id} Agent`}))],y=[...i?.agents||[],...(i?.accessGroups||[]).map(e=>`group:${e}`)];return(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:o,onChange:t=>{e({agents:t.filter(e=>!e.startsWith("group:")),accessGroups:t.filter(e=>e.startsWith("group:")).map(e=>e.replace("group:",""))})},value:y,loading:p,className:r,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:d,filterOption:(e,t)=>(x.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:x.map(e=>(0,t.jsx)(a.Select.Option,{value:e.value,label:e.label,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:e.isAccessGroup?"#52c41a":"#722ed1",flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:e.isAccessGroup?"#52c41a":"#722ed1",fontSize:"12px",fontWeight:500,opacity:.8},children:e.isAccessGroup?"Access Group":"Agent"})]})},e.value))})})}])},9314,645526,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(981339);e.i(247167);var s=e.i(931067),i=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.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.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 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 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.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.9-1.7-203.3 89.2-203.3 199.9 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.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};var n=e.i(9583),o=i.forwardRef(function(e,t){return i.createElement(n.default,(0,s.default)({},e,{ref:t,icon:r}))});e.s(["TeamOutlined",0,o],645526);var d=e.i(599724),c=e.i(263147);e.s(["default",0,({value:e,onChange:s,placeholder:i="Select access groups",disabled:r=!1,style:n,className:u,showLabel:m=!1,labelText:g="Access Group",allowClear:p=!0})=>{let{data:h,isLoading:x,isError:y}=(0,c.useAccessGroups)();if(x)return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(a.Skeleton.Input,{active:!0,block:!0,style:{height:32,...n}})]});let b=(h??[]).map(e=>({label:(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-medium",children:e.access_group_name})," ",(0,t.jsxs)("span",{className:"text-gray-400 text-xs",children:["(",e.access_group_id,")"]})]}),value:e.access_group_id,selectedLabel:e.access_group_name,searchText:`${e.access_group_name} ${e.access_group_id}`}));return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(l.Select,{mode:"multiple",value:e,placeholder:i,onChange:s,disabled:r,allowClear:p,showSearch:!0,style:{width:"100%",...n},className:`rounded-md ${u??""}`,notFoundContent:y?(0,t.jsx)("span",{className:"text-red-500",children:"Failed to load access groups"}):"No access groups found",filterOption:(e,t)=>(b.find(e=>e.value===t?.value)?.searchText??"").toLowerCase().includes(e.toLowerCase()),optionLabelProp:"selectedLabel",options:b.map(e=>({label:e.label,value:e.value,selectedLabel:e.selectedLabel}))})]})}],9314)},392110,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(592968),i=e.i(312361),r=e.i(790848),n=e.i(536916),o=e.i(808613),d=e.i(827252),c=e.i(779241);let{Option:u}=a.Select;e.s(["default",0,({form:e,autoRotationEnabled:m,onAutoRotationChange:g,rotationInterval:p,onRotationIntervalChange:h,isCreateMode:x=!1,neverExpire:y=!1,onNeverExpireChange:b})=>{let f=p&&!["7d","30d","90d","180d","365d"].includes(p),[j,_]=(0,l.useState)(f),[v,A]=(0,l.useState)(f?p:"");return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Key Expiry Settings"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Expire Key"}),(0,t.jsx)(s.Tooltip,{title:"Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to keep the current expiry unchanged.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})}),!x&&b&&(0,t.jsx)(n.Checkbox,{checked:y,onChange:t=>{let l=t.target.checked;b(l),l&&(e&&"function"==typeof e.setFieldValue?e.setFieldValue("duration",""):e&&"function"==typeof e.setFieldsValue&&e.setFieldsValue({duration:""}))},className:"ml-2 text-sm font-normal text-gray-600",children:"Never Expire"})]}),(0,t.jsx)(o.Form.Item,{name:"duration",noStyle:!0,initialValue:"",children:(0,t.jsx)(c.TextInput,{placeholder:x?"e.g., 30d or leave empty to never expire":"e.g., 30d",className:"w-full",disabled:!x&&y})})]})]}),(0,t.jsx)(i.Divider,{}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Auto-Rotation Settings"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Enable Auto-Rotation"}),(0,t.jsx)(s.Tooltip,{title:"Key will automatically regenerate at the specified interval for enhanced security.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsx)(r.Switch,{checked:m,onChange:g,size:"default",className:m?"":"bg-gray-400"})]}),m&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Rotation Interval"}),(0,t.jsx)(s.Tooltip,{title:"How often the key should be automatically rotated. Choose the interval that best fits your security requirements.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(a.Select,{value:j?"custom":p,onChange:e=>{"custom"===e?_(!0):(_(!1),A(""),h(e))},className:"w-full",placeholder:"Select interval",children:[(0,t.jsx)(u,{value:"7d",children:"7 days"}),(0,t.jsx)(u,{value:"30d",children:"30 days"}),(0,t.jsx)(u,{value:"90d",children:"90 days"}),(0,t.jsx)(u,{value:"180d",children:"180 days"}),(0,t.jsx)(u,{value:"365d",children:"365 days"}),(0,t.jsx)(u,{value:"custom",children:"Custom interval"})]}),j&&(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(c.TextInput,{value:v,onChange:e=>{let t=e.target.value;A(t),h(t)},placeholder:"e.g., 1s, 5m, 2h, 14d"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Supported formats: seconds (s), minutes (m), hours (h), days (d)"})]})]})]})]}),m&&(0,t.jsx)("div",{className:"bg-blue-50 p-3 rounded-md text-sm text-blue-700",children:"When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period."})]})]})}])},844565,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select pass through routes",disabled:d=!1,teamId:c})=>{let[u,m]=(0,l.useState)([]),[g,p]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{(async()=>{if(n){p(!0);try{let e=await (0,s.getPassThroughEndpointsCall)(n,c);if(e.endpoints){let t=e.endpoints.flatMap(e=>{let t=e.path,l=e.methods;return l&&l.length>0?l.map(e=>({label:`${e} ${t}`,value:t})):[{label:t,value:t}]});m(t)}}catch(e){console.error("Error fetching pass through routes:",e)}finally{p(!1)}}})()},[n,c]),(0,t.jsx)(a.Select,{mode:"tags",placeholder:o,onChange:e,value:i,loading:g,className:r,allowClear:!0,options:u,optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:d})}])},939510,e=>{"use strict";var t=e.i(843476),l=e.i(808613),a=e.i(199133),s=e.i(592968),i=e.i(827252);let{Option:r}=a.Select;e.s(["default",0,({type:e,name:n,showDetailedDescriptions:o=!0,className:d="",initialValue:c=null,form:u,onChange:m})=>{let g=e.toUpperCase(),p=e.toLowerCase(),h=`Select 'guaranteed_throughput' to prevent overallocating ${g} limit when the key belongs to a Team with specific ${g} limits.`;return(0,t.jsx)(l.Form.Item,{label:(0,t.jsxs)("span",{children:[g," Rate Limit Type"," ",(0,t.jsx)(s.Tooltip,{title:h,children:(0,t.jsx)(i.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:n,initialValue:c,className:d,children:(0,t.jsx)(a.Select,{defaultValue:o?"default":void 0,placeholder:"Select rate limit type",style:{width:"100%"},optionLabelProp:o?"label":void 0,onChange:e=>{u&&u.setFieldValue(n,e),m&&m(e)},children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",label:"Default",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Default"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Best effort throughput - no error if we're overallocating ",p," (Team/Key Limits checked at runtime)."]})]})}),(0,t.jsx)(r,{value:"guaranteed_throughput",label:"Guaranteed throughput",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Guaranteed throughput"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Guaranteed throughput - raise an error if we're overallocating ",p," (also checks model-specific limits)"]})]})}),(0,t.jsx)(r,{value:"dynamic",label:"Dynamic",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Dynamic"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["If the key has a set ",g," (e.g. 2 ",g,") and there are no 429 errors, it can dynamically exceed the limit when the model being called is not erroring."]})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",children:"Best effort throughput"}),(0,t.jsx)(r,{value:"guaranteed_throughput",children:"Guaranteed throughput"}),(0,t.jsx)(r,{value:"dynamic",children:"Dynamic"})]})})})}])},363256,e=>{"use strict";var t=e.i(843476),l=e.i(199133);let{Text:a}=e.i(898586).Typography;e.s(["default",0,({organizations:e,value:s,onChange:i,disabled:r,loading:n,style:o,placeholder:d="All Organizations"})=>(0,t.jsx)(l.Select,{showSearch:!0,placeholder:d,value:s,onChange:i,disabled:r,loading:n,allowClear:!0,style:{minWidth:280,...o},filterOption:(t,l)=>{if(!l)return!1;let a=e?.find(e=>e.organization_id===l.key);if(!a)return!1;let s=t.toLowerCase().trim(),i=(a.organization_alias||"").toLowerCase(),r=(a.organization_id||"").toLowerCase();return i.includes(s)||r.includes(s)},children:e?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.organization_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,t.jsxs)(a,{type:"secondary",children:["(",e.organization_id,")"]})]},e.organization_id))})])},128233,319312,833400,e=>{"use strict";var t=e.i(843476),l=e.i(464571),a=e.i(199133),s=e.i(592968),i=e.i(425063),r=e.i(107233),n=e.i(37727),o=e.i(271645);e.s(["BudgetFallbacksEditor",0,function({value:e,onChange:d,availableModels:c}){let[u,m]=(0,o.useState)(()=>{let t;return 0===(t=Object.keys(e)).length?[]:t.map((t,l)=>({id:String(l+1),primaryModel:t,fallbackModels:e[t]}))}),g=e=>{m(e),d(Object.fromEntries(e.filter(e=>null!==e.primaryModel&&e.fallbackModels.length>0).map(e=>[e.primaryModel,e.fallbackModels])))},p=()=>{g([...u,{id:Date.now().toString(),primaryModel:null,fallbackModels:[]}])},h=(e,t)=>{g(u.map(l=>l.id===e?{...l,...t}:l))},x=new Set(u.map(e=>e.primaryModel).filter(Boolean));return 0===u.length?(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),u.map(e=>{let l=c.filter(t=>t===e.primaryModel||!x.has(t)),r=c.filter(t=>t!==e.primaryModel);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void g(u.filter(e=>e.id!==t))},className:"absolute top-2 right-2 text-gray-400 hover:text-red-500 transition-colors p-1",children:(0,t.jsx)(n.X,{className:"w-4 h-4"})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Primary Model"}),(0,t.jsx)(a.Select,{className:"w-full",placeholder:"Select model",value:e.primaryModel,onChange:t=>{let l=e.fallbackModels.filter(e=>e!==t);h(e.id,{primaryModel:t,fallbackModels:l})},showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:l.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body})]}),(0,t.jsx)("div",{className:"flex items-center justify-center -my-1 mb-2",children:(0,t.jsxs)("div",{className:"bg-amber-50 text-amber-600 px-3 py-0.5 rounded-full text-[10px] font-bold border border-amber-100 flex items-center gap-1",children:[(0,t.jsx)(i.ArrowDown,{className:"w-3 h-3"}),"IF BUDGET EXCEEDED, TRY"]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Fallback Models"}),(0,t.jsx)(a.Select,{mode:"multiple",className:"w-full",placeholder:e.primaryModel?"Select fallback models":"Select a primary model first",value:e.fallbackModels,onChange:t=>h(e.id,{fallbackModels:t}),disabled:!e.primaryModel,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:r.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(s.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})}),e.fallbackModels.length>1&&(0,t.jsx)("div",{className:"text-[10px] text-gray-400 mt-1 ml-1",children:"Tried in order; first model still within its own budget is used"})]})]},e.id)}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]})}],128233);var d=e.i(28651);let c=[{value:"1h",label:"Hourly",resetHint:"Resets every hour"},{value:"24h",label:"Daily",resetHint:"Resets daily at midnight UTC"},{value:"7d",label:"Weekly",resetHint:"Resets every Sunday at midnight UTC"},{value:"30d",label:"Monthly",resetHint:"Resets on the 1st of every month at midnight UTC"}];e.s(["BudgetWindowsEditor",0,function({value:e,onChange:s}){let i=(t,l,a)=>{s(e.map((e,s)=>s===t?{...e,[l]:a}:e))};return(0,t.jsxs)("div",{children:[e.map((r,n)=>{let o=c.find(e=>e.value===r.budget_duration)?.resetHint;return(0,t.jsxs)("div",{style:{marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsx)(a.Select,{value:r.budget_duration,onChange:e=>i(n,"budget_duration",e),style:{width:130},options:c.map(e=>({value:e.value,label:e.label}))}),(0,t.jsx)(d.InputNumber,{step:.01,min:0,precision:2,value:r.max_budget??void 0,onChange:e=>i(n,"max_budget",e??null),placeholder:"Max spend ($)",style:{width:160},prefix:"$"}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{s(e.filter((e,t)=>t!==n))},style:{padding:"0 4px"},children:"✕"})]}),o&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#888",marginTop:3,marginLeft:2},children:["↻ ",o]})]},n)}),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),s([...e,{budget_duration:"24h",max_budget:null}])},children:"+ Add Budget Window"})]})}],319312);var u=e.i(311451);let m=0,g=()=>`tag-row-${m++}`;e.s(["TagRateLimitEditor",0,function({value:e,onChange:a}){let s=(t,l,s)=>{a(e.map((e,a)=>a===t?{...e,[l]:s}:e))};return(0,t.jsxs)("div",{children:[e.map((i,r)=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12},children:[(0,t.jsx)(u.Input,{value:i.tag,onChange:e=>s(r,"tag",e.target.value),placeholder:"Tag (e.g. cell-1)",style:{width:180}}),(0,t.jsx)(d.InputNumber,{min:0,value:i.rpm_limit??void 0,onChange:e=>s(r,"rpm_limit",e??null),placeholder:"RPM",style:{width:120}}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{a(e.filter((e,t)=>t!==r))},style:{padding:"0 4px"},children:"✕"})]},i.id)),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),a([...e,{id:g(),tag:"",rpm_limit:null}])},children:"+ Add Tag Limit"})]})},"tagLimitsToRows",0,e=>{let t=(e=>{if(!e||"object"!=typeof e)return{};let t={};return Object.entries(e).forEach(([e,l])=>{"number"==typeof l&&(t[e]=l)}),t})(e);return Object.keys(t).map(e=>({id:g(),tag:e,rpm_limit:t[e]}))},"tagRowsToLimits",0,e=>{let t={};return e.forEach(({tag:e,rpm_limit:l})=>{let a=e.trim();a&&"number"==typeof l&&(t[a]=l)}),{tag_rpm_limit:t}}],833400)},109034,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(135214);let i=(0,l.createQueryKeys)("tags");e.s(["useTags",0,()=>{let{accessToken:e,userId:l,userRole:r}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,a.tagListCall)(e),enabled:!!(e&&l&&r)})}])},533882,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(250980),s=e.i(797672),i=e.i(68155),r=e.i(304967),n=e.i(629569),o=e.i(599724),d=e.i(269200),c=e.i(427612),u=e.i(64848),m=e.i(942232),g=e.i(496020),p=e.i(977572),h=e.i(992619),x=e.i(727749);e.s(["default",0,({accessToken:e,initialModelAliases:y={},onAliasUpdate:b,showExampleConfig:f=!0})=>{let[j,_]=(0,l.useState)([]),[v,A]=(0,l.useState)({aliasName:"",targetModel:""}),[w,k]=(0,l.useState)(null);(0,l.useEffect)(()=>{_(Object.entries(y).map(([e,t],l)=>({id:`${l}-${e}`,aliasName:e,targetModel:t})))},[y]);let N=()=>{if(!w)return;if(!w.aliasName||!w.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.id!==w.id&&e.aliasName===w.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=j.map(e=>e.id===w.id?w:e);_(e),k(null);let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias updated successfully")},C=()=>{k(null)},S=j.reduce((e,t)=>(e[t.aliasName]=t.targetModel,e),{});return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Add New Alias"}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Alias Name"}),(0,t.jsx)("input",{type:"text",value:v.aliasName,onChange:e=>A({...v,aliasName:e.target.value}),placeholder:"e.g., gpt-4o",className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Target Model"}),(0,t.jsx)(h.default,{accessToken:e,value:v.targetModel,placeholder:"Select target model",onChange:e=>A({...v,targetModel:e}),showLabel:!1})]}),(0,t.jsx)("div",{className:"flex items-end",children:(0,t.jsxs)("button",{onClick:()=>{if(!v.aliasName||!v.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.aliasName===v.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=[...j,{id:`${Date.now()}-${v.aliasName}`,aliasName:v.aliasName,targetModel:v.targetModel}];_(e),A({aliasName:"",targetModel:""});let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias added successfully")},disabled:!v.aliasName||!v.targetModel,className:`flex items-center px-4 py-2 rounded-md text-sm ${!v.aliasName||!v.targetModel?"bg-gray-300 text-gray-500 cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700"}`,children:[(0,t.jsx)(a.PlusCircleIcon,{className:"w-4 h-4 mr-1"}),"Add Alias"]})})]})]}),(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Manage Existing Aliases"}),(0,t.jsx)("div",{className:"rounded-lg custom-border relative mb-6",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)(d.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,t.jsx)(c.TableHead,{children:(0,t.jsxs)(g.TableRow,{children:[(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Alias Name"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Target Model"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Actions"})]})}),(0,t.jsxs)(m.TableBody,{children:[j.map(l=>(0,t.jsx)(g.TableRow,{className:"h-8",children:w&&w.id===l.id?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)("input",{type:"text",value:w.aliasName,onChange:e=>k({...w,aliasName:e.target.value}),className:"w-full px-2 py-1 border border-gray-300 rounded-md text-sm"})}),(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)(h.default,{accessToken:e,value:w.targetModel,onChange:e=>k({...w,targetModel:e}),showLabel:!1,style:{height:"32px"}})}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:N,className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:"Save"}),(0,t.jsx)("button",{onClick:C,className:"text-xs bg-gray-50 text-gray-600 px-2 py-1 rounded-sm hover:bg-gray-100",children:"Cancel"})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-900",children:l.aliasName}),(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-500",children:l.targetModel}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>{k({...l})},className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:(0,t.jsx)(s.PencilIcon,{className:"w-3 h-3"})}),(0,t.jsx)("button",{onClick:()=>{var e;let t,a;return e=l.id,_(t=j.filter(t=>t.id!==e)),a={},void(t.forEach(e=>{a[e.aliasName]=e.targetModel}),b&&b(a),x.default.success("Alias deleted successfully"))},className:"text-xs bg-red-50 text-red-600 px-2 py-1 rounded-sm hover:bg-red-100",children:(0,t.jsx)(i.TrashIcon,{className:"w-3 h-3"})})]})})]})},l.id)),0===j.length&&(0,t.jsx)(g.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:3,className:"py-0.5 text-sm text-gray-500 text-center",children:"No aliases added yet. Add a new alias above."})})]})]})})}),f&&(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(n.Title,{className:"mb-4",children:"Configuration Example"}),(0,t.jsx)(o.Text,{className:"text-gray-600 mb-4",children:"Here's how your current aliases would look in the config:"}),(0,t.jsx)("div",{className:"bg-gray-100 rounded-lg p-4 font-mono text-sm",children:(0,t.jsxs)("div",{className:"text-gray-700",children:["model_aliases:",0===Object.keys(S).length?(0,t.jsxs)("span",{className:"text-gray-500",children:[(0,t.jsx)("br",{}),"  # No aliases configured yet"]}):Object.entries(S).map(([e,l])=>(0,t.jsxs)("span",{children:[(0,t.jsx)("br",{}),'  "',e,'": "',l,'"']},e))]})})]})]})}])},266484,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(592968),s=e.i(312361),i=e.i(827252),r=e.i(994388),n=e.i(304967),o=e.i(779241),d=e.i(988297),c=e.i(68155),u=e.i(810757),m=e.i(477386),g=e.i(557662),p=e.i(174553),h=e.i(435451);let{Option:x}=l.Select;e.s(["default",0,({value:e=[],onChange:y,disabledCallbacks:b=[],onDisabledCallbacksChange:f})=>{let j=Object.entries(g.callbackInfo).filter(([e,t])=>t.supports_key_team_logging).map(([e,t])=>e),_=Object.keys(g.callbackInfo),v=e=>{y?.(e)},A=(t,l,a)=>{let s=[...e];if("callback_name"===l){let e=g.callback_map[a]||a;s[t]={...s[t],[l]:e,callback_vars:{}}}else s[t]={...s[t],[l]:a};v(s)},w=(t,l,a)=>{let s=[...e];s[t]={...s[t],callback_vars:{...s[t].callback_vars,[l]:a}},v(s)};return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(m.BanIcon,{className:"w-5 h-5 text-red-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Disabled Callbacks"}),(0,t.jsx)(a.Tooltip,{title:"Select callbacks to disable for this key. Disabled callbacks will not receive any logging data.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Disabled Callbacks"}),(0,t.jsx)(l.Select,{mode:"multiple",placeholder:"Select callbacks to disable",value:b,onChange:e=>{let t=(0,g.mapDisplayToInternalNames)(e);f?.(t)},style:{width:"100%"},optionLabelProp:"label",children:_.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Select callbacks that should be disabled for this key. These callbacks will not receive any logging data."})]})]}),(0,t.jsx)(s.Divider,{}),(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(u.CogIcon,{className:"w-5 h-5 text-blue-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Logging Integrations"}),(0,t.jsx)(a.Tooltip,{title:"Configure callback logging integrations for this team.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsx)(r.Button,{variant:"secondary",onClick:()=>{v([...e,{callback_name:"",callback_type:"success",callback_vars:{}}])},icon:d.PlusIcon,size:"sm",className:"hover:border-blue-400 hover:text-blue-500",type:"button",children:"Add Integration"})]}),(0,t.jsx)("div",{className:"space-y-4",children:e.map((s,i)=>{let d=s.callback_name?Object.entries(g.callback_map).find(([e,t])=>t===s.callback_name)?.[0]:void 0;return(0,t.jsxs)(n.Card,{className:"border border-gray-200 shadow-xs hover:shadow-md transition-shadow duration-200",decoration:"top",decorationColor:"blue",children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[d&&(0,t.jsx)(p.Logo,{src:g.callbackInfo[d]?.logo,label:d,className:"w-5 h-5 object-contain"}),(0,t.jsxs)("span",{className:"text-sm font-medium",children:[d||"New Integration"," Configuration"]})]}),(0,t.jsx)(r.Button,{variant:"light",onClick:()=>{v(e.filter((e,t)=>t!==i))},icon:c.TrashIcon,size:"xs",color:"red",className:"hover:bg-red-50",type:"button",children:"Remove"})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Integration Type"}),(0,t.jsx)(l.Select,{value:d,placeholder:"Select integration",onChange:e=>A(i,"callback_name",e),className:"w-full",optionLabelProp:"label",children:j.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Event Type"}),(0,t.jsxs)(l.Select,{value:s.callback_type,onChange:e=>A(i,"callback_type",e),className:"w-full",children:[(0,t.jsx)(x,{value:"success",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"Success Only"})]})}),(0,t.jsx)(x,{value:"failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-red-500 rounded-full"}),(0,t.jsx)("span",{children:"Failure Only"})]})}),(0,t.jsx)(x,{value:"success_and_failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"Success & Failure"})]})})]})]})]}),((e,l)=>{if(!e.callback_name)return null;let a=Object.entries(g.callback_map).find(([t,l])=>l===e.callback_name)?.[0];if(!a)return null;let s=g.callbackInfo[a]?.dynamic_params||{};return 0===Object.keys(s).length?null:(0,t.jsxs)("div",{className:"mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-4",children:[(0,t.jsx)("div",{className:"w-3 h-3 bg-blue-100 rounded-full flex items-center justify-center",children:(0,t.jsx)("div",{className:"w-1.5 h-1.5 bg-blue-500 rounded-full"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Integration Parameters"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:Object.entries(s).map(([a,s])=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 capitalize flex items-center space-x-1",children:[(0,t.jsx)("span",{children:a.replace(/_/g," ")}),"password"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Sensitive"}),"number"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Number"})]}),"number"===s&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:"Value must be between 0 and 1"}),"number"===s?(0,t.jsx)(h.default,{step:.01,width:400,placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)}):(0,t.jsx)(o.TextInput,{type:"password"===s?"password":"text",placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)})]},a))})]})})(s,i)]})]},i)})}),0===e.length&&(0,t.jsxs)("div",{className:"text-center py-12 text-gray-500 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50",children:[(0,t.jsx)(u.CogIcon,{className:"w-12 h-12 text-gray-300 mb-3 mx-auto"}),(0,t.jsx)("div",{className:"text-base font-medium mb-1",children:"No logging integrations configured"}),(0,t.jsx)("div",{className:"text-sm text-gray-400",children:'Click "Add Integration" to configure logging for this team'})]})]})}])},651904,e=>{"use strict";var t=e.i(843476),l=e.i(599724),a=e.i(266484);e.s(["default",0,function({value:e,onChange:s,premiumUser:i=!1,disabledCallbacks:r=[],onDisabledCallbacksChange:n}){return i?(0,t.jsx)(a.default,{value:e,onChange:s,disabledCallbacks:r,onDisabledCallbacksChange:n}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-3",children:[(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ langfuse-logging"}),(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ datadog-logging"})]}),(0,t.jsx)("div",{className:"p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)(l.Text,{className:"text-sm text-yellow-800",children:["Setting Key/Team logging settings is a LiteLLM Enterprise feature. Global Logging Settings are available for all free users. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"}),"."]})})]})}])},460285,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(404206),s=e.i(723731),i=e.i(653824),r=e.i(881073),n=e.i(197647),o=e.i(266027),d=e.i(343488),c=e.i(602869),u=e.i(158392),m=e.i(419470),g=e.i(695411);let p=(0,l.forwardRef)(({accessToken:e,value:p,onChange:h,modelData:x,teamId:y},b)=>{let[f,j]=(0,l.useState)({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),[_,v]=(0,l.useState)([]),[A,w]=(0,l.useState)([]),[k,N]=(0,l.useState)([]),[C,S]=(0,l.useState)({}),[I,T]=(0,l.useState)({}),L=(0,l.useRef)(!1),E=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=p?.router_settings?JSON.stringify({routing_strategy:p.router_settings.routing_strategy,fallbacks:p.router_settings.fallbacks,enable_tag_filtering:p.router_settings.enable_tag_filtering}):null;if(L.current&&e===E.current){L.current=!1;return}if(L.current&&e!==E.current&&(L.current=!1),e!==E.current)if(E.current=e,p?.router_settings){let e=p.router_settings,{fallbacks:t,...l}=e;j({routerSettings:l,selectedStrategy:e.routing_strategy||null,enableTagFiltering:e.enable_tag_filtering??!1});let a=e.fallbacks||[];v(a),w(a&&0!==a.length?a.map((e,t)=>{let[l,a]=Object.entries(e)[0];return{id:(t+1).toString(),primaryModel:l||null,fallbackModels:a||[]}}):[{id:"1",primaryModel:null,fallbackModels:[]}])}else j({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),v([]),w([{id:"1",primaryModel:null,fallbackModels:[]}])},[p]),(0,l.useEffect)(()=>{e&&(0,c.getRouterSettingsCall)(e).then(e=>{if(e.fields){let t={};e.fields.forEach(e=>{t[e.field_name]={ui_field_name:e.ui_field_name,field_description:e.field_description,options:e.options,link:e.link}}),S(t);let l=e.fields.find(e=>"routing_strategy"===e.field_name);l?.options&&N(l.options),e.routing_strategy_descriptions&&T(e.routing_strategy_descriptions)}})},[e]);let{data:O=[]}=(0,o.useQuery)({queryKey:["fallbackAvailableModels",e,y??null],queryFn:()=>y?(0,g.fetchAvailableModelsForTeam)(e,y):(0,g.fetchAvailableModels)(e),enabled:!!e}),F=()=>{let e=new Set(["allowed_fails","cooldown_time","num_retries","timeout","retry_after"]),t=new Set(["model_group_alias","retry_policy"]),l=Object.fromEntries(Object.entries({...f.routerSettings,enable_tag_filtering:f.enableTagFiltering,routing_strategy:f.selectedStrategy,fallbacks:_.length>0?_:null}).map(([l,a])=>{if("routing_strategy_args"!==l&&"routing_strategy"!==l&&"enable_tag_filtering"!==l&&"fallbacks"!==l){let s=document.querySelector(`input[name="${l}"]`);if(s){if(void 0!==s.value&&""!==s.value){let i=((l,a,s)=>{if(null==a)return s;let i=String(a).trim();if(""===i||"null"===i.toLowerCase())return null;if(e.has(l)){let e=Number(i);return Number.isNaN(e)?s:e}if(t.has(l)){if(""===i)return null;try{return JSON.parse(i)}catch{return s}}return"true"===i.toLowerCase()||"false"!==i.toLowerCase()&&i})(l,s.value,a);return[l,i]}return[l,null]}}else if("routing_strategy"===l)return[l,f.selectedStrategy];else if("enable_tag_filtering"===l)return[l,f.enableTagFiltering];else if("fallbacks"===l)return[l,_.length>0?_:null];else if("routing_strategy_args"===l&&"latency-based-routing"===f.selectedStrategy){let e=document.querySelector('input[name="lowest_latency_buffer"]'),t=document.querySelector('input[name="ttl"]'),l={};return e?.value&&(l.lowest_latency_buffer=Number(e.value)),t?.value&&(l.ttl=Number(t.value)),["routing_strategy_args",Object.keys(l).length>0?l:null]}return[l,a]}).filter(e=>null!=e)),a=(e,t=!1)=>null==e||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length||t&&("number"!=typeof e||Number.isNaN(e))?null:e;return{routing_strategy:a(l.routing_strategy),allowed_fails:a(l.allowed_fails,!0),cooldown_time:a(l.cooldown_time,!0),num_retries:a(l.num_retries,!0),timeout:a(l.timeout,!0),retry_after:a(l.retry_after,!0),fallbacks:_.length>0?_:null,context_window_fallbacks:a(l.context_window_fallbacks),retry_policy:a(l.retry_policy),model_group_alias:a(l.model_group_alias),enable_tag_filtering:f.enableTagFiltering,routing_strategy_args:a(l.routing_strategy_args)}},M=(0,d.useDebouncedCallback)(()=>{h&&(L.current=!0,h({router_settings:F()}))},{wait:100});(0,l.useEffect)(()=>{h&&M()},[f,_]);let R=Array.from(new Set(O.map(e=>e.model_group))).sort();return((0,l.useImperativeHandle)(b,()=>({getValue:()=>({router_settings:F()})})),e)?(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)(i.TabGroup,{className:"w-full",children:[(0,t.jsxs)(r.TabList,{variant:"line",defaultValue:"1",className:"px-8 pt-4",children:[(0,t.jsx)(n.Tab,{value:"1",children:"Loadbalancing"}),(0,t.jsx)(n.Tab,{value:"2",children:"Fallbacks"})]}),(0,t.jsxs)(s.TabPanels,{className:"px-8 py-6",children:[(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(u.default,{value:f,onChange:j,routerFieldsMetadata:C,availableRoutingStrategies:k,routingStrategyDescriptions:I})}),(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(m.FallbackSelectionForm,{groups:A,onGroupsChange:e=>{w(e),v(e.filter(e=>e.primaryModel&&e.fallbackModels.length>0).map(e=>({[e.primaryModel]:e.fallbackModels})))},availableModels:R,maxGroups:5})})]})]})}):null});p.displayName="RouterSettingsAccordion",e.s(["default",0,p])},575260,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(482725),s=e.i(56456);e.s(["default",0,({projects:e,value:i,onChange:r,disabled:n,loading:o,teamId:d})=>{let c=d?e?.filter(e=>e.team_id===d):e;return(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"Search or select a project",value:i,onChange:r,disabled:n,loading:o,allowClear:!0,notFoundContent:o?(0,t.jsx)(a.Spin,{indicator:(0,t.jsx)(s.LoadingOutlined,{spin:!0}),size:"small"}):void 0,filterOption:(e,t)=>{if(!t)return!1;let l=c?.find(e=>e.project_id===t.key);if(!l)return!1;let a=e.toLowerCase().trim(),s=(l.project_alias||"").toLowerCase(),i=(l.project_id||"").toLowerCase();return s.includes(a)||i.includes(a)},optionFilterProp:"children",children:!o&&c?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.project_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.project_alias||e.project_id})," ",(0,t.jsxs)("span",{className:"text-gray-500",children:["(",e.project_id,")"]})]},e.project_id))})}])},364769,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(237016),s=e.i(464571),i=e.i(888259);e.s(["default",0,({apiKey:e})=>{let[r,n]=(0,l.useState)(!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2",children:["Please save this secret key somewhere safe and accessible. For security reasons,"," ",(0,t.jsx)("b",{children:"you will not be able to view it again"})," through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-3 mb-1",children:"Virtual Key:"}),(0,t.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,t.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal",margin:0},children:e})}),(0,t.jsx)(a.CopyToClipboard,{text:e,onCopy:()=>{n(!0),i.default.success("Key copied to clipboard"),setTimeout(()=>n(!1),2e3)},children:(0,t.jsx)(s.Button,{type:"primary",style:{marginTop:12},children:r?"Copied!":"Copy Virtual Key"})})]})}])},702597,e=>{"use strict";var t=e.i(843476),l=e.i(207082),a=e.i(109799),s=e.i(510674),i=e.i(109034),r=e.i(292639),n=e.i(135214),o=e.i(500330),d=e.i(827252),c=e.i(912598),u=e.i(677667),m=e.i(130643),g=e.i(898667),p=e.i(994388),h=e.i(309426),x=e.i(350967),y=e.i(599724),b=e.i(779241),f=e.i(629569),j=e.i(464571),_=e.i(808613),v=e.i(311451),A=e.i(212931),w=e.i(91739),k=e.i(199133),N=e.i(790848),C=e.i(262218),S=e.i(592968),I=e.i(898586),T=e.i(343488),L=e.i(741466),E=e.i(271645),O=e.i(708347),F=e.i(552130),M=e.i(557662),R=e.i(9314),B=e.i(860585),P=e.i(82946),D=e.i(392110),U=e.i(533882),z=e.i(844565),V=e.i(651904),K=e.i(939510),Q=e.i(460285),G=e.i(663435),W=e.i(363256),H=e.i(575260),q=e.i(371455),J=e.i(128233),$=e.i(319312),Y=e.i(833400),X=e.i(355619),Z=e.i(75921),ee=e.i(234713),et=e.i(390605),el=e.i(727749),ea=e.i(602869),es=e.i(364769),ei=e.i(435451),er=e.i(916940);let{Option:en}=k.Select,eo=async(e,t,l,a)=>{try{if(null===e||null===t)return[];if(null!==l)return(await (0,ea.modelAvailableCall)(l,e,t,!0,a,!0)).data.map(e=>e.id);return[]}catch(e){return console.error("Error fetching user models:",e),[]}},ed=async(e,t,l,a)=>{try{if(null===e||null===t)return;if(null!==l){let s=(await (0,ea.modelAvailableCall)(l,e,t)).data.map(e=>e.id);a(s)}}catch(e){console.error("Error fetching user models:",e)}};e.s(["default",0,({team:e,teams:ec,data:eu,addKey:em,autoOpenCreate:eg,prefillData:ep})=>{let{accessToken:eh,userId:ex,userRole:ey,premiumUser:eb}=(0,n.default)(),ef=eb||null!=ey&&O.rolesWithWriteAccess.includes(ey),{data:ej,isLoading:e_}=(0,a.useOrganizations)(),{data:ev,isLoading:eA}=(0,s.useProjects)(),{data:ew}=(0,r.useUISettings)(),{data:ek}=(0,i.useTags)(),eN=!!ew?.values?.enable_projects_ui,eC=!!ew?.values?.disable_custom_api_keys,eS=ek?Object.values(ek).map(e=>({value:e.name,label:e.name})):[],eI=(0,c.useQueryClient)(),[eT]=_.Form.useForm(),[eL,eE]=(0,E.useState)(!1),[eO,eF]=(0,E.useState)(null),[eM,eR]=(0,E.useState)([]),[eB,eP]=(0,E.useState)([]),[eD,eU]=(0,E.useState)("you"),[ez,eV]=(0,E.useState)(!1),[eK,eQ]=(0,E.useState)(null),[eG,eW]=(0,E.useState)([]),[eH,eq]=(0,E.useState)([]),[eJ,e$]=(0,E.useState)([]),[eY,eX]=(0,E.useState)([]),[eZ,e0]=(0,E.useState)(e),[e1,e4]=(0,E.useState)(null),[e2,e3]=(0,E.useState)(null),[e6,e5]=(0,E.useState)(!1),[e7,e8]=(0,E.useState)({}),[e9,te]=(0,E.useState)([]),[tt,tl]=(0,E.useState)(!1),[ta,ts]=(0,E.useState)([]),[ti,tr]=(0,E.useState)("llm_api"),[tn,to]=(0,E.useState)({}),[td,tc]=(0,E.useState)(!1),[tu,tm]=(0,E.useState)("30d"),[tg,tp]=(0,E.useState)(null),[th,tx]=(0,E.useState)([]),[ty,tb]=(0,E.useState)([]),[tf,tj]=(0,E.useState)({}),[t_,tv]=(0,E.useState)(0),[tA,tw]=(0,E.useState)(0),[tk,tN]=(0,E.useState)([]),[tC,tS]=(0,E.useState)(null),tI=_.Form.useWatch("models",eT)??[],tT=()=>{eE(!1),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)},tL=()=>{eE(!1),eF(null),e0(null),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)};(0,E.useEffect)(()=>{ex&&ey&&eh&&ed(ex,ey,eh,eR)},[eh,ex,ey]),(0,E.useEffect)(()=>{eh&&(0,ea.getAgentsList)(eh).then(e=>tN(e?.agents||[])).catch(()=>tN([]))},[eh]),(0,E.useEffect)(()=>{let e=async()=>{try{let e=(await (0,ea.getPoliciesList)(eh)).policies.map(e=>e.policy_name);eq(e)}catch(e){console.error("Failed to fetch policies:",e)}},t=async()=>{try{let e=await (0,ea.getPromptsList)(eh);e$(e.prompts.map(e=>e.prompt_id))}catch(e){console.error("Failed to fetch prompts:",e)}};(async()=>{try{let e=(await (0,ea.getGuardrailsList)(eh)).guardrails.map(e=>e.guardrail_name);eW(e)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),e(),t()},[eh]),(0,E.useEffect)(()=>{(async()=>{try{if(eh){let e=sessionStorage.getItem("possibleUserRoles");if(e)e8(JSON.parse(e));else{let e=await (0,ea.getPossibleUserRoles)(eh);sessionStorage.setItem("possibleUserRoles",JSON.stringify(e)),e8(e)}}}catch(e){console.error("Error fetching possible user roles:",e)}})()},[eh]),(0,E.useEffect)(()=>{if(eg&&!ez&&ec&&ey&&O.rolesWithWriteAccess.includes(ey)&&(eE(!0),eV(!0),ep)){if(ep.owned_by&&("another_user"===ep.owned_by&&"Admin"!==ey?eU("you"):eU(ep.owned_by)),ep.team_id){let e=ec?.find(e=>e.team_id===ep.team_id)||null;e&&(e0(e),eT.setFieldsValue({team_id:ep.team_id}))}ep.key_alias&&eT.setFieldsValue({key_alias:ep.key_alias}),ep.models&&ep.models.length>0&&eQ(ep.models),ep.key_type&&(tr(ep.key_type),eT.setFieldsValue({key_type:ep.key_type}))}},[eg,ep,ec,ez,eT,ey]);let tE=eB.includes("no-default-models")&&!eZ,tO=async e=>{try{let t,a=e?.key_alias??"",s=e?.team_id??null;if((eu?.filter(e=>e.team_id===s).map(e=>e.key_alias)??[]).includes(a))throw Error(`Key alias ${a} already exists for team with ID ${s}, please provide another key alias`);if(el.default.info("Making API Call"),eE(!0),"you"===eD)e.user_id=ex;else if("agent"===eD){if(!tC)return void el.default.fromBackend("Please select an agent");e.agent_id=tC}let i={};try{i=JSON.parse(e.metadata||"{}")}catch(e){console.error("Error parsing metadata:",e)}if("service_account"===eD&&(i.service_account_id=e.key_alias),eY.length>0&&(i={...i,logging:eY.filter(e=>e.callback_name)}),ta.length>0){let e=(0,M.mapDisplayToInternalNames)(ta);i={...i,litellm_disabled_callbacks:e}}if(td&&(e.auto_rotate=!0,e.rotation_interval=tu),e.duration&&""!==e.duration.trim()||(e.duration=null),e.metadata=JSON.stringify(i),e.disable_global_guardrails||delete e.disable_global_guardrails,e.allowed_vector_store_ids&&e.allowed_vector_store_ids.length>0&&(e.object_permission={vector_stores:e.allowed_vector_store_ids},delete e.allowed_vector_store_ids),e.allowed_mcp_servers_and_groups&&(e.allowed_mcp_servers_and_groups.servers?.length>0||e.allowed_mcp_servers_and_groups.accessGroups?.length>0||e.allowed_mcp_servers_and_groups.toolsets?.length>0)){e.object_permission||(e.object_permission={});let{servers:t,accessGroups:l,toolsets:a}=e.allowed_mcp_servers_and_groups;t&&t.length>0&&(e.object_permission.mcp_servers=t),l&&l.length>0&&(e.object_permission.mcp_access_groups=l),a&&a.length>0&&(e.object_permission.mcp_toolsets=a),delete e.allowed_mcp_servers_and_groups}let r=e.mcp_tool_permissions||{};if(Object.keys(r).length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_tool_permissions=r),delete e.mcp_tool_permissions,e.allowed_mcp_access_groups&&e.allowed_mcp_access_groups.length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_access_groups=e.allowed_mcp_access_groups,delete e.allowed_mcp_access_groups),e.allowed_agents_and_groups&&(e.allowed_agents_and_groups.agents?.length>0||e.allowed_agents_and_groups.accessGroups?.length>0)){e.object_permission||(e.object_permission={});let{agents:t,accessGroups:l}=e.allowed_agents_and_groups;t&&t.length>0&&(e.object_permission.agents=t),l&&l.length>0&&(e.object_permission.agent_access_groups=l),delete e.allowed_agents_and_groups}Object.keys(tn).length>0&&(e.aliases=JSON.stringify(tn)),tg?.router_settings&&Object.values(tg.router_settings).some(e=>null!=e&&""!==e)&&(e.router_settings=tg.router_settings);let n=th.filter(e=>e.budget_duration&&null!==e.max_budget&&void 0!==e.max_budget);n.length>0&&(e.budget_limits=n);let{tag_rpm_limit:o}=(0,Y.tagRowsToLimits)(ty);Object.keys(o).length>0&&(e.tag_rpm_limit=o),Object.keys(tf).length>0&&(e.budget_fallbacks=tf),t="service_account"===eD?await (0,ea.keyCreateServiceAccountCall)(eh,e):await (0,ea.keyCreateCall)(eh,ex,e),em(t),eI.invalidateQueries({queryKey:l.keyKeys.lists()}),eF(t.key),el.default.success("Virtual Key Created"),eT.resetFields(),tx([]),tb([]),tj({}),tv(e=>e+1),localStorage.removeItem("userData"+ex)}catch(t){let e=(e=>{let t;if(!(t=!e||"object"!=typeof e||e instanceof Error?String(e):JSON.stringify(e)).includes("/key/generate")&&!t.includes("KeyManagementRoutes.KEY_GENERATE"))return`Error creating the key: ${e}`;let l=t;try{if(!e||"object"!=typeof e||e instanceof Error){let e=t.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]),a=t?.error||t;a?.message&&(l=a.message)}}else{let t=e?.error||e;t?.message&&(l=t.message)}}catch(e){}return t.includes("team_member_permission_error")||l.includes("Team member does not have permissions")?"Team member does not have permission to generate key for this team. Ask your proxy admin to configure the team member permission settings.":`Error creating the key: ${e}`})(t);el.default.fromBackend(e)}};(0,E.useEffect)(()=>{if(e2){let e=ev?.find(e=>e.project_id===e2);eP(e?.models??[]),eT.setFieldValue("models",[]);return}ex&&ey&&eh&&eo(ex,ey,eh,eZ?.team_id??null).then(e=>{eP((0,X.excludeProxyWideSentinel)(Array.from(new Set([...eZ?.models??[],...e]))))}),eK||eT.setFieldValue("models",[]),eT.setFieldValue("allowed_mcp_servers_and_groups",{servers:[],accessGroups:[]})},[eZ,e2,eh,ex,ey,eT]),(0,E.useEffect)(()=>{if(!eK||0===eK.length||!eB||0===eB.length)return;let e=eK.filter(e=>eB.includes(e));e.length>0&&eT.setFieldsValue({models:e}),eQ(null)},[eK,eB,eT]),(0,E.useEffect)(()=>{if(!e2||!ec)return;let e=ev?.find(e=>e.project_id===e2);if(!e?.team_id||eZ?.team_id===e.team_id)return;let t=ec.find(t=>t.team_id===e.team_id)||null;t&&(e0(t),eT.setFieldValue("team_id",t.team_id))},[ec,e2,ev]);let tF=async e=>{if(!e)return void te([]);tl(!0);try{let t=new URLSearchParams;if(t.append("user_email",e),null==eh)return;let l=(await (0,ea.userFilterUICall)(eh,t)).map(e=>({label:`${e.user_email} (${e.user_id})`,value:e.user_id,user:e}));te(l)}catch(e){console.error("Error fetching users:",e),el.default.fromBackend("Failed to search for users")}finally{tl(!1)}},tM=(0,T.useDebouncedCallback)(e=>tF(e),{wait:L.DEBOUNCE_WAIT_MS});return(0,t.jsxs)("div",{children:[ey&&O.rolesWithWriteAccess.includes(ey)&&(0,t.jsx)(p.Button,{className:"mx-auto",onClick:()=>eE(!0),"data-testid":"create-key-button",children:"+ Create New Key"}),(0,t.jsx)(A.Modal,{open:eL,width:1e3,footer:null,onOk:tT,onCancel:tL,children:(0,t.jsxs)(_.Form,{form:eT,onFinish:tO,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Ownership"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Owned By"," ",(0,t.jsx)(S.Tooltip,{title:"Select who will own this Virtual Key",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),className:"mb-4",children:(0,t.jsxs)(w.Radio.Group,{onChange:e=>eU(e.target.value),value:eD,children:[(0,t.jsx)(w.Radio,{value:"you",children:"You"}),(0,t.jsx)(w.Radio,{value:"service_account",children:"Service Account"}),"Admin"===ey&&(0,t.jsx)(w.Radio,{value:"another_user",children:"Another User"}),(0,t.jsxs)(w.Radio,{value:"agent",children:["Agent ",(0,t.jsx)(C.Tag,{color:"purple",children:"New"})]})]})}),"another_user"===eD&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["User ID"," ",(0,t.jsx)(S.Tooltip,{title:"The user who will own this key and be responsible for its usage",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"user_id",className:"mt-4",rules:[{required:"another_user"===eD,message:"Please input the user ID of the user you are assigning the key to"}],children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",marginBottom:"8px"},children:[(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Type email to search for users",filterOption:!1,onSearch:tM,onSelect:(e,t)=>{let l;return l=t.user,void eT.setFieldsValue({user_id:l.user_id})},options:e9,loading:tt,allowClear:!0,style:{width:"100%"},notFoundContent:tt?"Searching...":"No users found"}),(0,t.jsx)(j.Button,{onClick:()=>e5(!0),style:{marginLeft:"8px"},children:"Create User"})]}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Search by email to find users"})]})}),"agent"===eD&&(0,t.jsxs)("div",{className:"mt-4 p-4 bg-purple-50 border border-purple-200 rounded-md",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Select Agent ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Select an agent",style:{width:"100%"},value:tC,onChange:e=>tS(e),filterOption:(e,t)=>t?.label?.toLowerCase().includes(e.toLowerCase()),options:tk.map(e=>({label:e.agent_name||e.agent_id,value:e.agent_id}))}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-2",children:"This key will be used by the selected agent to make requests to LiteLLM"})]}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Organization"," ",(0,t.jsx)(S.Tooltip,{title:"The organization this key belongs to. Selecting an organization filters the available teams.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",className:"mt-4",children:(0,t.jsx)(W.default,{organizations:ej,loading:e_,disabled:"Admin"!==ey,onChange:e=>{e4(e||null),e0(null),e3(null),eT.setFieldValue("team_id",void 0),eT.setFieldValue("project_id",void 0)}})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Team"," ",(0,t.jsx)(S.Tooltip,{title:"The team this key belongs to, which determines available models and budget limits",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"team_id",initialValue:e?e.team_id:null,className:"mt-4",rules:[{required:"service_account"===eD,message:"Please select a team for the service account"}],help:"service_account"===eD?"required":"",children:(0,t.jsx)(G.default,{disabled:null!==e2,organizationId:e1,onTeamSelect:e=>{e0(e),e3(null),eT.setFieldValue("project_id",void 0),e?.organization_id?(e4(e.organization_id),eT.setFieldValue("organization_id",e.organization_id)):e||(e4(null),eT.setFieldValue("organization_id",void 0))}})}),eN&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Project"," ",(0,t.jsx)(S.Tooltip,{title:"Assign this key to a project. Selecting a project will lock the team to the project's team.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"project_id",className:"mt-4",children:(0,t.jsx)(H.default,{projects:ev,teamId:eZ?.team_id,loading:eA||!ec,onChange:e=>{if(!e){e3(null),e0(null),eT.setFieldValue("team_id",void 0);return}e3(e)}})})]}),tE&&(0,t.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,t.jsx)(y.Text,{className:"text-blue-800 text-sm",children:"Please select a team to continue configuring your Virtual Key. If you do not see any teams, please contact your Proxy Admin to either provide you with access to models or to add you to a team."})}),!tE&&(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Details"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["you"===eD||"another_user"===eD?"Key Name":"Service Account ID"," ",(0,t.jsx)(S.Tooltip,{title:"you"===eD||"another_user"===eD?"A descriptive name to identify this key":"Unique identifier for this service account",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_alias",rules:[{required:!0,message:`Please input a ${"you"===eD?"key name":"service account ID"}`}],help:"required",children:(0,t.jsx)(b.TextInput,{placeholder:""})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Models"," ",(0,t.jsx)(S.Tooltip,{title:"Select which models this key can access. Choose 'All Team Models' to grant access to all models available to the team. Leave empty to allow access to all models.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",rules:[],help:"management"===ti||"read_only"===ti?"Models field is disabled for this key type":"optional - leave empty to allow access to all models",className:"mt-4",children:(0,t.jsxs)(k.Select,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},disabled:"management"===ti||"read_only"===ti,onChange:e=>{e.includes("all-team-models")?eT.setFieldsValue({models:["all-team-models"]}):e.includes("all-proxy-models")&&eT.setFieldsValue({models:["all-proxy-models"]})},children:[!e2&&eZ&&(0,t.jsx)(en,{value:"all-team-models",children:"All Team Models"},"all-team-models"),!e2&&!eZ&&(0,t.jsx)(en,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),eB.map(e=>(0,t.jsx)(en,{value:e,disabled:(0,X.hasAllModelsSentinel)(tI),children:(0,X.getModelDisplayName)(e)},e))]})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Key Type"," ",(0,t.jsx)(S.Tooltip,{title:"Select the type of key to determine what routes and operations this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_type",initialValue:"llm_api",className:"mt-4",children:(0,t.jsxs)(k.Select,{defaultValue:"llm_api",placeholder:"Select key type",style:{width:"100%"},optionLabelProp:"label",onChange:e=>{tr(e),("management"===e||"read_only"===e)&&eT.setFieldsValue({models:[]})},children:[(0,t.jsx)(en,{value:"llm_api",label:"AI APIs",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"AI APIs"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only AI API routes (chat/completions, embeddings, etc.)"})]})}),(0,t.jsx)(en,{value:"management",label:"Management",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Management"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only management routes (user/team/key management)"})]})}),(0,t.jsx)(en,{value:"default",label:"Full Access",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Full Access"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call all routes (AI APIs, Management, and read-only)"})]})})]})})]}),!tE&&(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)(f.Title,{className:"m-0",children:"Optional Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Max Budget (USD)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum amount in USD this key can spend. When reached, the key will be blocked from making further requests",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"max_budget",help:`Budget cannot exceed team max budget: $${e?.max_budget!==null&&e?.max_budget!==void 0?e?.max_budget:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.max_budget&&l>e.max_budget)throw Error(`Budget cannot exceed team max budget: $${(0,o.formatNumberWithCommas)(e.max_budget,4)}`)}}],children:(0,t.jsx)(ei.default,{step:.01,precision:2,width:200})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Reset Budget"," ",(0,t.jsx)(S.Tooltip,{title:"How often the budget should reset. For example, setting 'daily' will reset the budget every 24 hours",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"budget_duration",help:`Team Reset Budget: ${e?.budget_duration!==null&&e?.budget_duration!==void 0?e?.budget_duration:"None"}`,children:(0,t.jsx)(B.default,{placeholder:"Never resets",onChange:e=>eT.setFieldValue("budget_duration",e)})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Windows"," ",(0,t.jsx)(S.Tooltip,{title:"Set multiple independent budget windows (e.g., hourly $10 AND monthly $200). Each window tracks spend separately and resets on its own schedule.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)($.BudgetWindowsEditor,{value:th,onChange:tx})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Fallbacks"," ",(0,t.jsx)(S.Tooltip,{title:"When a model exceeds its per-model budget (model_max_budget), requests automatically reroute to fallback models instead of failing. Configure per-model budgets in Advanced Settings.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(J.BudgetFallbacksEditor,{value:tf,onChange:tj,availableModels:eB},t_)}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Tokens per minute Limit (TPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of tokens this key can process per minute. Helps control usage and costs",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tpm_limit",help:`TPM cannot exceed team TPM limit: ${e?.tpm_limit!==null&&e?.tpm_limit!==void 0?e?.tpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.tpm_limit&&l>e.tpm_limit)throw Error(`TPM limit cannot exceed team TPM limit: ${e.tpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"tpm",name:"tpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Requests per minute Limit (RPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of API requests this key can make per minute. Helps prevent abuse and manage load",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"rpm_limit",help:`RPM cannot exceed team RPM limit: ${e?.rpm_limit!==null&&e?.rpm_limit!==void 0?e?.rpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.rpm_limit&&l>e.rpm_limit)throw Error(`RPM limit cannot exceed team RPM limit: ${e.rpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"rpm",name:"rpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Per-Tag Rate Limits"," ",(0,t.jsx)(S.Tooltip,{title:"Scope rate limits to a request tag so each tag (e.g. a cell or group) gets its own RPM counter. Requests without a matching tag fall back to the key-level limit.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(Y.TagRateLimitEditor,{value:ty,onChange:tb})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Throttle on budget exceeded"," ",(0,t.jsx)(S.Tooltip,{title:"When this key exceeds its max budget, throttle its TPM/RPM to the globally configured percentage instead of blocking access entirely. Requires budget_exceeded_throttle_percentage in litellm_settings and a TPM/RPM limit on the key.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"throttle_on_budget_exceeded",valuePropName:"checked",children:(0,t.jsx)(N.Switch,{checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"Apply safety guardrails to this key to filter content or enforce policies",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-4",help:ef?"Select existing guardrails or enter new ones":"Premium feature - Upgrade to set guardrails by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!ef,placeholder:ef?"Select or enter guardrails":"Premium feature - Upgrade to set guardrails by key",options:eG.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"When enabled, this key will bypass any guardrails configured to run on every request (global guardrails)",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:ef?"Bypass global guardrails for this key":"Premium feature - Upgrade to disable global guardrails by key",children:(0,t.jsx)(N.Switch,{disabled:!ef,checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Policies"," ",(0,t.jsx)(S.Tooltip,{title:"Apply policies to this key to control guardrails and other settings",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-4",help:eb?"Select existing policies or enter new ones":"Premium feature - Upgrade to set policies by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter policies":"Premium feature - Upgrade to set policies by key",options:eH.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Prompts"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific prompt templates",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/prompt_management",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"prompts",className:"mt-4",help:eb?"Select existing prompts or enter new ones":"Premium feature - Upgrade to set prompts by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter prompts":"Premium feature - Upgrade to set prompts by key",options:eJ.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Access Groups"," ",(0,t.jsx)(S.Tooltip,{title:"Assign access groups to this key. Access groups control which models, MCP servers, and agents this key can use",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-4",help:"Select access groups to assign to this key",children:(0,t.jsx)(R.default,{placeholder:"Select access groups (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Pass Through Routes"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific pass through routes",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/pass_through",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"allowed_passthrough_routes",className:"mt-4",help:eb?"Select existing pass through routes or enter new ones":"Premium feature - Upgrade to set pass through routes by key",children:(0,t.jsx)(z.default,{accessToken:eh,placeholder:eb?"Select or enter pass through routes":"Premium feature - Upgrade to set pass through routes by key",disabled:!eb,teamId:eZ?eZ.team_id:null})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,t.jsx)(S.Tooltip,{title:"Select which vector stores this key can access. If none selected, the key will have access to all available vector stores",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-4",help:"Select vector stores this key can access. Leave empty for access to all vector stores",children:(0,t.jsx)(er.default,{onChange:e=>eT.setFieldValue("allowed_vector_store_ids",e),value:eT.getFieldValue("allowed_vector_store_ids"),accessToken:eh,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Metadata"," ",(0,t.jsx)(S.Tooltip,{title:"JSON object with additional information about this key. Used for tracking or custom logic",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"metadata",className:"mt-4",children:(0,t.jsx)(v.Input.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Tags"," ",(0,t.jsx)(S.Tooltip,{title:"Tags for tracking spend and/or doing tag-based routing. Used for analytics and filtering",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tags",className:"mt-4",help:"Tags for tracking spend and/or doing tag-based routing.",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter tags",tokenSeparators:[","],options:eS})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"MCP Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,t.jsx)(S.Tooltip,{title:"Select which MCP servers or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",help:"Select MCP servers or access groups this key can access",children:(0,t.jsx)(Z.default,{onChange:e=>eT.setFieldValue("allowed_mcp_servers_and_groups",e),value:eT.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:eh,teamId:eZ?.team_id??null,placeholder:"Select MCP servers or access groups (optional)",allowNoMcpServers:!0})}),(0,t.jsx)(_.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,t.jsx)(v.Input,{type:"hidden"})}),(0,t.jsx)(_.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.allowed_mcp_servers_and_groups!==t.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==t.mcp_tool_permissions,children:()=>(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(et.default,{accessToken:eh,selectedServers:(eT.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[]).filter(e=>e!==ee.NO_MCP_SERVERS_SENTINEL),toolPermissions:eT.getFieldValue("mcp_tool_permissions")||{},onChange:e=>eT.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Agent Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Agents"," ",(0,t.jsx)(S.Tooltip,{title:"Select which agents or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",help:"Select agents or access groups this key can access",children:(0,t.jsx)(F.default,{onChange:e=>eT.setFieldValue("allowed_agents_and_groups",e),value:eT.getFieldValue("allowed_agents_and_groups"),accessToken:eh,placeholder:"Select agents or access groups (optional)"})})})]}),eb?(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!0,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]}):(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Key-level logging settings is an enterprise feature, get in touch -",(0,t.jsx)("a",{href:"https://www.litellm.ai/enterprise",target:"_blank",children:"https://www.litellm.ai/enterprise"})]}),placement:"top",children:(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsx)("div",{style:{opacity:.5},children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!1,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]})}),(0,t.jsx)("div",{style:{position:"absolute",inset:0,cursor:"not-allowed"}})]})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Router Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4 w-full",children:(0,t.jsx)(Q.default,{accessToken:eh||"",value:tg||void 0,onChange:tp,modelData:eM.length>0?{data:eM.map(e=>({model_name:e}))}:void 0},tA)})})]},`router-settings-accordion-${tA}`),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Model Aliases"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)(y.Text,{className:"text-sm text-gray-600 mb-4",children:"Create custom aliases for models that can be used in API calls. This allows you to create shortcuts for specific models."}),(0,t.jsx)(U.default,{accessToken:eh,initialModelAliases:tn,onAliasUpdate:to,showExampleConfig:!1})]})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Key Lifecycle"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(D.default,{form:eT,autoRotationEnabled:td,onAutoRotationChange:tc,rotationInterval:tu,onRotationIntervalChange:tm,isCreateMode:!0})})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("b",{children:"Advanced Settings"}),(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Learn more about advanced settings in our"," ",(0,t.jsx)("a",{href:ea.proxyBaseUrl?`${ea.proxyBaseUrl}/#/key%20management/generate_key_fn_key_generate_post`:"/#/key%20management/generate_key_fn_key_generate_post",target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 hover:text-blue-300",children:"documentation"})]}),children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-300 cursor-help"})})]})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(P.default,{schemaComponent:"GenerateKeyRequest",form:eT,excludedFields:["key_alias","team_id","organization_id","models","duration","metadata","tags","guardrails","max_budget","budget_duration","tpm_limit","rpm_limit",...eC?["key"]:[]]})})]})]})]})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(j.Button,{htmlType:"submit",disabled:tE,style:{opacity:tE?.5:1},children:"Create Key"})})]})}),e6&&(0,t.jsx)(A.Modal,{title:"Create New User",open:e6,onCancel:()=>e5(!1),footer:null,width:800,children:(0,t.jsx)(q.CreateUserButton,{userID:ex,accessToken:eh,teams:ec,possibleUIRoles:e7,onUserCreated:e=>{eT.setFieldsValue({user_id:e}),e5(!1)},isEmbedded:!0})}),eO&&(0,t.jsx)(A.Modal,{open:eL,onOk:tT,onCancel:tL,footer:null,children:(0,t.jsxs)(x.Grid,{numItems:1,className:"gap-2 w-full",children:[(0,t.jsx)(f.Title,{children:"Save your Key"}),(0,t.jsx)(h.Col,{numColSpan:1,children:null!=eO?(0,t.jsx)(es.default,{apiKey:eO}):(0,t.jsx)(y.Text,{children:"Key being created, this might take 30s"})})]})})]})},"fetchTeamModels",0,eo,"fetchUserModels",0,ed],702597)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0poz1ux09ae29.js b/litellm/proxy/_experimental/out/_next/static/chunks/0poz1ux09ae29.js new file mode 100644 index 00000000000..2a59d31ae96 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0poz1ux09ae29.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,515288,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let l=r.forwardRef(({className:e,size:r="default",...l},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card","data-size":r,className:(0,a.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...l}));l.displayName="Card";let o=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-header",className:(0,a.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...r}));o.displayName="CardHeader";let s=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-title",className:(0,a.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...r}));s.displayName="CardTitle";let n=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...r}));n.displayName="CardDescription";let i=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-action",className:(0,a.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...r}));i.displayName="CardAction";let d=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-content",className:(0,a.cn)("px-(--card-spacing)",e),...r}));d.displayName="CardContent";let c=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-footer",className:(0,a.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...r}));c.displayName="CardFooter",e.s(["Card",0,l,"CardAction",0,i,"CardContent",0,d,"CardDescription",0,n,"CardFooter",0,c,"CardHeader",0,o,"CardTitle",0,s])},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])},768371,e=>{"use strict";let t,r;var a=e.i(247167);let l=/\{[^{}]+\}/g;function o(e,t,r){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${r?.allowReserved===!0?t:encodeURIComponent(t)}`}function s(e,t,r){if(!t||"object"!=typeof t)return"";let a=[],l={simple:",",label:".",matrix:";"}[r.style]||"&";if("deepObject"!==r.style&&!1===r.explode){for(let e in t)a.push(e,!0===r.allowReserved?t[e]:encodeURIComponent(t[e]));let l=a.join(",");switch(r.style){case"form":return`${e}=${l}`;case"label":return`.${l}`;case"matrix":return`;${e}=${l}`;default:return l}}for(let l in t){let s="deepObject"===r.style?`${e}[${l}]`:l;a.push(o(s,t[l],r))}let s=a.join(l);return"label"===r.style||"matrix"===r.style?`${l}${s}`:s}function n(e,t,r){if(!Array.isArray(t))return"";if(!1===r.explode){let a={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[r.style]||",",l=(!0===r.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(a);switch(r.style){case"simple":return l;case"label":return`.${l}`;case"matrix":return`;${e}=${l}`;default:return`${e}=${l}`}}let a={simple:",",label:".",matrix:";"}[r.style]||"&",l=[];for(let a of t)"simple"===r.style||"label"===r.style?l.push(!0===r.allowReserved?a:encodeURIComponent(a)):l.push(o(e,a,r));return"label"===r.style||"matrix"===r.style?`${a}${l.join(a)}`:l.join(a)}function i(e){return function(t){let r=[];if(t&&"object"==typeof t)for(let a in t){let l=t[a];if(null!=l){if(Array.isArray(l)){if(0===l.length)continue;r.push(n(a,l,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof l){r.push(s(a,l,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}r.push(o(a,l,e))}}return r.join("&")}}function d(e,t){let r=e;for(let a of e.match(l)??[]){let e=a.substring(1,a.length-1),l=!1,i="simple";if(e.endsWith("*")&&(l=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(i="label",e=e.substring(1)):e.startsWith(";")&&(i="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let d=t[e];if(Array.isArray(d)){r=r.replace(a,n(e,d,{style:i,explode:l}));continue}if("object"==typeof d){r=r.replace(a,s(e,d,{style:i,explode:l}));continue}if("matrix"===i){r=r.replace(a,`;${o(e,d)}`);continue}r=r.replace(a,"label"===i?`.${encodeURIComponent(d)}`:encodeURIComponent(d))}return r}function c(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function u(...e){let t=new Headers;for(let r of e)if(r&&"object"==typeof r)for(let[e,a]of r instanceof Headers?r.entries():Object.entries(r))if(null===a)t.delete(e);else if(Array.isArray(a))for(let r of a)t.append(e,r);else void 0!==a&&t.set(e,a);return t}function m(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var f=e.i(954616),h=e.i(621482),g=e.i(869230),p=e.i(469637),b=e.i(254440),x=e.i(266027),v=e.i(431703),y=e.i(97198),w=e.i(950643);let j=function(e){let{baseUrl:t="",Request:r=globalThis.Request,fetch:l=globalThis.fetch,querySerializer:o,bodySerializer:s,pathSerializer:n,headers:f,requestInitExt:h,...g}={...e};h="object"==typeof a.default&&Number.parseInt(a.default?.versions?.node?.substring(0,2))>=18&&a.default.versions.undici?h:void 0,t=m(t);let p=[];async function b(e,a){var b,x;let v,y,w,j,N,{baseUrl:C,fetch:k=l,Request:S=r,headers:R,params:M={},parseAs:E="json",querySerializer:T,bodySerializer:$=s??c,pathSerializer:D,body:_,middleware:O=[],...P}=a||{},H=t;C&&(H=m(C)??t);let z="function"==typeof o?o:i(o);T&&(z="function"==typeof T?T:i({..."object"==typeof o?o:{},...T}));let L=D||n||d,Y=void 0===_?void 0:$(_,u(f,R,M.header)),A=u(void 0===Y||Y instanceof FormData?{}:{"Content-Type":"application/json"},f,R,M.header),V=[...p,...O],q={redirect:"follow",...g,...P,body:Y,headers:A},I=new S((b=e,x={baseUrl:H,params:M,querySerializer:z,pathSerializer:L},v=`${x.baseUrl}${b}`,x.params?.path&&(v=x.pathSerializer(v,x.params.path)),(y=x.querySerializer(x.params.query??{})).startsWith("?")&&(y=y.substring(1)),y&&(v+=`?${y}`),v),q);for(let e in P)e in I||(I[e]=P[e]);if(V.length){for(let t of(w=Math.random().toString(36).slice(2,11),j=Object.freeze({baseUrl:H,fetch:k,parseAs:E,querySerializer:z,bodySerializer:$,pathSerializer:L}),V))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let r=await t.onRequest({request:I,schemaPath:e,params:M,options:j,id:w});if(r)if(r instanceof S)I=r;else if(r instanceof Response){N=r;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!N){try{N=await k(I,h)}catch(r){let t=r;if(V.length)for(let r=V.length-1;r>=0;r--){let a=V[r];if(a&&"object"==typeof a&&"function"==typeof a.onError){let r=await a.onError({request:I,error:t,schemaPath:e,params:M,options:j,id:w});if(r){if(r instanceof Response){t=void 0,N=r;break}if(r instanceof Error){t=r;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(V.length)for(let t=V.length-1;t>=0;t--){let r=V[t];if(r&&"object"==typeof r&&"function"==typeof r.onResponse){let t=await r.onResponse({request:I,response:N,schemaPath:e,params:M,options:j,id:w});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");N=t}}}}let B=N.headers.get("Content-Length");if(204===N.status||"HEAD"===I.method||"0"===B&&!N.headers.get("Transfer-Encoding")?.includes("chunked"))return N.ok?{data:void 0,response:N}:{error:void 0,response:N};if(N.ok){let e=async()=>{if("stream"===E)return N.body;if("json"===E&&!B){let e=await N.text();return e?JSON.parse(e):void 0}return await N[E]()};return{data:await e(),response:N}}let F=await N.text();try{F=JSON.parse(F)}catch{}return{error:F,response:N}}return{request:(e,t,r)=>b(t,{...r,method:e.toUpperCase()}),GET:(e,t)=>b(e,{...t,method:"GET"}),PUT:(e,t)=>b(e,{...t,method:"PUT"}),POST:(e,t)=>b(e,{...t,method:"POST"}),DELETE:(e,t)=>b(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>b(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>b(e,{...t,method:"HEAD"}),PATCH:(e,t)=>b(e,{...t,method:"PATCH"}),TRACE:(e,t)=>b(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");p.push(t)}},eject(...e){for(let t of e){let e=p.indexOf(t);-1!==e&&p.splice(e,1)}}}}({Request:function(e,t){return new globalThis.Request((0,w.resolveRequestUrl)(e,{registeredBase:(0,y.getRequestBaseUrl)(),pageOrigin:globalThis.location?.origin}),t)}});j.use({onRequest({request:e}){let t=(0,y.getAuthToken)();t&&e.headers.set((0,y.getAuthHeaderName)(),`Bearer ${t}`)},async onResponse({response:e}){let t;if(e.ok)return e;let r=await e.clone().text(),a=r;try{a=JSON.parse(r),t=(0,v.deriveErrorMessage)(a)}catch{t=r||`HTTP ${e.status}`}throw(0,y.reportError)(t),new v.ApiError(t,e.status,a)}});let N=(t=async({queryKey:[e,t,r],signal:a})=>{let l=j[e.toUpperCase()],{data:o,error:s,response:n}=await l(t,{signal:a,...r});if(s)throw s;return 204===n.status||"0"===n.headers.get("Content-Length")?o??null:o},{queryOptions:r=(e,r,...[a,l])=>({queryKey:void 0===a?[e,r]:[e,r,a],queryFn:t,...l}),useQuery:(e,t,...[a,l,o])=>(0,x.useQuery)(r(e,t,a,l),o),useSuspenseQuery:(e,t,...[a,l,o])=>{var s;return s=r(e,t,a,l),(0,p.useBaseQuery)({...s,enabled:!0,suspense:!0,throwOnError:b.defaultThrowOnError,placeholderData:void 0},g.QueryObserver,o)},useInfiniteQuery:(e,t,a,l,o)=>{let{pageParamName:s="cursor",...n}=l,{queryKey:i}=r(e,t,a);return(0,h.useInfiniteQuery)({queryKey:i,queryFn:async({queryKey:[e,t,r],pageParam:a=0,signal:l})=>{let o=j[e.toUpperCase()],n={...r,signal:l,params:{...r?.params||{},query:{...r?.params?.query,[s]:a}}},{data:i,error:d}=await o(t,n);if(d)throw d;return i},...n},o)},useMutation:(e,t,r,a)=>(0,f.useMutation)({mutationKey:[e,t],mutationFn:async r=>{let a=j[e.toUpperCase()],{data:l,error:o}=await a(t,r);if(o)throw o;return l},...r},a)});e.s(["$api",0,N,"fetchClient",0,j],768371)},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)},560025,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(931067),l=e.i(392221),o=e.i(703923),s=e.i(211577),n=e.i(209428),i=e.i(410160),d=e.i(914949),c=e.i(529681),u=e.i(611935),m=e.i(361275),f=e.i(174428),h=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}},g=function(e){return void 0!==e?"".concat(e,"px"):void 0};function p(e){var a=e.prefixCls,o=e.containerRef,s=e.value,i=e.getValueIndex,d=e.motionName,c=e.onMotionStart,p=e.onMotionEnd,b=e.direction,x=e.vertical,v=void 0!==x&&x,y=t.useRef(null),w=t.useState(s),j=(0,l.default)(w,2),N=j[0],C=j[1],k=function(e){var t,r=i(e),l=null==(t=o.current)?void 0:t.querySelectorAll(".".concat(a,"-item"))[r];return(null==l?void 0:l.offsetParent)&&l},S=t.useState(null),R=(0,l.default)(S,2),M=R[0],E=R[1],T=t.useState(null),$=(0,l.default)(T,2),D=$[0],_=$[1];(0,f.default)(function(){if(N!==s){var e=k(N),t=k(s),r=h(e,v),a=h(t,v);C(s),E(r),_(a),e&&t?c():p()}},[s]);var O=t.useMemo(function(){if(v){var e;return g(null!=(e=null==M?void 0:M.top)?e:0)}return"rtl"===b?g(-(null==M?void 0:M.right)):g(null==M?void 0:M.left)},[v,b,M]),P=t.useMemo(function(){if(v){var e;return g(null!=(e=null==D?void 0:D.top)?e:0)}return"rtl"===b?g(-(null==D?void 0:D.right)):g(null==D?void 0:D.left)},[v,b,D]);return M&&D?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(){E(null),_(null),p()}},function(e,l){var o=e.className,s=e.style,i=(0,n.default)((0,n.default)({},s),{},{"--thumb-start-left":O,"--thumb-start-width":g(null==M?void 0:M.width),"--thumb-active-left":P,"--thumb-active-width":g(null==D?void 0:D.width),"--thumb-start-top":O,"--thumb-start-height":g(null==M?void 0:M.height),"--thumb-active-top":P,"--thumb-active-height":g(null==D?void 0:D.height)}),d={ref:(0,u.composeRef)(y,l),style:i,className:(0,r.default)("".concat(a,"-thumb"),o)};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,o=e.disabled,n=e.checked,i=e.label,d=e.title,c=e.value,u=e.name,m=e.onChange,f=e.onFocus,h=e.onBlur,g=e.onKeyDown,p=e.onKeyUp,b=e.onMouseDown;return t.createElement("label",{className:(0,r.default)(l,(0,s.default)({},"".concat(a,"-item-disabled"),o)),onMouseDown:b},t.createElement("input",{name:u,className:"".concat(a,"-item-input"),type:"radio",disabled:o,checked:n,onChange:function(e){o||m(e,c)},onFocus:f,onBlur:h,onKeyDown:g,onKeyUp:p}),t.createElement("div",{className:"".concat(a,"-item-label"),title:d},i))},v=t.forwardRef(function(e,m){var f,h=e.prefixCls,g=void 0===h?"rc-segmented":h,v=e.direction,y=e.vertical,w=e.options,j=void 0===w?[]:w,N=e.disabled,C=e.defaultValue,k=e.value,S=e.name,R=e.onChange,M=e.className,E=e.motionName,T=(0,o.default)(e,b),$=t.useRef(null),D=t.useMemo(function(){return(0,u.composeRef)($,m)},[$,m]),_=t.useMemo(function(){return j.map(function(e){if("object"===(0,i.default)(e)&&null!==e){var t=function(e){if(void 0!==e.title)return e.title;if("object"!==(0,i.default)(e.label)){var t;return null==(t=e.label)?void 0:t.toString()}}(e);return(0,n.default)((0,n.default)({},e),{},{title:t})}return{label:null==e?void 0:e.toString(),title:null==e?void 0:e.toString(),value:e}})},[j]),O=(0,d.default)(null==(f=_[0])?void 0:f.value,{value:k,defaultValue:C}),P=(0,l.default)(O,2),H=P[0],z=P[1],L=t.useState(!1),Y=(0,l.default)(L,2),A=Y[0],V=Y[1],q=function(e,t){z(t),null==R||R(t)},I=(0,c.default)(T,["children"]),B=t.useState(!1),F=(0,l.default)(B,2),U=F[0],K=F[1],W=t.useState(!1),G=(0,l.default)(W,2),Q=G[0],X=G[1],J=function(){X(!0)},Z=function(){X(!1)},ee=function(){K(!1)},et=function(e){"Tab"===e.key&&K(!0)},er=function(e){var t=_.findIndex(function(e){return e.value===H}),r=_.length,a=_[(t+e+r)%r];a&&(z(a.value),null==R||R(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:N?void 0:0,"aria-orientation":y?"vertical":"horizontal"},I,{className:(0,r.default)(g,(0,s.default)((0,s.default)((0,s.default)({},"".concat(g,"-rtl"),"rtl"===v),"".concat(g,"-disabled"),N),"".concat(g,"-vertical"),y),void 0===M?"":M),ref:D}),t.createElement("div",{className:"".concat(g,"-group")},t.createElement(p,{vertical:y,prefixCls:g,value:H,containerRef:$,motionName:"".concat(g,"-").concat(void 0===E?"thumb-motion":E),direction:v,getValueIndex:function(e){return _.findIndex(function(t){return t.value===e})},onMotionStart:function(){V(!0)},onMotionEnd:function(){V(!1)}}),_.map(function(e){return t.createElement(x,(0,a.default)({},e,{name:S,key:e.value,prefixCls:g,className:(0,r.default)(e.className,"".concat(g,"-item"),(0,s.default)((0,s.default)({},"".concat(g,"-item-selected"),e.value===H&&!A),"".concat(g,"-item-focused"),Q&&U&&e.value===H)),checked:e.value===H,onChange:q,onFocus:J,onBlur:Z,onKeyDown:ea,onKeyUp:et,onMouseDown:ee,disabled:!!N||!!e.disabled}))})))}),y=e.i(981444),w=e.i(242064),j=e.i(517455);e.i(296059);var N=e.i(915654),C=e.i(183293),k=e.i(246422),S=e.i(838378);function R(e,t){return{[`${e}, ${e}:hover, ${e}:focus`]:{color:t.colorTextDisabled,cursor:"not-allowed"}}}function M(e){return{background:e.itemSelectedBg,boxShadow:e.boxShadowTertiary}}let E=Object.assign({overflow:"hidden"},C.textEllipsis),T=(0,k.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,C.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,C.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,N.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({},M(e)),{color:e.itemSelectedColor}),"&-focused":(0,C.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,N.unit)(r),padding:`0 ${(0,N.unit)(e.segmentedPaddingHorizontal)}`},E),"&-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({},M(e)),{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:"100%",padding:`${(0,N.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,N.unit)(a),padding:`0 ${(0,N.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,N.unit)(l),padding:`0 ${(0,N.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),R(`&-disabled ${t}-item`,e)),R(`${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,S.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:o,lineWidthBold:s,colorBgLayout:n}=e;return{trackPadding:s,trackBg:n,itemColor:t,itemHoverColor:r,itemHoverBg:a,itemSelectedBg:l,itemActiveBg:o,itemSelectedColor:r}});var $=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 D=t.forwardRef((e,a)=>{let l=(0,y.default)(),{prefixCls:o,className:s,rootClassName:n,block:i,options:d=[],size:c="middle",style:u,vertical:m,shape:f="default",name:h=l}=e,g=$(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:p,direction:b,className:x,style:N}=(0,w.useComponentConfig)("segmented"),C=p("segmented",o),[k,S,R]=T(C),M=(0,j.default)(c),E=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({},$(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${C}-item-icon`},r),a&&t.createElement("span",null,a))})}return e}),[d,C]),D=(0,r.default)(s,n,x,{[`${C}-block`]:i,[`${C}-sm`]:"small"===M,[`${C}-lg`]:"large"===M,[`${C}-vertical`]:m,[`${C}-shape-${f}`]:"round"===f},S,R),_=Object.assign(Object.assign({},N),u);return k(t.createElement(v,Object.assign({},g,{name:h,className:D,style:_,options:E,ref:a,prefixCls:C,direction:b,vertical:m})))});e.s(["Segmented",0,D],560025)},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["ExportOutlined",0,o],872934)},888288,e=>{"use strict";var t=e.i(271645);e.s(["default",0,(e,r)=>{let a=void 0!==r,[l,o]=(0,t.useState)(e);return[a?r:l,e=>{a||o(e)}]}])},793130,e=>{"use strict";var t=e.i(290571),r=e.i(783222),a=e.i(433336),l=e.i(271645),o=e.i(394487),s=e.i(503269),n=e.i(214520),i=e.i(746725),d=e.i(914189),c=e.i(144279),u=e.i(294316),m=e.i(601893),f=e.i(140721),h=e.i(942803),g=e.i(233538),p=e.i(694421),b=e.i(700020),x=e.i(35889),v=e.i(998348),y=e.i(722678);let w=(0,l.createContext)(null);w.displayName="GroupContext";let j=l.Fragment,N=Object.assign((0,b.forwardRefWithAs)(function(e,t){var j;let N=(0,l.useId)(),C=(0,h.useProvidedId)(),k=(0,m.useDisabled)(),{id:S=C||`headlessui-switch-${N}`,disabled:R=k||!1,checked:M,defaultChecked:E,onChange:T,name:$,value:D,form:_,autoFocus:O=!1,...P}=e,H=(0,l.useContext)(w),[z,L]=(0,l.useState)(null),Y=(0,l.useRef)(null),A=(0,u.useSyncRefs)(Y,t,null===H?null:H.setSwitch,L),V=(0,n.useDefaultValue)(E),[q,I]=(0,s.useControllable)(M,T,null!=V&&V),B=(0,i.useDisposables)(),[F,U]=(0,l.useState)(!1),K=(0,d.useEvent)(()=>{U(!0),null==I||I(!q),B.nextFrame(()=>{U(!1)})}),W=(0,d.useEvent)(e=>{if((0,g.isDisabledReactIssue7711)(e.currentTarget))return e.preventDefault();e.preventDefault(),K()}),G=(0,d.useEvent)(e=>{e.key===v.Keys.Space?(e.preventDefault(),K()):e.key===v.Keys.Enter&&(0,p.attemptSubmit)(e.currentTarget)}),Q=(0,d.useEvent)(e=>e.preventDefault()),X=(0,y.useLabelledBy)(),J=(0,x.useDescribedBy)(),{isFocusVisible:Z,focusProps:ee}=(0,r.useFocusRing)({autoFocus:O}),{isHovered:et,hoverProps:er}=(0,a.useHover)({isDisabled:R}),{pressed:ea,pressProps:el}=(0,o.useActivePress)({disabled:R}),eo=(0,l.useMemo)(()=>({checked:q,disabled:R,hover:et,focus:Z,active:ea,autofocus:O,changing:F}),[q,et,Z,ea,R,F,O]),es=(0,b.mergeProps)({id:S,ref:A,role:"switch",type:(0,c.useResolveButtonType)(e,z),tabIndex:-1===e.tabIndex?0:null!=(j=e.tabIndex)?j:0,"aria-checked":q,"aria-labelledby":X,"aria-describedby":J,disabled:R||void 0,autoFocus:O,onClick:W,onKeyUp:G,onKeyPress:Q},ee,er,el),en=(0,l.useCallback)(()=>{if(void 0!==V)return null==I?void 0:I(V)},[I,V]),ei=(0,b.useRender)();return l.default.createElement(l.default.Fragment,null,null!=$&&l.default.createElement(f.FormFields,{disabled:R,data:{[$]:D||"on"},overrides:{type:"checkbox",checked:q},form:_,onReset:en}),ei({ourProps:es,theirProps:P,slot:eo,defaultTag:"button",name:"Switch"}))}),{Group:function(e){var t;let[r,a]=(0,l.useState)(null),[o,s]=(0,y.useLabels)(),[n,i]=(0,x.useDescriptions)(),d=(0,l.useMemo)(()=>({switch:r,setSwitch:a}),[r,a]),c=(0,b.useRender)();return l.default.createElement(i,{name:"Switch.Description",value:n},l.default.createElement(s,{name:"Switch.Label",value:o,props:{htmlFor:null==(t=d.switch)?void 0:t.id,onClick(e){r&&(e.currentTarget instanceof HTMLLabelElement&&e.preventDefault(),r.click(),r.focus({preventScroll:!0}))}}},l.default.createElement(w.Provider,{value:d},c({ourProps:{},theirProps:e,slot:{},defaultTag:j,name:"Switch.Group"}))))},Label:y.Label,Description:x.Description});var C=e.i(888288),k=e.i(95779),S=e.i(444755),R=e.i(673706),M=e.i(829087);let E=(0,R.makeClassName)("Switch"),T=l.default.forwardRef((e,r)=>{let{checked:a,defaultChecked:o=!1,onChange:s,color:n,name:i,error:d,errorMessage:c,disabled:u,required:m,tooltip:f,id:h}=e,g=(0,t.__rest)(e,["checked","defaultChecked","onChange","color","name","error","errorMessage","disabled","required","tooltip","id"]),p={bgColor:n?(0,R.getColorClassNames)(n,k.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",ringColor:n?(0,R.getColorClassNames)(n,k.colorPalette.ring).ringColor:"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"},[b,x]=(0,C.default)(o,a),[v,y]=(0,l.useState)(!1),{tooltipProps:w,getReferenceProps:j}=(0,M.useTooltip)(300);return l.default.createElement("div",{className:"flex flex-row items-center justify-start"},l.default.createElement(M.default,Object.assign({text:f},w)),l.default.createElement("div",Object.assign({ref:(0,R.mergeRefs)([r,w.refs.setReference]),className:(0,S.tremorTwMerge)(E("root"),"flex flex-row relative h-5")},g,j),l.default.createElement("input",{type:"checkbox",className:(0,S.tremorTwMerge)(E("input"),"absolute w-5 h-5 cursor-pointer left-0 top-0 opacity-0"),name:i,required:m,checked:b,onChange:e=>{e.preventDefault()}}),l.default.createElement(N,{checked:b,onChange:e=>{x(e),null==s||s(e)},disabled:u,className:(0,S.tremorTwMerge)(E("switch"),"w-10 h-5 group relative inline-flex shrink-0 cursor-pointer items-center justify-center rounded-tremor-full","focus:outline-none",u?"cursor-not-allowed":""),onFocus:()=>y(!0),onBlur:()=>y(!1),id:h},l.default.createElement("span",{className:(0,S.tremorTwMerge)(E("sr-only"),"sr-only")},"Switch ",b?"on":"off"),l.default.createElement("span",{"aria-hidden":"true",className:(0,S.tremorTwMerge)(E("background"),b?p.bgColor:"bg-tremor-border dark:bg-dark-tremor-border","pointer-events-none absolute mx-auto h-3 w-9 rounded-tremor-full transition-colors duration-100 ease-in-out")}),l.default.createElement("span",{"aria-hidden":"true",className:(0,S.tremorTwMerge)(E("round"),b?(0,S.tremorTwMerge)(p.bgColor,"translate-x-5 border-tremor-background dark:border-dark-tremor-background"):"translate-x-0 bg-tremor-border dark:bg-dark-tremor-border border-tremor-background dark:border-dark-tremor-background","pointer-events-none absolute left-0 inline-block h-5 w-5 transform rounded-tremor-full border-2 shadow-tremor-input duration-100 ease-in-out transition",v?(0,S.tremorTwMerge)("ring-2",p.ringColor):"")}))),d&&c?l.default.createElement("p",{className:(0,S.tremorTwMerge)(E("errorMessage"),"text-sm text-red-500 mt-1 ")},c):null)});T.displayName="Switch",e.s(["Switch",0,T],793130)},418371,e=>{"use strict";var t=e.i(843476),r=e.i(174553);e.s(["ProviderLogo",0,({provider:e,className:a="w-4 h-4"})=>(0,t.jsx)(r.Logo,{provider:e,className:a})])},497650,e=>{"use strict";var t=e.i(309821);e.s(["Progress",()=>t.default])},980187,e=>{"use strict";e.s(["createTeamAliasMap",0,e=>e?e.reduce((e,t)=>(e[t.team_id]=t.team_alias,e),{}):{},"resolveTeamAliasFromTeamID",0,(e,t)=>{let r=t.find(t=>t.team_id===e);return r?r.team_alias:null}])},289793,e=>{"use strict";var t=e.i(602869),r=e.i(266027),a=e.i(243652),l=e.i(708347),o=e.i(135214);let s=(0,a.createQueryKeys)("agents");e.s(["useAgents",0,()=>{let{accessToken:e,userRole:a}=(0,o.default)();return(0,r.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,t.getAgentsList)(e),enabled:!!e&&l.all_admin_roles.includes(a||"")})}])},232164,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:"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 000 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm62.6-651.7l224.6 19 19 224.6L477.5 694 233.9 450.5l311.9-311.9zm60.16 186.23a48 48 0 1067.88-67.89 48 48 0 10-67.88 67.89zM889.7 539.8l-39.6-39.5a8.03 8.03 0 00-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 00-11.3 0l-39.6 39.5a8.03 8.03 0 000 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z"}}]},name:"tags",theme:"outlined"};var l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["TagsOutlined",0,o],232164)},366283,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(95779),l=e.i(444755),o=e.i(673706);let s=(0,o.makeClassName)("Callout"),n=r.default.forwardRef((e,n)=>{let{title:i,icon:d,color:c,className:u,children:m}=e,f=(0,t.__rest)(e,["title","icon","color","className","children"]);return r.default.createElement("div",Object.assign({ref:n,className:(0,l.tremorTwMerge)(s("root"),"flex flex-col overflow-hidden rounded-tremor-default text-tremor-default border-l-4 py-3 pr-3 pl-4",c?(0,l.tremorTwMerge)((0,o.getColorClassNames)(c,a.colorPalette.background).bgColor,(0,o.getColorClassNames)(c,a.colorPalette.darkBorder).borderColor,(0,o.getColorClassNames)(c,a.colorPalette.darkText).textColor,"dark:bg-opacity-10 bg-opacity-10"):(0,l.tremorTwMerge)("bg-tremor-brand-faint border-tremor-brand-emphasis text-tremor-brand-emphasis","dark:bg-dark-tremor-brand-muted/70 dark:border-dark-tremor-brand-emphasis dark:text-dark-tremor-brand-emphasis"),u)},f),r.default.createElement("div",{className:(0,l.tremorTwMerge)(s("header"),"flex items-start")},d?r.default.createElement(d,{className:(0,l.tremorTwMerge)(s("icon"),"flex-none h-5 w-5 mr-1.5")}):null,r.default.createElement("h4",{className:(0,l.tremorTwMerge)(s("title"),"font-semibold")},i)),r.default.createElement("p",{className:(0,l.tremorTwMerge)(s("body"),"overflow-y-auto",m?"mt-2":"")},m))});n.displayName="Callout",e.s(["Callout",0,n],366283)},738014,e=>{"use strict";var t=e.i(135214),r=e.i(602869),a=e.i(266027);let l=(0,e.i(243652).createQueryKeys)("users");e.s(["useCurrentUser",0,()=>{let{accessToken:e,userId:o}=(0,t.default)();return(0,a.useQuery)({queryKey:l.detail(o),queryFn:async()=>await (0,r.userGetInfoV2)(e),enabled:!!(e&&o)})}])},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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["GlobalOutlined",0,o],160818)},37091,e=>{"use strict";var t=e.i(290571),r=e.i(95779),a=e.i(444755),l=e.i(673706),o=e.i(271645);let s=o.default.forwardRef((e,s)=>{let{color:n,children:i,className:d}=e,c=(0,t.__rest)(e,["color","children","className"]);return o.default.createElement("p",Object.assign({ref:s,className:(0,a.tremorTwMerge)(n?(0,l.getColorClassNames)(n,r.colorPalette.lightText).textColor:"text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",d)},c),i)});s.displayName="Subtitle",e.s(["Subtitle",0,s],37091)},617802,149121,1023,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(602869),l=e.i(500330),o=e.i(135214);e.s(["default",0,({userSpend:e,userMaxBudget:s,selectedTeam:n})=>{let{accessToken:i,userRole:d,userId:c}=(0,o.default)(),[u,m]=(0,r.useState)(null!==e?e:0),[f,h]=(0,r.useState)(n?Number((0,l.formatNumberWithCommas)(n.max_budget,4)):null);(0,r.useEffect)(()=>{if(n)if("Default Team"===n.team_alias)h(s);else{let e=!1;if(n.team_memberships)for(let t of n.team_memberships)t.user_id===c&&"max_budget"in t.litellm_budget_table&&null!==t.litellm_budget_table.max_budget&&(h(t.litellm_budget_table.max_budget),e=!0);e||h(n.max_budget)}else h(s)},[n,s]);let[g,p]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(!i||!c||!d)return};(async()=>{try{if(null===c||null===d)return;if(null!==i){let e=(await (0,a.modelAvailableCall)(i,c,d)).data.map(e=>e.id);p(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[d,i,c]),(0,r.useEffect)(()=>{null!==e&&m(e)},[e]);let b=[];n&&n.models&&(b=n.models),b&&b.includes("all-proxy-models")?b=g:b&&b.includes("all-team-models")?b=n.models:b&&0===b.length&&(b=g);let x=null!==f?`$${(0,l.formatNumberWithCommas)(Number(f),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 s=e.i(343053);e.i(622826);var n=e.i(399536),i=e.i(964471),d=e.i(871943),c=e.i(360820),u=e.i(560025),m=e.i(592968),f=e.i(20147),h=e.i(152990),g=e.i(682830),p=e.i(784774);function b({data:e=[],columns:a,getRowId:l,onRowClick:o,renderSubComponent:s,getRowCanExpand:n,isLoading:i=!1,loadingMessage:d="Loading...",noDataMessage:c="No results",enableSorting:u=!1}){let m=!!s&&!!n,f=a.some(e=>void 0!==e.size),[x,v]=(0,r.useState)([]),y=(0,h.useReactTable)({data:e,columns:a,...u&&{state:{sorting:x},onSortingChange:v,enableSortingRemoval:!1},...m&&{getRowCanExpand:n},...l&&{getRowId:l},getCoreRowModel:(0,g.getCoreRowModel)(),...u&&{getSortedRowModel:(0,g.getSortedRowModel)()},...m&&{getExpandedRowModel:(0,g.getExpandedRowModel)()}}),w=f?{minWidth:y.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)(p.Table,{className:f?"table-fixed":"table-fixed w-full box-border",style:w,children:[(0,t.jsx)(p.TableHeader,{children:y.getHeaderGroups().map(e=>(0,t.jsx)(p.TableRow,{className:"bg-muted/50 hover:bg-muted/50",children:e.headers.map(e=>{let r=u&&e.column.getCanSort(),a=e.column.getIsSorted(),l=e.column.columnDef.meta?.numeric;return(0,t.jsx)(p.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:f?{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 ${l?"justify-end":""}`,children:[(0,h.flexRender)(e.column.columnDef.header,e.getContext()),r&&(0,t.jsx)("span",{className:"text-muted-foreground",children:"asc"===a?"↑":"desc"===a?"↓":"⇅"})]})},e.id)})},e.id))}),(0,t.jsx)(p.TableBody,{children:i?(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:a.length,className:"h-8 text-center",children:(0,t.jsx)("div",{className:"text-center text-muted-foreground",children:(0,t.jsx)("p",{children:d})})})}):y.getRowModel().rows.length>0?y.getRowModel().rows.map(e=>(0,t.jsxs)(r.Fragment,{children:[(0,t.jsx)(p.TableRow,{className:`h-8 ${o?"cursor-pointer":""}`,onClick:()=>o?.(e.original),children:e.getVisibleCells().map(e=>(0,t.jsx)(p.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:f?{width:e.column.getSize()}:void 0,children:(0,h.flexRender)(e.column.columnDef.cell,e.getContext())},e.id))}),m&&e.getIsExpanded()&&s&&(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:e.getVisibleCells().length,className:"p-0",children:(0,t.jsx)("div",{className:"w-full max-w-full overflow-hidden box-border",children:s({row:e})})})})]},e.id)):(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:a.length,className:"h-24 text-center align-middle",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:c})})})})]})})}e.s(["DataTable",0,b],149121),e.s(["default",0,({topKeys:e,teams:h,showTags:g=!1,topKeysLimit:p,setTopKeysLimit:x})=>{let{accessToken:v}=(0,o.default)(),[y,w]=(0,r.useState)(!1),[j,N]=(0,r.useState)(null),[C,k]=(0,r.useState)(void 0),[S,R]=(0,r.useState)("table"),[M,E]=(0,r.useState)(new Set),T=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);k(r),N(e.api_key),w(!0)}catch(e){console.error("Error fetching key info:",e)}},$=()=>{w(!1),N(null),k(void 0)};r.default.useEffect(()=>{let e=e=>{"Escape"===e.key&&y&&$()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[y]);let D=[{header:"Key ID",accessorKey:"api_key",cell:e=>(0,t.jsx)(n.IdCell,{value:e.getValue(),onClick:()=>T(e.row.original)})},{header:"Key Alias",accessorKey:"key_alias",cell:e=>e.getValue()||"-"}],_={header:"Spend (USD)",accessorKey:"spend",meta:{numeric:!0},cell:e=>(0,t.jsx)(i.MoneyCell,{value:e.getValue(),decimals:2})},O=g?[...D,{header:"Tags",accessorKey:"tags",cell:e=>{let r=e.getValue(),a=e.row.original.api_key,o=M.has(a);if(!r||0===r.length)return"-";let s=r.sort((e,t)=>t.usage-e.usage),n=o?s:s.slice(0,2),i=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:[n.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)),i&&(0,t.jsx)("button",{onClick:()=>{E(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:o?"Show fewer tags":"Show all tags",children:o?(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"})})]})})}},_]:[...D,_],P=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:p,onChange:e=>x(e)}),(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>R("table"),className:`px-3 py-1 text-sm rounded-md ${"table"===S?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Table View"}),(0,t.jsx)("button",{onClick:()=>R("chart"),className:`px-3 py-1 text-sm rounded-md ${"chart"===S?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Chart View"})]})]}),"chart"===S?(0,t.jsx)("div",{className:"relative max-h-[600px] overflow-y-auto",children:(0,t.jsx)(s.BarChart,{className:"mt-4 cursor-pointer hover:opacity-90",style:{height:52*Math.min(P.length,p)},data:P,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=>T(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)(b,{columns:O,data:e,isLoading:!1})}),y&&j&&C&&(0,t.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:e=>{e.target===e.currentTarget&&$()},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:$,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)(f.default,{keyId:j,onClose:$,keyData:C,teams:h})})]})})]})}],1023)},973706,e=>{"use strict";var t=e.i(843476),r=e.i(72713),a=e.i(637235),l=e.i(994388),o=e.i(599724),s=e.i(166540),n=e.i(271645);let i=[{label:"Today",shortLabel:"today",getValue:()=>({from:(0,s.default)().startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Last 7 days",shortLabel:"7d",getValue:()=>({from:(0,s.default)().subtract(7,"days").startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Last 30 days",shortLabel:"30d",getValue:()=>({from:(0,s.default)().subtract(30,"days").startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Month to date",shortLabel:"MTD",getValue:()=>({from:(0,s.default)().startOf("month").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Year to date",shortLabel:"YTD",getValue:()=>({from:(0,s.default)().startOf("year").toDate(),to:(0,s.default)().endOf("day").toDate()})}];e.s(["default",0,({value:e,onValueChange:d,label:c="Select Time Range",showTimeRange:u=!0})=>{let[m,f]=(0,n.useState)(!1),[h,g]=(0,n.useState)(e),[p,b]=(0,n.useState)(null),[x,v]=(0,n.useState)(""),[y,w]=(0,n.useState)(""),j=(0,n.useRef)(null),N=(0,n.useCallback)(e=>{if(!e.from||!e.to)return null;for(let t of i){let r=t.getValue(),a=(0,s.default)(e.from).isSame((0,s.default)(r.from),"day"),l=(0,s.default)(e.to).isSame((0,s.default)(r.to),"day");if(a&&l)return t.shortLabel}return null},[]);(0,n.useEffect)(()=>{b(N(e))},[e,N]);let C=(0,n.useCallback)(()=>{if(!x||!y)return{isValid:!0,error:""};let e=(0,s.default)(x,"YYYY-MM-DD"),t=(0,s.default)(y,"YYYY-MM-DD");return e.isValid()&&t.isValid()?t.isBefore(e)?{isValid:!1,error:"End date cannot be before start date"}:{isValid:!0,error:""}:{isValid:!1,error:"Invalid date format"}},[x,y])();(0,n.useEffect)(()=>{e.from&&v((0,s.default)(e.from).format("YYYY-MM-DD")),e.to&&w((0,s.default)(e.to).format("YYYY-MM-DD")),g(e)},[e]),(0,n.useEffect)(()=>{let e=e=>{j.current&&!j.current.contains(e.target)&&f(!1)};return m&&document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[m]);let k=(0,n.useCallback)((e,t)=>{if(!e||!t)return"Select date range";let r=e=>(0,s.default)(e).format("D MMM, HH:mm");return`${r(e)} - ${r(t)}`},[]),S=(0,n.useCallback)(e=>{let t;if(!e.from)return e;let r={...e},a=new Date(e.from);return t=new Date(e.to?e.to:e.from),a.toDateString()===t.toDateString(),a.setHours(0,0,0,0),t.setHours(23,59,59,999),r.from=a,r.to=t,r},[]),R=(0,n.useCallback)(()=>{try{if(x&&y&&C.isValid){let e=(0,s.default)(x,"YYYY-MM-DD").startOf("day"),t=(0,s.default)(y,"YYYY-MM-DD").endOf("day");if(e.isValid()&&t.isValid()){let r={from:e.toDate(),to:t.toDate()};g(r);let a=N(r);b(a)}}}catch(e){console.warn("Invalid date format:",e)}},[x,y,C.isValid,N]);return(0,n.useEffect)(()=>{R()},[R]),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[c&&(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 whitespace-nowrap",children:c}),(0,t.jsxs)("div",{className:"relative",ref:j,children:[(0,t.jsx)("div",{className:"w-[300px] px-3 py-2 text-sm border border-gray-300 rounded-md bg-white cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500",onClick:()=>f(!m),children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(a.ClockCircleOutlined,{className:"text-gray-600"}),(0,t.jsx)("span",{className:"text-gray-900",children:k(e.from,e.to)})]}),(0,t.jsx)("svg",{className:`w-4 h-4 text-gray-400 transition-transform ${m?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]})}),m&&(0,t.jsx)("div",{className:"absolute top-full right-0 z-9999 min-w-[600px] mt-1 bg-white border border-gray-200 rounded-lg shadow-xl",children:(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsxs)("div",{className:"w-1/2 border-r border-gray-200",children:[(0,t.jsx)("div",{className:"p-3 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:"Relative time"})}),(0,t.jsx)("div",{className:"h-[350px] overflow-y-auto",children:i.map(e=>{let r=p===e.shortLabel;return(0,t.jsxs)("div",{className:`flex items-center justify-between px-5 py-4 cursor-pointer border-b border-gray-100 transition-colors ${r?"bg-blue-50 hover:bg-blue-100 border-blue-200":"hover:bg-gray-50"}`,onClick:()=>(e=>{let{from:t,to:r}=e.getValue();g({from:t,to:r}),b(e.shortLabel),v((0,s.default)(t).format("YYYY-MM-DD")),w((0,s.default)(r).format("YYYY-MM-DD"))})(e),children:[(0,t.jsx)("span",{className:`text-sm ${r?"text-blue-700 font-medium":"text-gray-700"}`,children:e.label}),(0,t.jsx)("span",{className:`text-xs px-2 py-1 rounded capitalize ${r?"text-blue-700 bg-blue-100":"text-gray-500 bg-gray-100"}`,children:e.shortLabel})]},e.label)})})]}),(0,t.jsxs)("div",{className:"w-1/2 relative",children:[(0,t.jsx)("div",{className:"p-3.5 border-b border-gray-200",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(r.CalendarOutlined,{className:"text-gray-600"}),(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:"Start and end dates"})]})}),(0,t.jsxs)("div",{className:"p-6 space-y-6 pb-20",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-sm text-gray-700 mb-1 block",children:"Start date"}),(0,t.jsx)("input",{type:"date",value:x,onChange:e=>v(e.target.value),className:`w-65 px-3 py-2 text-sm border rounded-md cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 ${!C.isValid?"border-red-300 focus:border-red-500 focus:ring-red-200":"border-gray-300"}`})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-sm text-gray-700 mb-1 block",children:"End date"}),(0,t.jsx)("input",{type:"date",value:y,onChange:e=>w(e.target.value),className:`w-65 px-3 py-2 text-sm border rounded-md cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 ${!C.isValid?"border-red-300 focus:border-red-500 focus:ring-red-200":"border-gray-300"}`})]}),!C.isValid&&C.error&&(0,t.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-md p-3",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("svg",{className:"w-4 h-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})}),(0,t.jsx)("span",{className:"text-sm text-red-700 font-medium",children:C.error})]})}),h.from&&h.to&&C.isValid&&(0,t.jsxs)("div",{className:"bg-blue-50 p-3 rounded-md space-y-1",children:[(0,t.jsxs)("div",{className:"text-xs text-blue-800",children:[(0,t.jsx)("span",{className:"font-medium",children:"From:"})," ",(0,s.default)(h.from).format("MMM D, YYYY [at] HH:mm:ss")]}),(0,t.jsxs)("div",{className:"text-xs text-blue-800",children:[(0,t.jsx)("span",{className:"font-medium",children:"To:"})," ",(0,s.default)(h.to).format("MMM D, YYYY [at] HH:mm:ss")]})]})]}),(0,t.jsx)("div",{className:"absolute bottom-4 right-4",children:(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(l.Button,{variant:"secondary",onClick:()=>{g(e),e.from&&v((0,s.default)(e.from).format("YYYY-MM-DD")),e.to&&w((0,s.default)(e.to).format("YYYY-MM-DD")),b(N(e)),f(!1)},children:"Cancel"}),(0,t.jsx)(l.Button,{onClick:()=>{h.from&&h.to&&C.isValid&&(d(h),requestIdleCallback(()=>{d(S(h))},{timeout:100}),f(!1))},disabled:!h.from||!h.to||!C.isValid,children:"Apply"})]})})]})]})})]})]})}])},567425,e=>{"use strict";var t=e.i(271645);let r=["total_spend","total_prompt_tokens","total_completion_tokens","total_tokens","total_api_requests","total_successful_requests","total_failed_requests","total_cache_read_input_tokens","total_cache_creation_input_tokens"],a={results:[],metadata:{total_spend:0,total_prompt_tokens:0,total_completion_tokens:0,total_tokens:0,total_api_requests:0,total_successful_requests:0,total_failed_requests:0,total_cache_read_input_tokens:0,total_cache_creation_input_tokens:0,total_pages:1,has_more:!1,page:1}};e.s(["usePaginatedDailyActivity",0,function({fetchFn:e,args:l,enabled:o}){let[s,n]=(0,t.useState)(a),[i,d]=(0,t.useState)(!1),[c,u]=(0,t.useState)(!1),[m,f]=(0,t.useState)({currentPage:0,totalPages:0}),[h,g]=(0,t.useState)(!1),p=(0,t.useRef)(0),b=(0,t.useRef)(!1),x=(0,t.useRef)(null),v=(0,t.useRef)(l);v.current=l;let y=JSON.stringify(l),w=(0,t.useCallback)(()=>{b.current=!0,g(!0),u(!1),null!==x.current&&(clearTimeout(x.current),x.current=null)},[]);return(0,t.useEffect)(()=>{if(!o){n(a),d(!1),u(!1),f({currentPage:0,totalPages:0}),g(!1);return}let t=++p.current;b.current=!1,g(!1);let l=()=>p.current!==t||b.current,s=e=>new Promise(t=>{x.current=setTimeout(()=>{x.current=null,t()},e)});return(async()=>{let t=v.current;d(!0),u(!1),f({currentPage:1,totalPages:1});try{let a=[...t.slice(0,3),1,...t.slice(3)],o=await e(...a);if(l())return;n(o);let i=o.metadata?.total_pages||1;if(f({currentPage:1,totalPages:i}),i<=1)return void d(!1);d(!1),u(!0);let c=[...o.results],m={...o.metadata};for(let a=2;a<=i;a++){if(l()||(await s(300),l()))return;let o=[...t.slice(0,3),a,...t.slice(3)],d=await e(...o);if(l())return;c=[...c,...d.results],(m=function(e,t){let a={...e};for(let l of r)a[l]=(e[l]||0)+(t[l]||0);return a}(m,d.metadata)).total_pages=i,m.has_more=a{p.current++,null!==x.current&&(clearTimeout(x.current),x.current=null)}},[o,e,y]),{data:s,loading:i,isFetchingMore:c,progress:m,cancelled:h,cancel:w}}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0q8_xov7_vyo6.js b/litellm/proxy/_experimental/out/_next/static/chunks/0q8_xov7_vyo6.js new file mode 100644 index 00000000000..99cc97ca2a7 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0q8_xov7_vyo6.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},515288,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let i=r.forwardRef(({className:e,size:r="default",...i},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"card","data-size":r,className:(0,a.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...i}));i.displayName="Card";let n=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-header",className:(0,a.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...r}));n.displayName="CardHeader";let s=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-title",className:(0,a.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...r}));s.displayName="CardTitle";let o=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...r}));o.displayName="CardDescription";let l=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-action",className:(0,a.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...r}));l.displayName="CardAction";let d=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-content",className:(0,a.cn)("px-(--card-spacing)",e),...r}));d.displayName="CardContent";let c=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"card-footer",className:(0,a.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...r}));c.displayName="CardFooter",e.s(["Card",0,i,"CardAction",0,l,"CardContent",0,d,"CardDescription",0,o,"CardFooter",0,c,"CardHeader",0,n,"CardTitle",0,s])},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,373488,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(["default",0,t],373488),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:i=0,side:n="bottom",sideOffset:s=4,className:o,...l}){return(0,t.jsx)(r.Menu.Portal,{children:(0,t.jsx)(r.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:i,side:n,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",o),...l})})})},"DropdownMenuItem",0,function({className:e,inset:i,variant:n="default",...s}){return(0,t.jsx)(r.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":i,"data-variant":n,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,...i}){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),...i})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(r.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},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)},677572,370359,405934,e=>{"use strict";var t,r,a,i=e.i(843476);e.s([],559657),e.i(559657),e.i(247167);var n=e.i(271645),s=e.i(951437),o=e.i(146376),l=e.i(667865),d=e.i(552245),c=e.i(53687),u=e.i(733332);let f=n.createContext(void 0);function p(){let e=n.useContext(f);if(void 0===e)throw Error((0,u.default)(64));return e}let g=((t={}).activationDirection="data-activation-direction",t.orientation="data-orientation",t),h={tabActivationDirection:e=>({[g.activationDirection]:e})};var m=e.i(675606),x=e.i(56434);let v=n.forwardRef(function(e,t){let{className:r,defaultValue:a=0,onValueChange:u,orientation:p="horizontal",render:g,value:v,style:y,...w}=e,k=void 0!==e.defaultValue,j=n.useRef([]),[C,_]=n.useState(()=>new Map),[R,E]=(0,s.useControlled)({controlled:v,default:a,name:"Tabs",state:"value"}),N=void 0!==v,[T,A]=n.useState(()=>new Map),S=n.useRef(void 0),O=n.useCallback(e=>{if(void 0===e)return null;for(let[t,r]of T.entries())if(null!=r&&e===(r.value??r.index))return t;return null},[T]),[I,M]=n.useState(()=>({previousValue:R,tabActivationDirection:"none"})),{previousValue:z,tabActivationDirection:D}=I,L=D,H=!1;z!==R&&(L=b(z,R,p,T),H=null!=z&&null!=R&&null==O(R));let P=H?z:R,q=z!==P||D!==L;(0,o.useIsoLayoutEffect)(()=>{q&&M({previousValue:P,tabActivationDirection:L})},[P,q,L]);let U=(0,l.useStableCallback)((e,t)=>{t.activationDirection=b(R,e,p,T),u?.(e,t),t.isCanceled||E(e)}),B=(0,l.useStableCallback)((e,t)=>{u?.(e,(0,m.createChangeEventDetails)(t,void 0,void 0,{activationDirection:"none"}))}),$=(0,l.useStableCallback)((e,t)=>{_(r=>{if(r.get(e)===t)return r;let a=new Map(r);return a.set(e,t),a})}),V=(0,l.useStableCallback)((e,t)=>{_(r=>{if(!r.has(e)||r.get(e)!==t)return r;let a=new Map(r);return a.delete(e),a})}),W=n.useCallback(e=>C.get(e),[C]),K=n.useCallback(e=>{for(let t of T.values())if(e===t?.value)return t?.id},[T]),F=n.useMemo(()=>({getTabElementBySelectedValue:O,getTabIdByPanelValue:K,getTabPanelIdByValue:W,onValueChange:U,orientation:p,registerMountedTabPanel:$,setTabMap:A,unregisterMountedTabPanel:V,tabActivationDirection:L,value:R}),[O,K,W,U,p,$,A,V,L,R]),G=n.useMemo(()=>{for(let e of T.values())if(null!=e&&e.value===R)return e},[T,R]),Y=n.useMemo(()=>{for(let e of T.values())if(null!=e&&!e.disabled)return e.value},[T]),J=n.useRef(!k),Q=n.useRef(a),X=n.useRef(k),Z=n.useRef(!1);(0,o.useIsoLayoutEffect)(()=>{if(N)return;function e(e,t){E(e),M(t=>t.previousValue===e&&"none"===t.tabActivationDirection?t:{previousValue:e,tabActivationDirection:"none"}),B(e,t),J.current=!1}if(0===T.size){Z.current&&null!==R&&!S.current?.isConnected&&e(null,x.REASONS.missing);return}Z.current=!0,S.current=T.keys().next().value;let t=G?.disabled,r=null==G&&null!==R;if(t||R!==Q.current||(X.current=!1),X.current&&t&&R===Q.current)return;let a=J.current;if(t||r){let r=Y??null;if(R===r){J.current=!1;return}let i=x.REASONS.missing;a?i=x.REASONS.initial:t&&(i=x.REASONS.disabled),e(r,i);return}a&&null!=G&&(B(R,x.REASONS.initial),J.current=!1)},[Y,N,B,G,E,T,R]);let ee={orientation:p,tabActivationDirection:L},et=(0,d.useRenderElement)("div",e,{state:ee,ref:t,props:w,stateAttributesMapping:h});return(0,i.jsx)(f.Provider,{value:F,children:(0,i.jsx)(c.CompositeList,{elementsRef:j,children:et})})});function b(e,t,r,a){if(null==e||null==t)return"none";let i=null,n=null;for(let[r,s]of a.entries()){if(null==s)continue;let a=s.value??s.index;if(e===a&&(i=r),t===a&&(n=r),null!=i&&null!=n)break}if(null==i||null==n)return i!==n&&("number"==typeof e||"string"==typeof e)&&typeof e==typeof t?"horizontal"===r?t>e?"right":"left":t>e?"down":"up":"none";let s=i.getBoundingClientRect(),o=n.getBoundingClientRect();if("horizontal"===r){if(o.lefts.left)return"right"}else{if(o.tops.top)return"down"}return"none"}var y=e.i(108868),w=e.i(788015),k=e.i(540886);let j="data-composite-item-active";e.s(["ACTIVE_COMPOSITE_ITEM",0,j],370359);var C=e.i(395530);let _=n.createContext(void 0);function R(){let e=n.useContext(_);if(void 0===e)throw Error((0,u.default)(65));return e}var E=e.i(647554);let N=n.forwardRef(function(e,t){let{className:r,disabled:a=!1,render:i,value:s,id:l,nativeButton:c=!0,style:u,...f}=e,{value:g,getTabPanelIdByValue:v,orientation:b,tabActivationDirection:_}=p(),{activateOnFocus:N,highlightedTabIndex:T,onTabActivation:A,registerTabResizeObserverElement:S,setHighlightedTabIndex:O,tabsListElement:I}=R(),M=(0,w.useBaseUiId)(l),z=n.useMemo(()=>({disabled:a,id:M,value:s}),[a,M,s]),{compositeProps:D,compositeRef:L,index:H}=(0,C.useCompositeItem)({metadata:z}),P=s===g,q=n.useRef(!1),U=n.useRef(null);(0,o.useIsoLayoutEffect)(()=>{let e=U.current;if(e)return S(e)},[S]),(0,o.useIsoLayoutEffect)(()=>{if(q.current){q.current=!1;return}if(P&&H>-1&&T!==H){if(null!=I){let e=(0,E.activeElement)((0,y.ownerDocument)(I));if(e&&(0,E.contains)(I,e))return}a||O(H)}},[P,H,T,O,a,I]);let{getButtonProps:B,buttonRef:$}=(0,k.useButton)({disabled:a,native:c,focusableWhenDisabled:!0}),V=v(s),W=n.useRef(!1),K=n.useRef(!1);return(0,d.useRenderElement)("button",e,{state:{disabled:a,active:P,orientation:b,tabActivationDirection:_},ref:[t,$,L,U],props:[D,{role:"tab","aria-controls":V,"aria-selected":P,id:M,onClick:function(e){P||a||A(s,(0,m.createChangeEventDetails)(x.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"}))},onFocus:function(e){P||(H>-1&&!a&&O(H),!a&&N&&(!W.current||W.current&&K.current)&&A(s,(0,m.createChangeEventDetails)(x.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"})))},onPointerDown:function(e){P||a||(W.current=!0,e.button&&0!==e.button||(K.current=!0,(0,y.ownerDocument)(e.currentTarget).addEventListener("pointerup",function(){W.current=!1,K.current=!1},{once:!0})))},[j]:P?"":void 0,onKeyDownCapture(){q.current=!0}},f,B],stateAttributesMapping:h})});var T=e.i(73364),A=e.i(802239),S=e.i(956789);function O(){return S.NOOP}function I(){return!1}function M(){return!0}let z=((r={}).activeTabLeft="--active-tab-left",r.activeTabRight="--active-tab-right",r.activeTabTop="--active-tab-top",r.activeTabBottom="--active-tab-bottom",r.activeTabWidth="--active-tab-width",r.activeTabHeight="--active-tab-height",r);var D=e.i(172410);let L={...h,activeTabPosition:()=>null,activeTabSize:()=>null},H=n.forwardRef(function(e,t){let{className:r,render:a,renderBeforeHydration:s=!1,style:o,...l}=e,{nonce:c}=(0,D.useCSPContext)(),{getTabElementBySelectedValue:u,orientation:f,tabActivationDirection:g,value:h}=p(),{tabsListElement:m,registerIndicatorUpdateListener:x}=R(),v=(0,A.useSyncExternalStore)(O,I,M),b=function(){let[,e]=n.useState({});return n.useCallback(()=>{e({})},[])}();n.useEffect(()=>x(b),[x,b]);let y=0,w=0,k=0,j=0,C=0,_=0,E=!1;if(null!=h&&null!=m){let e=u(h);if(null!=e){E=!0;let{width:t,height:r}=(0,T.getCssDimensions)(e),{width:a,height:i}=(0,T.getCssDimensions)(m),n=e.getBoundingClientRect(),s=m.getBoundingClientRect(),o=a>0?s.width/a:1,l=i>0?s.height/i:1;if(Math.abs(o)>Number.EPSILON&&Math.abs(l)>Number.EPSILON){let e=n.left-s.left,t=n.top-s.top;y=e/o+m.scrollLeft-m.clientLeft,k=t/l+m.scrollTop-m.clientTop}else y=e.offsetLeft,k=e.offsetTop;C=t,_=r,w=m.scrollWidth-y-C,j=m.scrollHeight-k-_}}let N=E?{left:y,right:w,top:k,bottom:j}:null,S=E?{width:C,height:_}:null,H=E?{[z.activeTabLeft]:`${y}px`,[z.activeTabRight]:`${w}px`,[z.activeTabTop]:`${k}px`,[z.activeTabBottom]:`${j}px`,[z.activeTabWidth]:`${C}px`,[z.activeTabHeight]:`${_}px`}:void 0,P=E&&C>0&&_>0,q=(0,d.useRenderElement)("span",e,{state:{orientation:f,activeTabPosition:N,activeTabSize:S,tabActivationDirection:g},ref:t,props:[{role:"presentation",style:H,hidden:!P},l,{suppressHydrationWarning:!0}],stateAttributesMapping:L});return null==h?null:(0,i.jsxs)(n.Fragment,{children:[q,v&&s&&(0,i.jsx)("script",{nonce:c,dangerouslySetInnerHTML:{__html:'!function(){const t=document.currentScript.previousElementSibling;if(!t)return;const e=t.closest(\'[role="tablist"]\');if(!e)return;const i=e.querySelector("[data-active]");if(!i)return;if(0===i.offsetWidth||0===e.offsetWidth)return;let o=0,n=0,h=0,l=0,r=0,f=0;function s(t){const e=getComputedStyle(t);let i=parseFloat(e.width)||0,o=parseFloat(e.height)||0;return(Math.round(i)!==t.offsetWidth||Math.round(o)!==t.offsetHeight)&&(i=t.offsetWidth,o=t.offsetHeight),{width:i,height:o}}if(null!=i&&null!=e){const{width:t,height:c}=s(i),{width:u,height:d}=s(e),a=i.getBoundingClientRect(),g=e.getBoundingClientRect(),p=u>0?g.width/u:1,b=d>0?g.height/d:1;if(Math.abs(p)>Number.EPSILON&&Math.abs(b)>Number.EPSILON){const t=a.left-g.left,i=a.top-g.top;o=t/p+e.scrollLeft-e.clientLeft,h=i/b+e.scrollTop-e.clientTop}else o=i.offsetLeft,h=i.offsetTop;r=t,f=c,n=e.scrollWidth-o-r,l=e.scrollHeight-h-f}function c(e,i){t.style.setProperty(`--active-tab-${e}`,`${i}px`)}c("left",o),c("right",n),c("top",h),c("bottom",l),c("width",r),c("height",f),r>0&&f>0&&t.removeAttribute("hidden")}();'},suppressHydrationWarning:!0})]})});var P=e.i(144394),q=e.i(209407),U=e.i(137584),B=e.i(223910),$=e.i(673553);let V=((a={}).index="data-index",a.activationDirection="data-activation-direction",a.orientation="data-orientation",a.hidden="data-hidden",a[a.startingStyle=q.TransitionStatusDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=q.TransitionStatusDataAttributes.endingStyle]="endingStyle",a),W={...h,...q.transitionStatusMapping},K=n.forwardRef(function(e,t){let{className:r,value:a,render:i,keepMounted:s=!1,style:l,...c}=e,{value:u,getTabIdByPanelValue:f,orientation:g,tabActivationDirection:h,registerMountedTabPanel:m,unregisterMountedTabPanel:x}=p(),v=(0,w.useBaseUiId)(),b=n.useMemo(()=>({id:v,value:a}),[v,a]),{ref:y,index:k}=(0,$.useCompositeListItem)({metadata:b}),j=a===u,{mounted:C,transitionStatus:_,setMounted:R}=(0,B.useTransitionStatus)(j),E=!C,N=f(a),T=n.useRef(null),A=(0,d.useRenderElement)("div",e,{state:{hidden:E,orientation:g,tabActivationDirection:h,transitionStatus:_},ref:[t,y,T],props:[{"aria-labelledby":N,hidden:E,id:v,role:"tabpanel",tabIndex:j?0:-1,inert:(0,P.inertValue)(!j),[V.index]:k},c],stateAttributesMapping:W});return((0,U.useOpenChangeComplete)({open:j,ref:T,onComplete(){j||R(!1)}}),(0,o.useIsoLayoutEffect)(()=>{if((!E||s)&&null!=v)return m(a,v),()=>{x(a,v)}},[E,s,a,v,m,x]),s||C)?A:null});var F=e.i(590803),G=e.i(828918),Y=e.i(673327),J=e.i(621082);let Q=[];var X=e.i(838452),Z=e.i(872855);function ee(e){let{render:t,className:r,style:a,refs:s=S.EMPTY_ARRAY,props:u=S.EMPTY_ARRAY,state:f=S.EMPTY_OBJECT,stateAttributesMapping:p,highlightedIndex:g,onHighlightedIndexChange:h,orientation:m,grid:x,loopFocus:v,onLoop:b,enableHomeAndEndKeys:y,onMapChange:w,stopEventPropagation:k=!0,rootRef:C,disabledIndices:_,modifierKeys:R,highlightItemOnHover:N=!1,tag:T="div",...A}=e,{props:O,highlightedIndex:I,onHighlightedIndexChange:M,elementsRef:z,onMapChange:D,relayKeyboardEvent:L}=function(e){let{loopFocus:t=!0,orientation:r="both",grid:a,onLoop:i,direction:s,highlightedIndex:d,onHighlightedIndexChange:c,rootRef:u,enableHomeAndEndKeys:f=!1,stopEventPropagation:p=!1,disabledIndices:g,modifierKeys:h=Q}=e,[m,x]=n.useState(0),v=null!=a,b=n.useRef(null),y=(0,G.useMergedRefs)(b,u),w=n.useRef([]),k=n.useRef(!1),C=d??m,_=(0,l.useStableCallback)((e,t=!1)=>{if((c??x)(e),t){let t=w.current[e];(0,Y.scrollIntoViewIfNeeded)(b.current,t,s,r)}}),R=(0,l.useStableCallback)(e=>{if(0===e.size||k.current)return;k.current=!0;let t=Array.from(e.keys()),a=t.find(e=>e?.hasAttribute(j))??null,i=a?t.indexOf(a):-1;if(-1!==i)_(i);else if((0,J.isListIndexDisabled)(t,C,g)){let e=(0,J.findNonDisabledListIndex)(t,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(t,e)||_(e)}(0,Y.scrollIntoViewIfNeeded)(b.current,a,s,r)});(0,o.useIsoLayoutEffect)(()=>{if(null==g||null!=d||!k.current)return;let e=w.current;if((0,J.isListIndexDisabled)(e,C,g)){let t=(0,J.findNonDisabledListIndex)(e,{disabledIndices:g});(0,J.isIndexOutOfListBounds)(e,t)||_(t)}},[g,d,C,w,_]);let N=(0,l.useStableCallback)((e,t,r)=>i?i(e,t,r,w):r),T=(0,l.useStableCallback)(e=>{let n=f?Y.COMPOSITE_KEYS:Y.ARROW_KEYS;if(!n.has(e.key)||function(e,t){for(let r of Y.MODIFIER_KEYS.values())if(!t.includes(r)&&e.getModifierState(r))return!0;return!1}(e,h)||!b.current)return;let o="rtl"===s,l=o?Y.ARROW_LEFT:Y.ARROW_RIGHT,d={horizontal:l,vertical:Y.ARROW_DOWN,both:l}[r],c=o?Y.ARROW_RIGHT:Y.ARROW_LEFT,u={horizontal:c,vertical:Y.ARROW_UP,both:c}[r],m=(0,E.getTarget)(e.nativeEvent);if(null!=m&&(0,Y.isNativeInput)(m)&&!(0,F.isElementDisabled)(m)){let t=m.selectionStart,r=m.selectionEnd,a=m.value??"";if(null==t||e.shiftKey||t!==r||e.key!==u&&t0)return}let x=C,y=(0,J.getMinListIndex)(w,g),k=(0,J.getMaxListIndex)(w,g);null!=a&&(x=a({disabledIndices:g,elementsRef:w,event:e,highlightedIndex:C,loopFocus:t,maxIndex:k,minIndex:y,onLoop:N,orientation:r,rtl:o}));let j={horizontal:[l],vertical:[Y.ARROW_DOWN],both:[l,Y.ARROW_DOWN]}[r],R={horizontal:[c],vertical:[Y.ARROW_UP],both:[c,Y.ARROW_UP]}[r],T=v?n:({horizontal:f?Y.HORIZONTAL_KEYS_WITH_EXTRA_KEYS:Y.HORIZONTAL_KEYS,vertical:f?Y.VERTICAL_KEYS_WITH_EXTRA_KEYS:Y.VERTICAL_KEYS,both:n})[r];f&&(e.key===Y.HOME?x=y:e.key===Y.END&&(x=k)),x===C&&(j.includes(e.key)||R.includes(e.key))&&(t&&x===k&&j.includes(e.key)?(x=y,i&&(x=i(e,C,x,w))):t&&x===y&&R.includes(e.key)?(x=k,i&&(x=i(e,C,x,w))):x=(0,J.findNonDisabledListIndex)(w.current,{startingIndex:x,decrement:R.includes(e.key),disabledIndices:g})),x===C||(0,J.isIndexOutOfListBounds)(w.current,x)||(p&&e.stopPropagation(),T.has(e.key)&&e.preventDefault(),_(x,!0),queueMicrotask(()=>{w.current[x]?.focus()}))});return{props:{ref:y,onFocus(e){let t=b.current,r=(0,E.getTarget)(e.nativeEvent);t&&null!=r&&(0,Y.isNativeInput)(r)&&r.setSelectionRange(0,r.value.length??0)},onKeyDown:T},highlightedIndex:C,onHighlightedIndexChange:_,elementsRef:w,disabledIndices:g,onMapChange:R,relayKeyboardEvent:T}}({grid:x,loopFocus:v,onLoop:b,orientation:m,highlightedIndex:g,onHighlightedIndexChange:h,rootRef:C,stopEventPropagation:k,enableHomeAndEndKeys:y,direction:(0,Z.useDirection)(),disabledIndices:_,modifierKeys:R}),H=(0,d.useRenderElement)(T,e,{state:f,ref:s,props:[O,...u,A],stateAttributesMapping:p}),P=n.useMemo(()=>({highlightedIndex:I,onHighlightedIndexChange:M,highlightItemOnHover:N,relayKeyboardEvent:L}),[I,M,N,L]);return(0,i.jsx)(X.CompositeRootContext.Provider,{value:P,children:(0,i.jsx)(c.CompositeList,{elementsRef:z,onMapChange:e=>{w?.(e),D(e)},children:H})})}e.s(["CompositeRoot",0,ee],405934);let et=n.forwardRef(function(e,t){let{activateOnFocus:r=!1,className:a,loopFocus:s=!0,render:d,style:c,...u}=e,{onValueChange:f,orientation:g,value:m,setTabMap:x,tabActivationDirection:v}=p(),[b,y]=n.useState(0),[w,k]=n.useState(null),j=n.useRef(new Set),C=n.useRef(new Set),R=n.useRef(null);(0,o.useIsoLayoutEffect)(()=>{if("u"{j.current.forEach(e=>{e()})});return R.current=e,w&&e.observe(w),C.current.forEach(t=>{e.observe(t)}),()=>{e.disconnect(),R.current=null}},[w]);let E=(0,l.useStableCallback)(e=>(j.current.add(e),()=>{j.current.delete(e)})),N=(0,l.useStableCallback)(e=>(C.current.add(e),R.current?.observe(e),()=>{C.current.delete(e),R.current?.unobserve(e)})),T=(0,l.useStableCallback)((e,t)=>{e!==m&&f(e,t)}),A=n.useMemo(()=>({activateOnFocus:r,highlightedTabIndex:b,registerIndicatorUpdateListener:E,registerTabResizeObserverElement:N,onTabActivation:T,setHighlightedTabIndex:y,tabsListElement:w}),[r,b,E,N,T,y,w]);return(0,i.jsx)(_.Provider,{value:A,children:(0,i.jsx)(ee,{render:d,className:a,style:c,state:{orientation:g,tabActivationDirection:v},refs:[t,k],props:[{"aria-orientation":"vertical"===g?"vertical":void 0,role:"tablist"},u],stateAttributesMapping:h,highlightedIndex:b,enableHomeAndEndKeys:!0,loopFocus:s,orientation:g,onHighlightedIndexChange:y,onMapChange:x,disabledIndices:S.EMPTY_ARRAY})})});e.s(["Indicator",0,H,"List",0,et,"Panel",0,K,"Root",0,v,"Tab",0,N],69281);var er=e.i(69281),er=er,ea=e.i(115504);let ei=(0,ea.cva)({base:"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-9 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});e.s(["Tabs",0,function({className:e,orientation:t="horizontal",...r}){return(0,i.jsx)(er.Root,{"data-slot":"tabs","data-orientation":t,className:(0,ea.cn)("group/tabs flex gap-2 data-horizontal:flex-col",e),...r})},"TabsContent",0,function({className:e,...t}){return(0,i.jsx)(er.Panel,{"data-slot":"tabs-content",className:(0,ea.cn)("flex-1 text-sm outline-none",e),...t})},"TabsList",0,function({className:e,variant:t="default",...r}){return(0,i.jsx)(er.List,{"data-slot":"tabs-list","data-variant":t,className:(0,ea.cn)(ei({variant:t}),e),...r})},"TabsTrigger",0,function({className:e,...t}){return(0,i.jsx)(er.Tab,{"data-slot":"tabs-trigger",className:(0,ea.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",e),...t})}],677572)},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])},871689,e=>{"use strict";var t=e.i(180127);e.s(["ArrowLeft",()=>t.default])},776639,e=>{"use strict";var t=e.i(843476),r=e.i(353753),a=e.i(115504),i=e.i(519455),n=e.i(995926);function s({...e}){return(0,t.jsx)(r.Dialog.Portal,{"data-slot":"dialog-portal",...e})}function o({className:e,...i}){return(0,t.jsx)(r.Dialog.Backdrop,{"data-slot":"dialog-overlay",className:(0,a.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...i})}e.s(["Dialog",0,function({...e}){return(0,t.jsx)(r.Dialog.Root,{"data-slot":"dialog",...e})},"DialogContent",0,function({className:e,children:l,showCloseButton:d=!0,...c}){return(0,t.jsxs)(s,{children:[(0,t.jsx)(o,{}),(0,t.jsxs)(r.Dialog.Popup,{"data-slot":"dialog-content",className:(0,a.cn)("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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),...c,children:[l,d&&(0,t.jsxs)(r.Dialog.Close,{"data-slot":"dialog-close",render:(0,t.jsx)(i.Button,{variant:"ghost",className:"absolute top-4 right-4",size:"icon-sm"}),children:[(0,t.jsx)(n.XIcon,{}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})},"DialogDescription",0,function({className:e,...i}){return(0,t.jsx)(r.Dialog.Description,{"data-slot":"dialog-description",className:(0,a.cn)("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...i})},"DialogFooter",0,function({className:e,showCloseButton:n=!1,children:s,...o}){return(0,t.jsxs)("div",{"data-slot":"dialog-footer",className:(0,a.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...o,children:[s,n&&(0,t.jsx)(r.Dialog.Close,{render:(0,t.jsx)(i.Button,{variant:"outline"}),children:"Close"})]})},"DialogHeader",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"dialog-header",className:(0,a.cn)("flex flex-col gap-2",e),...r})},"DialogTitle",0,function({className:e,...i}){return(0,t.jsx)(r.Dialog.Title,{"data-slot":"dialog-title",className:(0,a.cn)("leading-none font-medium",e),...i})}])},868499,e=>{"use strict";var t=e.i(843476);e.s([],558762),e.i(558762);var r=e.i(366250),a=e.i(402820),i=e.i(156736),n=e.i(209793),s=e.i(784324),o=e.i(264951),l=e.i(77173);let d=e.i(313488).DialogTrigger;var c=e.i(974217),u=e.i(325326),f=e.i(301807);let p={modal:!0,disablePointerDismissal:!0,role:"alertdialog"};class g extends u.DialogHandle{constructor(e){super(e??new f.DialogStore(p)),e&&this.store.update(p)}}e.s(["Backdrop",()=>a.DialogBackdrop,"Close",()=>i.DialogClose,"Description",()=>n.DialogDescription,"Handle",0,g,"Popup",()=>s.DialogPopup,"Portal",()=>o.DialogPortal,"Root",0,function(e){return(0,r.useRenderDialogRoot)(e,"alert-dialog")},"Title",()=>l.DialogTitle,"Trigger",0,d,"Viewport",()=>c.DialogViewport,"createHandle",0,function(){return new g}],734604);var h=e.i(734604),h=h,m=e.i(115504),x=e.i(519455);function v({...e}){return(0,t.jsx)(h.Portal,{"data-slot":"alert-dialog-portal",...e})}function b({className:e,...r}){return(0,t.jsx)(h.Backdrop,{"data-slot":"alert-dialog-overlay",className:(0,m.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...r})}e.s(["AlertDialog",0,function({...e}){return(0,t.jsx)(h.Root,{"data-slot":"alert-dialog",...e})},"AlertDialogAction",0,function({className:e,variant:r="default",size:a="default",...i}){return(0,t.jsx)(h.Close,{"data-slot":"alert-dialog-action",className:(0,m.cn)(e),render:(0,t.jsx)(x.Button,{variant:r,size:a}),...i})},"AlertDialogCancel",0,function({className:e,variant:r="outline",size:a="default",...i}){return(0,t.jsx)(h.Close,{"data-slot":"alert-dialog-cancel",className:(0,m.cn)(e),render:(0,t.jsx)(x.Button,{variant:r,size:a}),...i})},"AlertDialogContent",0,function({className:e,size:r="default",...a}){return(0,t.jsxs)(v,{children:[(0,t.jsx)(b,{}),(0,t.jsx)(h.Popup,{"data-slot":"alert-dialog-content","data-size":r,className:(0,m.cn)("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-popover p-6 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg 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),...a})]})},"AlertDialogDescription",0,function({className:e,...r}){return(0,t.jsx)(h.Description,{"data-slot":"alert-dialog-description",className:(0,m.cn)("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...r})},"AlertDialogFooter",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"alert-dialog-footer",className:(0,m.cn)("flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",e),...r})},"AlertDialogHeader",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"alert-dialog-header",className:(0,m.cn)("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",e),...r})},"AlertDialogTitle",0,function({className:e,...r}){return(0,t.jsx)(h.Title,{"data-slot":"alert-dialog-title",className:(0,m.cn)("text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",e),...r})},"AlertDialogTrigger",0,function({...e}){return(0,t.jsx)(h.Trigger,{"data-slot":"alert-dialog-trigger",...e})}],868499)},768371,e=>{"use strict";let t,r;var a=e.i(247167);let i=/\{[^{}]+\}/g;function n(e,t,r){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${r?.allowReserved===!0?t:encodeURIComponent(t)}`}function s(e,t,r){if(!t||"object"!=typeof t)return"";let a=[],i={simple:",",label:".",matrix:";"}[r.style]||"&";if("deepObject"!==r.style&&!1===r.explode){for(let e in t)a.push(e,!0===r.allowReserved?t[e]:encodeURIComponent(t[e]));let i=a.join(",");switch(r.style){case"form":return`${e}=${i}`;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return i}}for(let i in t){let s="deepObject"===r.style?`${e}[${i}]`:i;a.push(n(s,t[i],r))}let s=a.join(i);return"label"===r.style||"matrix"===r.style?`${i}${s}`:s}function o(e,t,r){if(!Array.isArray(t))return"";if(!1===r.explode){let a={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[r.style]||",",i=(!0===r.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(a);switch(r.style){case"simple":return i;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return`${e}=${i}`}}let a={simple:",",label:".",matrix:";"}[r.style]||"&",i=[];for(let a of t)"simple"===r.style||"label"===r.style?i.push(!0===r.allowReserved?a:encodeURIComponent(a)):i.push(n(e,a,r));return"label"===r.style||"matrix"===r.style?`${a}${i.join(a)}`:i.join(a)}function l(e){return function(t){let r=[];if(t&&"object"==typeof t)for(let a in t){let i=t[a];if(null!=i){if(Array.isArray(i)){if(0===i.length)continue;r.push(o(a,i,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof i){r.push(s(a,i,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}r.push(n(a,i,e))}}return r.join("&")}}function d(e,t){let r=e;for(let a of e.match(i)??[]){let e=a.substring(1,a.length-1),i=!1,l="simple";if(e.endsWith("*")&&(i=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(l="label",e=e.substring(1)):e.startsWith(";")&&(l="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let d=t[e];if(Array.isArray(d)){r=r.replace(a,o(e,d,{style:l,explode:i}));continue}if("object"==typeof d){r=r.replace(a,s(e,d,{style:l,explode:i}));continue}if("matrix"===l){r=r.replace(a,`;${n(e,d)}`);continue}r=r.replace(a,"label"===l?`.${encodeURIComponent(d)}`:encodeURIComponent(d))}return r}function c(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function u(...e){let t=new Headers;for(let r of e)if(r&&"object"==typeof r)for(let[e,a]of r instanceof Headers?r.entries():Object.entries(r))if(null===a)t.delete(e);else if(Array.isArray(a))for(let r of a)t.append(e,r);else void 0!==a&&t.set(e,a);return t}function f(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var p=e.i(954616),g=e.i(621482),h=e.i(869230),m=e.i(469637),x=e.i(254440),v=e.i(266027),b=e.i(431703),y=e.i(97198),w=e.i(950643);let k=function(e){let{baseUrl:t="",Request:r=globalThis.Request,fetch:i=globalThis.fetch,querySerializer:n,bodySerializer:s,pathSerializer:o,headers:p,requestInitExt:g,...h}={...e};g="object"==typeof a.default&&Number.parseInt(a.default?.versions?.node?.substring(0,2))>=18&&a.default.versions.undici?g:void 0,t=f(t);let m=[];async function x(e,a){var x,v;let b,y,w,k,j,{baseUrl:C,fetch:_=i,Request:R=r,headers:E,params:N={},parseAs:T="json",querySerializer:A,bodySerializer:S=s??c,pathSerializer:O,body:I,middleware:M=[],...z}=a||{},D=t;C&&(D=f(C)??t);let L="function"==typeof n?n:l(n);A&&(L="function"==typeof A?A:l({..."object"==typeof n?n:{},...A}));let H=O||o||d,P=void 0===I?void 0:S(I,u(p,E,N.header)),q=u(void 0===P||P instanceof FormData?{}:{"Content-Type":"application/json"},p,E,N.header),U=[...m,...M],B={redirect:"follow",...h,...z,body:P,headers:q},$=new R((x=e,v={baseUrl:D,params:N,querySerializer:L,pathSerializer:H},b=`${v.baseUrl}${x}`,v.params?.path&&(b=v.pathSerializer(b,v.params.path)),(y=v.querySerializer(v.params.query??{})).startsWith("?")&&(y=y.substring(1)),y&&(b+=`?${y}`),b),B);for(let e in z)e in $||($[e]=z[e]);if(U.length){for(let t of(w=Math.random().toString(36).slice(2,11),k=Object.freeze({baseUrl:D,fetch:_,parseAs:T,querySerializer:L,bodySerializer:S,pathSerializer:H}),U))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let r=await t.onRequest({request:$,schemaPath:e,params:N,options:k,id:w});if(r)if(r instanceof R)$=r;else if(r instanceof Response){j=r;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!j){try{j=await _($,g)}catch(r){let t=r;if(U.length)for(let r=U.length-1;r>=0;r--){let a=U[r];if(a&&"object"==typeof a&&"function"==typeof a.onError){let r=await a.onError({request:$,error:t,schemaPath:e,params:N,options:k,id:w});if(r){if(r instanceof Response){t=void 0,j=r;break}if(r instanceof Error){t=r;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(U.length)for(let t=U.length-1;t>=0;t--){let r=U[t];if(r&&"object"==typeof r&&"function"==typeof r.onResponse){let t=await r.onResponse({request:$,response:j,schemaPath:e,params:N,options:k,id:w});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");j=t}}}}let V=j.headers.get("Content-Length");if(204===j.status||"HEAD"===$.method||"0"===V&&!j.headers.get("Transfer-Encoding")?.includes("chunked"))return j.ok?{data:void 0,response:j}:{error:void 0,response:j};if(j.ok){let e=async()=>{if("stream"===T)return j.body;if("json"===T&&!V){let e=await j.text();return e?JSON.parse(e):void 0}return await j[T]()};return{data:await e(),response:j}}let W=await j.text();try{W=JSON.parse(W)}catch{}return{error:W,response:j}}return{request:(e,t,r)=>x(t,{...r,method:e.toUpperCase()}),GET:(e,t)=>x(e,{...t,method:"GET"}),PUT:(e,t)=>x(e,{...t,method:"PUT"}),POST:(e,t)=>x(e,{...t,method:"POST"}),DELETE:(e,t)=>x(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>x(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>x(e,{...t,method:"HEAD"}),PATCH:(e,t)=>x(e,{...t,method:"PATCH"}),TRACE:(e,t)=>x(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");m.push(t)}},eject(...e){for(let t of e){let e=m.indexOf(t);-1!==e&&m.splice(e,1)}}}}({Request:function(e,t){return new globalThis.Request((0,w.resolveRequestUrl)(e,{registeredBase:(0,y.getRequestBaseUrl)(),pageOrigin:globalThis.location?.origin}),t)}});k.use({onRequest({request:e}){let t=(0,y.getAuthToken)();t&&e.headers.set((0,y.getAuthHeaderName)(),`Bearer ${t}`)},async onResponse({response:e}){let t;if(e.ok)return e;let r=await e.clone().text(),a=r;try{a=JSON.parse(r),t=(0,b.deriveErrorMessage)(a)}catch{t=r||`HTTP ${e.status}`}throw(0,y.reportError)(t),new b.ApiError(t,e.status,a)}});let j=(t=async({queryKey:[e,t,r],signal:a})=>{let i=k[e.toUpperCase()],{data:n,error:s,response:o}=await i(t,{signal:a,...r});if(s)throw s;return 204===o.status||"0"===o.headers.get("Content-Length")?n??null:n},{queryOptions:r=(e,r,...[a,i])=>({queryKey:void 0===a?[e,r]:[e,r,a],queryFn:t,...i}),useQuery:(e,t,...[a,i,n])=>(0,v.useQuery)(r(e,t,a,i),n),useSuspenseQuery:(e,t,...[a,i,n])=>{var s;return s=r(e,t,a,i),(0,m.useBaseQuery)({...s,enabled:!0,suspense:!0,throwOnError:x.defaultThrowOnError,placeholderData:void 0},h.QueryObserver,n)},useInfiniteQuery:(e,t,a,i,n)=>{let{pageParamName:s="cursor",...o}=i,{queryKey:l}=r(e,t,a);return(0,g.useInfiniteQuery)({queryKey:l,queryFn:async({queryKey:[e,t,r],pageParam:a=0,signal:i})=>{let n=k[e.toUpperCase()],o={...r,signal:i,params:{...r?.params||{},query:{...r?.params?.query,[s]:a}}},{data:l,error:d}=await n(t,o);if(d)throw d;return l},...o},n)},useMutation:(e,t,r,a)=>(0,p.useMutation)({mutationKey:[e,t],mutationFn:async r=>{let a=k[e.toUpperCase()],{data:i,error:n}=await a(t,r);if(n)throw n;return i},...r},a)});e.s(["$api",0,j,"fetchClient",0,k],768371)},118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},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}})])},596239,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:"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 i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["LinkOutlined",0,n],596239)},624687,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let i=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)("textarea",{ref:i,"data-slot":"textarea",className:(0,a.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground 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 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...r}));i.displayName="Textarea",e.s(["Textarea",0,i])},950594,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504),i=e.i(519455),n=e.i(793479),s=e.i(624687);let o=(0,a.cva)({base:"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",variants:{align:{"inline-start":"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}}),l=(0,a.cva)({base:"flex items-center gap-2 text-sm shadow-none",variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}}),d=r.forwardRef(({className:e,type:r="button",variant:n="ghost",size:s="xs",...o},d)=>(0,t.jsx)(i.Button,{ref:d,type:r,"data-size":s,variant:n,className:(0,a.cn)(l({size:s}),e),...o}));d.displayName="InputGroupButton";let c=r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(n.Input,{ref:i,"data-slot":"input-group-control",className:(0,a.cn)("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r}));c.displayName="InputGroupInput",r.forwardRef(({className:e,...r},i)=>(0,t.jsx)(s.Textarea,{ref:i,"data-slot":"input-group-control",className:(0,a.cn)("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",e),...r})).displayName="InputGroupTextarea",e.s(["InputGroup",0,function({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"input-group",role:"group",className:(0,a.cn)("group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...r})},"InputGroupAddon",0,function({className:e,align:r="inline-start",...i}){return(0,t.jsx)("div",{role:"group","data-slot":"input-group-addon","data-align":r,className:(0,a.cn)(o({align:r}),e),onClick:e=>{e.target.closest("button")||e.currentTarget.parentElement?.querySelector("input")?.focus()},...i})},"InputGroupButton",0,d,"InputGroupInput",0,c,"InputGroupText",0,function({className:e,...r}){return(0,t.jsx)("span",{className:(0,a.cn)("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...r})}])},447566,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:"M872 474H286.9l350.2-304c5.6-4.9 2.2-14-5.2-14h-88.5c-3.9 0-7.6 1.4-10.5 3.9L155 487.8a31.96 31.96 0 000 48.3L535.1 866c1.5 1.3 3.3 2 5.2 2h91.5c7.4 0 10.8-9.2 5.2-14L286.9 550H872c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"arrow-left",theme:"outlined"};var i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["ArrowLeftOutlined",0,n],447566)},245704,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:"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 i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["CheckCircleOutlined",0,n],245704)},211576,e=>{"use strict";var t=e.i(131757);e.s(["Col",()=>t.default])},178654,e=>{"use strict";let t=e.i(211576).Col;e.s(["Col",0,t],178654)},621192,e=>{"use strict";let t=e.i(281256).Row;e.s(["Row",0,t],621192)},983561,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:"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 i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["RobotOutlined",0,n],983561)},992619,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(779241),i=e.i(599724),n=e.i(199133),s=e.i(983561),o=e.i(343488),l=e.i(695411);e.s(["default",0,({accessToken:e,value:d,placeholder:c="Select a Model",onChange:u,disabled:f=!1,style:p,className:g,showLabel:h=!0,labelText:m="Select Model"})=>{let[x,v]=(0,r.useState)(d),[b,y]=(0,r.useState)(!1),[w,k]=(0,r.useState)([]);(0,r.useEffect)(()=>{v(d)},[d]),(0,r.useEffect)(()=>{e&&(async()=>{try{let t=await (0,l.fetchAvailableModels)(e);t.length>0&&k(t)}catch(e){console.error("Error fetching model info:",e)}})()},[e]);let j=(0,o.useDebouncedCallback)(e=>{v(e),u?.(e)},{wait:500});return(0,t.jsxs)("div",{children:[h&&(0,t.jsxs)(i.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)(n.Select,{value:x,placeholder:c,onChange:e=>{"custom"===e?(y(!0),v(void 0)):(y(!1),v(e),u&&u(e))},options:[...Array.from(new Set(w.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%",...p},showSearch:!0,className:`rounded-md ${g||""}`,disabled:f}),b&&(0,t.jsx)(a.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:j,disabled:f})]})}])},981339,e=>{"use strict";var t=e.i(185793);e.s(["Skeleton",()=>t.default])},500727,e=>{"use strict";var t=e.i(266027),r=e.i(243652),a=e.i(602869),i=e.i(135214);let n=(0,r.createQueryKeys)("mcpServers");e.s(["useMCPServers",0,e=>{let{accessToken:r}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list(e?{filters:{teamId:e}}:void 0),queryFn:async()=>await (0,a.fetchMCPServers)(r,e),enabled:!!r})}])},699857,e=>{"use strict";var t=e.i(266027),r=e.i(243652),a=e.i(602869),i=e.i(135214);let n=(0,r.createQueryKeys)("mcpToolsets");e.s(["useMCPToolsets",0,()=>{let{accessToken:e}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list(),queryFn:async()=>await (0,a.fetchMCPToolsets)(e),enabled:!!e})}])},988297,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:"M12 4v16m8-8H4"}))});e.s(["PlusIcon",0,r],988297)},531516,696609,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(536916),i=e.i(599724),n=e.i(409797),s=e.i(233565);let o=/\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,d=/\b(update|edit|modify|change|patch|put|set|rename|move|transform)\b/i,c=/\b(get|read|list|fetch|search|find|query|retrieve|show|view|check|describe|info)\b/i;function u(e,t=""){let r=e.toLowerCase();if(c.test(r))return"read";if(o.test(r))return"delete";if(d.test(r))return"update";if(l.test(r))return"create";if(t){let e=t.toLowerCase();if(c.test(e))return"read";if(o.test(e))return"delete";if(d.test(e))return"update";if(l.test(e))return"create"}return"unknown"}function f(e){let t={read:[],create:[],update:[],delete:[],unknown:[]};for(let r of e)t[u(r.name,r.description)].push(r);return t}let p={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,p,"classifyToolOp",0,u,"groupToolsByCrud",0,f],696609);let g=["read","create","update","delete","unknown"],h={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"},m={read:"border-green-200",create:"border-blue-200",update:"border-yellow-200",delete:"border-red-300",unknown:"border-gray-200"},x={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:o,onChange:l,readOnly:d=!1,searchFilter:c=""})=>{let[u,v]=(0,r.useState)({read:!1,create:!1,update:!1,delete:!1,unknown:!0}),b=(0,r.useMemo)(()=>f(e),[e]),y=(0,r.useMemo)(()=>new Set(void 0===o?e.map(e=>e.name):o),[o,e]),w=e=>{if(d)return;let t=new Set(y);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:g.map(e=>{let r,o=b[e];if(0===o.length)return null;if(c){let e=c.toLowerCase();if(!o.some(t=>t.name.toLowerCase().includes(e)||(t.description??"").toLowerCase().includes(e)))return null}let f=p[e],g=(r=b[e]).length>0&&r.every(e=>y.has(e.name)),k=(e=>{let t=b[e];if(0===t.length)return!1;let r=t.filter(e=>y.has(e.name)).length;return r>0&&r{v(t=>({...t,[e]:!t[e]}))},children:[j?(0,t.jsx)(s.ChevronRightIcon,{className:"w-4 h-4 text-gray-500 shrink-0"}):(0,t.jsx)(n.ChevronDownIcon,{className:"w-4 h-4 text-gray-500 shrink-0"}),(0,t.jsx)("span",{className:"font-semibold text-gray-900 text-sm",children:f.label}),(0,t.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-full ${h[f.risk]}`,children:"high"===f.risk?"High Risk":"medium"===f.risk?"Medium Risk":"low"===f.risk?"Safe":"Unclassified"}),(0,t.jsxs)("span",{className:"text-xs text-gray-500 ml-1",children:[o.filter(e=>y.has(e.name)).length,"/",o.length," allowed"]})]}),!d&&(0,t.jsxs)("div",{className:"flex items-center gap-2 ml-4",children:[(0,t.jsx)(i.Text,{className:"text-xs text-gray-500",children:g?"All on":k?"Partial":"All off"}),(0,t.jsx)(a.Checkbox,{checked:g,indeterminate:k,onChange:t=>((e,t)=>{if(d)return;let r=new Set(y);for(let a of b[e])t?r.add(a.name):r.delete(a.name);l(Array.from(r))})(e,t.target.checked),onClick:e=>e.stopPropagation()})]})]}),!j&&(0,t.jsx)("div",{className:"px-4 pt-2 pb-1 text-xs text-gray-500 bg-white border-b border-gray-100",children:f.description}),!j&&(0,t.jsx)("div",{className:"bg-white divide-y divide-gray-50",children:o.filter(e=>!c||e.name.toLowerCase().includes(c.toLowerCase())||(e.description??"").toLowerCase().includes(c.toLowerCase())).map(e=>{let r,n=(r=e.name,y.has(r));return(0,t.jsxs)("div",{className:`flex items-start gap-3 px-4 py-2.5 transition-colors hover:bg-gray-50 ${!d?"cursor-pointer":""} ${n?"":"opacity-60"}`,onClick:()=>w(e.name),children:[(0,t.jsx)(a.Checkbox,{checked:n,onChange:()=>w(e.name),disabled:d,onClick:e=>e.stopPropagation()}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)(i.Text,{className:"font-medium text-gray-900 text-sm",children:e.name}),e.description&&(0,t.jsx)(i.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 ${n?"bg-green-100 text-green-700":"bg-gray-100 text-gray-500"}`,children:n?"on":"off"})]},e.name)})})]},e)})})}],531516)},123287,e=>{"use strict";let t=(0,e.i(475254).default)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["default",0,t])},990681,e=>{e.q("/litellm-asset-prefix/_next/static/media/postgresql.0a2k5oak2hvw5.svg")},319023,e=>{"use strict";let t=(0,e.i(475254).default)("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);e.s(["Lock",0,t],319023)},438957,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:"M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5l-41.1 41.1-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-44.9 44.9-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-65.3 65.3a8.03 8.03 0 000 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6A304.06 304.06 0 00608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644c-60.9 0-118.2-23.7-161.2-66.8-43.1-43-66.8-100.3-66.8-161.2 0-60.9 23.7-118.2 66.8-161.2 43-43.1 100.3-66.8 161.2-66.8 60.9 0 118.2 23.7 161.2 66.8 43.1 43 66.8 100.3 66.8 161.2 0 60.9-23.7 118.2-66.8 161.2z"}}]},name:"key",theme:"outlined"};var i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["KeyOutlined",0,n],438957)},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 i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["SaveOutlined",0,n],987432)},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 i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["MinusCircleOutlined",0,n],564897)},286536,e=>{"use strict";let t=(0,e.i(475254).default)("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Eye",0,t],286536)},77705,e=>{"use strict";let t=(0,e.i(475254).default)("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);e.s(["EyeOff",0,t],77705)},292335,122520,165615,779129,280024,e=>{"use strict";let t={NONE:"none",API_KEY:"api_key",BEARER_TOKEN:"bearer_token",TOKEN:"token",BASIC:"basic",OAUTH2:"oauth2",OAUTH2_TOKEN_EXCHANGE:"oauth2_token_exchange",OAUTH2_ID_JAG:"oauth2_id_jag",AWS_SIGV4:"aws_sigv4",TRUE_PASSTHROUGH:"true_passthrough",OAUTH_DELEGATE:"oauth_delegate"},r=e=>e===t.TRUE_PASSTHROUGH||e===t.OAUTH_DELEGATE,a={INTERACTIVE:"interactive",M2M:"m2m"},i=e=>{let t=e.credentials??{};return JSON.stringify({url:"string"==typeof e.url?e.url:null,spec_path:"string"==typeof e.spec_path?e.spec_path:null,auth_type:e.auth_type??null,oauth_flow_type:e.oauth_flow_type??null,client_id:t.client_id??null,client_secret:t.client_secret??null,scopes:t.scopes??null,upstream_resource:t.upstream_resource??null,issuer:e.issuer??null,authorization_url:e.authorization_url??null,token_url:e.token_url??null,registration_url:e.registration_url??null})},n=["client_id","client_secret"],s=["upstream_resource"],o=["access_token","refresh_token","expires_in","scope"],l=(e,t)=>{if(!e)return;let r=Object.fromEntries(t.filter(t=>"string"==typeof e[t]&&""!==e[t]).map(t=>[t,e[t]]));return Object.keys(r).length>0?r:void 0},d="client_credentials",c={SSE:"sse",HTTP:"http",STDIO:"stdio",OPENAPI:"openapi"};e.s(["ADMIN_CONFIG_CREDENTIAL_KEYS",0,s,"AUTH_TYPE",0,t,"CLEARED_ON_INVALIDATION",0,["credentials"],"MCP_OAUTH2_FLOW_INTERACTIVE",0,"authorization_code","MCP_OAUTH2_FLOW_M2M",0,d,"OAUTH_FLOW",0,a,"TRANSPORT",0,c,"credentialAuthClass",0,e=>e===t.TRUE_PASSTHROUGH||e===t.OAUTH_DELEGATE?"client_forwarded":e??null,"gatewayMintsClientFor",0,e=>e.auth_type===t.TRUE_PASSTHROUGH||e.auth_type===t.OAUTH_DELEGATE&&!e.dcr_bridge,"getMcpOAuthMode",0,function(e){return e.auth_type===t.OAUTH2_TOKEN_EXCHANGE?"token_exchange":e.auth_type!==t.OAUTH2?null:e.oauth2_flow===d?"m2m":e.delegate_auth_to_upstream?"passthrough":"authorization_code"},"getOAuthAuthorizationIdentity",0,i,"handleAuth",0,e=>null==e?t.NONE:e,"handleTransport",0,(e,t)=>null==e?c.SSE:t&&e!==c.STDIO?c.OPENAPI:e,"isClientForwardedTokenMode",0,r,"isHeldOAuthTokenStale",0,(e,t)=>void 0!==t&&i(e)!==t,"isUnsupportedOnGatewayConnect",0,e=>r(e)||e===t.OAUTH2_TOKEN_EXCHANGE,"oauth2FlowToFormValue",0,function(e){return e===d?a.M2M:e?a.INTERACTIVE:void 0},"preservedAdminCredentials",0,e=>l(e,[...n,...s]),"preservedDeclaredAppCredentials",0,e=>l(e,n),"withoutMintedTokenCredentials",0,e=>{if(!e)return;let t=Object.fromEntries(Object.entries(e).filter(([e])=>!o.includes(e)));return Object.keys(t).length>0?t:void 0}],292335);var u=e.i(271645),f=e.i(602869),p=e.i(727749);function g(e){if(e instanceof Error)return e.message;if(e&&"object"==typeof e){let t=e.detail;return"string"==typeof t?t:Array.isArray(t)?t.map(e=>e&&"object"==typeof e?"string"==typeof e.msg?e.msg:JSON.stringify(e):String(e)).join("; "):t&&"object"==typeof t&&"string"==typeof t.error?t.error:"string"==typeof e.message?e.message:JSON.stringify(e)}return String(e)}e.s(["extractErrorMessage",0,g],122520);let h=e=>{let t=new Uint8Array(e),r="";return t.forEach(e=>r+=String.fromCharCode(e)),btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},m=()=>{let e=new Uint8Array(32);return window.crypto.getRandomValues(e),h(e.buffer)},x=async e=>{let t=new TextEncoder().encode(e);return h(await window.crypto.subtle.digest("SHA-256",t))};e.s(["generateCodeChallenge",0,x,"generateCodeVerifier",0,m],165615);var v=e.i(434166);let b=()=>{{let e=window.location.pathname||"",t=e.indexOf("/ui"),r=t>=0?e.slice(0,t+3).replace(/\/+$/,""):"";return`${window.location.origin}${r}/mcp/oauth/callback`}},y=(...e)=>{e.forEach(e=>{try{window.sessionStorage.removeItem(e)}catch(e){}})};e.s(["TOOLS_OAUTH_UI_STATE_KEY",0,"litellm-mcp-oauth-tools-state","buildCallbackUrl",0,b,"clearStorage",0,y],779129);let w="litellm-user-mcp-oauth-flow-state",k="litellm-user-mcp-oauth-result",j=(e,t)=>{(0,v.setSecureItem)(e,t)},C=e=>(0,v.getSecureItem)(e);e.s(["useUserMcpOAuthFlow",0,({accessToken:e,serverId:t,serverAlias:r,scopes:a,clientId:i,onSuccess:n})=>{let[s,o]=(0,u.useState)("idle"),[l,d]=(0,u.useState)(null),c=(0,u.useRef)(!1),h=(0,u.useCallback)(async()=>{try{let n;o("authorizing"),d(null);let s=i??void 0;if(!s)try{let a=await (0,f.registerMcpOAuthClient)(e,t,{client_name:r||t,grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"});s=a?.client_id,n=a?.client_secret}catch(e){}let l=m(),c=await x(l),u=crypto.randomUUID(),p=b(),g=a?.filter(e=>e.trim()).join(" "),h=(0,f.buildMcpOAuthAuthorizeUrl)({serverId:t,clientId:s,redirectUri:p,state:u,codeChallenge:c,scope:g}),v={state:u,codeVerifier:l,serverId:t,redirectUri:p,clientId:s,clientSecret:n,scopes:a};j(w,JSON.stringify(v));let y=new URL(window.location.href);y.searchParams.set("mcpOauthReturn","apps"),j("litellm-mcp-oauth-return-url",y.toString()),window.location.href=h}catch(t){let e=g(t);d(e),o("error"),p.default.error(e)}},[e,t,r,a,i]),v=(0,u.useCallback)(async()=>{if(c.current)return;let r=C(k);if(!r)return;let a=C(w);if(!a)return;try{let e=JSON.parse(a);if(e.serverId&&e.serverId!==t)return}catch(e){}c.current=!0,y(k);let i=null,s=null;try{i=JSON.parse(r);let e=C(w);s=e?JSON.parse(e):null}catch(e){d("Failed to resume OAuth flow. Please retry."),o("error"),c.current=!1,y(w);return}try{if(!s?.state||!s.codeVerifier||!s.serverId)throw Error("OAuth session state was lost. Please retry.");if(!i?.state||i.state!==s.state)throw Error("OAuth state mismatch. Please retry.");if(i.error)throw Error(i.error_description||i.error);if(!i.code)throw Error("Authorization code missing in callback.");o("exchanging");let t=await (0,f.exchangeMcpOAuthToken)({serverId:s.serverId,code:i.code,clientId:s.clientId,clientSecret:s.clientSecret,codeVerifier:s.codeVerifier,redirectUri:s.redirectUri,accessToken:e});await (0,f.storeMCPOAuthUserCredential)(e,s.serverId,{access_token:t.access_token,refresh_token:t.refresh_token,expires_in:t.expires_in,scopes:s.scopes}),o("success"),d(null),p.default.success("Connected successfully"),n()}catch(t){let e=g(t);d(e),o("error"),p.default.error(e)}finally{y(w),setTimeout(()=>{c.current=!1},1e3)}},[e,t,n]);return(0,u.useEffect)(()=>{v()},[v]),{startOAuthFlow:h,status:s,error:l}}],280024)},284629,e=>{"use strict";let t={src:e.i(990681).default,width:64,height:64,blurWidth:0,blurHeight:0};e.s(["default",0,t])},849550,e=>{"use strict";let t=(0,e.i(475254).default)("dollar-sign",[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]]);e.s(["default",0,t])},221345,e=>{"use strict";let t=(0,e.i(475254).default)("link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);e.s(["Link",0,t],221345)},101048,e=>{"use strict";var t=e.i(123287);e.s(["CircleCheck",()=>t.default])},440987,e=>{"use strict";var t=e.i(903446);e.s(["SettingsIcon",()=>t.default])},251854,e=>{"use strict";let t=(0,e.i(475254).default)("save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);e.s(["default",0,t])},703330,e=>{e.q("/litellm-asset-prefix/_next/static/media/github.01qi6qit7j89y.svg")},924056,e=>{e.q("/litellm-asset-prefix/_next/static/media/slack.01ebucngfr3lq.svg")},806471,e=>{e.q("/litellm-asset-prefix/_next/static/media/notion.3ve1izxfth6xd.svg")},67456,e=>{e.q("/litellm-asset-prefix/_next/static/media/linear.0r-vgi7wxinhb.svg")},459465,e=>{e.q("/litellm-asset-prefix/_next/static/media/jira.266jkt8otu3z6.svg")},283873,e=>{e.q("/litellm-asset-prefix/_next/static/media/figma.3-gfkcs78xixl.svg")},88313,e=>{e.q("/litellm-asset-prefix/_next/static/media/gmail.2kxy7ehty9j4p.svg")},243999,e=>{e.q("/litellm-asset-prefix/_next/static/media/google_drive.0t6j-2z4psaod.svg")},798962,e=>{e.q("/litellm-asset-prefix/_next/static/media/stripe.3583qhnprkybz.svg")},762217,e=>{e.q("/litellm-asset-prefix/_next/static/media/shopify.25i2if4d3gr23.svg")},758618,e=>{e.q("/litellm-asset-prefix/_next/static/media/salesforce.20dxbd6cxoyl2.svg")},333191,e=>{e.q("/litellm-asset-prefix/_next/static/media/hubspot.21ls0k94wst4x.svg")},675865,e=>{e.q("/litellm-asset-prefix/_next/static/media/twilio.1vmsvt7mb88__.svg")},301873,e=>{e.q("/litellm-asset-prefix/_next/static/media/sentry.0i-7ujykfedjd.svg")},72982,e=>{e.q("/litellm-asset-prefix/_next/static/media/zapier.3q67ovovgk_25.svg")},521442,e=>{e.q("/litellm-asset-prefix/_next/static/media/gitlab.2a2utw-6akshk.svg")},756788,e=>{e.q("/litellm-asset-prefix/_next/static/media/mcp_logo.008pk5gd77gim.png")},362024,e=>{"use strict";var t=e.i(988122);e.s(["Collapse",()=>t.default])},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},266537,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:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};var i=e.i(9583),n=r.forwardRef(function(e,n){return r.createElement(i.default,(0,t.default)({},e,{ref:n,icon:a}))});e.s(["ArrowRightOutlined",0,n],266537)},988846,181692,438100,e=>{"use strict";var t=e.i(54943);e.s(["SearchIcon",()=>t.default],988846);let r=(0,e.i(475254).default)("key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);e.s(["default",0,r],181692),e.s(["KeyIcon",0,r],438100)},302202,e=>{"use strict";var t=e.i(953651);e.s(["ServerIcon",()=>t.default])},750113,e=>{"use strict";var t=e.i(684024);e.s(["QuestionCircleOutlined",()=>t.default])},328196,e=>{"use strict";var t=e.i(361653);e.s(["AlertCircleIcon",()=>t.default])},758472,634831,e=>{"use strict";let t=(0,e.i(475254).default)("code",[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]);e.s(["Code",0,t],758472);var r=e.i(546467);e.s(["ExternalLinkIcon",()=>r.default],634831)},611052,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(212931),i=e.i(311451),n=e.i(790848),s=e.i(888259),o=e.i(768371),l=e.i(431703),d=e.i(438957);e.i(247167);var c=e.i(931067);let u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"lock",theme:"outlined"};var f=e.i(9583),p=r.forwardRef(function(e,t){return r.createElement(f.default,(0,c.default)({},e,{ref:t,icon:u}))}),g=e.i(492030),h=e.i(266537),m=e.i(447566),x=e.i(149192),v=e.i(596239);e.s(["ByokCredentialModal",0,({server:e,open:c,onClose:u,onSuccess:f})=>{let[b,y]=(0,r.useState)(1),[w,k]=(0,r.useState)(""),[j,C]=(0,r.useState)(!0),[_,R]=(0,r.useState)(!1),E=e.alias||e.server_name||"Service",N=E.charAt(0).toUpperCase(),T=()=>{y(1),k(""),C(!0),R(!1),u()},A=async()=>{if(!w.trim())return void s.default.error("Please enter your API key");R(!0);try{await o.fetchClient.POST("/v1/mcp/server/{server_id}/user-credential",{params:{path:{server_id:e.server_id}},body:{credential:w.trim(),save:j}}),s.default.success(`Connected to ${E}`),f(e.server_id),T()}catch(e){s.default.error((e=>{if(e instanceof l.ApiError){let t=e.body?.detail?.error;if(t)return t}return e instanceof Error&&e.message?e.message:"Failed to connect"})(e))}finally{R(!1)}};return(0,t.jsx)(a.Modal,{open:c,onCancel:T,footer:null,width:480,closeIcon:null,className:"byok-modal",children:(0,t.jsxs)("div",{className:"relative p-2",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-6",children:[2===b?(0,t.jsxs)("button",{onClick:()=>y(1),className:"flex items-center gap-1 text-gray-500 hover:text-gray-800 text-sm",children:[(0,t.jsx)(m.ArrowLeftOutlined,{})," Back"]}):(0,t.jsx)("div",{}),(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("div",{className:`w-2 h-2 rounded-full ${1===b?"bg-blue-500":"bg-gray-300"}`}),(0,t.jsx)("div",{className:`w-2 h-2 rounded-full ${2===b?"bg-blue-500":"bg-gray-300"}`})]}),(0,t.jsx)("button",{onClick:T,className:"text-gray-400 hover:text-gray-600",children:(0,t.jsx)(x.CloseOutlined,{})})]}),1===b?(0,t.jsxs)("div",{className:"text-center",children:[(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 mb-6",children:[(0,t.jsx)("div",{className:"w-14 h-14 rounded-xl bg-linear-to-br from-teal-400 to-cyan-600 flex items-center justify-center text-white font-bold text-xl shadow-sm",children:"L"}),(0,t.jsx)(h.ArrowRightOutlined,{className:"text-gray-400 text-lg"}),(0,t.jsx)("div",{className:"w-14 h-14 rounded-xl bg-linear-to-br from-blue-600 to-indigo-800 flex items-center justify-center text-white font-bold text-xl shadow-sm",children:N})]}),(0,t.jsxs)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:["Connect ",E]}),(0,t.jsxs)("p",{className:"text-gray-500 mb-6",children:["LiteLLM needs access to ",E," to complete your request."]}),(0,t.jsx)("div",{className:"bg-gray-50 rounded-xl p-4 text-left mb-4",children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("div",{className:"mt-0.5",children:(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",className:"text-gray-500",children:[(0,t.jsx)("rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",stroke:"currentColor",strokeWidth:"2"}),(0,t.jsx)("path",{d:"M8 4v16M16 4v16",stroke:"currentColor",strokeWidth:"2"})]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-semibold text-gray-800 mb-1",children:"How it works"}),(0,t.jsxs)("p",{className:"text-gray-500 text-sm",children:["LiteLLM acts as a secure bridge. Your requests are routed through our MCP client directly to"," ",E,"'s API."]})]})]})}),e.byok_description&&e.byok_description.length>0&&(0,t.jsxs)("div",{className:"bg-gray-50 rounded-xl p-4 text-left mb-6",children:[(0,t.jsxs)("p",{className:"text-xs font-semibold text-gray-500 uppercase tracking-widest mb-3 flex items-center gap-2",children:[(0,t.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",className:"text-green-500",children:[(0,t.jsx)("path",{d:"M12 2L12 22M2 12L22 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,t.jsx)("circle",{cx:"12",cy:"12",r:"9",stroke:"currentColor",strokeWidth:"2"})]}),"Requested Access"]}),(0,t.jsx)("ul",{className:"space-y-2",children:e.byok_description.map((e,r)=>(0,t.jsxs)("li",{className:"flex items-center gap-2 text-sm text-gray-700",children:[(0,t.jsx)(g.CheckOutlined,{className:"text-green-500 shrink-0"}),e]},r))})]}),(0,t.jsxs)("button",{onClick:()=>y(2),className:"w-full bg-gray-900 hover:bg-gray-700 text-white font-medium py-3 px-6 rounded-xl flex items-center justify-center gap-2 transition-colors",children:["Continue to Authentication ",(0,t.jsx)(h.ArrowRightOutlined,{})]}),(0,t.jsx)("button",{onClick:T,className:"mt-3 w-full text-gray-400 hover:text-gray-600 text-sm py-2",children:"Cancel"})]}):(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"w-12 h-12 rounded-full bg-blue-50 flex items-center justify-center mb-4",children:(0,t.jsx)(d.KeyOutlined,{className:"text-blue-400 text-xl"})}),(0,t.jsx)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Provide API Key"}),(0,t.jsxs)("p",{className:"text-gray-500 mb-6",children:["Enter your ",E," API key to authorize this connection."]}),(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsxs)("label",{className:"block text-sm font-semibold text-gray-800 mb-2",children:[E," API Key"]}),(0,t.jsx)(i.Input.Password,{placeholder:"Enter your API key",value:w,onChange:e=>k(e.target.value),size:"large",className:"rounded-lg"}),e.byok_api_key_help_url&&(0,t.jsxs)("a",{href:e.byok_api_key_help_url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700 text-sm mt-2 flex items-center gap-1",children:["Where do I find my API key? ",(0,t.jsx)(v.LinkOutlined,{})]})]}),(0,t.jsxs)("div",{className:"bg-gray-50 rounded-xl p-4 flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",className:"text-gray-500",children:(0,t.jsx)("path",{d:"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z",fill:"currentColor"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-800",children:"Save key for future use"})]}),(0,t.jsx)(n.Switch,{checked:j,onChange:C})]}),(0,t.jsxs)("div",{className:"bg-blue-50 rounded-xl p-4 flex items-start gap-3 mb-6",children:[(0,t.jsx)(p,{className:"text-blue-400 mt-0.5 shrink-0"}),(0,t.jsx)("p",{className:"text-sm text-blue-700",children:"Your key is stored securely and transmitted over HTTPS. It is never shared with third parties."})]}),(0,t.jsxs)("button",{onClick:A,disabled:_,className:"w-full bg-blue-500 hover:bg-blue-600 disabled:opacity-60 text-white font-medium py-3 px-6 rounded-xl flex items-center justify-center gap-2 transition-colors",children:[(0,t.jsx)(p,{}),"Connect & Authorize"]})]})]})})}],611052)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0qf84m09hg_q8.js b/litellm/proxy/_experimental/out/_next/static/chunks/0qf84m09hg_q8.js deleted file mode 100644 index 48ebb4791d2..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0qf84m09hg_q8.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,463059,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],246349),e.s(["ChevronRight",0,t],463059)},555436,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],54943),e.s(["Search",0,t],555436)},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)},550896,e=>{"use strict";var t=e.i(201675);e.s(["SCROLL_EDGE_TOLERANCE_PX",0,1,"getMaxScrollOffset",0,function(e,t){return Math.max(0,e-t)},"normalizeScrollOffset",0,function(e,o){if(o<=0)return 0;let a=(0,t.clamp)(e,0,o),n=o-a,r=a<=1,i=n<=1;return r&&i?a<=n?0:o:r?0:i?o:a}])},60837,e=>{"use strict";var t=e.i(843476);let o="base-ui-disable-scrollbar";e.s(["styleDisableScrollbar",0,{className:o,getElement:e=>(0,t.jsx)("style",{nonce:e,href:o,precedence:"base-ui:low",children:`.${o}{scrollbar-width:none}.${o}::-webkit-scrollbar{display:none}`})}])},652225,e=>{"use strict";var t=e.i(271645),o=e.i(552245);let a=t.forwardRef(function(e,t){let{className:a,render:n,orientation:r="horizontal",style:i,...s}=e;return(0,o.useRenderElement)("div",e,{state:{orientation:r},ref:t,props:[{role:"separator","aria-orientation":r},s]})});e.s(["Separator",0,a])},469690,875812,381104,e=>{"use strict";e.i(247167);var t,o=e.i(733332),a=e.i(271645),n=e.i(956789);let r=((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),i={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},s={valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},l={disabled:!1,...s};e.s(["DEFAULT_FIELD_ROOT_STATE",0,l,"DEFAULT_FIELD_STATE_ATTRIBUTES",0,s,"DEFAULT_VALIDITY_STATE",0,i,"fieldValidityMapping",0,{valid:e=>null===e?null:e?{[r.valid]:""}:{[r.invalid]:""}}],875812);let u={invalid:void 0,name:void 0,validityData:{state:i,errors:[],error:"",value:"",initialValue:null},setValidityData:n.NOOP,disabled:void 0,touched:s.touched,setTouched:n.NOOP,dirty:s.dirty,setDirty:n.NOOP,filled:s.filled,setFilled:n.NOOP,focused:s.focused,setFocused:n.NOOP,validate:()=>null,validationMode:"onSubmit",validationDebounceTime:0,shouldValidateOnChange:()=>!1,state:l,markedDirtyRef:{current:!1},registerFieldControl:n.NOOP,validation:{getValidationProps:(e,t=n.EMPTY_OBJECT)=>t,inputRef:{current:null},registerInput:n.NOOP,commit:async()=>{},change:n.NOOP}},d=a.createContext(u);function c(e=!0){let t=a.useContext(d);if(t.setValidityData===n.NOOP&&!e)throw Error((0,o.default)(28));return t}e.s(["DEFAULT_FIELD_ROOT_CONTEXT",0,u,"FieldRootContext",0,d,"useFieldRootContext",0,c],469690);var p=e.i(146376);e.s(["useRegisterFieldControl",0,function(e,t,o,n,r=!0,i){let{registerFieldControl:s}=c(),l=a.useRef(null);l.current||(l.current=Symbol()),(0,p.useIsoLayoutEffect)(()=>{let a=l.current;if(a&&r)return s(a,{controlRef:e,getValue:n,id:t,name:i,value:o}),()=>{s(a,void 0)}},[e,r,n,t,i,s,o])}],381104)},538489,247778,e=>{"use strict";var t=e.i(271645),o=e.i(146376),a=e.i(667865),n=e.i(921374),r=e.i(229315),i=e.i(956789),s=e.i(788015);e.i(247167);let l=t.createContext({controlId:void 0,registerControlId:i.NOOP,labelId:void 0,setLabelId:i.NOOP,messageIds:[],setMessageIds:i.NOOP,getDescriptionProps:e=>e});function u(){return t.useContext(l)}e.s(["useLabelableContext",0,u],247778),e.s(["useLabelableId",0,function(e={}){let{id:l,implicit:d=!1,controlRef:c}=e,{controlId:p,registerControlId:f}=u(),g=(0,s.useBaseUiId)(l),m=d?p:void 0,v=(0,n.useRefWithInit)(()=>Symbol("labelable-control")),b=t.useRef(!1),S=t.useRef(null!=l),h=(0,a.useStableCallback)(()=>{b.current&&f!==i.NOOP&&(b.current=!1,f(v.current,void 0))});return(0,o.useIsoLayoutEffect)(()=>{let e;if(f!==i.NOOP){if(d){let t=c?.current;e=(0,r.isElement)(t)&&null!=t.closest("label")?l??null:m??g}else if(null!=l)S.current=!0,e=l;else{if(!S.current)return void h();e=g}if(void 0===e)return void h();b.current=!0,f(v.current,e)}},[l,c,m,f,d,g,v,h]),t.useEffect(()=>h,[h]),p??g}],538489)},884708,e=>{"use strict";var t=e.i(271645),o=e.i(956789);let a=t.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:o.NOOP,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});e.s(["useFormContext",0,function(){return t.useContext(a)}])},33383,e=>{"use strict";var t=e.i(271645),o=e.i(108868),a=e.i(145484),n=e.i(146376);e.s(["useAnchoredPopupScrollLock",0,function(e,r,i,s){let[l,u]=t.useState(!1);(0,n.useIsoLayoutEffect)(()=>{if(!e||!r||null==i)return void u(!1);let t=(0,o.ownerDocument)(i).documentElement.clientWidth,a=i.offsetWidth;u(t>0&&a>0&&a>=t-20)},[e,r,i]),(0,a.useScrollLock)(e&&(!r||l),s)}])},96533,e=>{"use strict";var t=e.i(733332),o=e.i(271645);let a=o.createContext(void 0);e.s(["useToolbarRootContext",0,function(e){let n=o.useContext(a);if(void 0===n&&!e)throw Error((0,t.default)(69));return n}])},643531,e=>{"use strict";var t=e.i(678745);e.s(["Check",()=>t.default])},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])},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])},664659,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDown",()=>t.default])},31421,e=>{"use strict";var t=e.i(271645),o=e.i(146376),a=e.i(788015);e.s(["useAriaLabelledBy",0,function(e,n,r,i=!0,s){let[l,u]=t.useState(),d=(0,a.useBaseUiId)(s?`${s}-label`:void 0),c=e??n??l;return(0,o.useIsoLayoutEffect)(()=>{let t=e||n||!i?void 0:function(e,t){let o=function(e){if(!e)return;let t=e.parentElement;if(t&&"LABEL"===t.tagName)return t;let o=e.id;if(o){let t=e.nextElementSibling;if(t&&t.htmlFor===o)return t}let a=e.labels;return a&&a[0]}(e);if(o)return!o.id&&t&&(o.id=t),o.id||void 0}(r.current,d);l!==t&&u(t)}),c}])},346570,e=>{"use strict";var t=e.i(271645),o=e.i(174080),a=e.i(647554),n=e.i(383976),r=e.i(675606),i=e.i(56434);e.s(["useTriggerFocusGuards",0,function(e,s){let l=t.useRef(null);return{preFocusGuardRef:l,handlePreFocusGuardFocus:function(t){o.flushSync(()=>{e.setOpen(!1,(0,r.createChangeEventDetails)(i.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let a=(0,n.getTabbableBeforeElement)(l.current);a?.focus()},handleFocusTargetFocus:function(t){let l=e.select("positionerElement");if(l&&(0,n.isOutsideEvent)(t,l))e.context.beforeContentFocusGuardRef.current?.focus();else{o.flushSync(()=>{e.setOpen(!1,(0,r.createChangeEventDetails)(i.REASONS.focusOut,t.nativeEvent,t.currentTarget))});let u=(0,n.getTabbableAfterElement)(e.context.triggerFocusTargetRef.current||s.current);for(;null!==u&&(0,a.contains)(l,u);){let e=u;if((u=(0,n.getNextTabbable)(u))===e)break}u?.focus()}}}}])},784774,e=>{"use strict";var t=e.i(843476),o=e.i(271645),a=e.i(115504);let n=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{ref:n,"data-slot":"table",className:(0,a.cn)("w-full caption-bottom text-sm",e),...o})}));n.displayName="Table";let r=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("thead",{ref:n,"data-slot":"table-header",className:(0,a.cn)("[&_tr]:border-b",e),...o}));r.displayName="TableHeader";let i=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("tbody",{ref:n,"data-slot":"table-body",className:(0,a.cn)("[&_tr:last-child]:border-0",e),...o}));i.displayName="TableBody";let s=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("tfoot",{ref:n,"data-slot":"table-footer",className:(0,a.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},n)=>(0,t.jsx)("tr",{ref:n,"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),...o}));l.displayName="TableRow";let u=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("th",{ref:n,"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),...o}));u.displayName="TableHead";let d=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("td",{ref:n,"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),...o}));d.displayName="TableCell",o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("caption",{ref:n,"data-slot":"table-caption",className:(0,a.cn)("mt-4 text-sm text-muted-foreground",e),...o})).displayName="TableCaption",e.s(["Table",0,n,"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),a=e.i(115504);let n=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("div",{ref:n,"data-slot":"skeleton",className:(0,a.cn)("animate-pulse rounded-md bg-accent",e),...o}));n.displayName="Skeleton",e.s(["Skeleton",0,n])},108821,e=>{"use strict";var t=e.i(733332),o=e.i(271645);let a=o.createContext(!1),n=o.createContext(void 0);e.s(["DialogRootContext",0,n,"IsDrawerContext",0,a,"useDialogRootContext",0,function(e){let a=o.useContext(n);if(!1===e&&void 0===a)throw Error((0,t.default)(27));return a}])},402820,156736,209793,625834,784324,264951,e=>{"use strict";e.i(247167);var t,o,a=e.i(271645),n=e.i(108821),r=e.i(552245),i=e.i(405005),s=e.i(209407);let l={...i.popupStateMapping,...s.transitionStatusMapping},u=a.forwardRef(function(e,t){let{render:o,className:a,style:i,forceRender:s=!1,...u}=e,{store:d}=(0,n.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=a.forwardRef(function(e,t){let{render:o,className:a,style:i,disabled:s=!1,nativeButton:l=!0,...u}=e,{store:f}=(0,n.useDialogRootContext)(),g=f.useState("open"),{getButtonProps:m,buttonRef:v}=(0,d.useButton)({disabled:s,native:l});return(0,r.useRenderElement)("button",e,{state:{disabled:s},ref:[t,v],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=a.forwardRef(function(e,t){let{render:o,className:a,style:i,id:s,...l}=e,{store:u}=(0,n.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 v=e.i(61487);let b=((t={}).nestedDialogs="--nested-dialogs",t),S=((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 h=e.i(733332);let C=a.createContext(void 0);function D(){let e=a.useContext(C);if(void 0===e)throw Error((0,h.default)(26));return e}e.s(["DialogPortalContext",0,C,"useDialogPortalContext",0,D],625834);var R=e.i(137584),x=e.i(673327),O=e.i(264111),E=e.i(843476);let y={...i.popupStateMapping,...s.transitionStatusMapping,nestedDialogOpen:e=>e?{[S.nestedDialogOpen]:""}:null},P=a.forwardRef(function(e,t){let{render:o,className:a,style:i,finalFocus:s,initialFocus:l,...u}=e,{store:d}=(0,n.useDialogRootContext)(),c=d.useState("descriptionElementId"),p=d.useState("disablePointerDismissal"),f=d.useState("floatingRootContext"),g=d.useState("popupProps"),m=d.useState("modal"),S=d.useState("mounted"),h=d.useState("nested"),C=d.useState("nestedOpenDialogCount"),P=d.useState("open"),T=d.useState("openMethod"),w=d.useState("titleElementId"),I=d.useState("transitionStatus"),N=d.useState("role"),k=f.useState("floatingId"),A=u.id??k;D(),(0,R.useOpenChangeComplete)({open:P,ref:d.context.popupRef,onComplete(){P&&d.context.onOpenChangeComplete?.(!0)}});let M=void 0===l?(0,O.createDefaultInitialFocus)(d.context.popupRef):l,F=d.useStateSetter("popupElement"),B=(0,r.useRenderElement)("div",e,{state:{open:P,nested:h,transitionStatus:I,nestedDialogOpen:C>0},props:[g,{id:A,"aria-labelledby":w??void 0,"aria-describedby":c??void 0,role:N,...O.FOCUSABLE_POPUP_PROPS,hidden:!S,onKeyDown(e){x.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[b.nestedDialogs]:C}},u],ref:[t,d.context.popupRef,F],stateAttributesMapping:y});return(0,E.jsx)(v.FloatingFocusManager,{context:f,openInteractionType:T,disabled:!S,closeOnFocusOut:!p,initialFocus:M,returnFocus:s,modal:!1!==m,restoreFocus:"popup",children:B})});e.s(["DialogPopup",0,P],784324);var T=e.i(144394),w=e.i(726674),I=e.i(426);let N=a.forwardRef(function(e,t){let{keepMounted:o=!1,...a}=e,{store:r}=(0,n.useDialogRootContext)(),i=r.useState("mounted"),s=r.useState("modal"),l=r.useState("open");return i||o?(0,E.jsx)(C.Provider,{value:o,children:(0,E.jsxs)(w.FloatingPortal,{ref:t,...a,children:[i&&!0===s&&(0,E.jsx)(I.InternalBackdrop,{ref:r.context.internalBackdropRef,inert:(0,T.inertValue)(!l)}),e.children]})}):null});e.s(["DialogPortal",0,N],264951)},67530,e=>{"use strict";var t=e.i(271645),o=e.i(145484),a=e.i(956789),n=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),[v,b]=t.useState(0),S=0===g,h=(0,n.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!!S&&!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:S});(0,o.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{m(e),b(t)}),e.useContextCallback("onNestedDialogClose",()=>{m(0),b(0)}),t.useEffect(()=>(i?.onNestedDialogOpen&&u&&i.onNestedDialogOpen(g+1,v+ +!!s),i?.onNestedDialogClose&&!u&&i.onNestedDialogClose(),()=>{i?.onNestedDialogClose&&u&&i.onNestedDialogClose()}),[s,u,g,v,i]);let C=h.reference??a.EMPTY_OBJECT,D=h.trigger??a.EMPTY_OBJECT,R=h.floating??a.EMPTY_OBJECT;return(0,l.usePopupInteractionProps)(e,{activeTriggerProps:C,inactiveTriggerProps:D,popupProps:R,nestedOpenDialogCount:g,nestedOpenDrawerCount:v}),null},"useDialogRoot",0,function(e){let{store:o,actionsRef:a}=e,n=o.useState("open");(0,l.usePopupRootSync)(o,n),(0,l.useImplicitActiveTrigger)(o);let{forceUnmount:r}=(0,l.useOpenStateTransitions)(n,o),u=t.useCallback(()=>{o.setOpen(!1,(0,i.createChangeEventDetails)(s.REASONS.imperativeAction))},[o]);t.useImperativeHandle(a,()=>({unmount:r,close:u}),[r,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),o=e.i(713203),a=e.i(67530),n=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,a=!1){const n=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)(n,o,a),super(r,{popupRef:t.createRef(),backdropRef:t.createRef(),internalBackdropRef:t.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:n,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:v,triggerId:b,defaultTriggerId:S=null}=e,h="alert-dialog"===r,C=(0,n.useDialogRootContext)(!0),D={modal:!!h||g,disablePointerDismissal:h||f,nested:!!C,role:h?"alertdialog":"dialog"},R=c.useStore(v?.store,{open:l,openProp:s,activeTriggerId:S,triggerIdProp:b,...D});(0,o.useOnFirstRender)(()=>{let e=void 0===s&&!1===R.state.open&&!0===l?{open:!0,activeTriggerId:S}:null;h?R.update(e?{...D,...e}:D):e&&R.update(e)}),R.useControlledProp("openProp",s),R.useControlledProp("triggerIdProp",b),R.useSyncedValues(D),R.useContextCallback("onOpenChange",u),R.useContextCallback("onOpenChangeComplete",d);let x=R.useState("open"),O=R.useState("mounted"),E=R.useState("payload");(0,a.useDialogRoot)({store:R,actionsRef:m});let y=t.useMemo(()=>({store:R}),[R]);return(0,p.jsx)(n.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(n.DialogRootContext.Provider,{value:y,children:[(x||O)&&(0,p.jsx)(a.DialogInteractions,{store:R,parentContext:C?.store.context,isDrawer:"drawer"===r}),"function"==typeof i?i({payload:E}):i]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,o=e.i(271645),a=e.i(552245),n=e.i(405005),r=e.i(209407),i=e.i(108821),s=e.i(625834);let l=((t={})[t.open=n.CommonPopupDataAttributes.open]="open",t[t.closed=n.CommonPopupDataAttributes.closed]="closed",t[t.startingStyle=n.CommonPopupDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=n.CommonPopupDataAttributes.endingStyle]="endingStyle",t.nested="data-nested",t.nestedDialogOpen="data-nested-dialog-open",t),u={...n.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:n,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"),v=p.useState("nestedOpenDialogCount"),b=p.useState("mounted"),S=p.useStateSetter("viewportElement");return(0,a.useRenderElement)("div",e,{enabled:c||b,state:{open:f,nested:g,transitionStatus:m,nestedDialogOpen:v>0},ref:[t,S],stateAttributesMapping:u,props:[{role:"presentation",hidden:!b,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),a=e.i(552245),n=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,n.useBaseUiId)(l);return d.useSyncedValueWithCleanup("titleElementId",c),(0,a.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:v=!1,nativeButton:b=!0,id:S,payload:h,handle:C,...D}=e,R=(0,o.useDialogRootContext)(!0),x=C?.store??R?.store;if(!x)throw Error((0,i.default)(79));let O=(0,n.useBaseUiId)(S),E=x.useState("floatingRootContext"),y=x.useState("isOpenedByTrigger",O),P=x.useState("triggerPopupId",O),T=t.useRef(null),{registerTrigger:w,isMountedByThisTrigger:I}=(0,d.useTriggerDataForwarding)(O,T,x,{payload:h}),{getButtonProps:N,buttonRef:k}=(0,s.useButton)({disabled:v,native:b}),A=(0,c.useClick)(E,{enabled:null!=E}),M=(0,p.useOpenMethodTriggerProps)(()=>x.select("open"),e=>{x.set("openMethod",e)}),F=x.useState("triggerProps",I);return(0,a.useRenderElement)("button",e,{state:{disabled:v,open:y},ref:[k,r,w,T],props:[A.reference,F,M,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:O,"aria-haspopup":"dialog","aria-expanded":y,"aria-controls":P},D,N],stateAttributesMapping:l.triggerOpenStateMapping})});e.s(["DialogTrigger",0,f],313488)},325326,e=>{"use strict";var t=e.i(301807),o=e.i(675606),a=e.i(56434);class n{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)(a.REASONS.imperativeAction,void 0,t))}openWithPayload(e){this.store.set("payload",e),this.store.setOpen(!0,(0,o.createChangeEventDetails)(a.REASONS.imperativeAction,void 0,void 0))}close(){this.store.setOpen(!1,(0,o.createChangeEventDetails)(a.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["DialogHandle",0,n,"createDialogHandle",0,function(){return new n}])},353753,e=>{"use strict";e.s([],914651),e.i(914651);var t=e.i(402820),o=e.i(156736),a=e.i(209793),n=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",()=>a.DialogDescription,"Handle",()=>p.DialogHandle,"Popup",()=>n.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)},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)},110204,e=>{"use strict";var t=e.i(843476),o=e.i(271645),a=e.i(115504);let n=o.forwardRef(({className:e,...o},n)=>(0,t.jsx)("label",{ref:n,"data-slot":"label",className:(0,a.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}));n.displayName="Label",e.s(["Label",0,n])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0qkqkii3nce2s.js b/litellm/proxy/_experimental/out/_next/static/chunks/0qkqkii3nce2s.js deleted file mode 100644 index 3b450b7c99e..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0qkqkii3nce2s.js +++ /dev/null @@ -1,427 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),o=e.i(242064),i=e.i(529681);let a=e=>{let{prefixCls:o,className:i,style:a,size:n,shape:s}=e,l=(0,r.default)({[`${o}-lg`]:"large"===n,[`${o}-sm`]:"small"===n}),c=(0,r.default)({[`${o}-circle`]:"circle"===s,[`${o}-square`]:"square"===s,[`${o}-round`]:"round"===s}),d=t.useMemo(()=>"number"==typeof n?{width:n,height:n,lineHeight:`${n}px`}:{},[n]);return t.createElement("span",{className:(0,r.default)(o,l,c,i),style:Object.assign(Object.assign({},d),a)})};e.i(296059);var n=e.i(694758),s=e.i(915654),l=e.i(246422),c=e.i(838378);let d=new n.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),u=e=>({height:e,lineHeight:(0,s.unit)(e)}),p=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)),h=e=>Object.assign({width:e},u(e)),f=(e,t,r)=>{let{skeletonButtonCls:o}=e;return{[`${r}${o}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${r}${o}-round`]:{borderRadius:t}}},g=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},u(e)),b=(0,l.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:r}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:r,skeletonTitleCls:o,skeletonParagraphCls:i,skeletonButtonCls:a,skeletonInputCls:n,skeletonImageCls:s,controlHeight:l,controlHeightLG:c,controlHeightSM:u,gradientFromColor:b,padding:v,marginSM:x,borderRadius:y,titleHeight:_,blockRadius:k,paragraphLiHeight:w,controlHeightXS:j,paragraphMarginTop:S}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:v,verticalAlign:"top",[r]:Object.assign({display:"inline-block",verticalAlign:"top",background:b},p(l)),[`${r}-circle`]:{borderRadius:"50%"},[`${r}-lg`]:Object.assign({},p(c)),[`${r}-sm`]:Object.assign({},p(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[o]:{width:"100%",height:_,background:b,borderRadius:k,[`+ ${i}`]:{marginBlockStart:u}},[i]:{padding:0,"> li":{width:"100%",height:w,listStyle:"none",background:b,borderRadius:k,"+ li":{marginBlockStart:j}}},[`${i}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${o}, ${i} > li`]:{borderRadius:y}}},[`${t}-with-avatar ${t}-content`]:{[o]:{marginBlockStart:x,[`+ ${i}`]:{marginBlockStart:S}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:r,controlHeight:o,controlHeightLG:i,controlHeightSM:a,gradientFromColor:n,calc:s}=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:s(o).mul(2).equal(),minWidth:s(o).mul(2).equal()},g(o,s))},f(e,o,r)),{[`${r}-lg`]:Object.assign({},g(i,s))}),f(e,i,`${r}-lg`)),{[`${r}-sm`]:Object.assign({},g(a,s))}),f(e,a,`${r}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:r,controlHeight:o,controlHeightLG:i,controlHeightSM:a}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:r},p(o)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},p(i)),[`${t}${t}-sm`]:Object.assign({},p(a))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:r,skeletonInputCls:o,controlHeightLG:i,controlHeightSM:a,gradientFromColor:n,calc:s}=e;return{[o]:Object.assign({display:"inline-block",verticalAlign:"top",background:n,borderRadius:r},m(t,s)),[`${o}-lg`]:Object.assign({},m(i,s)),[`${o}-sm`]:Object.assign({},m(a,s))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:r,gradientFromColor:o,borderRadiusSM:i,calc:a}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:o,borderRadius:i},h(a(r).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},h(r)),{maxWidth:a(r).mul(4).equal(),maxHeight:a(r).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[a]:{width:"100%"},[n]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${o}, - ${i} > li, - ${r}, - ${a}, - ${n}, - ${s} - `]: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"]]}),v=e=>{let{prefixCls:o,className:i,style:a,rows:n=0}=e,s=Array.from({length:n}).map((r,o)=>t.createElement("li",{key:o,style:{width:((e,t)=>{let{width:r,rows:o=2}=t;return Array.isArray(r)?r[e]:o-1===e?r:void 0})(o,e)}}));return t.createElement("ul",{className:(0,r.default)(o,i),style:a},s)},x=({prefixCls:e,className:o,width:i,style:a})=>t.createElement("h3",{className:(0,r.default)(e,o),style:Object.assign({width:i},a)});function y(e){return e&&"object"==typeof e?e:{}}let _=e=>{let{prefixCls:i,loading:n,className:s,rootClassName:l,style:c,children:d,avatar:u=!1,title:p=!0,paragraph:m=!0,active:h,round:f}=e,{getPrefixCls:g,direction:_,className:k,style:w}=(0,o.useComponentConfig)("skeleton"),j=g("skeleton",i),[S,C,z]=b(j);if(n||!("loading"in e)){let e,o,i=!!u,n=!!p,d=!!m;if(i){let r=Object.assign(Object.assign({prefixCls:`${j}-avatar`},n&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),y(u));e=t.createElement("div",{className:`${j}-header`},t.createElement(a,Object.assign({},r)))}if(n||d){let e,r;if(n){let r=Object.assign(Object.assign({prefixCls:`${j}-title`},!i&&d?{width:"38%"}:i&&d?{width:"50%"}:{}),y(p));e=t.createElement(x,Object.assign({},r))}if(d){let e,o=Object.assign(Object.assign({prefixCls:`${j}-paragraph`},(e={},i&&n||(e.width="61%"),!i&&n?e.rows=3:e.rows=2,e)),y(m));r=t.createElement(v,Object.assign({},o))}o=t.createElement("div",{className:`${j}-content`},e,r)}let g=(0,r.default)(j,{[`${j}-with-avatar`]:i,[`${j}-active`]:h,[`${j}-rtl`]:"rtl"===_,[`${j}-round`]:f},k,s,l,C,z);return S(t.createElement("div",{className:g,style:Object.assign(Object.assign({},w),c)},e,o))}return null!=d?d:null};_.Button=e=>{let{prefixCls:n,className:s,rootClassName:l,active:c,block:d=!1,size:u="default"}=e,{getPrefixCls:p}=t.useContext(o.ConfigContext),m=p("skeleton",n),[h,f,g]=b(m),v=(0,i.default)(e,["prefixCls"]),x=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:c,[`${m}-block`]:d},s,l,f,g);return h(t.createElement("div",{className:x},t.createElement(a,Object.assign({prefixCls:`${m}-button`,size:u},v))))},_.Avatar=e=>{let{prefixCls:n,className:s,rootClassName:l,active:c,shape:d="circle",size:u="default"}=e,{getPrefixCls:p}=t.useContext(o.ConfigContext),m=p("skeleton",n),[h,f,g]=b(m),v=(0,i.default)(e,["prefixCls","className"]),x=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:c},s,l,f,g);return h(t.createElement("div",{className:x},t.createElement(a,Object.assign({prefixCls:`${m}-avatar`,shape:d,size:u},v))))},_.Input=e=>{let{prefixCls:n,className:s,rootClassName:l,active:c,block:d,size:u="default"}=e,{getPrefixCls:p}=t.useContext(o.ConfigContext),m=p("skeleton",n),[h,f,g]=b(m),v=(0,i.default)(e,["prefixCls"]),x=(0,r.default)(m,`${m}-element`,{[`${m}-active`]:c,[`${m}-block`]:d},s,l,f,g);return h(t.createElement("div",{className:x},t.createElement(a,Object.assign({prefixCls:`${m}-input`,size:u},v))))},_.Image=e=>{let{prefixCls:i,className:a,rootClassName:n,style:s,active:l}=e,{getPrefixCls:c}=t.useContext(o.ConfigContext),d=c("skeleton",i),[u,p,m]=b(d),h=(0,r.default)(d,`${d}-element`,{[`${d}-active`]:l},a,n,p,m);return u(t.createElement("div",{className:h},t.createElement("div",{className:(0,r.default)(`${d}-image`,a),style:s},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`})))))},_.Node=e=>{let{prefixCls:i,className:a,rootClassName:n,style:s,active:l,children:c}=e,{getPrefixCls:d}=t.useContext(o.ConfigContext),u=d("skeleton",i),[p,m,h]=b(u),f=(0,r.default)(u,`${u}-element`,{[`${u}-active`]:l},m,a,n,h);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,r.default)(`${u}-image`,a),style:s},c)))},e.s(["default",0,_],185793)},922611,e=>{"use strict";var t=e.i(271645),r=e.i(175066);function o(){}let i=t.createContext({add:o,remove:o});e.s(["usePanelRef",0,function(e){let o=t.useContext(i),a=t.useRef(null);return(0,r.default)(t=>{if(t){let r=e?t.querySelector(e):t;r&&(o.add(r),a.current=r)}else o.remove(a.current)})}])},678784,e=>{"use strict";var t=e.i(678745);e.s(["CheckIcon",()=>t.default])},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])},270377,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ExclamationCircleOutlined",0,a],270377)},954616,e=>{"use strict";var t=e.i(271645),r=e.i(114272),o=e.i(540143),i=e.i(915823),a=e.i(619273),n=class extends i.Subscribable{#e;#t=void 0;#r;#o;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}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.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#r?.removeObserver(this),this.#r=void 0,this.#i(),this.#a()}mutate(e,t){return this.#o=t,this.#r?.removeObserver(this),this.#r=this.#e.getMutationCache().build(this.#e,this.options),this.#r.addObserver(this),this.#r.execute(e)}#i(){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){o.notifyManager.batch(()=>{if(this.#o&&this.hasListeners()){let t=this.#t.variables,r=this.#t.context,o={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#o.onSuccess?.(e.data,t,r,o)}catch(e){Promise.reject(e)}try{this.#o.onSettled?.(e.data,null,t,r,o)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#o.onError?.(e.error,t,r,o)}catch(e){Promise.reject(e)}try{this.#o.onSettled?.(void 0,e.error,t,r,o)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},s=e.i(912598);e.s(["useMutation",0,function(e,r){let i=(0,s.useQueryClient)(r),[l]=t.useState(()=>new n(i,e));t.useEffect(()=>{l.setOptions(e)},[l,e]);let c=t.useSyncExternalStore(t.useCallback(e=>l.subscribe(o.notifyManager.batchCalls(e)),[l]),()=>l.getCurrentResult(),()=>l.getCurrentResult()),d=t.useCallback((e,t)=>{l.mutate(e,t).catch(a.noop)},[l]);if(c.error&&(0,a.shouldThrowError)(l.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:d,mutateAsync:c.mutate}}],954616)},107233,603908,e=>{"use strict";let t=(0,e.i(475254).default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["default",0,t],603908),e.s(["Plus",0,t],107233)},655063,e=>{"use strict";var t=e.i(399029),r=e.i(271645);e.s(["useDebouncedValue",0,function(e,o,i){let[a,n,s]=(0,t.useDebouncedState)(e,o,i);return(0,r.useEffect)(()=>{n(e)},[e,n]),[a,s]}])},541202,e=>{"use strict";var t=e.i(843476),r=e.i(522016),o=e.i(560445);e.s(["DeprecationBanner",0,({featureName:e})=>(0,t.jsx)(o.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}})])},768371,e=>{"use strict";let t,r;var o=e.i(247167);let i=/\{[^{}]+\}/g;function a(e,t,r){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${r?.allowReserved===!0?t:encodeURIComponent(t)}`}function n(e,t,r){if(!t||"object"!=typeof t)return"";let o=[],i={simple:",",label:".",matrix:";"}[r.style]||"&";if("deepObject"!==r.style&&!1===r.explode){for(let e in t)o.push(e,!0===r.allowReserved?t[e]:encodeURIComponent(t[e]));let i=o.join(",");switch(r.style){case"form":return`${e}=${i}`;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return i}}for(let i in t){let n="deepObject"===r.style?`${e}[${i}]`:i;o.push(a(n,t[i],r))}let n=o.join(i);return"label"===r.style||"matrix"===r.style?`${i}${n}`:n}function s(e,t,r){if(!Array.isArray(t))return"";if(!1===r.explode){let o={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[r.style]||",",i=(!0===r.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(o);switch(r.style){case"simple":return i;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return`${e}=${i}`}}let o={simple:",",label:".",matrix:";"}[r.style]||"&",i=[];for(let o of t)"simple"===r.style||"label"===r.style?i.push(!0===r.allowReserved?o:encodeURIComponent(o)):i.push(a(e,o,r));return"label"===r.style||"matrix"===r.style?`${o}${i.join(o)}`:i.join(o)}function l(e){return function(t){let r=[];if(t&&"object"==typeof t)for(let o in t){let i=t[o];if(null!=i){if(Array.isArray(i)){if(0===i.length)continue;r.push(s(o,i,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof i){r.push(n(o,i,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}r.push(a(o,i,e))}}return r.join("&")}}function c(e,t){let r=e;for(let o of e.match(i)??[]){let e=o.substring(1,o.length-1),i=!1,l="simple";if(e.endsWith("*")&&(i=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(l="label",e=e.substring(1)):e.startsWith(";")&&(l="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let c=t[e];if(Array.isArray(c)){r=r.replace(o,s(e,c,{style:l,explode:i}));continue}if("object"==typeof c){r=r.replace(o,n(e,c,{style:l,explode:i}));continue}if("matrix"===l){r=r.replace(o,`;${a(e,c)}`);continue}r=r.replace(o,"label"===l?`.${encodeURIComponent(c)}`:encodeURIComponent(c))}return r}function d(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function u(...e){let t=new Headers;for(let r of e)if(r&&"object"==typeof r)for(let[e,o]of r instanceof Headers?r.entries():Object.entries(r))if(null===o)t.delete(e);else if(Array.isArray(o))for(let r of o)t.append(e,r);else void 0!==o&&t.set(e,o);return t}function p(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var m=e.i(954616),h=e.i(621482),f=e.i(869230),g=e.i(469637),b=e.i(254440),v=e.i(266027),x=e.i(431703),y=e.i(97198);let _=async(e,t)=>new Request(t,{method:e.method,headers:e.headers,body:e.body?await e.arrayBuffer():void 0,mode:e.mode,credentials:e.credentials,cache:e.cache,redirect:e.redirect,referrer:e.referrer,referrerPolicy:e.referrerPolicy,integrity:e.integrity,keepalive:e.keepalive,signal:e.signal}),k=function(e){let{baseUrl:t="",Request:r=globalThis.Request,fetch:i=globalThis.fetch,querySerializer:a,bodySerializer:n,pathSerializer:s,headers:m,requestInitExt:h,...f}={...e};h="object"==typeof o.default&&Number.parseInt(o.default?.versions?.node?.substring(0,2))>=18&&o.default.versions.undici?h:void 0,t=p(t);let g=[];async function b(e,o){var b,v;let x,y,_,k,w,{baseUrl:j,fetch:S=i,Request:C=r,headers:z,params:R={},parseAs:O="json",querySerializer:M,bodySerializer:$=n??d,pathSerializer:E,body:N,middleware:T=[],...A}=o||{},I=t;j&&(I=p(j)??t);let L="function"==typeof a?a:l(a);M&&(L="function"==typeof M?M:l({..."object"==typeof a?a:{},...M}));let H=E||s||c,B=void 0===N?void 0:$(N,u(m,z,R.header)),q=u(void 0===B||B instanceof FormData?{}:{"Content-Type":"application/json"},m,z,R.header),P=[...g,...T],F={redirect:"follow",...f,...A,body:B,headers:q},V=new C((b=e,v={baseUrl:I,params:R,querySerializer:L,pathSerializer:H},x=`${v.baseUrl}${b}`,v.params?.path&&(x=v.pathSerializer(x,v.params.path)),(y=v.querySerializer(v.params.query??{})).startsWith("?")&&(y=y.substring(1)),y&&(x+=`?${y}`),x),F);for(let e in A)e in V||(V[e]=A[e]);if(P.length){for(let t of(_=Math.random().toString(36).slice(2,11),k=Object.freeze({baseUrl:I,fetch:S,parseAs:O,querySerializer:L,bodySerializer:$,pathSerializer:H}),P))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let r=await t.onRequest({request:V,schemaPath:e,params:R,options:k,id:_});if(r)if(r instanceof C)V=r;else if(r instanceof Response){w=r;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!w){try{w=await S(V,h)}catch(r){let t=r;if(P.length)for(let r=P.length-1;r>=0;r--){let o=P[r];if(o&&"object"==typeof o&&"function"==typeof o.onError){let r=await o.onError({request:V,error:t,schemaPath:e,params:R,options:k,id:_});if(r){if(r instanceof Response){t=void 0,w=r;break}if(r instanceof Error){t=r;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(P.length)for(let t=P.length-1;t>=0;t--){let r=P[t];if(r&&"object"==typeof r&&"function"==typeof r.onResponse){let t=await r.onResponse({request:V,response:w,schemaPath:e,params:R,options:k,id:_});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");w=t}}}}let D=w.headers.get("Content-Length");if(204===w.status||"HEAD"===V.method||"0"===D&&!w.headers.get("Transfer-Encoding")?.includes("chunked"))return w.ok?{data:void 0,response:w}:{error:void 0,response:w};if(w.ok){let e=async()=>{if("stream"===O)return w.body;if("json"===O&&!D){let e=await w.text();return e?JSON.parse(e):void 0}return await w[O]()};return{data:await e(),response:w}}let U=await w.text();try{U=JSON.parse(U)}catch{}return{error:U,response:w}}return{request:(e,t,r)=>b(t,{...r,method:e.toUpperCase()}),GET:(e,t)=>b(e,{...t,method:"GET"}),PUT:(e,t)=>b(e,{...t,method:"PUT"}),POST:(e,t)=>b(e,{...t,method:"POST"}),DELETE:(e,t)=>b(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>b(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>b(e,{...t,method:"HEAD"}),PATCH:(e,t)=>b(e,{...t,method:"PATCH"}),TRACE:(e,t)=>b(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");g.push(t)}},eject(...e){for(let t of e){let e=g.indexOf(t);-1!==e&&g.splice(e,1)}}}}({baseUrl:globalThis.location?.origin??""});k.use({async onRequest({request:e}){let t=(0,y.getRequestBaseUrl)(),r=t?await _(e,((e,t)=>{let{pathname:r,search:o}=new URL(e);return`${t.replace(/\/+$/,"")}${r}${o}`})(e.url,t)):e,o=(0,y.getAuthToken)();return o&&r.headers.set((0,y.getAuthHeaderName)(),`Bearer ${o}`),r},async onResponse({response:e}){let t;if(e.ok)return e;let r=await e.clone().text(),o=r;try{o=JSON.parse(r),t=(0,x.deriveErrorMessage)(o)}catch{t=r||`HTTP ${e.status}`}throw(0,y.reportError)(t),new x.ApiError(t,e.status,o)}});let w=(t=async({queryKey:[e,t,r],signal:o})=>{let i=k[e.toUpperCase()],{data:a,error:n,response:s}=await i(t,{signal:o,...r});if(n)throw n;return 204===s.status||"0"===s.headers.get("Content-Length")?a??null:a},{queryOptions:r=(e,r,...[o,i])=>({queryKey:void 0===o?[e,r]:[e,r,o],queryFn:t,...i}),useQuery:(e,t,...[o,i,a])=>(0,v.useQuery)(r(e,t,o,i),a),useSuspenseQuery:(e,t,...[o,i,a])=>{var n;return n=r(e,t,o,i),(0,g.useBaseQuery)({...n,enabled:!0,suspense:!0,throwOnError:b.defaultThrowOnError,placeholderData:void 0},f.QueryObserver,a)},useInfiniteQuery:(e,t,o,i,a)=>{let{pageParamName:n="cursor",...s}=i,{queryKey:l}=r(e,t,o);return(0,h.useInfiniteQuery)({queryKey:l,queryFn:async({queryKey:[e,t,r],pageParam:o=0,signal:i})=>{let a=k[e.toUpperCase()],s={...r,signal:i,params:{...r?.params||{},query:{...r?.params?.query,[n]:o}}},{data:l,error:c}=await a(t,s);if(c)throw c;return l},...s},a)},useMutation:(e,t,r,o)=>(0,m.useMutation)({mutationKey:[e,t],mutationFn:async r=>{let o=k[e.toUpperCase()],{data:i,error:a}=await o(t,r);if(a)throw a;return i},...r},o)});e.s(["$api",0,w,"fetchClient",0,k],768371)},434166,e=>{"use strict";e.s(["getSecureItem",0,function(e){try{let t=window.sessionStorage.getItem(e);if(null===t)return null;return decodeURIComponent(atob(t).split("").map(e=>"%"+e.charCodeAt(0).toString(16).padStart(2,"0")).join(""))}catch{return null}},"setSecureItem",0,function(e,t){window.sessionStorage.setItem(e,btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(e,t)=>String.fromCharCode(parseInt(t,16)))))}])},466828,e=>{"use strict";var t=e.i(843476),r=e.i(271645),o=e.i(678784);let i=(0,e.i(475254).default)("clipboard",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}]]);var a=e.i(650056);let n={'code[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{background:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)",fontFamily:'"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",borderRadius:"0.3em"},'code[class*="language-"]::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::-moz-selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"]::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'code[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},'pre[class*="language-"] *::selection':{background:"hsl(230, 1%, 90%)",color:"inherit"},':not(pre) > code[class*="language-"]':{padding:"0.2em 0.3em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},prolog:{color:"hsl(230, 4%, 64%)"},cdata:{color:"hsl(230, 4%, 64%)"},doctype:{color:"hsl(230, 8%, 24%)"},punctuation:{color:"hsl(230, 8%, 24%)"},entity:{color:"hsl(230, 8%, 24%)",cursor:"help"},"attr-name":{color:"hsl(35, 99%, 36%)"},"class-name":{color:"hsl(35, 99%, 36%)"},boolean:{color:"hsl(35, 99%, 36%)"},constant:{color:"hsl(35, 99%, 36%)"},number:{color:"hsl(35, 99%, 36%)"},atrule:{color:"hsl(35, 99%, 36%)"},keyword:{color:"hsl(301, 63%, 40%)"},property:{color:"hsl(5, 74%, 59%)"},tag:{color:"hsl(5, 74%, 59%)"},symbol:{color:"hsl(5, 74%, 59%)"},deleted:{color:"hsl(5, 74%, 59%)"},important:{color:"hsl(5, 74%, 59%)"},selector:{color:"hsl(119, 34%, 47%)"},string:{color:"hsl(119, 34%, 47%)"},char:{color:"hsl(119, 34%, 47%)"},builtin:{color:"hsl(119, 34%, 47%)"},inserted:{color:"hsl(119, 34%, 47%)"},regex:{color:"hsl(119, 34%, 47%)"},"attr-value":{color:"hsl(119, 34%, 47%)"},"attr-value > .token.punctuation":{color:"hsl(119, 34%, 47%)"},variable:{color:"hsl(221, 87%, 60%)"},operator:{color:"hsl(221, 87%, 60%)"},function:{color:"hsl(221, 87%, 60%)"},url:{color:"hsl(198, 99%, 37%)"},"attr-value > .token.punctuation.attr-equals":{color:"hsl(230, 8%, 24%)"},"special-attr > .token.attr-value > .token.value.css":{color:"hsl(230, 8%, 24%)"},".language-css .token.selector":{color:"hsl(5, 74%, 59%)"},".language-css .token.property":{color:"hsl(230, 8%, 24%)"},".language-css .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.function":{color:"hsl(198, 99%, 37%)"},".language-css .token.url > .token.string.url":{color:"hsl(119, 34%, 47%)"},".language-css .token.important":{color:"hsl(301, 63%, 40%)"},".language-css .token.atrule .token.rule":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.operator":{color:"hsl(301, 63%, 40%)"},".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation":{color:"hsl(344, 84%, 43%)"},".language-json .token.operator":{color:"hsl(230, 8%, 24%)"},".language-json .token.null.keyword":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.url":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.operator":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url-reference.url > .token.string":{color:"hsl(230, 8%, 24%)"},".language-markdown .token.url > .token.content":{color:"hsl(221, 87%, 60%)"},".language-markdown .token.url > .token.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.url-reference.url":{color:"hsl(198, 99%, 37%)"},".language-markdown .token.blockquote.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.hr.punctuation":{color:"hsl(230, 4%, 64%)",fontStyle:"italic"},".language-markdown .token.code-snippet":{color:"hsl(119, 34%, 47%)"},".language-markdown .token.bold .token.content":{color:"hsl(35, 99%, 36%)"},".language-markdown .token.italic .token.content":{color:"hsl(301, 63%, 40%)"},".language-markdown .token.strike .token.content":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.strike .token.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.list.punctuation":{color:"hsl(5, 74%, 59%)"},".language-markdown .token.title.important > .token.punctuation":{color:"hsl(5, 74%, 59%)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:"0.8"},"token.tab:not(:empty):before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.cr:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.lf:before":{color:"hsla(230, 8%, 24%, 0.2)"},"token.space:before":{color:"hsla(230, 8%, 24%, 0.2)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item":{marginRight:"0.4em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 6%, 44%)",padding:"0.1em 0.4em",borderRadius:"0.3em"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus":{background:"hsl(230, 1%, 78%)",color:"hsl(230, 8%, 24%)"},".line-highlight.line-highlight":{background:"hsla(230, 8%, 24%, 0.05)"},".line-highlight.line-highlight:before":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},".line-highlight.line-highlight[data-end]:after":{background:"hsl(230, 1%, 90%)",color:"hsl(230, 8%, 24%)",padding:"0.1em 0.6em",borderRadius:"0.3em",boxShadow:"0 2px 0 0 rgba(0, 0, 0, 0.2)"},"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before":{backgroundColor:"hsla(230, 8%, 24%, 0.05)"},".line-numbers.line-numbers .line-numbers-rows":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".command-line .command-line-prompt":{borderRightColor:"hsla(230, 8%, 24%, 0.2)"},".line-numbers .line-numbers-rows > span:before":{color:"hsl(230, 1%, 62%)"},".command-line .command-line-prompt > span:before":{color:"hsl(230, 1%, 62%)"},".rainbow-braces .token.token.punctuation.brace-level-1":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-5":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-9":{color:"hsl(5, 74%, 59%)"},".rainbow-braces .token.token.punctuation.brace-level-2":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-6":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-10":{color:"hsl(119, 34%, 47%)"},".rainbow-braces .token.token.punctuation.brace-level-3":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-7":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-11":{color:"hsl(221, 87%, 60%)"},".rainbow-braces .token.token.punctuation.brace-level-4":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-8":{color:"hsl(301, 63%, 40%)"},".rainbow-braces .token.token.punctuation.brace-level-12":{color:"hsl(301, 63%, 40%)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)":{backgroundColor:"hsla(353, 100%, 66%, 0.15)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection":{backgroundColor:"hsla(353, 95%, 66%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)":{backgroundColor:"hsla(137, 100%, 55%, 0.15)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection":{backgroundColor:"hsla(135, 73%, 55%, 0.25)"},".prism-previewer.prism-previewer:before":{borderColor:"hsl(0, 0, 95%)"},".prism-previewer-gradient.prism-previewer-gradient div":{borderColor:"hsl(0, 0, 95%)",borderRadius:"0.3em"},".prism-previewer-color.prism-previewer-color:before":{borderRadius:"0.3em"},".prism-previewer-easing.prism-previewer-easing:before":{borderRadius:"0.3em"},".prism-previewer.prism-previewer:after":{borderTopColor:"hsl(0, 0, 95%)"},".prism-previewer-flipped.prism-previewer-flipped.after":{borderBottomColor:"hsl(0, 0, 95%)"},".prism-previewer-angle.prism-previewer-angle:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-time.prism-previewer-time:before":{background:"hsl(0, 0%, 100%)"},".prism-previewer-easing.prism-previewer-easing":{background:"hsl(0, 0%, 100%)"},".prism-previewer-angle.prism-previewer-angle circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-time.prism-previewer-time circle":{stroke:"hsl(230, 8%, 24%)",strokeOpacity:"1"},".prism-previewer-easing.prism-previewer-easing circle":{stroke:"hsl(230, 8%, 24%)",fill:"transparent"},".prism-previewer-easing.prism-previewer-easing path":{stroke:"hsl(230, 8%, 24%)"},".prism-previewer-easing.prism-previewer-easing line":{stroke:"hsl(230, 8%, 24%)"}};e.s(["default",0,({code:e,language:s})=>{let[l,c]=(0,r.useState)(!1);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 overflow-hidden",children:[(0,t.jsx)("button",{onClick:()=>{navigator.clipboard.writeText(e),c(!0),setTimeout(()=>c(!1),2e3)},className:"absolute top-3 right-3 p-2 rounded-md bg-gray-100 hover:bg-gray-200 text-gray-600 z-10","aria-label":"Copy code",children:l?(0,t.jsx)(o.CheckIcon,{size:16}):(0,t.jsx)(i,{size:16})}),(0,t.jsx)(a.Prism,{language:s,style:n,customStyle:{margin:0,padding:"1.5rem",borderRadius:"0.5rem",fontSize:"0.9rem",backgroundColor:"#fafafa"},showLineNumbers:!0,children:e})]})}],466828)},438957,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5l-41.1 41.1-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-44.9 44.9-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-65.3 65.3a8.03 8.03 0 000 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6A304.06 304.06 0 00608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644c-60.9 0-118.2-23.7-161.2-66.8-43.1-43-66.8-100.3-66.8-161.2 0-60.9 23.7-118.2 66.8-161.2 43-43.1 100.3-66.8 161.2-66.8 60.9 0 118.2 23.7 161.2 66.8 43.1 43 66.8 100.3 66.8 161.2 0 60.9-23.7 118.2-66.8 161.2z"}}]},name:"key",theme:"outlined"};var i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["KeyOutlined",0,a],438957)},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])},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),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ExperimentOutlined",0,a],19732)},518617,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["CloseCircleOutlined",0,a],518617)},366308,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ToolOutlined",0,a],366308)},313603,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["SettingOutlined",0,a],313603)},782273,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["SoundOutlined",0,a],782273)},793916,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["AudioOutlined",0,a],793916)},596239,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["LinkOutlined",0,a],596239)},339019,865361,e=>{"use strict";var t,r,o=((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),i=((r={}).IMAGE="image",r.VIDEO="video",r.CHAT="chat",r.RESPONSES="responses",r.IMAGE_EDITS="image_edits",r.ANTHROPIC_MESSAGES="anthropic_messages",r.EMBEDDINGS="embeddings",r.SPEECH="speech",r.TRANSCRIPTION="transcription",r.A2A_AGENTS="a2a_agents",r.MCP="mcp",r.REALTIME="realtime",r.INTERACTIONS="interactions",r);let a={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",()=>i,"getEndpointType",0,e=>Object.values(o).includes(e)?a[e]:"chat"],865361),e.s(["generateCodeSnippet",0,e=>{let t,{apiKeySource:r,accessToken:o,apiKey:a,inputMessage:n,chatHistory:s,selectedTags:l,selectedVectorStores:c,selectedGuardrails:d,selectedPolicies:u,selectedMCPServers:p,mcpServers:m,mcpServerToolRestrictions:h,selectedVoice:f,endpointType:g,selectedModel:b,selectedSdk:v,proxySettings:x}=e,y="session"===r?o:a,_=window.location.origin,k=x?.LITELLM_UI_API_DOC_BASE_URL;k&&k.trim()?_=k:x?.PROXY_BASE_URL&&(_=x.PROXY_BASE_URL);let w=n||"Your prompt here",j=w.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n"),S=s.filter(e=>!e.isImage).map(({role:e,content:t})=>({role:e,content:t})),C={};l.length>0&&(C.tags=l),c.length>0&&(C.vector_stores=c),d.length>0&&(C.guardrails=d),u.length>0&&(C.policies=u);let z=b||"your-model-name",R="azure"===v?`import openai - -client = openai.AzureOpenAI( - api_key="${y||"YOUR_LITELLM_API_KEY"}", - azure_endpoint="${_}", - api_version="2024-02-01" -)`:`import openai - -client = openai.OpenAI( - api_key="${y||"YOUR_LITELLM_API_KEY"}", - base_url="${_}" -)`;switch(g){case i.CHAT:{let e=Object.keys(C).length>0,r="";if(e){let e=JSON.stringify({metadata:C},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();r=`, - extra_body=${e}`}let o=S.length>0?S:[{role:"user",content:w}];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(o,null,4)}${r} -) - -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": "${j}" -# }, -# { -# "type": "image_url", -# "image_url": { -# "url": f"data:image/jpeg;base64,{base64_file}" # or data:application/pdf;base64,{base64_file} -# } -# } -# ] -# } -# ]${r} -# ) -# print(response_with_file) -`;break}case i.RESPONSES:{let e=Object.keys(C).length>0,r="";if(e){let e=JSON.stringify({metadata:C},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();r=`, - extra_body=${e}`}let o=S.length>0?S:[{role:"user",content:w}];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(o,null,4)}${r} -) - -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": "${j}"}, -# { -# "type": "input_image", -# "image_url": f"data:image/jpeg;base64,{base64_file}", # or data:application/pdf;base64,{base64_file} -# }, -# ], -# } -# ]${r} -# ) -# print(response_with_file.output_text) -`;break}case i.IMAGE:t="azure"===v?` -# 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="${n}", - 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 = "${j}" - -# 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 i.IMAGE_EDITS:t="azure"===v?` -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 = "${j}" - -# 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 = "${j}" - -# 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 i.EMBEDDINGS:t=` -response = client.embeddings.create( - input="${n||"Your string here"}", - model="${z}", - encoding_format="base64" # or "float" -) - -print(response.data[0].embedding) -`;break;case i.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${n?`, - prompt="${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:""} -) - -print(response.text) -`;break;case i.SPEECH:t=` -# Make the text-to-speech request -response = client.audio.speech.create( - model="${z}", - input="${n||"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="${n||"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`${R} -${t}`}],339019)},123287,e=>{"use strict";let t=(0,e.i(475254).default)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["default",0,t])},595468,e=>{"use strict";var t=e.i(123287);e.s(["CheckCircle2",()=>t.default])},582458,e=>{"use strict";let t=(0,e.i(475254).default)("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);e.s(["default",0,t])},878894,e=>{"use strict";var t=e.i(582458);e.s(["AlertTriangle",()=>t.default])},514764,e=>{"use strict";let t=(0,e.i(475254).default)("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);e.s(["Send",0,t],514764)},367240,e=>{"use strict";let t=(0,e.i(475254).default)("rotate-ccw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);e.s(["RotateCcw",0,t],367240)},232164,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 000 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm62.6-651.7l224.6 19 19 224.6L477.5 694 233.9 450.5l311.9-311.9zm60.16 186.23a48 48 0 1067.88-67.89 48 48 0 10-67.88 67.89zM889.7 539.8l-39.6-39.5a8.03 8.03 0 00-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 00-11.3 0l-39.6 39.5a8.03 8.03 0 000 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z"}}]},name:"tags",theme:"outlined"};var i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["TagsOutlined",0,a],232164)},91500,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M531.3 574.4l.3-1.4c5.8-23.9 13.1-53.7 7.4-80.7-3.8-21.3-19.5-29.6-32.9-30.2-15.8-.7-29.9 8.3-33.4 21.4-6.6 24-.7 56.8 10.1 98.6-13.6 32.4-35.3 79.5-51.2 107.5-29.6 15.3-69.3 38.9-75.2 68.7-1.2 5.5.2 12.5 3.5 18.8 3.7 7 9.6 12.4 16.5 15 3 1.1 6.6 2 10.8 2 17.6 0 46.1-14.2 84.1-79.4 5.8-1.9 11.8-3.9 17.6-5.9 27.2-9.2 55.4-18.8 80.9-23.1 28.2 15.1 60.3 24.8 82.1 24.8 21.6 0 30.1-12.8 33.3-20.5 5.6-13.5 2.9-30.5-6.2-39.6-13.2-13-45.3-16.4-95.3-10.2-24.6-15-40.7-35.4-52.4-65.8zM421.6 726.3c-13.9 20.2-24.4 30.3-30.1 34.7 6.7-12.3 19.8-25.3 30.1-34.7zm87.6-235.5c5.2 8.9 4.5 35.8.5 49.4-4.9-19.9-5.6-48.1-2.7-51.4.8.1 1.5.7 2.2 2zm-1.6 120.5c10.7 18.5 24.2 34.4 39.1 46.2-21.6 4.9-41.3 13-58.9 20.2-4.2 1.7-8.3 3.4-12.3 5 13.3-24.1 24.4-51.4 32.1-71.4zm155.6 65.5c.1.2.2.5-.4.9h-.2l-.2.3c-.8.5-9 5.3-44.3-8.6 40.6-1.9 45 7.3 45.1 7.4zm191.4-388.2L639.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 42h216v494z"}}]},name:"file-pdf",theme:"outlined"};var i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["FilePdfOutlined",0,a],91500)},987432,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["SaveOutlined",0,a],987432)},266537,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};var i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ArrowRightOutlined",0,a],266537)},611052,e=>{"use strict";var t=e.i(843476),r=e.i(271645),o=e.i(212931),i=e.i(311451),a=e.i(790848),n=e.i(888259),s=e.i(768371),l=e.i(431703),c=e.i(438957);e.i(247167);var d=e.i(931067);let u={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 10-56 0z"}}]},name:"lock",theme:"outlined"};var p=e.i(9583),m=r.forwardRef(function(e,t){return r.createElement(p.default,(0,d.default)({},e,{ref:t,icon:u}))}),h=e.i(492030),f=e.i(266537),g=e.i(447566),b=e.i(149192),v=e.i(596239);e.s(["ByokCredentialModal",0,({server:e,open:d,onClose:u,onSuccess:p})=>{let[x,y]=(0,r.useState)(1),[_,k]=(0,r.useState)(""),[w,j]=(0,r.useState)(!0),[S,C]=(0,r.useState)(!1),z=e.alias||e.server_name||"Service",R=z.charAt(0).toUpperCase(),O=()=>{y(1),k(""),j(!0),C(!1),u()},M=async()=>{if(!_.trim())return void n.default.error("Please enter your API key");C(!0);try{await s.fetchClient.POST("/v1/mcp/server/{server_id}/user-credential",{params:{path:{server_id:e.server_id}},body:{credential:_.trim(),save:w}}),n.default.success(`Connected to ${z}`),p(e.server_id),O()}catch(e){n.default.error((e=>{if(e instanceof l.ApiError){let t=e.body?.detail?.error;if(t)return t}return e instanceof Error&&e.message?e.message:"Failed to connect"})(e))}finally{C(!1)}};return(0,t.jsx)(o.Modal,{open:d,onCancel:O,footer:null,width:480,closeIcon:null,className:"byok-modal",children:(0,t.jsxs)("div",{className:"relative p-2",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-6",children:[2===x?(0,t.jsxs)("button",{onClick:()=>y(1),className:"flex items-center gap-1 text-gray-500 hover:text-gray-800 text-sm",children:[(0,t.jsx)(g.ArrowLeftOutlined,{})," Back"]}):(0,t.jsx)("div",{}),(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("div",{className:`w-2 h-2 rounded-full ${1===x?"bg-blue-500":"bg-gray-300"}`}),(0,t.jsx)("div",{className:`w-2 h-2 rounded-full ${2===x?"bg-blue-500":"bg-gray-300"}`})]}),(0,t.jsx)("button",{onClick:O,className:"text-gray-400 hover:text-gray-600",children:(0,t.jsx)(b.CloseOutlined,{})})]}),1===x?(0,t.jsxs)("div",{className:"text-center",children:[(0,t.jsxs)("div",{className:"flex items-center justify-center gap-3 mb-6",children:[(0,t.jsx)("div",{className:"w-14 h-14 rounded-xl bg-linear-to-br from-teal-400 to-cyan-600 flex items-center justify-center text-white font-bold text-xl shadow-sm",children:"L"}),(0,t.jsx)(f.ArrowRightOutlined,{className:"text-gray-400 text-lg"}),(0,t.jsx)("div",{className:"w-14 h-14 rounded-xl bg-linear-to-br from-blue-600 to-indigo-800 flex items-center justify-center text-white font-bold text-xl shadow-sm",children:R})]}),(0,t.jsxs)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:["Connect ",z]}),(0,t.jsxs)("p",{className:"text-gray-500 mb-6",children:["LiteLLM needs access to ",z," to complete your request."]}),(0,t.jsx)("div",{className:"bg-gray-50 rounded-xl p-4 text-left mb-4",children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("div",{className:"mt-0.5",children:(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",className:"text-gray-500",children:[(0,t.jsx)("rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",stroke:"currentColor",strokeWidth:"2"}),(0,t.jsx)("path",{d:"M8 4v16M16 4v16",stroke:"currentColor",strokeWidth:"2"})]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-semibold text-gray-800 mb-1",children:"How it works"}),(0,t.jsxs)("p",{className:"text-gray-500 text-sm",children:["LiteLLM acts as a secure bridge. Your requests are routed through our MCP client directly to"," ",z,"'s API."]})]})]})}),e.byok_description&&e.byok_description.length>0&&(0,t.jsxs)("div",{className:"bg-gray-50 rounded-xl p-4 text-left mb-6",children:[(0,t.jsxs)("p",{className:"text-xs font-semibold text-gray-500 uppercase tracking-widest mb-3 flex items-center gap-2",children:[(0,t.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",className:"text-green-500",children:[(0,t.jsx)("path",{d:"M12 2L12 22M2 12L22 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,t.jsx)("circle",{cx:"12",cy:"12",r:"9",stroke:"currentColor",strokeWidth:"2"})]}),"Requested Access"]}),(0,t.jsx)("ul",{className:"space-y-2",children:e.byok_description.map((e,r)=>(0,t.jsxs)("li",{className:"flex items-center gap-2 text-sm text-gray-700",children:[(0,t.jsx)(h.CheckOutlined,{className:"text-green-500 shrink-0"}),e]},r))})]}),(0,t.jsxs)("button",{onClick:()=>y(2),className:"w-full bg-gray-900 hover:bg-gray-700 text-white font-medium py-3 px-6 rounded-xl flex items-center justify-center gap-2 transition-colors",children:["Continue to Authentication ",(0,t.jsx)(f.ArrowRightOutlined,{})]}),(0,t.jsx)("button",{onClick:O,className:"mt-3 w-full text-gray-400 hover:text-gray-600 text-sm py-2",children:"Cancel"})]}):(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"w-12 h-12 rounded-full bg-blue-50 flex items-center justify-center mb-4",children:(0,t.jsx)(c.KeyOutlined,{className:"text-blue-400 text-xl"})}),(0,t.jsx)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Provide API Key"}),(0,t.jsxs)("p",{className:"text-gray-500 mb-6",children:["Enter your ",z," API key to authorize this connection."]}),(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsxs)("label",{className:"block text-sm font-semibold text-gray-800 mb-2",children:[z," API Key"]}),(0,t.jsx)(i.Input.Password,{placeholder:"Enter your API key",value:_,onChange:e=>k(e.target.value),size:"large",className:"rounded-lg"}),e.byok_api_key_help_url&&(0,t.jsxs)("a",{href:e.byok_api_key_help_url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:text-blue-700 text-sm mt-2 flex items-center gap-1",children:["Where do I find my API key? ",(0,t.jsx)(v.LinkOutlined,{})]})]}),(0,t.jsxs)("div",{className:"bg-gray-50 rounded-xl p-4 flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",className:"text-gray-500",children:(0,t.jsx)("path",{d:"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z",fill:"currentColor"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-800",children:"Save key for future use"})]}),(0,t.jsx)(a.Switch,{checked:w,onChange:j})]}),(0,t.jsxs)("div",{className:"bg-blue-50 rounded-xl p-4 flex items-start gap-3 mb-6",children:[(0,t.jsx)(m,{className:"text-blue-400 mt-0.5 shrink-0"}),(0,t.jsx)("p",{className:"text-sm text-blue-700",children:"Your key is stored securely and transmitted over HTTPS. It is never shared with third parties."})]}),(0,t.jsxs)("button",{onClick:M,disabled:S,className:"w-full bg-blue-500 hover:bg-blue-600 disabled:opacity-60 text-white font-medium py-3 px-6 rounded-xl flex items-center justify-center gap-2 transition-colors",children:[(0,t.jsx)(m,{}),"Connect & Authorize"]})]})]})})}],611052)},516015,(e,t,r)=>{},898547,(e,t,r)=>{var o=e.i(247167);e.r(516015);var i=e.r(271645),a=i&&"object"==typeof i&&"default"in i?i:{default:i},n=void 0!==o.default&&o.default.env&&!0,s=function(e){return"[object String]"===Object.prototype.toString.call(e)},l=function(){function e(e){var t=void 0===e?{}:e,r=t.name,o=void 0===r?"stylesheet":r,i=t.optimizeForSpeed,a=void 0===i?n:i;c(s(o),"`name` must be a string"),this._name=o,this._deletedRulePlaceholder="#"+o+"-deleted-rule____{}",c("boolean"==typeof a,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=a,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var l="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=l?l.getAttribute("content"):null}var t,r=e.prototype;return r.setOptimizeForSpeed=function(e){c("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),c(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},r.isOptimizeForSpeed=function(){return this._optimizeForSpeed},r.inject=function(){var e=this;if(c(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(n||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,r){return"number"==typeof r?e._serverSheet.cssRules[r]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),r},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},r.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;ttypeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!r.cssRules[e])return e;r.deleteRule(e);try{r.insertRule(t,e)}catch(o){n||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),r.insertRule(this._deletedRulePlaceholder,e)}}else{var o=this._tags[e];c(o,"old rule at index `"+e+"` not found"),o.textContent=t}return e},r.deleteRule=function(e){if("u"typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},r.cssRules=function(){var e=this;return"u">>0},u={};function p(e,t){if(!t)return"jsx-"+e;var r=String(t),o=e+r;return u[o]||(u[o]="jsx-"+d(e+"-"+r)),u[o]}function m(e,t){"u"typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var r=this.getIdAndRules(e),o=r.styleId,i=r.rules;if(o in this._instancesCounts){this._instancesCounts[o]+=1;return}var a=i.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[o]=a,this._instancesCounts[o]=1},t.remove=function(e){var t=this,r=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(r in this._instancesCounts,"styleId: `"+r+"` not found"),this._instancesCounts[r]-=1,this._instancesCounts[r]<1){var o=this._fromServer&&this._fromServer[r];o?(o.parentNode.removeChild(o),delete this._fromServer[r]):(this._indices[r].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[r]),delete this._instancesCounts[r]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],r=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return r[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,r;return t=this.cssRules(),void 0===(r=e)&&(r={}),t.map(function(e){var t=e[0],o=e[1];return a.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:r.nonce?r.nonce:void 0,dangerouslySetInnerHTML:{__html:o}})})},t.getIdAndRules=function(e){var t=e.children,r=e.dynamic,o=e.id;if(r){var i=p(o,r);return{styleId:i,rules:Array.isArray(t)?t.map(function(e){return m(i,e)}):[m(i,t)]}}return{styleId:p(o),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),f=i.createContext(null);function g(){return new h}function b(){return i.useContext(f)}f.displayName="StyleSheetContext";var v=a.default.useInsertionEffect||a.default.useLayoutEffect,x="u">typeof window?g():void 0;function y(e){var t=x||b();return t&&("u"{t.exports=e.r(898547).style},431343,e=>{"use strict";let t=(0,e.i(475254).default)("play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);e.s(["Play",0,t],431343)},800374,218129,210612,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645),o={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M573 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40zm-280 0c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40z"}},{tag:"path",attrs:{d:"M894 345a343.92 343.92 0 00-189-130v.1c-17.1-19-36.4-36.5-58-52.1-163.7-119-393.5-82.7-513 81-96.3 133-92.2 311.9 6 439l.8 132.6c0 3.2.5 6.4 1.5 9.4a31.95 31.95 0 0040.1 20.9L309 806c33.5 11.9 68.1 18.7 102.5 20.6l-.5.4c89.1 64.9 205.9 84.4 313 49l127.1 41.4c3.2 1 6.5 1.6 9.9 1.6 17.7 0 32-14.3 32-32V753c88.1-119.6 90.4-284.9 1-408zM323 735l-12-5-99 31-1-104-8-9c-84.6-103.2-90.2-251.9-11-361 96.4-132.2 281.2-161.4 413-66 132.2 96.1 161.5 280.6 66 412-80.1 109.9-223.5 150.5-348 102zm505-17l-8 10 1 104-98-33-12 5c-56 20.8-115.7 22.5-171 7l-.2-.1A367.31 367.31 0 00729 676c76.4-105.3 88.8-237.6 44.4-350.4l.6.4c23 16.5 44.1 37.1 62 62 72.6 99.6 68.5 235.2-8 330z"}},{tag:"path",attrs:{d:"M433 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40z"}}]},name:"comment",theme:"outlined"},i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["CommentOutlined",0,a],800374);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M917.7 148.8l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 00-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 000 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3 2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4zM769.1 441.7l-59.4 59.4-186.8-186.8 59.4-59.4c24.9-24.9 58.1-38.7 93.4-38.7 35.3 0 68.4 13.7 93.4 38.7 24.9 24.9 38.7 58.1 38.7 93.4 0 35.3-13.8 68.4-38.7 93.4zm-190.2 105a8.03 8.03 0 00-11.3 0L501 613.3 410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 00-11.3 0L363 475.3l-43-43a7.85 7.85 0 00-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2c-68.9 69-77 175.7-24.3 253.5l-76.1 76.1a8.03 8.03 0 000 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3 51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43 66.7-66.7c3.1-3.1 3.1-8.2 0-11.3l-36.6-36.2zM441.7 769.1a131.32 131.32 0 01-93.4 38.7c-35.3 0-68.4-13.7-93.4-38.7a131.32 131.32 0 01-38.7-93.4c0-35.3 13.7-68.4 38.7-93.4l59.4-59.4 186.8 186.8-59.4 59.4z"}}]},name:"api",theme:"outlined"};var s=r.forwardRef(function(e,o){return r.createElement(i.default,(0,t.default)({},e,{ref:o,icon:n}))});e.s(["ApiOutlined",0,s],218129);let l={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-600 72h560v208H232V136zm560 480H232V408h560v208zm0 272H232V680h560v208zM304 240a40 40 0 1080 0 40 40 0 10-80 0zm0 272a40 40 0 1080 0 40 40 0 10-80 0zm0 272a40 40 0 1080 0 40 40 0 10-80 0z"}}]},name:"database",theme:"outlined"};var c=r.forwardRef(function(e,o){return r.createElement(i.default,(0,t.default)({},e,{ref:o,icon:l}))});e.s(["DatabaseOutlined",0,c],210612)},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),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["BulbOutlined",0,a],812618)},319023,e=>{"use strict";let t=(0,e.i(475254).default)("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);e.s(["Lock",0,t],319023)},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)},459161,e=>{"use strict";e.i(247167);var t=e.i(356449),r=e.i(602869),o=e.i(727749);async function i(e,a,n,s,l=[],c,d,u,p,m,h,f,g,b,v,x,y,_,k,w,j,S,C){if(!s)throw Error("Virtual Key is required");if(!n||""===n.trim())throw Error("Model is required. Please select a model before sending a request.");console.log=function(){};let z=w||(0,r.getProxyBaseUrl)(),R={};l&&l.length>0&&(R["x-litellm-tags"]=l.join(","));let O=new t.default.OpenAI({apiKey:s,baseURL:z,dangerouslyAllowBrowser:!0,defaultHeaders:R});try{let t=Date.now(),r=!1,o=e.map(e=>(Array.isArray(e.content),{role:e.role,content:e.content,type:"message"})),i=[];b&&b.length>0&&(b.includes("__all__")?i.push({type:"mcp",server_label:"litellm",server_url:`${z}/mcp`,require_approval:"never"}):b.forEach(e=>{if(e.startsWith("toolset:")){let t=e.slice(8),r=C?.find(e=>e.toolset_id===t),o=r?.toolset_name||t;i.push({type:"mcp",server_label:o,server_url:`${z}/mcp/${encodeURIComponent(o)}`,require_approval:"never"})}else{let t=j?.find(t=>t.server_id===e),r=t?.server_name||e,o=S?.[e]||[];i.push({type:"mcp",server_label:r,server_url:`${z}/mcp/${encodeURIComponent(r)}`,require_approval:"never",...o.length>0?{allowed_tools:o}:{}})}})),_&&i.push({type:"code_interpreter",container:{type:"auto"}});let s=await O.responses.create({model:n,input:o,stream:!0,litellm_trace_id:m,...v?{previous_response_id:v}:{},...h?{vector_store_ids:h}:{},...f?{guardrails:f}:{},...g?{policies:g}:{},...i.length>0?{tools:i,tool_choice:"auto"}:{}},{signal:c}),l="",w={code:"",containerId:""};for await(let e of s)if("object"==typeof e&&null!==e){if((e.type?.startsWith("response.mcp_")||"response.output_item.done"===e.type&&(e.item?.type==="mcp_list_tools"||e.item?.type==="mcp_call"))&&y){let t={type:e.type,sequence_number:e.sequence_number,output_index:e.output_index,item_id:e.item_id||e.item?.id,item:e.item,delta:e.delta,arguments:e.arguments,timestamp:Date.now()};y(t)}"response.output_item.done"===e.type&&e.item?.type==="mcp_call"&&e.item?.name&&(l=e.item.name),M=w;var M,$=w="response.output_item.done"===e.type&&e.item?.type==="code_interpreter_call"?{code:e.item.code||"",containerId:e.item.container_id||""}:M;if("response.output_item.done"===e.type&&e.item?.type==="message"&&e.item?.content&&k){for(let t of e.item.content)if("output_text"===t.type&&t.annotations){let e=t.annotations.filter(e=>"container_file_citation"===e.type);(e.length>0||$.code)&&k({code:$.code,containerId:$.containerId,annotations:e})}}if("response.role.delta"===e.type)continue;if("response.output_text.delta"===e.type&&"string"==typeof e.delta){let o=e.delta;if(o.length>0&&(a("assistant",o,n),!r)){r=!0;let e=Date.now()-t;u&&u(e)}}if("response.reasoning.delta"===e.type&&"delta"in e){let t=e.delta;"string"==typeof t&&d&&d(t)}if("response.completed"===e.type&&"response"in e){let t=e.response,r=t.usage;if(t.id&&x&&x(t.id),r&&p){let e={completionTokens:r.output_tokens,promptTokens:r.input_tokens,totalTokens:r.total_tokens};r.completion_tokens_details?.reasoning_tokens&&(e.reasoningTokens=r.completion_tokens_details.reasoning_tokens),p(e,l)}}}return s}catch(e){throw c?.aborted||o.default.fromBackend(`Error occurred while generating model response. Please try again. Error: ${e}`),e}}e.s(["makeOpenAIResponsesRequest",0,i],459161)},499569,e=>{"use strict";var t=e.i(843476),r=e.i(437902),o=e.i(898586),i=e.i(362024);let{Text:a}=o.Typography,{Panel:n}=i.Collapse;e.s(["default",0,({events:e,className:o})=>{if(!e||0===e.length)return null;let a=e.find(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_list_tools"&&e.item.tools&&e.item.tools.length>0),s=e.filter(e=>"response.output_item.done"===e.type&&e.item?.type==="mcp_call");return a||0!==s.length?(0,t.jsxs)("div",{className:`jsx-32b14b04f420f3ac mcp-events-display ${o||""}`,children:[(0,t.jsx)(r.default,{id:"32b14b04f420f3ac",children:".openai-mcp-tools.jsx-32b14b04f420f3ac{margin:0;padding:0;position:relative}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse.jsx-32b14b04f420f3ac,.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-item.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac{color:#9ca3af!important;background:0 0!important;border:none!important;min-height:20px!important;padding:0 0 0 20px!important;font-size:14px!important;font-weight:400!important;line-height:20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-header.jsx-32b14b04f420f3ac:hover{color:#6b7280!important;background:0 0!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content.jsx-32b14b04f420f3ac{background:0 0!important;border:none!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-content-box.jsx-32b14b04f420f3ac{padding:4px 0 0 20px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac{color:#9ca3af!important;justify-content:center!important;align-items:center!important;width:16px!important;height:16px!important;font-size:10px!important;display:flex!important;position:absolute!important;top:2px!important;left:2px!important}.openai-mcp-tools.jsx-32b14b04f420f3ac .ant-collapse-expand-icon.jsx-32b14b04f420f3ac:hover{color:#6b7280!important}.openai-vertical-line.jsx-32b14b04f420f3ac{opacity:.8;background-color:#f3f4f6;width:.5px;position:absolute;top:18px;bottom:0;left:9px}.tool-item.jsx-32b14b04f420f3ac{color:#4b5563;z-index:1;background:#fff;margin:0;padding:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:18px;position:relative}.mcp-section.jsx-32b14b04f420f3ac{z-index:1;background:#fff;margin-bottom:12px;position:relative}.mcp-section.jsx-32b14b04f420f3ac:last-child{margin-bottom:0}.mcp-section-header.jsx-32b14b04f420f3ac{color:#6b7280;margin-bottom:4px;font-size:13px;font-weight:500}.mcp-code-block.jsx-32b14b04f420f3ac{background:#f9fafb;border:1px solid #f3f4f6;border-radius:6px;padding:8px;font-size:12px}.mcp-json.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;word-wrap:break-word;margin:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcp-approved.jsx-32b14b04f420f3ac{color:#6b7280;align-items:center;font-size:13px;display:flex}.mcp-checkmark.jsx-32b14b04f420f3ac{color:#10b981;margin-right:6px;font-weight:700}.mcp-response-content.jsx-32b14b04f420f3ac{color:#374151;white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,SF Mono,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:1.5}"}),(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac openai-mcp-tools",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac openai-vertical-line"}),(0,t.jsxs)(i.Collapse,{ghost:!0,size:"small",expandIconPosition:"start",defaultActiveKey:a?["list-tools"]:s.map((e,t)=>`mcp-call-${t}`),children:[a&&(0,t.jsx)(n,{header:"List tools",children:(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac",children:a.item?.tools?.map((e,r)=>(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac tool-item",children:e.name},r))})},"list-tools"),s.map((e,r)=>(0,t.jsx)(n,{header:e.item?.name||"Tool call",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac",children:[(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Request"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-code-block",children:e.item?.arguments&&(0,t.jsx)("pre",{className:"jsx-32b14b04f420f3ac mcp-json",children:(()=>{try{return JSON.stringify(JSON.parse(e.item.arguments),null,2)}catch(t){return e.item.arguments}})()})})]}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-approved",children:[(0,t.jsx)("span",{className:"jsx-32b14b04f420f3ac mcp-checkmark",children:"✓"})," Approved"]})}),e.item?.output&&(0,t.jsxs)("div",{className:"jsx-32b14b04f420f3ac mcp-section",children:[(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-section-header",children:"Response"}),(0,t.jsx)("div",{className:"jsx-32b14b04f420f3ac mcp-response-content",children:e.item.output})]})]})},`mcp-call-${r}`))]})]})]}):null}])},936772,e=>{"use strict";var t=e.i(843476),r=e.i(271645),o=e.i(464571),i=e.i(918789),a=e.i(650056),n=e.i(219470),s=e.i(755151),l=e.i(240647),c=e.i(812618);e.s(["default",0,({reasoningContent:e})=>{let[d,u]=(0,r.useState)(!0);return e?(0,t.jsxs)("div",{className:"reasoning-content mt-1 mb-2",children:[(0,t.jsxs)(o.Button,{type:"text",className:"flex items-center text-xs text-gray-500 hover:text-gray-700",onClick:()=>u(!d),icon:(0,t.jsx)(c.BulbOutlined,{}),children:[d?"Hide reasoning":"Show reasoning",d?(0,t.jsx)(s.DownOutlined,{className:"ml-1"}):(0,t.jsx)(l.RightOutlined,{className:"ml-1"})]}),d&&(0,t.jsx)("div",{className:"mt-2 p-3 bg-gray-50 border border-gray-200 rounded-md text-sm text-gray-700 max-w-full overflow-x-auto whitespace-pre-wrap break-words",style:{wordBreak:"break-word",overflowWrap:"break-word"},children:(0,t.jsx)(i.default,{components:{code({node:e,inline:r,className:o,children:i,...s}){let l=/language-(\w+)/.exec(o||"");return!r&&l?(0,t.jsx)(a.Prism,{style:n.coy,language:l[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...s,children:String(i).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${o} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...s,children:i})},pre:({node:e,...r})=>(0,t.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...r})},children:e})})]}):null}])},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ExportOutlined",0,a],872934)},245094,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["CodeOutlined",0,a],245094)},569074,e=>{"use strict";let t=(0,e.i(475254).default)("upload",[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]);e.s(["Upload",0,t],569074)},132104,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let o={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 i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ArrowUpOutlined",0,a],132104)},447593,285903,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645),o={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"},i=e.i(9583),a=r.forwardRef(function(e,a){return r.createElement(i.default,(0,t.default)({},e,{ref:a,icon:o}))});e.s(["ClearOutlined",0,a],447593);var n=e.i(843476),s=e.i(592968),l=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=r.forwardRef(function(e,o){return r.createElement(i.default,(0,t.default)({},e,{ref:o,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 p=r.forwardRef(function(e,o){return r.createElement(i.default,(0,t.default)({},e,{ref:o,icon:u}))}),m=e.i(872934),h=e.i(812618),f=e.i(366308);let g={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 b=r.forwardRef(function(e,o){return r.createElement(i.default,(0,t.default)({},e,{ref:o,icon:g}))});e.s(["default",0,({timeToFirstToken:e,totalLatency:t,usage:r,toolName:o})=>e||t||r?(0,n.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,n.jsx)(s.Tooltip,{title:"Time to first token",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(l.ClockCircleOutlined,{className:"mr-1"}),(0,n.jsxs)("span",{children:["TTFT: ",(e/1e3).toFixed(2),"s"]})]})}),void 0!==t&&(0,n.jsx)(s.Tooltip,{title:"Total latency",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(l.ClockCircleOutlined,{className:"mr-1"}),(0,n.jsxs)("span",{children:["Total Latency: ",(t/1e3).toFixed(2),"s"]})]})}),r?.promptTokens!==void 0&&(0,n.jsx)(s.Tooltip,{title:"Prompt tokens",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(p,{className:"mr-1"}),(0,n.jsxs)("span",{children:["In: ",r.promptTokens]})]})}),r?.completionTokens!==void 0&&(0,n.jsx)(s.Tooltip,{title:"Completion tokens",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(m.ExportOutlined,{className:"mr-1"}),(0,n.jsxs)("span",{children:["Out: ",r.completionTokens]})]})}),r?.reasoningTokens!==void 0&&(0,n.jsx)(s.Tooltip,{title:"Reasoning tokens",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(h.BulbOutlined,{className:"mr-1"}),(0,n.jsxs)("span",{children:["Reasoning: ",r.reasoningTokens]})]})}),r?.totalTokens!==void 0&&(0,n.jsx)(s.Tooltip,{title:"Total tokens",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(d,{className:"mr-1"}),(0,n.jsxs)("span",{children:["Total: ",r.totalTokens]})]})}),r?.cost!==void 0&&(0,n.jsx)(s.Tooltip,{title:"Cost",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(b,{className:"mr-1"}),(0,n.jsxs)("span",{children:["$",r.cost.toFixed(6)]})]})}),o&&(0,n.jsx)(s.Tooltip,{title:"Tool used",children:(0,n.jsxs)("div",{className:"flex items-center",children:[(0,n.jsx)(f.ToolOutlined,{className:"mr-1"}),(0,n.jsxs)("span",{children:["Tool: ",o]})]})})]}):null],285903)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0qmwyxhqsmi-v.js b/litellm/proxy/_experimental/out/_next/static/chunks/0qmwyxhqsmi-v.js new file mode 100644 index 00000000000..8c3392ae2c4 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0qmwyxhqsmi-v.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,9314,645526,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(981339);e.i(247167);var s=e.i(931067),i=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.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.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 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 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.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.9-1.7-203.3 89.2-203.3 199.9 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.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};var n=e.i(9583),o=i.forwardRef(function(e,t){return i.createElement(n.default,(0,s.default)({},e,{ref:t,icon:r}))});e.s(["TeamOutlined",0,o],645526);var d=e.i(599724),c=e.i(263147);e.s(["default",0,({value:e,onChange:s,placeholder:i="Select access groups",disabled:r=!1,style:n,className:u,showLabel:m=!1,labelText:g="Access Group",allowClear:p=!0})=>{let{data:h,isLoading:x,isError:y}=(0,c.useAccessGroups)();if(x)return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(a.Skeleton.Input,{active:!0,block:!0,style:{height:32,...n}})]});let b=(h??[]).map(e=>({label:(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-medium",children:e.access_group_name})," ",(0,t.jsxs)("span",{className:"text-gray-400 text-xs",children:["(",e.access_group_id,")"]})]}),value:e.access_group_id,selectedLabel:e.access_group_name,searchText:`${e.access_group_name} ${e.access_group_id}`}));return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(l.Select,{mode:"multiple",value:e,placeholder:i,onChange:s,disabled:r,allowClear:p,showSearch:!0,style:{width:"100%",...n},className:`rounded-md ${u??""}`,notFoundContent:y?(0,t.jsx)("span",{className:"text-red-500",children:"Failed to load access groups"}):"No access groups found",filterOption:(e,t)=>(b.find(e=>e.value===t?.value)?.searchText??"").toLowerCase().includes(e.toLowerCase()),optionLabelProp:"selectedLabel",options:b.map(e=>({label:e.label,value:e.value,selectedLabel:e.selectedLabel}))})]})}],9314)},533882,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(250980),s=e.i(797672),i=e.i(68155),r=e.i(304967),n=e.i(629569),o=e.i(599724),d=e.i(269200),c=e.i(427612),u=e.i(64848),m=e.i(942232),g=e.i(496020),p=e.i(977572),h=e.i(992619),x=e.i(727749);e.s(["default",0,({accessToken:e,initialModelAliases:y={},onAliasUpdate:b,showExampleConfig:f=!0})=>{let[j,_]=(0,l.useState)([]),[v,A]=(0,l.useState)({aliasName:"",targetModel:""}),[w,k]=(0,l.useState)(null);(0,l.useEffect)(()=>{_(Object.entries(y).map(([e,t],l)=>({id:`${l}-${e}`,aliasName:e,targetModel:t})))},[y]);let N=()=>{if(!w)return;if(!w.aliasName||!w.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.id!==w.id&&e.aliasName===w.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=j.map(e=>e.id===w.id?w:e);_(e),k(null);let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias updated successfully")},C=()=>{k(null)},S=j.reduce((e,t)=>(e[t.aliasName]=t.targetModel,e),{});return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Add New Alias"}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Alias Name"}),(0,t.jsx)("input",{type:"text",value:v.aliasName,onChange:e=>A({...v,aliasName:e.target.value}),placeholder:"e.g., gpt-4o",className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Target Model"}),(0,t.jsx)(h.default,{accessToken:e,value:v.targetModel,placeholder:"Select target model",onChange:e=>A({...v,targetModel:e}),showLabel:!1})]}),(0,t.jsx)("div",{className:"flex items-end",children:(0,t.jsxs)("button",{onClick:()=>{if(!v.aliasName||!v.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.aliasName===v.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=[...j,{id:`${Date.now()}-${v.aliasName}`,aliasName:v.aliasName,targetModel:v.targetModel}];_(e),A({aliasName:"",targetModel:""});let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias added successfully")},disabled:!v.aliasName||!v.targetModel,className:`flex items-center px-4 py-2 rounded-md text-sm ${!v.aliasName||!v.targetModel?"bg-gray-300 text-gray-500 cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700"}`,children:[(0,t.jsx)(a.PlusCircleIcon,{className:"w-4 h-4 mr-1"}),"Add Alias"]})})]})]}),(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Manage Existing Aliases"}),(0,t.jsx)("div",{className:"rounded-lg custom-border relative mb-6",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)(d.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,t.jsx)(c.TableHead,{children:(0,t.jsxs)(g.TableRow,{children:[(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Alias Name"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Target Model"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Actions"})]})}),(0,t.jsxs)(m.TableBody,{children:[j.map(l=>(0,t.jsx)(g.TableRow,{className:"h-8",children:w&&w.id===l.id?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)("input",{type:"text",value:w.aliasName,onChange:e=>k({...w,aliasName:e.target.value}),className:"w-full px-2 py-1 border border-gray-300 rounded-md text-sm"})}),(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)(h.default,{accessToken:e,value:w.targetModel,onChange:e=>k({...w,targetModel:e}),showLabel:!1,style:{height:"32px"}})}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:N,className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:"Save"}),(0,t.jsx)("button",{onClick:C,className:"text-xs bg-gray-50 text-gray-600 px-2 py-1 rounded-sm hover:bg-gray-100",children:"Cancel"})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-900",children:l.aliasName}),(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-500",children:l.targetModel}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>{k({...l})},className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:(0,t.jsx)(s.PencilIcon,{className:"w-3 h-3"})}),(0,t.jsx)("button",{onClick:()=>{var e;let t,a;return e=l.id,_(t=j.filter(t=>t.id!==e)),a={},void(t.forEach(e=>{a[e.aliasName]=e.targetModel}),b&&b(a),x.default.success("Alias deleted successfully"))},className:"text-xs bg-red-50 text-red-600 px-2 py-1 rounded-sm hover:bg-red-100",children:(0,t.jsx)(i.TrashIcon,{className:"w-3 h-3"})})]})})]})},l.id)),0===j.length&&(0,t.jsx)(g.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:3,className:"py-0.5 text-sm text-gray-500 text-center",children:"No aliases added yet. Add a new alias above."})})]})]})})}),f&&(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(n.Title,{className:"mb-4",children:"Configuration Example"}),(0,t.jsx)(o.Text,{className:"text-gray-600 mb-4",children:"Here's how your current aliases would look in the config:"}),(0,t.jsx)("div",{className:"bg-gray-100 rounded-lg p-4 font-mono text-sm",children:(0,t.jsxs)("div",{className:"text-gray-700",children:["model_aliases:",0===Object.keys(S).length?(0,t.jsxs)("span",{className:"text-gray-500",children:[(0,t.jsx)("br",{}),"  # No aliases configured yet"]}):Object.entries(S).map(([e,l])=>(0,t.jsxs)("span",{children:[(0,t.jsx)("br",{}),'  "',e,'": "',l,'"']},e))]})})]})]})}])},552130,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select agents",disabled:d=!1})=>{let[c,u]=(0,l.useState)([]),[m,g]=(0,l.useState)([]),[p,h]=(0,l.useState)(!1);(0,l.useEffect)(()=>{(async()=>{if(n){h(!0);try{let e=await (0,s.getAgentsList)(n),t=e?.agents||[];u(t);let l=new Set;t.forEach(e=>{let t=e.agent_access_groups;t&&Array.isArray(t)&&t.forEach(e=>l.add(e))}),g(Array.from(l))}catch(e){console.error("Error fetching agents:",e)}finally{h(!1)}}})()},[n]);let x=[...m.map(e=>({label:e,value:`group:${e}`,isAccessGroup:!0,searchText:`${e} Access Group`})),...c.map(e=>({label:`${e.agent_name||e.agent_id}`,value:e.agent_id,isAccessGroup:!1,searchText:`${e.agent_name||e.agent_id} ${e.agent_id} Agent`}))],y=[...i?.agents||[],...(i?.accessGroups||[]).map(e=>`group:${e}`)];return(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:o,onChange:t=>{e({agents:t.filter(e=>!e.startsWith("group:")),accessGroups:t.filter(e=>e.startsWith("group:")).map(e=>e.replace("group:",""))})},value:y,loading:p,className:r,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:d,filterOption:(e,t)=>(x.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:x.map(e=>(0,t.jsx)(a.Select.Option,{value:e.value,label:e.label,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:e.isAccessGroup?"#52c41a":"#722ed1",flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:e.isAccessGroup?"#52c41a":"#722ed1",fontSize:"12px",fontWeight:500,opacity:.8},children:e.isAccessGroup?"Access Group":"Agent"})]})},e.value))})})}])},844565,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select pass through routes",disabled:d=!1,teamId:c})=>{let[u,m]=(0,l.useState)([]),[g,p]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{(async()=>{if(n){p(!0);try{let e=await (0,s.getPassThroughEndpointsCall)(n,c);if(e.endpoints){let t=e.endpoints.flatMap(e=>{let t=e.path,l=e.methods;return l&&l.length>0?l.map(e=>({label:`${e} ${t}`,value:t})):[{label:t,value:t}]});m(t)}}catch(e){console.error("Error fetching pass through routes:",e)}finally{p(!1)}}})()},[n,c]),(0,t.jsx)(a.Select,{mode:"tags",placeholder:o,onChange:e,value:i,loading:g,className:r,allowClear:!0,options:u,optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:d})}])},810757,477386,e=>{"use strict";var t=e.i(271645);let l=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}))});e.s(["CogIcon",0,l],810757);let a=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"}))});e.s(["BanIcon",0,a],477386)},557662,e=>{"use strict";let t={src:e.i(196361).default,width:823,height:807,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABCUlEQVR42k2Ov0sCYRjH3/f09c68NOuiLg+NvMM6qIaIhgKDlgbBBiH7ARbkFAr+wEFwUBzUSRwUN3+Am4Kbg4sIIg4iOugiguDm5F/gvaLiF57l83yf5/sFYC0VQdJJnS0bObUkSCgnwa4ggPD94O57KkYX46vw/HVftECMNzKRJ2JL8A+KekelfO6s1Y3utl6hNayWahmlznIfhQbv6V4oGP6aOrvtCIFRnH1LKQmkBC7G7BtehmZWzY0NRxEAEo7Dhz/MvrT3P6BvCk5irDVJQURhAx5aKpzh7Pkm7+2BZ1p4YeT0MYIy5Dx6/P+UrvAXFml0TyqjeVtUytsrGX6rac6ew+YNXwKfsTPy4XOyEQAAAABJRU5ErkJggg=="},l={src:e.i(614148).default,width:600,height:450,blurWidth:0,blurHeight:0},a={src:e.i(858236).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqklEQVR42mXOzQqCQBQF4NG8PVKLalNRrxW01EgUghZm4Tu0aV3gopBCaDDoh8LMyubaCzQzLj2c1fk2h/zwyZvjI8NTmtMXHj94yfBG5JqE0WrsDWyv70eLGOkbrwJotG316lDVeJvd2pouE3YW4M4nAEBkADTD1eOvBNPUFUUpQAMwplbK7gJsa6hWVG58bXTam0OAmAjYBT63kWk4Myeke2TiJynulvsHOZp6y2XrD90AAAAASUVORK5CYII="},s={src:e.i(508296).default,width:180,height:180,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvXivVvITItyZVvSwKFmDRbjjPYDB/SutONn6fiaaH/9k="},i={src:e.i(324755).default,width:48,height:48,blurWidth:0,blurHeight:0},r={src:e.i(475151).default,width:14,height:16,blurWidth:0,blurHeight:0},n={src:e.i(274286).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA/ElEQVR42m3Pz0vCUADA8ed7a3uBjb0sx5C1Ri1oIDJSKEdJgyEFtbwFgScpsGNR1CmyS0Ho0ZOggv+A4F3B30f9HwRRwYMICupNPPg5fa9fANazLQtCtC0jdGbSdFSmN6+Ry/tIHd/+w52jOwyRCDRZL+UJ6eREdXauR0dq8HtiBl7mD25r+MtyLfBO+Fpm19UXTsJ17LnPWhyf+rNvVWOiu38j+Zrgk/CNuHDYtfsiRUa1khYnpH9Y0viQtIGxf1oGfsVoFxzOYULR51f+p6lifo09wdjs0hvuvbKkAhDF7GkUFYpgnLhg8DPtOAghOfAGiWRs2KBz/dqKBVIdOzeF2+/ZAAAAAElFTkSuQmCC"},o={src:e.i(436494).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAnElEQVR42oXOsQqCUACF4ftWvUFbBFFzQSVRLQ5RmRDkUJFTIUFNEQgNDWFTNURjgyAiOgiiCF7FQRCcVFQQJ1H4t284B1gwzA0UAS/A2+N7pp8nmrne3yynJ6Cp3mBBoARZbfcqjVZ3tkSwlSw7QFHc5gitI+M1delM8LhafyhKNjCN4PPjsR2Fk8f59jDd7JnXHxp+Oh5zVsmrCGlHlzZm+jq8AAAAAElFTkSuQmCC"},d={src:e.i(204086).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhElEQVR42oWPuw0DIRBEr6g7aIGQAAQSEiTk1EAHVILogIQAQUPOxoKT5cSfYDbYedqdOc7zfFzXhU9a3vHNfGkDhBB472GMQQgB1lo45/Z+A4wx9N6Rc8acE7VWpJRuYI0YI1prW6UUjDHAOb9fLEAIAaXUPi2lhNYalNJ3hp8h/9V8AqCAe6iqrOaAAAAAAElFTkSuQmCC"},c={src:e.i(531150).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA40lEQVR42lWOvesBcQDGz0/9VmUl/4lSyqaUic5gM0jKSBlISgaXwWCwGc7gFPKeIikUMXAldec9Wdx5uft+v3KFMzzL8/k89WAIIUweyLG6W9tRFNmKGUHw9wMfAvgfDBfWddWbv5aNE5Gtmr9LiBSNzgq3uQv7UKzY2tZ9uXvfl/4IxxOvyeZn/niyQkWJJkXTjB7ez2oJHk6cNpzo5ohUjeTHRICnSScEQPliGIKistef23FPYUNSo6CwJHGw6xgQggpJEBYZ12UQiY2njOnCPVSv528oCWDbNopMySIv5XkCtum3l9/HqzEAAAAASUVORK5CYII="},u=[{id:"arize",displayName:"Arize",logo:t.src,supports_key_team_logging:!0,dynamic_params:{arize_api_key:"password",arize_space_id:"password"},description:"Arize Logging Integration"},{id:"braintrust",displayName:"Braintrust",logo:a.src,supports_key_team_logging:!1,dynamic_params:{braintrust_api_key:"password",braintrust_project_name:"text"},description:"Braintrust Logging Integration"},{id:"custom_callback_api",displayName:"Custom Callback API",supports_key_team_logging:!0,dynamic_params:{custom_callback_api_url:"text",custom_callback_api_headers:"text"},description:"Custom Callback API Logging Integration"},{id:"galileo",displayName:"Galileo",logo:i.src,supports_key_team_logging:!1,dynamic_params:{GALILEO_API_KEY:"password",GALILEO_PROJECT_ID:"text",GALILEO_LOG_STREAM_ID:"text",GALILEO_BASE_URL:"text",GALILEO_USERNAME:"text",GALILEO_PASSWORD:"password"},description:"Galileo AI Observability Integration"},{id:"datadog",displayName:"Datadog",logo:s.src,supports_key_team_logging:!1,dynamic_params:{dd_api_key:"password",dd_site:"text"},description:"Datadog Logging Integration"},{id:"lago",displayName:"Lago",logo:r.src,supports_key_team_logging:!1,dynamic_params:{lago_api_url:"text",lago_api_key:"password"},description:"Lago Billing Logging Integration"},{id:"langfuse",displayName:"Langfuse",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v2 Logging Integration"},{id:"langfuse_otel",displayName:"Langfuse OTEL",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v3 OTEL Logging Integration"},{id:"langsmith",displayName:"LangSmith",logo:o.src,supports_key_team_logging:!0,dynamic_params:{langsmith_api_key:"password",langsmith_project:"text",langsmith_base_url:"text",langsmith_sampling_rate:"number"},description:"Langsmith Logging Integration"},{id:"openmeter",displayName:"OpenMeter",logo:d.src,supports_key_team_logging:!1,dynamic_params:{openmeter_api_key:"password",openmeter_base_url:"text"},description:"OpenMeter Logging Integration"},{id:"otel",displayName:"Open Telemetry",logo:c.src,supports_key_team_logging:!1,dynamic_params:{otel_endpoint:"text",otel_headers:"text"},description:"OpenTelemetry Logging Integration"},{id:"s3",displayName:"S3",logo:l.src,supports_key_team_logging:!1,dynamic_params:{s3_bucket_name:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"S3 Bucket (AWS) Logging Integration"},{id:"SQS",displayName:"SQS",logo:l.src,supports_key_team_logging:!1,dynamic_params:{sqs_queue_url:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"SQS Queue (AWS) Logging Integration"}],m=u.reduce((e,t)=>(e[t.displayName]=t,e),{}),g=u.reduce((e,t)=>(e[t.displayName]=t.id,e),{}),p=u.reduce((e,t)=>(e[t.id]=t.displayName,e),{});e.s(["callbackInfo",0,m,"callback_map",0,g,"mapDisplayToInternalNames",0,e=>e.map(e=>g[e]||e),"mapInternalToDisplayNames",0,e=>e.map(e=>p[e]||e),"reverse_callback_map",0,p],557662)},266484,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(592968),s=e.i(312361),i=e.i(827252),r=e.i(994388),n=e.i(304967),o=e.i(779241),d=e.i(988297),c=e.i(68155),u=e.i(810757),m=e.i(477386),g=e.i(557662),p=e.i(174553),h=e.i(435451);let{Option:x}=l.Select;e.s(["default",0,({value:e=[],onChange:y,disabledCallbacks:b=[],onDisabledCallbacksChange:f})=>{let j=Object.entries(g.callbackInfo).filter(([e,t])=>t.supports_key_team_logging).map(([e,t])=>e),_=Object.keys(g.callbackInfo),v=e=>{y?.(e)},A=(t,l,a)=>{let s=[...e];if("callback_name"===l){let e=g.callback_map[a]||a;s[t]={...s[t],[l]:e,callback_vars:{}}}else s[t]={...s[t],[l]:a};v(s)},w=(t,l,a)=>{let s=[...e];s[t]={...s[t],callback_vars:{...s[t].callback_vars,[l]:a}},v(s)};return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(m.BanIcon,{className:"w-5 h-5 text-red-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Disabled Callbacks"}),(0,t.jsx)(a.Tooltip,{title:"Select callbacks to disable for this key. Disabled callbacks will not receive any logging data.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Disabled Callbacks"}),(0,t.jsx)(l.Select,{mode:"multiple",placeholder:"Select callbacks to disable",value:b,onChange:e=>{let t=(0,g.mapDisplayToInternalNames)(e);f?.(t)},style:{width:"100%"},optionLabelProp:"label",children:_.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Select callbacks that should be disabled for this key. These callbacks will not receive any logging data."})]})]}),(0,t.jsx)(s.Divider,{}),(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(u.CogIcon,{className:"w-5 h-5 text-blue-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Logging Integrations"}),(0,t.jsx)(a.Tooltip,{title:"Configure callback logging integrations for this team.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsx)(r.Button,{variant:"secondary",onClick:()=>{v([...e,{callback_name:"",callback_type:"success",callback_vars:{}}])},icon:d.PlusIcon,size:"sm",className:"hover:border-blue-400 hover:text-blue-500",type:"button",children:"Add Integration"})]}),(0,t.jsx)("div",{className:"space-y-4",children:e.map((s,i)=>{let d=s.callback_name?Object.entries(g.callback_map).find(([e,t])=>t===s.callback_name)?.[0]:void 0;return(0,t.jsxs)(n.Card,{className:"border border-gray-200 shadow-xs hover:shadow-md transition-shadow duration-200",decoration:"top",decorationColor:"blue",children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[d&&(0,t.jsx)(p.Logo,{src:g.callbackInfo[d]?.logo,label:d,className:"w-5 h-5 object-contain"}),(0,t.jsxs)("span",{className:"text-sm font-medium",children:[d||"New Integration"," Configuration"]})]}),(0,t.jsx)(r.Button,{variant:"light",onClick:()=>{v(e.filter((e,t)=>t!==i))},icon:c.TrashIcon,size:"xs",color:"red",className:"hover:bg-red-50",type:"button",children:"Remove"})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Integration Type"}),(0,t.jsx)(l.Select,{value:d,placeholder:"Select integration",onChange:e=>A(i,"callback_name",e),className:"w-full",optionLabelProp:"label",children:j.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Event Type"}),(0,t.jsxs)(l.Select,{value:s.callback_type,onChange:e=>A(i,"callback_type",e),className:"w-full",children:[(0,t.jsx)(x,{value:"success",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"Success Only"})]})}),(0,t.jsx)(x,{value:"failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-red-500 rounded-full"}),(0,t.jsx)("span",{children:"Failure Only"})]})}),(0,t.jsx)(x,{value:"success_and_failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"Success & Failure"})]})})]})]})]}),((e,l)=>{if(!e.callback_name)return null;let a=Object.entries(g.callback_map).find(([t,l])=>l===e.callback_name)?.[0];if(!a)return null;let s=g.callbackInfo[a]?.dynamic_params||{};return 0===Object.keys(s).length?null:(0,t.jsxs)("div",{className:"mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-4",children:[(0,t.jsx)("div",{className:"w-3 h-3 bg-blue-100 rounded-full flex items-center justify-center",children:(0,t.jsx)("div",{className:"w-1.5 h-1.5 bg-blue-500 rounded-full"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Integration Parameters"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:Object.entries(s).map(([a,s])=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 capitalize flex items-center space-x-1",children:[(0,t.jsx)("span",{children:a.replace(/_/g," ")}),"password"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Sensitive"}),"number"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Number"})]}),"number"===s&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:"Value must be between 0 and 1"}),"number"===s?(0,t.jsx)(h.default,{step:.01,width:400,placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)}):(0,t.jsx)(o.TextInput,{type:"password"===s?"password":"text",placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)})]},a))})]})})(s,i)]})]},i)})}),0===e.length&&(0,t.jsxs)("div",{className:"text-center py-12 text-gray-500 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50",children:[(0,t.jsx)(u.CogIcon,{className:"w-12 h-12 text-gray-300 mb-3 mx-auto"}),(0,t.jsx)("div",{className:"text-base font-medium mb-1",children:"No logging integrations configured"}),(0,t.jsx)("div",{className:"text-sm text-gray-400",children:'Click "Add Integration" to configure logging for this team'})]})]})}])},460285,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(404206),s=e.i(723731),i=e.i(653824),r=e.i(881073),n=e.i(197647),o=e.i(266027),d=e.i(343488),c=e.i(602869),u=e.i(158392),m=e.i(419470),g=e.i(695411);let p=(0,l.forwardRef)(({accessToken:e,value:p,onChange:h,modelData:x,teamId:y},b)=>{let[f,j]=(0,l.useState)({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),[_,v]=(0,l.useState)([]),[A,w]=(0,l.useState)([]),[k,N]=(0,l.useState)([]),[C,S]=(0,l.useState)({}),[I,T]=(0,l.useState)({}),L=(0,l.useRef)(!1),E=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=p?.router_settings?JSON.stringify({routing_strategy:p.router_settings.routing_strategy,fallbacks:p.router_settings.fallbacks,enable_tag_filtering:p.router_settings.enable_tag_filtering}):null;if(L.current&&e===E.current){L.current=!1;return}if(L.current&&e!==E.current&&(L.current=!1),e!==E.current)if(E.current=e,p?.router_settings){let e=p.router_settings,{fallbacks:t,...l}=e;j({routerSettings:l,selectedStrategy:e.routing_strategy||null,enableTagFiltering:e.enable_tag_filtering??!1});let a=e.fallbacks||[];v(a),w(a&&0!==a.length?a.map((e,t)=>{let[l,a]=Object.entries(e)[0];return{id:(t+1).toString(),primaryModel:l||null,fallbackModels:a||[]}}):[{id:"1",primaryModel:null,fallbackModels:[]}])}else j({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),v([]),w([{id:"1",primaryModel:null,fallbackModels:[]}])},[p]),(0,l.useEffect)(()=>{e&&(0,c.getRouterSettingsCall)(e).then(e=>{if(e.fields){let t={};e.fields.forEach(e=>{t[e.field_name]={ui_field_name:e.ui_field_name,field_description:e.field_description,options:e.options,link:e.link}}),S(t);let l=e.fields.find(e=>"routing_strategy"===e.field_name);l?.options&&N(l.options),e.routing_strategy_descriptions&&T(e.routing_strategy_descriptions)}})},[e]);let{data:O=[]}=(0,o.useQuery)({queryKey:["fallbackAvailableModels",e,y??null],queryFn:()=>y?(0,g.fetchAvailableModelsForTeam)(e,y):(0,g.fetchAvailableModels)(e),enabled:!!e}),F=()=>{let e=new Set(["allowed_fails","cooldown_time","num_retries","timeout","retry_after"]),t=new Set(["model_group_alias","retry_policy"]),l=Object.fromEntries(Object.entries({...f.routerSettings,enable_tag_filtering:f.enableTagFiltering,routing_strategy:f.selectedStrategy,fallbacks:_.length>0?_:null}).map(([l,a])=>{if("routing_strategy_args"!==l&&"routing_strategy"!==l&&"enable_tag_filtering"!==l&&"fallbacks"!==l){let s=document.querySelector(`input[name="${l}"]`);if(s){if(void 0!==s.value&&""!==s.value){let i=((l,a,s)=>{if(null==a)return s;let i=String(a).trim();if(""===i||"null"===i.toLowerCase())return null;if(e.has(l)){let e=Number(i);return Number.isNaN(e)?s:e}if(t.has(l)){if(""===i)return null;try{return JSON.parse(i)}catch{return s}}return"true"===i.toLowerCase()||"false"!==i.toLowerCase()&&i})(l,s.value,a);return[l,i]}return[l,null]}}else if("routing_strategy"===l)return[l,f.selectedStrategy];else if("enable_tag_filtering"===l)return[l,f.enableTagFiltering];else if("fallbacks"===l)return[l,_.length>0?_:null];else if("routing_strategy_args"===l&&"latency-based-routing"===f.selectedStrategy){let e=document.querySelector('input[name="lowest_latency_buffer"]'),t=document.querySelector('input[name="ttl"]'),l={};return e?.value&&(l.lowest_latency_buffer=Number(e.value)),t?.value&&(l.ttl=Number(t.value)),["routing_strategy_args",Object.keys(l).length>0?l:null]}return[l,a]}).filter(e=>null!=e)),a=(e,t=!1)=>null==e||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length||t&&("number"!=typeof e||Number.isNaN(e))?null:e;return{routing_strategy:a(l.routing_strategy),allowed_fails:a(l.allowed_fails,!0),cooldown_time:a(l.cooldown_time,!0),num_retries:a(l.num_retries,!0),timeout:a(l.timeout,!0),retry_after:a(l.retry_after,!0),fallbacks:_.length>0?_:null,context_window_fallbacks:a(l.context_window_fallbacks),retry_policy:a(l.retry_policy),model_group_alias:a(l.model_group_alias),enable_tag_filtering:f.enableTagFiltering,routing_strategy_args:a(l.routing_strategy_args)}},M=(0,d.useDebouncedCallback)(()=>{h&&(L.current=!0,h({router_settings:F()}))},{wait:100});(0,l.useEffect)(()=>{h&&M()},[f,_]);let R=Array.from(new Set(O.map(e=>e.model_group))).sort();return((0,l.useImperativeHandle)(b,()=>({getValue:()=>({router_settings:F()})})),e)?(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)(i.TabGroup,{className:"w-full",children:[(0,t.jsxs)(r.TabList,{variant:"line",defaultValue:"1",className:"px-8 pt-4",children:[(0,t.jsx)(n.Tab,{value:"1",children:"Loadbalancing"}),(0,t.jsx)(n.Tab,{value:"2",children:"Fallbacks"})]}),(0,t.jsxs)(s.TabPanels,{className:"px-8 py-6",children:[(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(u.default,{value:f,onChange:j,routerFieldsMetadata:C,availableRoutingStrategies:k,routingStrategyDescriptions:I})}),(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(m.FallbackSelectionForm,{groups:A,onGroupsChange:e=>{w(e),v(e.filter(e=>e.primaryModel&&e.fallbackModels.length>0).map(e=>({[e.primaryModel]:e.fallbackModels})))},availableModels:R,maxGroups:5})})]})]})}):null});p.displayName="RouterSettingsAccordion",e.s(["default",0,p])},207082,e=>{"use strict";var t=e.i(619273),l=e.i(266027),a=e.i(243652),s=e.i(602869),i=e.i(431703),r=e.i(135214);let n=(0,a.createQueryKeys)("keys"),o=async(e,t,l,a={})=>{try{let r=(0,s.getProxyBaseUrl)(),n=new URLSearchParams(Object.entries({team_id:a.teamID,project_id:a.projectID,agent_id:a.agentID,organization_id:a.organizationID,key_alias:a.selectedKeyAlias,key_hash:a.keyHash,user_id:a.userID,page:t,size:l,sort_by:a.sortBy,sort_order:a.sortOrder,expand:a.expand,status:a.status,return_full_object:"true",include_team_keys:"true",include_created_by_keys:"true",substring_matching:"true"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),o=`${r?`${r}/key/list`:"/key/list"}?${n}`,d=await fetch(o,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!d.ok){let e=await d.json(),t=(0,i.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await d.json()}catch(e){throw console.error("Failed to list keys:",e),e}},d=(0,a.createQueryKeys)("deletedKeys");e.s(["keyKeys",0,n,"useDeletedKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:d.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,{...s,status:"deleted"}),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})},"useKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:n.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,s),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})}])},510674,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(431703),i=e.i(135214),r=e.i(708347);let n=(0,l.createQueryKeys)("projects"),o=[...r.all_admin_roles,...r.internalUserRoles],d=async e=>{let t=(0,a.getProxyBaseUrl)(),l=`${t}/project/list`,i=await fetch(l,{method:"GET",headers:{[(0,a.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let e=await i.json(),t=(0,s.deriveErrorMessage)(e);throw(0,a.handleError)(t),Error(t)}return i.json()};e.s(["projectKeys",0,n,"useProjects",0,()=>{let{accessToken:e,userRole:l}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list({}),queryFn:async()=>d(e),enabled:!!e&&o.includes(l)})}])},392110,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(592968),i=e.i(312361),r=e.i(790848),n=e.i(536916),o=e.i(808613),d=e.i(827252),c=e.i(779241);let{Option:u}=a.Select;e.s(["default",0,({form:e,autoRotationEnabled:m,onAutoRotationChange:g,rotationInterval:p,onRotationIntervalChange:h,isCreateMode:x=!1,neverExpire:y=!1,onNeverExpireChange:b})=>{let f=p&&!["7d","30d","90d","180d","365d"].includes(p),[j,_]=(0,l.useState)(f),[v,A]=(0,l.useState)(f?p:"");return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Key Expiry Settings"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Expire Key"}),(0,t.jsx)(s.Tooltip,{title:"Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to keep the current expiry unchanged.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})}),!x&&b&&(0,t.jsx)(n.Checkbox,{checked:y,onChange:t=>{let l=t.target.checked;b(l),l&&(e&&"function"==typeof e.setFieldValue?e.setFieldValue("duration",""):e&&"function"==typeof e.setFieldsValue&&e.setFieldsValue({duration:""}))},className:"ml-2 text-sm font-normal text-gray-600",children:"Never Expire"})]}),(0,t.jsx)(o.Form.Item,{name:"duration",noStyle:!0,initialValue:"",children:(0,t.jsx)(c.TextInput,{placeholder:x?"e.g., 30d or leave empty to never expire":"e.g., 30d",className:"w-full",disabled:!x&&y})})]})]}),(0,t.jsx)(i.Divider,{}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Auto-Rotation Settings"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Enable Auto-Rotation"}),(0,t.jsx)(s.Tooltip,{title:"Key will automatically regenerate at the specified interval for enhanced security.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsx)(r.Switch,{checked:m,onChange:g,size:"default",className:m?"":"bg-gray-400"})]}),m&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Rotation Interval"}),(0,t.jsx)(s.Tooltip,{title:"How often the key should be automatically rotated. Choose the interval that best fits your security requirements.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(a.Select,{value:j?"custom":p,onChange:e=>{"custom"===e?_(!0):(_(!1),A(""),h(e))},className:"w-full",placeholder:"Select interval",children:[(0,t.jsx)(u,{value:"7d",children:"7 days"}),(0,t.jsx)(u,{value:"30d",children:"30 days"}),(0,t.jsx)(u,{value:"90d",children:"90 days"}),(0,t.jsx)(u,{value:"180d",children:"180 days"}),(0,t.jsx)(u,{value:"365d",children:"365 days"}),(0,t.jsx)(u,{value:"custom",children:"Custom interval"})]}),j&&(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(c.TextInput,{value:v,onChange:e=>{let t=e.target.value;A(t),h(t)},placeholder:"e.g., 1s, 5m, 2h, 14d"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Supported formats: seconds (s), minutes (m), hours (h), days (d)"})]})]})]})]}),m&&(0,t.jsx)("div",{className:"bg-blue-50 p-3 rounded-md text-sm text-blue-700",children:"When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period."})]})]})}])},939510,e=>{"use strict";var t=e.i(843476),l=e.i(808613),a=e.i(199133),s=e.i(592968),i=e.i(827252);let{Option:r}=a.Select;e.s(["default",0,({type:e,name:n,showDetailedDescriptions:o=!0,className:d="",initialValue:c=null,form:u,onChange:m})=>{let g=e.toUpperCase(),p=e.toLowerCase(),h=`Select 'guaranteed_throughput' to prevent overallocating ${g} limit when the key belongs to a Team with specific ${g} limits.`;return(0,t.jsx)(l.Form.Item,{label:(0,t.jsxs)("span",{children:[g," Rate Limit Type"," ",(0,t.jsx)(s.Tooltip,{title:h,children:(0,t.jsx)(i.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:n,initialValue:c,className:d,children:(0,t.jsx)(a.Select,{defaultValue:o?"default":void 0,placeholder:"Select rate limit type",style:{width:"100%"},optionLabelProp:o?"label":void 0,onChange:e=>{u&&u.setFieldValue(n,e),m&&m(e)},children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",label:"Default",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Default"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Best effort throughput - no error if we're overallocating ",p," (Team/Key Limits checked at runtime)."]})]})}),(0,t.jsx)(r,{value:"guaranteed_throughput",label:"Guaranteed throughput",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Guaranteed throughput"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Guaranteed throughput - raise an error if we're overallocating ",p," (also checks model-specific limits)"]})]})}),(0,t.jsx)(r,{value:"dynamic",label:"Dynamic",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Dynamic"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["If the key has a set ",g," (e.g. 2 ",g,") and there are no 429 errors, it can dynamically exceed the limit when the model being called is not erroring."]})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",children:"Best effort throughput"}),(0,t.jsx)(r,{value:"guaranteed_throughput",children:"Guaranteed throughput"}),(0,t.jsx)(r,{value:"dynamic",children:"Dynamic"})]})})})}])},363256,e=>{"use strict";var t=e.i(843476),l=e.i(199133);let{Text:a}=e.i(898586).Typography;e.s(["default",0,({organizations:e,value:s,onChange:i,disabled:r,loading:n,style:o,placeholder:d="All Organizations"})=>(0,t.jsx)(l.Select,{showSearch:!0,placeholder:d,value:s,onChange:i,disabled:r,loading:n,allowClear:!0,style:{minWidth:280,...o},filterOption:(t,l)=>{if(!l)return!1;let a=e?.find(e=>e.organization_id===l.key);if(!a)return!1;let s=t.toLowerCase().trim(),i=(a.organization_alias||"").toLowerCase(),r=(a.organization_id||"").toLowerCase();return i.includes(s)||r.includes(s)},children:e?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.organization_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,t.jsxs)(a,{type:"secondary",children:["(",e.organization_id,")"]})]},e.organization_id))})])},128233,319312,833400,e=>{"use strict";var t=e.i(843476),l=e.i(464571),a=e.i(199133),s=e.i(592968),i=e.i(425063),r=e.i(107233),n=e.i(37727),o=e.i(271645);e.s(["BudgetFallbacksEditor",0,function({value:e,onChange:d,availableModels:c}){let[u,m]=(0,o.useState)(()=>{let t;return 0===(t=Object.keys(e)).length?[]:t.map((t,l)=>({id:String(l+1),primaryModel:t,fallbackModels:e[t]}))}),g=e=>{m(e),d(Object.fromEntries(e.filter(e=>null!==e.primaryModel&&e.fallbackModels.length>0).map(e=>[e.primaryModel,e.fallbackModels])))},p=()=>{g([...u,{id:Date.now().toString(),primaryModel:null,fallbackModels:[]}])},h=(e,t)=>{g(u.map(l=>l.id===e?{...l,...t}:l))},x=new Set(u.map(e=>e.primaryModel).filter(Boolean));return 0===u.length?(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),u.map(e=>{let l=c.filter(t=>t===e.primaryModel||!x.has(t)),r=c.filter(t=>t!==e.primaryModel);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void g(u.filter(e=>e.id!==t))},className:"absolute top-2 right-2 text-gray-400 hover:text-red-500 transition-colors p-1",children:(0,t.jsx)(n.X,{className:"w-4 h-4"})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Primary Model"}),(0,t.jsx)(a.Select,{className:"w-full",placeholder:"Select model",value:e.primaryModel,onChange:t=>{let l=e.fallbackModels.filter(e=>e!==t);h(e.id,{primaryModel:t,fallbackModels:l})},showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:l.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body})]}),(0,t.jsx)("div",{className:"flex items-center justify-center -my-1 mb-2",children:(0,t.jsxs)("div",{className:"bg-amber-50 text-amber-600 px-3 py-0.5 rounded-full text-[10px] font-bold border border-amber-100 flex items-center gap-1",children:[(0,t.jsx)(i.ArrowDown,{className:"w-3 h-3"}),"IF BUDGET EXCEEDED, TRY"]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Fallback Models"}),(0,t.jsx)(a.Select,{mode:"multiple",className:"w-full",placeholder:e.primaryModel?"Select fallback models":"Select a primary model first",value:e.fallbackModels,onChange:t=>h(e.id,{fallbackModels:t}),disabled:!e.primaryModel,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:r.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(s.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})}),e.fallbackModels.length>1&&(0,t.jsx)("div",{className:"text-[10px] text-gray-400 mt-1 ml-1",children:"Tried in order; first model still within its own budget is used"})]})]},e.id)}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]})}],128233);var d=e.i(28651);let c=[{value:"1h",label:"Hourly",resetHint:"Resets every hour"},{value:"24h",label:"Daily",resetHint:"Resets daily at midnight UTC"},{value:"7d",label:"Weekly",resetHint:"Resets every Sunday at midnight UTC"},{value:"30d",label:"Monthly",resetHint:"Resets on the 1st of every month at midnight UTC"}];e.s(["BudgetWindowsEditor",0,function({value:e,onChange:s}){let i=(t,l,a)=>{s(e.map((e,s)=>s===t?{...e,[l]:a}:e))};return(0,t.jsxs)("div",{children:[e.map((r,n)=>{let o=c.find(e=>e.value===r.budget_duration)?.resetHint;return(0,t.jsxs)("div",{style:{marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsx)(a.Select,{value:r.budget_duration,onChange:e=>i(n,"budget_duration",e),style:{width:130},options:c.map(e=>({value:e.value,label:e.label}))}),(0,t.jsx)(d.InputNumber,{step:.01,min:0,precision:2,value:r.max_budget??void 0,onChange:e=>i(n,"max_budget",e??null),placeholder:"Max spend ($)",style:{width:160},prefix:"$"}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{s(e.filter((e,t)=>t!==n))},style:{padding:"0 4px"},children:"✕"})]}),o&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#888",marginTop:3,marginLeft:2},children:["↻ ",o]})]},n)}),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),s([...e,{budget_duration:"24h",max_budget:null}])},children:"+ Add Budget Window"})]})}],319312);var u=e.i(311451);let m=0,g=()=>`tag-row-${m++}`;e.s(["TagRateLimitEditor",0,function({value:e,onChange:a}){let s=(t,l,s)=>{a(e.map((e,a)=>a===t?{...e,[l]:s}:e))};return(0,t.jsxs)("div",{children:[e.map((i,r)=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12},children:[(0,t.jsx)(u.Input,{value:i.tag,onChange:e=>s(r,"tag",e.target.value),placeholder:"Tag (e.g. cell-1)",style:{width:180}}),(0,t.jsx)(d.InputNumber,{min:0,value:i.rpm_limit??void 0,onChange:e=>s(r,"rpm_limit",e??null),placeholder:"RPM",style:{width:120}}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{a(e.filter((e,t)=>t!==r))},style:{padding:"0 4px"},children:"✕"})]},i.id)),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),a([...e,{id:g(),tag:"",rpm_limit:null}])},children:"+ Add Tag Limit"})]})},"tagLimitsToRows",0,e=>{let t=(e=>{if(!e||"object"!=typeof e)return{};let t={};return Object.entries(e).forEach(([e,l])=>{"number"==typeof l&&(t[e]=l)}),t})(e);return Object.keys(t).map(e=>({id:g(),tag:e,rpm_limit:t[e]}))},"tagRowsToLimits",0,e=>{let t={};return e.forEach(({tag:e,rpm_limit:l})=>{let a=e.trim();a&&"number"==typeof l&&(t[a]=l)}),{tag_rpm_limit:t}}],833400)},109034,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(135214);let i=(0,l.createQueryKeys)("tags");e.s(["useTags",0,()=>{let{accessToken:e,userId:l,userRole:r}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,a.tagListCall)(e),enabled:!!(e&&l&&r)})}])},309426,e=>{"use strict";var t=e.i(290571),l=e.i(444755),a=e.i(673706),s=e.i(271645),i=e.i(46757);let r=(0,a.makeClassName)("Col"),n=s.default.forwardRef((e,a)=>{let n,o,d,c,{numColSpan:u=1,numColSpanSm:m,numColSpanMd:g,numColSpanLg:p,children:h,className:x}=e,y=(0,t.__rest)(e,["numColSpan","numColSpanSm","numColSpanMd","numColSpanLg","children","className"]),b=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"";return s.default.createElement("div",Object.assign({ref:a,className:(0,l.tremorTwMerge)(r("root"),(n=b(u,i.colSpan),o=b(m,i.colSpanSm),d=b(g,i.colSpanMd),c=b(p,i.colSpanLg),(0,l.tremorTwMerge)(n,o,d,c)),x)},y),h)});n.displayName="Col",e.s(["Col",0,n],309426)},651904,e=>{"use strict";var t=e.i(843476),l=e.i(599724),a=e.i(266484);e.s(["default",0,function({value:e,onChange:s,premiumUser:i=!1,disabledCallbacks:r=[],onDisabledCallbacksChange:n}){return i?(0,t.jsx)(a.default,{value:e,onChange:s,disabledCallbacks:r,onDisabledCallbacksChange:n}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-3",children:[(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ langfuse-logging"}),(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ datadog-logging"})]}),(0,t.jsx)("div",{className:"p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)(l.Text,{className:"text-sm text-yellow-800",children:["Setting Key/Team logging settings is a LiteLLM Enterprise feature. Global Logging Settings are available for all free users. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"}),"."]})})]})}])},575260,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(482725),s=e.i(56456);e.s(["default",0,({projects:e,value:i,onChange:r,disabled:n,loading:o,teamId:d})=>{let c=d?e?.filter(e=>e.team_id===d):e;return(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"Search or select a project",value:i,onChange:r,disabled:n,loading:o,allowClear:!0,notFoundContent:o?(0,t.jsx)(a.Spin,{indicator:(0,t.jsx)(s.LoadingOutlined,{spin:!0}),size:"small"}):void 0,filterOption:(e,t)=>{if(!t)return!1;let l=c?.find(e=>e.project_id===t.key);if(!l)return!1;let a=e.toLowerCase().trim(),s=(l.project_alias||"").toLowerCase(),i=(l.project_id||"").toLowerCase();return s.includes(a)||i.includes(a)},optionFilterProp:"children",children:!o&&c?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.project_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.project_alias||e.project_id})," ",(0,t.jsxs)("span",{className:"text-gray-500",children:["(",e.project_id,")"]})]},e.project_id))})}])},364769,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(237016),s=e.i(464571),i=e.i(888259);e.s(["default",0,({apiKey:e})=>{let[r,n]=(0,l.useState)(!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2",children:["Please save this secret key somewhere safe and accessible. For security reasons,"," ",(0,t.jsx)("b",{children:"you will not be able to view it again"})," through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-3 mb-1",children:"Virtual Key:"}),(0,t.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,t.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal",margin:0},children:e})}),(0,t.jsx)(a.CopyToClipboard,{text:e,onCopy:()=>{n(!0),i.default.success("Key copied to clipboard"),setTimeout(()=>n(!1),2e3)},children:(0,t.jsx)(s.Button,{type:"primary",style:{marginTop:12},children:r?"Copied!":"Copy Virtual Key"})})]})}])},702597,e=>{"use strict";var t=e.i(843476),l=e.i(207082),a=e.i(109799),s=e.i(510674),i=e.i(109034),r=e.i(292639),n=e.i(135214),o=e.i(500330),d=e.i(827252),c=e.i(912598),u=e.i(677667),m=e.i(130643),g=e.i(898667),p=e.i(994388),h=e.i(309426),x=e.i(350967),y=e.i(599724),b=e.i(779241),f=e.i(629569),j=e.i(464571),_=e.i(808613),v=e.i(311451),A=e.i(212931),w=e.i(91739),k=e.i(199133),N=e.i(790848),C=e.i(262218),S=e.i(592968),I=e.i(898586),T=e.i(343488),L=e.i(741466),E=e.i(271645),O=e.i(708347),F=e.i(552130),M=e.i(557662),R=e.i(9314),B=e.i(860585),P=e.i(82946),D=e.i(392110),U=e.i(533882),z=e.i(844565),V=e.i(651904),K=e.i(939510),Q=e.i(460285),G=e.i(663435),W=e.i(363256),H=e.i(575260),q=e.i(371455),J=e.i(128233),$=e.i(319312),Y=e.i(833400),X=e.i(355619),Z=e.i(75921),ee=e.i(234713),et=e.i(390605),el=e.i(727749),ea=e.i(602869),es=e.i(364769),ei=e.i(435451),er=e.i(916940);let{Option:en}=k.Select,eo=async(e,t,l,a)=>{try{if(null===e||null===t)return[];if(null!==l)return(await (0,ea.modelAvailableCall)(l,e,t,!0,a,!0)).data.map(e=>e.id);return[]}catch(e){return console.error("Error fetching user models:",e),[]}},ed=async(e,t,l,a)=>{try{if(null===e||null===t)return;if(null!==l){let s=(await (0,ea.modelAvailableCall)(l,e,t)).data.map(e=>e.id);a(s)}}catch(e){console.error("Error fetching user models:",e)}};e.s(["default",0,({team:e,teams:ec,data:eu,addKey:em,autoOpenCreate:eg,prefillData:ep})=>{let{accessToken:eh,userId:ex,userRole:ey,premiumUser:eb}=(0,n.default)(),ef=eb||null!=ey&&O.rolesWithWriteAccess.includes(ey),{data:ej,isLoading:e_}=(0,a.useOrganizations)(),{data:ev,isLoading:eA}=(0,s.useProjects)(),{data:ew}=(0,r.useUISettings)(),{data:ek}=(0,i.useTags)(),eN=!!ew?.values?.enable_projects_ui,eC=!!ew?.values?.disable_custom_api_keys,eS=ek?Object.values(ek).map(e=>({value:e.name,label:e.name})):[],eI=(0,c.useQueryClient)(),[eT]=_.Form.useForm(),[eL,eE]=(0,E.useState)(!1),[eO,eF]=(0,E.useState)(null),[eM,eR]=(0,E.useState)([]),[eB,eP]=(0,E.useState)([]),[eD,eU]=(0,E.useState)("you"),[ez,eV]=(0,E.useState)(!1),[eK,eQ]=(0,E.useState)(null),[eG,eW]=(0,E.useState)([]),[eH,eq]=(0,E.useState)([]),[eJ,e$]=(0,E.useState)([]),[eY,eX]=(0,E.useState)([]),[eZ,e0]=(0,E.useState)(e),[e1,e4]=(0,E.useState)(null),[e2,e3]=(0,E.useState)(null),[e6,e5]=(0,E.useState)(!1),[e7,e8]=(0,E.useState)({}),[e9,te]=(0,E.useState)([]),[tt,tl]=(0,E.useState)(!1),[ta,ts]=(0,E.useState)([]),[ti,tr]=(0,E.useState)("llm_api"),[tn,to]=(0,E.useState)({}),[td,tc]=(0,E.useState)(!1),[tu,tm]=(0,E.useState)("30d"),[tg,tp]=(0,E.useState)(null),[th,tx]=(0,E.useState)([]),[ty,tb]=(0,E.useState)([]),[tf,tj]=(0,E.useState)({}),[t_,tv]=(0,E.useState)(0),[tA,tw]=(0,E.useState)(0),[tk,tN]=(0,E.useState)([]),[tC,tS]=(0,E.useState)(null),tI=_.Form.useWatch("models",eT)??[],tT=()=>{eE(!1),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)},tL=()=>{eE(!1),eF(null),e0(null),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)};(0,E.useEffect)(()=>{ex&&ey&&eh&&ed(ex,ey,eh,eR)},[eh,ex,ey]),(0,E.useEffect)(()=>{eh&&(0,ea.getAgentsList)(eh).then(e=>tN(e?.agents||[])).catch(()=>tN([]))},[eh]),(0,E.useEffect)(()=>{let e=async()=>{try{let e=(await (0,ea.getPoliciesList)(eh)).policies.map(e=>e.policy_name);eq(e)}catch(e){console.error("Failed to fetch policies:",e)}},t=async()=>{try{let e=await (0,ea.getPromptsList)(eh);e$(e.prompts.map(e=>e.prompt_id))}catch(e){console.error("Failed to fetch prompts:",e)}};(async()=>{try{let e=(await (0,ea.getGuardrailsList)(eh)).guardrails.map(e=>e.guardrail_name);eW(e)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),e(),t()},[eh]),(0,E.useEffect)(()=>{(async()=>{try{if(eh){let e=sessionStorage.getItem("possibleUserRoles");if(e)e8(JSON.parse(e));else{let e=await (0,ea.getPossibleUserRoles)(eh);sessionStorage.setItem("possibleUserRoles",JSON.stringify(e)),e8(e)}}}catch(e){console.error("Error fetching possible user roles:",e)}})()},[eh]),(0,E.useEffect)(()=>{if(eg&&!ez&&ec&&ey&&O.rolesWithWriteAccess.includes(ey)&&(eE(!0),eV(!0),ep)){if(ep.owned_by&&("another_user"===ep.owned_by&&"Admin"!==ey?eU("you"):eU(ep.owned_by)),ep.team_id){let e=ec?.find(e=>e.team_id===ep.team_id)||null;e&&(e0(e),eT.setFieldsValue({team_id:ep.team_id}))}ep.key_alias&&eT.setFieldsValue({key_alias:ep.key_alias}),ep.models&&ep.models.length>0&&eQ(ep.models),ep.key_type&&(tr(ep.key_type),eT.setFieldsValue({key_type:ep.key_type}))}},[eg,ep,ec,ez,eT,ey]);let tE=eB.includes("no-default-models")&&!eZ,tO=async e=>{try{let t,a=e?.key_alias??"",s=e?.team_id??null;if((eu?.filter(e=>e.team_id===s).map(e=>e.key_alias)??[]).includes(a))throw Error(`Key alias ${a} already exists for team with ID ${s}, please provide another key alias`);if(el.default.info("Making API Call"),eE(!0),"you"===eD)e.user_id=ex;else if("agent"===eD){if(!tC)return void el.default.fromBackend("Please select an agent");e.agent_id=tC}let i={};try{i=JSON.parse(e.metadata||"{}")}catch(e){console.error("Error parsing metadata:",e)}if("service_account"===eD&&(i.service_account_id=e.key_alias),eY.length>0&&(i={...i,logging:eY.filter(e=>e.callback_name)}),ta.length>0){let e=(0,M.mapDisplayToInternalNames)(ta);i={...i,litellm_disabled_callbacks:e}}if(td&&(e.auto_rotate=!0,e.rotation_interval=tu),e.duration&&""!==e.duration.trim()||(e.duration=null),e.metadata=JSON.stringify(i),e.disable_global_guardrails||delete e.disable_global_guardrails,e.allowed_vector_store_ids&&e.allowed_vector_store_ids.length>0&&(e.object_permission={vector_stores:e.allowed_vector_store_ids},delete e.allowed_vector_store_ids),e.allowed_mcp_servers_and_groups&&(e.allowed_mcp_servers_and_groups.servers?.length>0||e.allowed_mcp_servers_and_groups.accessGroups?.length>0||e.allowed_mcp_servers_and_groups.toolsets?.length>0)){e.object_permission||(e.object_permission={});let{servers:t,accessGroups:l,toolsets:a}=e.allowed_mcp_servers_and_groups;t&&t.length>0&&(e.object_permission.mcp_servers=t),l&&l.length>0&&(e.object_permission.mcp_access_groups=l),a&&a.length>0&&(e.object_permission.mcp_toolsets=a),delete e.allowed_mcp_servers_and_groups}let r=e.mcp_tool_permissions||{};if(Object.keys(r).length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_tool_permissions=r),delete e.mcp_tool_permissions,e.allowed_mcp_access_groups&&e.allowed_mcp_access_groups.length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_access_groups=e.allowed_mcp_access_groups,delete e.allowed_mcp_access_groups),e.allowed_agents_and_groups&&(e.allowed_agents_and_groups.agents?.length>0||e.allowed_agents_and_groups.accessGroups?.length>0)){e.object_permission||(e.object_permission={});let{agents:t,accessGroups:l}=e.allowed_agents_and_groups;t&&t.length>0&&(e.object_permission.agents=t),l&&l.length>0&&(e.object_permission.agent_access_groups=l),delete e.allowed_agents_and_groups}Object.keys(tn).length>0&&(e.aliases=JSON.stringify(tn)),tg?.router_settings&&Object.values(tg.router_settings).some(e=>null!=e&&""!==e)&&(e.router_settings=tg.router_settings);let n=th.filter(e=>e.budget_duration&&null!==e.max_budget&&void 0!==e.max_budget);n.length>0&&(e.budget_limits=n);let{tag_rpm_limit:o}=(0,Y.tagRowsToLimits)(ty);Object.keys(o).length>0&&(e.tag_rpm_limit=o),Object.keys(tf).length>0&&(e.budget_fallbacks=tf),t="service_account"===eD?await (0,ea.keyCreateServiceAccountCall)(eh,e):await (0,ea.keyCreateCall)(eh,ex,e),em(t),eI.invalidateQueries({queryKey:l.keyKeys.lists()}),eF(t.key),el.default.success("Virtual Key Created"),eT.resetFields(),tx([]),tb([]),tj({}),tv(e=>e+1),localStorage.removeItem("userData"+ex)}catch(t){let e=(e=>{let t;if(!(t=!e||"object"!=typeof e||e instanceof Error?String(e):JSON.stringify(e)).includes("/key/generate")&&!t.includes("KeyManagementRoutes.KEY_GENERATE"))return`Error creating the key: ${e}`;let l=t;try{if(!e||"object"!=typeof e||e instanceof Error){let e=t.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]),a=t?.error||t;a?.message&&(l=a.message)}}else{let t=e?.error||e;t?.message&&(l=t.message)}}catch(e){}return t.includes("team_member_permission_error")||l.includes("Team member does not have permissions")?"Team member does not have permission to generate key for this team. Ask your proxy admin to configure the team member permission settings.":`Error creating the key: ${e}`})(t);el.default.fromBackend(e)}};(0,E.useEffect)(()=>{if(e2){let e=ev?.find(e=>e.project_id===e2);eP(e?.models??[]),eT.setFieldValue("models",[]);return}ex&&ey&&eh&&eo(ex,ey,eh,eZ?.team_id??null).then(e=>{eP((0,X.excludeProxyWideSentinel)(Array.from(new Set([...eZ?.models??[],...e]))))}),eK||eT.setFieldValue("models",[]),eT.setFieldValue("allowed_mcp_servers_and_groups",{servers:[],accessGroups:[]})},[eZ,e2,eh,ex,ey,eT]),(0,E.useEffect)(()=>{if(!eK||0===eK.length||!eB||0===eB.length)return;let e=eK.filter(e=>eB.includes(e));e.length>0&&eT.setFieldsValue({models:e}),eQ(null)},[eK,eB,eT]),(0,E.useEffect)(()=>{if(!e2||!ec)return;let e=ev?.find(e=>e.project_id===e2);if(!e?.team_id||eZ?.team_id===e.team_id)return;let t=ec.find(t=>t.team_id===e.team_id)||null;t&&(e0(t),eT.setFieldValue("team_id",t.team_id))},[ec,e2,ev]);let tF=async e=>{if(!e)return void te([]);tl(!0);try{let t=new URLSearchParams;if(t.append("user_email",e),null==eh)return;let l=(await (0,ea.userFilterUICall)(eh,t)).map(e=>({label:`${e.user_email} (${e.user_id})`,value:e.user_id,user:e}));te(l)}catch(e){console.error("Error fetching users:",e),el.default.fromBackend("Failed to search for users")}finally{tl(!1)}},tM=(0,T.useDebouncedCallback)(e=>tF(e),{wait:L.DEBOUNCE_WAIT_MS});return(0,t.jsxs)("div",{children:[ey&&O.rolesWithWriteAccess.includes(ey)&&(0,t.jsx)(p.Button,{className:"mx-auto",onClick:()=>eE(!0),"data-testid":"create-key-button",children:"+ Create New Key"}),(0,t.jsx)(A.Modal,{open:eL,width:1e3,footer:null,onOk:tT,onCancel:tL,children:(0,t.jsxs)(_.Form,{form:eT,onFinish:tO,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Ownership"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Owned By"," ",(0,t.jsx)(S.Tooltip,{title:"Select who will own this Virtual Key",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),className:"mb-4",children:(0,t.jsxs)(w.Radio.Group,{onChange:e=>eU(e.target.value),value:eD,children:[(0,t.jsx)(w.Radio,{value:"you",children:"You"}),(0,t.jsx)(w.Radio,{value:"service_account",children:"Service Account"}),"Admin"===ey&&(0,t.jsx)(w.Radio,{value:"another_user",children:"Another User"}),(0,t.jsxs)(w.Radio,{value:"agent",children:["Agent ",(0,t.jsx)(C.Tag,{color:"purple",children:"New"})]})]})}),"another_user"===eD&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["User ID"," ",(0,t.jsx)(S.Tooltip,{title:"The user who will own this key and be responsible for its usage",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"user_id",className:"mt-4",rules:[{required:"another_user"===eD,message:"Please input the user ID of the user you are assigning the key to"}],children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",marginBottom:"8px"},children:[(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Type email to search for users",filterOption:!1,onSearch:tM,onSelect:(e,t)=>{let l;return l=t.user,void eT.setFieldsValue({user_id:l.user_id})},options:e9,loading:tt,allowClear:!0,style:{width:"100%"},notFoundContent:tt?"Searching...":"No users found"}),(0,t.jsx)(j.Button,{onClick:()=>e5(!0),style:{marginLeft:"8px"},children:"Create User"})]}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Search by email to find users"})]})}),"agent"===eD&&(0,t.jsxs)("div",{className:"mt-4 p-4 bg-purple-50 border border-purple-200 rounded-md",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Select Agent ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Select an agent",style:{width:"100%"},value:tC,onChange:e=>tS(e),filterOption:(e,t)=>t?.label?.toLowerCase().includes(e.toLowerCase()),options:tk.map(e=>({label:e.agent_name||e.agent_id,value:e.agent_id}))}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-2",children:"This key will be used by the selected agent to make requests to LiteLLM"})]}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Organization"," ",(0,t.jsx)(S.Tooltip,{title:"The organization this key belongs to. Selecting an organization filters the available teams.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",className:"mt-4",children:(0,t.jsx)(W.default,{organizations:ej,loading:e_,disabled:"Admin"!==ey,onChange:e=>{e4(e||null),e0(null),e3(null),eT.setFieldValue("team_id",void 0),eT.setFieldValue("project_id",void 0)}})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Team"," ",(0,t.jsx)(S.Tooltip,{title:"The team this key belongs to, which determines available models and budget limits",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"team_id",initialValue:e?e.team_id:null,className:"mt-4",rules:[{required:"service_account"===eD,message:"Please select a team for the service account"}],help:"service_account"===eD?"required":"",children:(0,t.jsx)(G.default,{disabled:null!==e2,organizationId:e1,onTeamSelect:e=>{e0(e),e3(null),eT.setFieldValue("project_id",void 0),e?.organization_id?(e4(e.organization_id),eT.setFieldValue("organization_id",e.organization_id)):e||(e4(null),eT.setFieldValue("organization_id",void 0))}})}),eN&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Project"," ",(0,t.jsx)(S.Tooltip,{title:"Assign this key to a project. Selecting a project will lock the team to the project's team.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"project_id",className:"mt-4",children:(0,t.jsx)(H.default,{projects:ev,teamId:eZ?.team_id,loading:eA||!ec,onChange:e=>{if(!e){e3(null),e0(null),eT.setFieldValue("team_id",void 0);return}e3(e)}})})]}),tE&&(0,t.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,t.jsx)(y.Text,{className:"text-blue-800 text-sm",children:"Please select a team to continue configuring your Virtual Key. If you do not see any teams, please contact your Proxy Admin to either provide you with access to models or to add you to a team."})}),!tE&&(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Details"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["you"===eD||"another_user"===eD?"Key Name":"Service Account ID"," ",(0,t.jsx)(S.Tooltip,{title:"you"===eD||"another_user"===eD?"A descriptive name to identify this key":"Unique identifier for this service account",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_alias",rules:[{required:!0,message:`Please input a ${"you"===eD?"key name":"service account ID"}`}],help:"required",children:(0,t.jsx)(b.TextInput,{placeholder:""})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Models"," ",(0,t.jsx)(S.Tooltip,{title:"Select which models this key can access. Choose 'All Team Models' to grant access to all models available to the team. Leave empty to allow access to all models.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",rules:[],help:"management"===ti||"read_only"===ti?"Models field is disabled for this key type":"optional - leave empty to allow access to all models",className:"mt-4",children:(0,t.jsxs)(k.Select,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},disabled:"management"===ti||"read_only"===ti,onChange:e=>{e.includes("all-team-models")?eT.setFieldsValue({models:["all-team-models"]}):e.includes("all-proxy-models")&&eT.setFieldsValue({models:["all-proxy-models"]})},children:[!e2&&eZ&&(0,t.jsx)(en,{value:"all-team-models",children:"All Team Models"},"all-team-models"),!e2&&!eZ&&(0,t.jsx)(en,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),eB.map(e=>(0,t.jsx)(en,{value:e,disabled:(0,X.hasAllModelsSentinel)(tI),children:(0,X.getModelDisplayName)(e)},e))]})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Key Type"," ",(0,t.jsx)(S.Tooltip,{title:"Select the type of key to determine what routes and operations this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_type",initialValue:"llm_api",className:"mt-4",children:(0,t.jsxs)(k.Select,{defaultValue:"llm_api",placeholder:"Select key type",style:{width:"100%"},optionLabelProp:"label",onChange:e=>{tr(e),("management"===e||"read_only"===e)&&eT.setFieldsValue({models:[]})},children:[(0,t.jsx)(en,{value:"llm_api",label:"AI APIs",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"AI APIs"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only AI API routes (chat/completions, embeddings, etc.)"})]})}),(0,t.jsx)(en,{value:"management",label:"Management",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Management"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only management routes (user/team/key management)"})]})}),(0,t.jsx)(en,{value:"default",label:"Full Access",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Full Access"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call all routes (AI APIs, Management, and read-only)"})]})})]})})]}),!tE&&(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)(f.Title,{className:"m-0",children:"Optional Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Max Budget (USD)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum amount in USD this key can spend. When reached, the key will be blocked from making further requests",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"max_budget",help:`Budget cannot exceed team max budget: $${e?.max_budget!==null&&e?.max_budget!==void 0?e?.max_budget:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.max_budget&&l>e.max_budget)throw Error(`Budget cannot exceed team max budget: $${(0,o.formatNumberWithCommas)(e.max_budget,4)}`)}}],children:(0,t.jsx)(ei.default,{step:.01,precision:2,width:200})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Reset Budget"," ",(0,t.jsx)(S.Tooltip,{title:"How often the budget should reset. For example, setting 'daily' will reset the budget every 24 hours",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"budget_duration",help:`Team Reset Budget: ${e?.budget_duration!==null&&e?.budget_duration!==void 0?e?.budget_duration:"None"}`,children:(0,t.jsx)(B.default,{placeholder:"Never resets",onChange:e=>eT.setFieldValue("budget_duration",e)})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Windows"," ",(0,t.jsx)(S.Tooltip,{title:"Set multiple independent budget windows (e.g., hourly $10 AND monthly $200). Each window tracks spend separately and resets on its own schedule.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)($.BudgetWindowsEditor,{value:th,onChange:tx})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Fallbacks"," ",(0,t.jsx)(S.Tooltip,{title:"When a model exceeds its per-model budget (model_max_budget), requests automatically reroute to fallback models instead of failing. Configure per-model budgets in Advanced Settings.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(J.BudgetFallbacksEditor,{value:tf,onChange:tj,availableModels:eB},t_)}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Tokens per minute Limit (TPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of tokens this key can process per minute. Helps control usage and costs",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tpm_limit",help:`TPM cannot exceed team TPM limit: ${e?.tpm_limit!==null&&e?.tpm_limit!==void 0?e?.tpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.tpm_limit&&l>e.tpm_limit)throw Error(`TPM limit cannot exceed team TPM limit: ${e.tpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"tpm",name:"tpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Requests per minute Limit (RPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of API requests this key can make per minute. Helps prevent abuse and manage load",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"rpm_limit",help:`RPM cannot exceed team RPM limit: ${e?.rpm_limit!==null&&e?.rpm_limit!==void 0?e?.rpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.rpm_limit&&l>e.rpm_limit)throw Error(`RPM limit cannot exceed team RPM limit: ${e.rpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"rpm",name:"rpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Per-Tag Rate Limits"," ",(0,t.jsx)(S.Tooltip,{title:"Scope rate limits to a request tag so each tag (e.g. a cell or group) gets its own RPM counter. Requests without a matching tag fall back to the key-level limit.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(Y.TagRateLimitEditor,{value:ty,onChange:tb})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Throttle on budget exceeded"," ",(0,t.jsx)(S.Tooltip,{title:"When this key exceeds its max budget, throttle its TPM/RPM to the globally configured percentage instead of blocking access entirely. Requires budget_exceeded_throttle_percentage in litellm_settings and a TPM/RPM limit on the key.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"throttle_on_budget_exceeded",valuePropName:"checked",children:(0,t.jsx)(N.Switch,{checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"Apply safety guardrails to this key to filter content or enforce policies",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-4",help:ef?"Select existing guardrails or enter new ones":"Premium feature - Upgrade to set guardrails by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!ef,placeholder:ef?"Select or enter guardrails":"Premium feature - Upgrade to set guardrails by key",options:eG.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"When enabled, this key will bypass any guardrails configured to run on every request (global guardrails)",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:ef?"Bypass global guardrails for this key":"Premium feature - Upgrade to disable global guardrails by key",children:(0,t.jsx)(N.Switch,{disabled:!ef,checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Policies"," ",(0,t.jsx)(S.Tooltip,{title:"Apply policies to this key to control guardrails and other settings",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-4",help:eb?"Select existing policies or enter new ones":"Premium feature - Upgrade to set policies by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter policies":"Premium feature - Upgrade to set policies by key",options:eH.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Prompts"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific prompt templates",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/prompt_management",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"prompts",className:"mt-4",help:eb?"Select existing prompts or enter new ones":"Premium feature - Upgrade to set prompts by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter prompts":"Premium feature - Upgrade to set prompts by key",options:eJ.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Access Groups"," ",(0,t.jsx)(S.Tooltip,{title:"Assign access groups to this key. Access groups control which models, MCP servers, and agents this key can use",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-4",help:"Select access groups to assign to this key",children:(0,t.jsx)(R.default,{placeholder:"Select access groups (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Pass Through Routes"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific pass through routes",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/pass_through",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"allowed_passthrough_routes",className:"mt-4",help:eb?"Select existing pass through routes or enter new ones":"Premium feature - Upgrade to set pass through routes by key",children:(0,t.jsx)(z.default,{accessToken:eh,placeholder:eb?"Select or enter pass through routes":"Premium feature - Upgrade to set pass through routes by key",disabled:!eb,teamId:eZ?eZ.team_id:null})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,t.jsx)(S.Tooltip,{title:"Select which vector stores this key can access. If none selected, the key will have access to all available vector stores",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-4",help:"Select vector stores this key can access. Leave empty for access to all vector stores",children:(0,t.jsx)(er.default,{onChange:e=>eT.setFieldValue("allowed_vector_store_ids",e),value:eT.getFieldValue("allowed_vector_store_ids"),accessToken:eh,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Metadata"," ",(0,t.jsx)(S.Tooltip,{title:"JSON object with additional information about this key. Used for tracking or custom logic",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"metadata",className:"mt-4",children:(0,t.jsx)(v.Input.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Tags"," ",(0,t.jsx)(S.Tooltip,{title:"Tags for tracking spend and/or doing tag-based routing. Used for analytics and filtering",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tags",className:"mt-4",help:"Tags for tracking spend and/or doing tag-based routing.",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter tags",tokenSeparators:[","],options:eS})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"MCP Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,t.jsx)(S.Tooltip,{title:"Select which MCP servers or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",help:"Select MCP servers or access groups this key can access",children:(0,t.jsx)(Z.default,{onChange:e=>eT.setFieldValue("allowed_mcp_servers_and_groups",e),value:eT.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:eh,teamId:eZ?.team_id??null,placeholder:"Select MCP servers or access groups (optional)",allowNoMcpServers:!0})}),(0,t.jsx)(_.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,t.jsx)(v.Input,{type:"hidden"})}),(0,t.jsx)(_.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.allowed_mcp_servers_and_groups!==t.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==t.mcp_tool_permissions,children:()=>(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(et.default,{accessToken:eh,selectedServers:(eT.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[]).filter(e=>e!==ee.NO_MCP_SERVERS_SENTINEL),toolPermissions:eT.getFieldValue("mcp_tool_permissions")||{},onChange:e=>eT.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Agent Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Agents"," ",(0,t.jsx)(S.Tooltip,{title:"Select which agents or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",help:"Select agents or access groups this key can access",children:(0,t.jsx)(F.default,{onChange:e=>eT.setFieldValue("allowed_agents_and_groups",e),value:eT.getFieldValue("allowed_agents_and_groups"),accessToken:eh,placeholder:"Select agents or access groups (optional)"})})})]}),eb?(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!0,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]}):(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Key-level logging settings is an enterprise feature, get in touch -",(0,t.jsx)("a",{href:"https://www.litellm.ai/enterprise",target:"_blank",children:"https://www.litellm.ai/enterprise"})]}),placement:"top",children:(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsx)("div",{style:{opacity:.5},children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!1,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]})}),(0,t.jsx)("div",{style:{position:"absolute",inset:0,cursor:"not-allowed"}})]})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Router Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4 w-full",children:(0,t.jsx)(Q.default,{accessToken:eh||"",value:tg||void 0,onChange:tp,modelData:eM.length>0?{data:eM.map(e=>({model_name:e}))}:void 0},tA)})})]},`router-settings-accordion-${tA}`),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Model Aliases"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)(y.Text,{className:"text-sm text-gray-600 mb-4",children:"Create custom aliases for models that can be used in API calls. This allows you to create shortcuts for specific models."}),(0,t.jsx)(U.default,{accessToken:eh,initialModelAliases:tn,onAliasUpdate:to,showExampleConfig:!1})]})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Key Lifecycle"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(D.default,{form:eT,autoRotationEnabled:td,onAutoRotationChange:tc,rotationInterval:tu,onRotationIntervalChange:tm,isCreateMode:!0})})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("b",{children:"Advanced Settings"}),(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Learn more about advanced settings in our"," ",(0,t.jsx)("a",{href:ea.proxyBaseUrl?`${ea.proxyBaseUrl}/#/key%20management/generate_key_fn_key_generate_post`:"/#/key%20management/generate_key_fn_key_generate_post",target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 hover:text-blue-300",children:"documentation"})]}),children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-300 cursor-help"})})]})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(P.default,{schemaComponent:"GenerateKeyRequest",form:eT,excludedFields:["key_alias","team_id","organization_id","models","duration","metadata","tags","guardrails","max_budget","budget_duration","tpm_limit","rpm_limit",...eC?["key"]:[]]})})]})]})]})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(j.Button,{htmlType:"submit",disabled:tE,style:{opacity:tE?.5:1},children:"Create Key"})})]})}),e6&&(0,t.jsx)(A.Modal,{title:"Create New User",open:e6,onCancel:()=>e5(!1),footer:null,width:800,children:(0,t.jsx)(q.CreateUserButton,{userID:ex,accessToken:eh,teams:ec,possibleUIRoles:e7,onUserCreated:e=>{eT.setFieldsValue({user_id:e}),e5(!1)},isEmbedded:!0})}),eO&&(0,t.jsx)(A.Modal,{open:eL,onOk:tT,onCancel:tL,footer:null,children:(0,t.jsxs)(x.Grid,{numItems:1,className:"gap-2 w-full",children:[(0,t.jsx)(f.Title,{children:"Save your Key"}),(0,t.jsx)(h.Col,{numColSpan:1,children:null!=eO?(0,t.jsx)(es.default,{apiKey:eO}):(0,t.jsx)(y.Text,{children:"Key being created, this might take 30s"})})]})})]})},"fetchTeamModels",0,eo,"fetchUserModels",0,ed],702597)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0r0okx31djc7i.js b/litellm/proxy/_experimental/out/_next/static/chunks/0r0okx31djc7i.js deleted file mode 100644 index 93e911cf263..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0r0okx31djc7i.js +++ /dev/null @@ -1,8 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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 l=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}));l.displayName="TableHeader";let o=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}));o.displayName="TableBody";let i=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}));i.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,o,"TableCell",0,d,"TableFooter",0,i,"TableHead",0,u,"TableHeader",0,l,"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),l=e.i(552245),o=e.i(405005),i=e.i(209407);let s={...o.popupStateMapping,...i.transitionStatusMapping},u=n.forwardRef(function(e,t){let{render:a,className:n,style:o,forceRender:i=!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,l.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:i||!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:o,disabled:i=!1,nativeButton:s=!0,...u}=e,{store:g}=(0,r.useDialogRootContext)(),m=g.useState("open"),{getButtonProps:f,buttonRef:b}=(0,d.useButton)({disabled:i,native:s});return(0,l.useRenderElement)("button",e,{state:{disabled:i},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:o,id:i,...s}=e,{store:u}=(0,r.useDialogRootContext)(),d=(0,m.useBaseUiId)(i);return u.useSyncedValueWithCleanup("descriptionElementId",d),(0,l.useRenderElement)("p",e,{ref:t,props:[{id:d},s]})});e.s(["DialogDescription",0,f],209793);var b=e.i(61487);let x=((t={}).nestedDialogs="--nested-dialogs",t),h=((a={})[a.open=o.CommonPopupDataAttributes.open]="open",a[a.closed=o.CommonPopupDataAttributes.closed]="closed",a[a.startingStyle=o.CommonPopupDataAttributes.startingStyle]="startingStyle",a[a.endingStyle=o.CommonPopupDataAttributes.endingStyle]="endingStyle",a.nested="data-nested",a.nestedDialogOpen="data-nested-dialog-open",a);var y=e.i(733332);let C=n.createContext(void 0);function v(){let e=n.useContext(C);if(void 0===e)throw Error((0,y.default)(26));return e}e.s(["DialogPortalContext",0,C,"useDialogPortalContext",0,v],625834);var S=e.i(137584),w=e.i(673327),$=e.i(264111),D=e.i(843476);let j={...o.popupStateMapping,...i.transitionStatusMapping,nestedDialogOpen:e=>e?{[h.nestedDialogOpen]:""}:null},R=n.forwardRef(function(e,t){let{render:a,className:n,style:o,finalFocus:i,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"),h=d.useState("mounted"),y=d.useState("nested"),C=d.useState("nestedOpenDialogCount"),R=d.useState("open"),O=d.useState("openMethod"),N=d.useState("titleElementId"),k=d.useState("transitionStatus"),E=d.useState("role"),M=g.useState("floatingId"),P=u.id??M;v(),(0,S.useOpenChangeComplete)({open:R,ref:d.context.popupRef,onComplete(){R&&d.context.onOpenChangeComplete?.(!0)}});let T=void 0===s?(0,$.createDefaultInitialFocus)(d.context.popupRef):s,A=d.useStateSetter("popupElement"),I=(0,l.useRenderElement)("div",e,{state:{open:R,nested:y,transitionStatus:k,nestedDialogOpen:C>0},props:[m,{id:P,"aria-labelledby":N??void 0,"aria-describedby":c??void 0,role:E,...$.FOCUSABLE_POPUP_PROPS,hidden:!h,onKeyDown(e){w.COMPOSITE_KEYS.has(e.key)&&e.stopPropagation()},style:{[x.nestedDialogs]:C}},u],ref:[t,d.context.popupRef,A],stateAttributesMapping:j});return(0,D.jsx)(b.FloatingFocusManager,{context:g,openInteractionType:O,disabled:!h,closeOnFocusOut:!p,initialFocus:T,returnFocus:i,modal:!1!==f,restoreFocus:"popup",children:I})});e.s(["DialogPopup",0,R],784324);var O=e.i(144394),N=e.i(726674),k=e.i(426);let E=n.forwardRef(function(e,t){let{keepMounted:a=!1,...n}=e,{store:l}=(0,r.useDialogRootContext)(),o=l.useState("mounted"),i=l.useState("modal"),s=l.useState("open");return o||a?(0,D.jsx)(C.Provider,{value:a,children:(0,D.jsxs)(N.FloatingPortal,{ref:t,...n,children:[o&&!0===i&&(0,D.jsx)(k.InternalBackdrop,{ref:l.context.internalBackdropRef,inert:(0,O.inertValue)(!s)}),e.children]})}):null});e.s(["DialogPortal",0,E],264951)},67530,e=>{"use strict";var t=e.i(271645),a=e.i(145484),n=e.i(956789),r=e.i(17989),l=e.i(647554),o=e.i(675606),i=e.i(56434),s=e.i(264111);e.s(["DialogInteractions",0,function({store:e,parentContext:o,isDrawer:i}){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,x]=t.useState(0),h=0===m,y=(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,l.getTarget)(t);return!!h&&!d&&(!c||!e.context.internalBackdropRef.current&&!e.context.backdropRef.current||e.context.internalBackdropRef.current===a||e.context.backdropRef.current===a||(0,l.contains)(a,p)&&!a?.hasAttribute("data-base-ui-portal"))},escapeKey:h});(0,a.useScrollLock)(u&&!0===c,p),e.useContextCallback("onNestedDialogOpen",(e,t)=>{f(e),x(t)}),e.useContextCallback("onNestedDialogClose",()=>{f(0),x(0)}),t.useEffect(()=>(o?.onNestedDialogOpen&&u&&o.onNestedDialogOpen(m+1,b+ +!!i),o?.onNestedDialogClose&&!u&&o.onNestedDialogClose(),()=>{o?.onNestedDialogClose&&u&&o.onNestedDialogClose()}),[i,u,m,b,o]);let C=y.reference??n.EMPTY_OBJECT,v=y.trigger??n.EMPTY_OBJECT,S=y.floating??n.EMPTY_OBJECT;return(0,s.usePopupInteractionProps)(e,{activeTriggerProps:C,inactiveTriggerProps:v,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:l}=(0,s.useOpenStateTransitions)(r,a),u=t.useCallback(()=>{a.setOpen(!1,(0,o.createChangeEventDetails)(i.REASONS.imperativeAction))},[a]);t.useImperativeHandle(n,()=>({unmount:l,close:u}),[l,u])}])},366250,301807,e=>{"use strict";var t=e.i(271645),a=e.i(713203),n=e.i(67530),r=e.i(108821),l=e.i(616269),o=e.i(301252),i=e.i(116786),s=e.i(990627),u=e.i(264111);let d={...i.popupStoreSelectors,modal:(0,l.createSelector)(e=>e.modal),nested:(0,l.createSelector)(e=>e.nested),nestedOpenDialogCount:(0,l.createSelector)(e=>e.nestedOpenDialogCount),nestedOpenDrawerCount:(0,l.createSelector)(e=>e.nestedOpenDrawerCount),disablePointerDismissal:(0,l.createSelector)(e=>e.disablePointerDismissal),openMethod:(0,l.createSelector)(e=>e.openMethod),descriptionElementId:(0,l.createSelector)(e=>e.descriptionElementId),titleElementId:(0,l.createSelector)(e=>e.titleElementId),viewportElement:(0,l.createSelector)(e=>e.viewportElement),role:(0,l.createSelector)(e=>e.role)};class c extends o.ReactStore{constructor(e,a,n=!1){const r=new s.PopupTriggerMap,l=function(e={}){return{...(0,i.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);l.floatingRootContext=(0,i.createPopupFloatingRootContext)(r,a,n),super(l,{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,l="dialog"){let{children:o,open:i,defaultOpen:s=!1,onOpenChange:u,onOpenChangeComplete:d,disablePointerDismissal:g=!1,modal:m=!0,actionsRef:f,handle:b,triggerId:x,defaultTriggerId:h=null}=e,y="alert-dialog"===l,C=(0,r.useDialogRootContext)(!0),v={modal:!!y||m,disablePointerDismissal:y||g,nested:!!C,role:y?"alertdialog":"dialog"},S=c.useStore(b?.store,{open:s,openProp:i,activeTriggerId:h,triggerIdProp:x,...v});(0,a.useOnFirstRender)(()=>{let e=void 0===i&&!1===S.state.open&&!0===s?{open:!0,activeTriggerId:h}:null;y?S.update(e?{...v,...e}:v):e&&S.update(e)}),S.useControlledProp("openProp",i),S.useControlledProp("triggerIdProp",x),S.useSyncedValues(v),S.useContextCallback("onOpenChange",u),S.useContextCallback("onOpenChangeComplete",d);let w=S.useState("open"),$=S.useState("mounted"),D=S.useState("payload");(0,n.useDialogRoot)({store:S,actionsRef:f});let j=t.useMemo(()=>({store:S}),[S]);return(0,p.jsx)(r.IsDrawerContext.Provider,{value:!1,children:(0,p.jsxs)(r.DialogRootContext.Provider,{value:j,children:[(w||$)&&(0,p.jsx)(n.DialogInteractions,{store:S,parentContext:C?.store.context,isDrawer:"drawer"===l}),"function"==typeof o?o({payload:D}):o]})})}],366250)},974217,e=>{"use strict";e.i(247167);var t,a=e.i(271645),n=e.i(552245),r=e.i(405005),l=e.i(209407),o=e.i(108821),i=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,...l.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:l,children:s,...d}=e,c=(0,i.useDialogPortalContext)(),{store:p}=(0,o.useDialogRootContext)(),g=p.useState("open"),m=p.useState("nested"),f=p.useState("transitionStatus"),b=p.useState("nestedOpenDialogCount"),x=p.useState("mounted"),h=p.useStateSetter("viewportElement");return(0,n.useRenderElement)("div",e,{enabled:c||x,state:{open:g,nested:m,transitionStatus:f,nestedDialogOpen:b>0},ref:[t,h],stateAttributesMapping:u,props:[{role:"presentation",hidden:!x,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 l=t.forwardRef(function(e,t){let{render:l,className:o,style:i,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,l],77173);var o=e.i(733332),i=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,l){let{render:g,className:m,style:f,disabled:b=!1,nativeButton:x=!0,id:h,payload:y,handle:C,...v}=e,S=(0,a.useDialogRootContext)(!0),w=C?.store??S?.store;if(!w)throw Error((0,o.default)(79));let $=(0,r.useBaseUiId)(h),D=w.useState("floatingRootContext"),j=w.useState("isOpenedByTrigger",$),R=w.useState("triggerPopupId",$),O=t.useRef(null),{registerTrigger:N,isMountedByThisTrigger:k}=(0,d.useTriggerDataForwarding)($,O,w,{payload:y}),{getButtonProps:E,buttonRef:M}=(0,i.useButton)({disabled:b,native:x}),P=(0,c.useClick)(D,{enabled:null!=D}),T=(0,p.useOpenMethodTriggerProps)(()=>w.select("open"),e=>{w.set("openMethod",e)}),A=w.useState("triggerProps",k);return(0,n.useRenderElement)("button",e,{state:{disabled:b,open:j},ref:[M,l,N,O],props:[P.reference,A,T,{[u.CLICK_TRIGGER_IDENTIFIER]:"",id:$,"aria-haspopup":"dialog","aria-expanded":j,"aria-controls":R},v,E],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}])},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),l=e.i(264951),o=e.i(271645),i=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",()=>l.DialogPortal,"Root",0,function(e){let t=o.useContext(i.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)},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)},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])},37727,e=>{"use strict";var t=e.i(841947);e.s(["X",()=>t.default])},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 l=e=>{let{prefixCls:n,className:r,style:l,size:o,shape:i}=e,s=(0,a.default)({[`${n}-lg`]:"large"===o,[`${n}-sm`]:"small"===o}),u=(0,a.default)({[`${n}-circle`]:"circle"===i,[`${n}-square`]:"square"===i,[`${n}-round`]:"round"===i}),d=t.useMemo(()=>"number"==typeof o?{width:o,height:o,lineHeight:`${o}px`}:{},[o]);return t.createElement("span",{className:(0,a.default)(n,s,u,r),style:Object.assign(Object.assign({},d),l)})};e.i(296059);var o=e.i(694758),i=e.i(915654),s=e.i(246422),u=e.i(838378);let d=new o.Keyframes("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),c=e=>({height:e,lineHeight:(0,i.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)),x=(0,s.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:n,skeletonParagraphCls:r,skeletonButtonCls:l,skeletonInputCls:o,skeletonImageCls:i,controlHeight:s,controlHeightLG:u,controlHeightSM:c,gradientFromColor:x,padding:h,marginSM:y,borderRadius:C,titleHeight:v,blockRadius:S,paragraphLiHeight:w,controlHeightXS:$,paragraphMarginTop:D}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:h,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:x},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:v,background:x,borderRadius:S,[`+ ${r}`]:{marginBlockStart:c}},[r]:{padding:0,"> li":{width:"100%",height:w,listStyle:"none",background:x,borderRadius:S,"+ li":{marginBlockStart:$}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${r} > li`]:{borderRadius:C}}},[`${t}-with-avatar ${t}-content`]:{[n]:{marginBlockStart:y,[`+ ${r}`]:{marginBlockStart:D}}},[`${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:l,gradientFromColor:o,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:t,width:i(n).mul(2).equal(),minWidth:i(n).mul(2).equal()},b(n,i))},f(e,n,a)),{[`${a}-lg`]:Object.assign({},b(r,i))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(l,i))}),f(e,l,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:n,controlHeightLG:r,controlHeightSM:l}=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(l))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:n,controlHeightLG:r,controlHeightSM:l,gradientFromColor:o,calc:i}=e;return{[n]:Object.assign({display:"inline-block",verticalAlign:"top",background:o,borderRadius:a},g(t,i)),[`${n}-lg`]:Object.assign({},g(r,i)),[`${n}-sm`]:Object.assign({},g(l,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:n,borderRadiusSM:r,calc:l}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:n,borderRadius:r},m(l(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},m(a)),{maxWidth:l(a).mul(4).equal(),maxHeight:l(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[l]:{width:"100%"},[o]:{width:"100%"}},[`${t}${t}-active`]:{[` - ${n}, - ${r} > li, - ${a}, - ${l}, - ${o}, - ${i} - `]: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"]]}),h=e=>{let{prefixCls:n,className:r,style:l,rows:o=0}=e,i=Array.from({length:o}).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:l},i)},y=({prefixCls:e,className:n,width:r,style:l})=>t.createElement("h3",{className:(0,a.default)(e,n),style:Object.assign({width:r},l)});function C(e){return e&&"object"==typeof e?e:{}}let v=e=>{let{prefixCls:r,loading:o,className:i,rootClassName:s,style:u,children:d,avatar:c=!1,title:p=!0,paragraph:g=!0,active:m,round:f}=e,{getPrefixCls:b,direction:v,className:S,style:w}=(0,n.useComponentConfig)("skeleton"),$=b("skeleton",r),[D,j,R]=x($);if(o||!("loading"in e)){let e,n,r=!!c,o=!!p,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${$}-avatar`},o&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),C(c));e=t.createElement("div",{className:`${$}-header`},t.createElement(l,Object.assign({},a)))}if(o||d){let e,a;if(o){let a=Object.assign(Object.assign({prefixCls:`${$}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),C(p));e=t.createElement(y,Object.assign({},a))}if(d){let e,n=Object.assign(Object.assign({prefixCls:`${$}-paragraph`},(e={},r&&o||(e.width="61%"),!r&&o?e.rows=3:e.rows=2,e)),C(g));a=t.createElement(h,Object.assign({},n))}n=t.createElement("div",{className:`${$}-content`},e,a)}let b=(0,a.default)($,{[`${$}-with-avatar`]:r,[`${$}-active`]:m,[`${$}-rtl`]:"rtl"===v,[`${$}-round`]:f},S,i,s,j,R);return D(t.createElement("div",{className:b,style:Object.assign(Object.assign({},w),u)},e,n))}return null!=d?d:null};v.Button=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d=!1,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-button`,size:c},h))))},v.Avatar=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,shape:d="circle",size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls","className"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:c},h))))},v.Input=e=>{let{prefixCls:o,className:i,rootClassName:s,active:u,block:d,size:c="default"}=e,{getPrefixCls:p}=t.useContext(n.ConfigContext),g=p("skeleton",o),[m,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:u,[`${g}-block`]:d},i,s,f,b);return m(t.createElement("div",{className:y},t.createElement(l,Object.assign({prefixCls:`${g}-input`,size:c},h))))},v.Image=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s}=e,{getPrefixCls:u}=t.useContext(n.ConfigContext),d=u("skeleton",r),[c,p,g]=x(d),m=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:s},l,o,p,g);return c(t.createElement("div",{className:m},t.createElement("div",{className:(0,a.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`})))))},v.Node=e=>{let{prefixCls:r,className:l,rootClassName:o,style:i,active:s,children:u}=e,{getPrefixCls:d}=t.useContext(n.ConfigContext),c=d("skeleton",r),[p,g,m]=x(c),f=(0,a.default)(c,`${c}-element`,{[`${c}-active`]:s},g,l,o,m);return p(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${c}-image`,l),style:i},u)))},e.s(["default",0,v],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),l=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(n.add(a),l.current=a)}else n.remove(l.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 l=e<0?"-":"",o=Math.abs(e),i=o,s="";return o>=1e6?(i=o/1e6,s="M"):o>=1e3&&(i=o/1e3,s="K"),`${l}${i.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 l({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,l],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:r,tooltip:i,dataTestId:s}){let u=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":s,className:(0,n.cn)("whitespace-nowrap font-normal",o[e]),children:r});return i?(0,t.jsx)(l,{content:i,trigger:u}):u}],112179)},625901,e=>{"use strict";var t=e.i(266027),a=e.i(621482),n=e.i(912598),r=e.i(243652),l=e.i(602869),o=e.i(135214);let i=(0,r.createQueryKeys)("models"),s=(0,r.createQueryKeys)("modelHub"),u=(0,r.createQueryKeys)("allProxyModels");(0,r.createQueryKeys)("selectedTeamModels");let d=(0,r.createQueryKeys)("infiniteModels"),c=(0,r.createQueryKeys)("userModels"),p=new Set,g=e=>!!e?.litellm_params?.model?.startsWith("auto_router/"),m=e=>new Set(e.filter(g).map(e=>e.model_name).filter(e=>!!e)),f=e=>e.filter(g),b=async(e,t,a)=>{let n=await (0,l.modelInfoCall)(e,t,a,1,1e3),r=n?.total_pages??1;return[n,...await Promise.all(Array.from({length:Math.max(0,r-1)},(n,r)=>(0,l.modelInfoCall)(e,t,a,r+2,1e3)))].flatMap(e=>e?.data??[])},x=(e,t)=>i.list({filters:{scope:"autoRouters",...e&&{userId:e},...t&&{userRole:t}}});e.s(["useAllProxyModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:u.list({}),queryFn:async()=>await (0,l.modelAvailableCall)(e,a,n,!0,null,!0,!1,"expand"),enabled:!!(e&&a&&n)})},"useAutoRouterModelGroups",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)(),{data:r}=(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:m});return r??p},"useAutoRouters",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:x(a,n),queryFn:async()=>await b(e,a,n),enabled:!!(e&&a&&n),select:f})},"useInfiniteModelInfo",0,(e=50,t)=>{let{accessToken:n,userId:r,userRole:i}=(0,o.default)();return(0,a.useInfiniteQuery)({queryKey:d.list({filters:{...r&&{userId:r},...i&&{userRole:i},size:e,...t&&{search:t}}}),queryFn:async({pageParam:a})=>await (0,l.modelInfoCall)(n,r,i,a,e,t),initialPageParam:1,getNextPageParam:e=>{if(e.current_page{let e=(0,n.useQueryClient)();return async()=>{await e.invalidateQueries({queryKey:i.lists()})}},"useModelHub",0,()=>{let{accessToken:e}=(0,o.default)();return(0,t.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,l.modelHubCall)(e),enabled:!!e})},"useModelsInfo",0,(e=1,a=50,n,r,s,u,d,c=!1)=>{let{accessToken:p,userId:g,userRole:m}=(0,o.default)();return(0,t.useQuery)({queryKey:i.list({filters:{...g&&{userId:g},...m&&{userRole:m},page:e,size:a,...n&&{search:n},...r&&{modelId:r},...s&&{teamId:s},...u&&{sortBy:u},...d&&{sortOrder:d},...c&&{excludeAutoRouters:"true"}}}),queryFn:async()=>await (0,l.modelInfoCall)(p,g,m,e,a,n,r,s,u,d,c),enabled:!!(p&&g&&m)})},"useUserModels",0,()=>{let{accessToken:e,userId:a,userRole:n}=(0,o.default)();return(0,t.useQuery)({queryKey:c.list({}),queryFn:async()=>(await (0,l.modelAvailableCall)(e,a,n)).data.map(e=>e.id),enabled:!!(e&&a&&n)})}])},199931,e=>{"use strict";let t=(0,e.i(475254).default)("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]);e.s(["Waypoints",0,t],199931)},548151,200208,399536,997422,146512,e=>{"use strict";var t=e.i(843476),a=e.i(271645),n=e.i(199931),r=e.i(625901),l=e.i(487486),o=e.i(115504);let i=new Set,s=(0,a.createContext)(i);function u(e){let t=(0,a.useContext)(s);return!!e&&t.has(e)}e.s(["AutoRouterIcon",0,function({size:e=12,className:a}){return(0,t.jsx)(n.Waypoints,{size:e,className:a,"aria-hidden":!0})},"AutoRouterModelGroupsProvider",0,function({children:e}){let a=(0,r.useAutoRouterModelGroups)();return(0,t.jsx)(s.Provider,{value:a,children:e})},"AutoRouterTag",0,function({modelGroup:e,className:a}){return u(e)?(0,t.jsxs)(l.Badge,{variant:"secondary",title:`Routed by auto-router "${e}"`,className:(0,o.cn)("gap-1.5 px-2.5 py-1 text-sm font-normal text-foreground",a),children:[(0,t.jsx)(n.Waypoints,{"aria-hidden":!0}),e]}):null},"useIsAutoRoutedModelGroup",0,u],548151);var d=e.i(581070);let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=e=>String(e).padStart(2,"0"),g=(e,t)=>"date"===t?`${c[e.getMonth()]} ${e.getDate()}, ${e.getFullYear()}`:`${c[e.getMonth()]} ${e.getDate()}, ${p(e.getHours())}:${p(e.getMinutes())}:${p(e.getSeconds())}`;e.s(["DateCell",0,function({value:e,precision:a="datetime",fallback:n="-"}){let r,l,o,i=e?new Date(e):null;return!i||Number.isNaN(i.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:n}):(0,t.jsx)(d.CellTooltip,{content:(r=Intl.DateTimeFormat().resolvedOptions().timeZone,l=`${c[i.getMonth()]} ${i.getDate()}, ${i.getFullYear()}`,o=`${p(i.getHours())}:${p(i.getMinutes())}:${p(i.getSeconds())}`,`${l}, ${o} (${r})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:g(i,a)})})},"formatCellDate",0,g],200208);var m=e.i(174886),f=e.i(500330);let b={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:n,copyable:r=!1,truncate:l=!0,fallback:i="-",tooltip:s,disabled:u=!1,dataTestId:c,className:p}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:i});let g=!!n&&!u,x=(0,o.cn)(b[a].base,g&&b[a].clickable,l&&"block max-w-[15ch] truncate",u&&"opacity-50",p),h=g?(0,t.jsx)("button",{type:"button",className:x,"data-testid":c,onClick:()=>n(e),children:e}):(0,t.jsx)("span",{className:x,"data-testid":c,children:e}),y=(0,t.jsx)(d.CellTooltip,{content:s??e,trigger:h});return r?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[y,(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,f.copyToClipboard)(e)},children:(0,t.jsx)(m.Copy,{className:"size-3"})})]}):y}],399536);var x=e.i(463059);e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:n,onClick:r,className:l,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!=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,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",l),children:[s,(0,t.jsx)(x.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",l),children:s})}],997422);let h={hasModelAccess:!1,label:"Management"},y={hasModelAccess:!1,label:"Read-only"},C={hasModelAccess:!1,label:"SCIM"},v={hasModelAccess:!0,label:null},S=e=>e.startsWith("/scim"),w=(e,t)=>1===e.length&&e[0]===t;e.s(["deriveKeyModelScope",0,(e,t)=>"management"===t?h:"read_only"===t?y:Array.isArray(e)&&0!==e.length?e.every(S)?C:w(e,"management_routes")?h:w(e,"info_routes")?y:v:v],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),l=[],o=[];return r.forEach(e=>{e.endsWith("/*")?l.push(e):o.push(e)}),[...l,...o]}}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("/*",""),l=t.filter(e=>e.startsWith(r+"/"));n.push(...l),a.push(e)}else n.push(e)}),[...a,...n].filter((e,t,a)=>a.indexOf(e)===t)}])},622826,547227,964471,630500,e=>{"use strict";e.i(548151);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),l=e.i(487486);let o="all-proxy-models",i=e=>{if(e===o)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)(l.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)(l.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)(l.Badge,{variant:e===o?"secondary":"outline",children:i(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:i(e)},t))}),trigger:(0,a.jsxs)(l.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,l=t??n??null,o=null==t&&null!=n,i="number"==typeof l&&l>0,d=i?r/l*100:0,c=r>0?(0,s.getSpendString)(r,4):"$0.00",p=null===l?"· Unlimited":`of $${(0,s.formatNumberWithCommas)(l)}${o?" (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})]}),i&&(0,a.jsx)(u.Meter,{value:r,max:l,"aria-valuetext":`${c} of $${(0,s.formatNumberWithCommas)(l)}`,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)},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/0xu-p94boe99i.js b/litellm/proxy/_experimental/out/_next/static/chunks/0s31ton5ia2fh.js similarity index 86% rename from litellm/proxy/_experimental/out/_next/static/chunks/0xu-p94boe99i.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0s31ton5ia2fh.js index 2ae2a8c9d0a..156771a77d2 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0xu-p94boe99i.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0s31ton5ia2fh.js @@ -164,4 +164,4 @@ main();`}})())},[i,d,p,e,r,a]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(F.Butt border: 1px solid #fed7aa; font-family: monospace; } - `}),(0,t.jsx)(eO,{value:e,onChange:e=>r(e.target.value),placeholder:a,rows:l,className:"font-sans"}),p.length>0&&(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 items-center",children:[(0,t.jsx)("span",{className:"text-xs text-gray-500 mr-1",children:"Detected variables:"}),p.map((e,s)=>(0,t.jsx)(eB.Popover,{content:(0,t.jsxs)("div",{className:"p-2",style:{minWidth:"200px"},children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"Edit variable name"}),(0,t.jsx)(ey.Input,{size:"small",value:c,onChange:e=>d(e.target.value),onPressEnter:m,placeholder:"Variable name",autoFocus:!0}),(0,t.jsxs)("div",{className:"flex gap-2 mt-2",children:[(0,t.jsx)("button",{onClick:m,className:"text-xs px-2 py-1 bg-blue-500 text-white rounded-sm hover:bg-blue-600",children:"Save"}),(0,t.jsx)("button",{onClick:()=>{i(null),d("")},className:"text-xs px-2 py-1 bg-gray-200 text-gray-700 rounded-sm hover:bg-gray-300",children:"Cancel"})]})]}),open:o?.start===e.start,onOpenChange:e=>{e||(i(null),d(""))},trigger:"click",children:(0,t.jsx)(eA.Tag,{color:"orange",className:"cursor-pointer hover:opacity-80 transition-all m-0",icon:(0,t.jsx)(eE.EditOutlined,{}),onClick:()=>{i({oldName:e.name,start:e.start,end:e.end}),d(e.name)},children:e.name})},`${e.start}-${s}`))]})]})},eM=({value:e,onChange:s})=>(0,t.jsxs)(A.Card,{className:"p-3",children:[(0,t.jsx)(O.Text,{className:"block mb-2 text-sm font-medium",children:"Developer message"}),(0,t.jsx)(O.Text,{className:"text-gray-500 text-xs mb-2",children:"Optional system instructions for the model"}),(0,t.jsx)(ez,{value:e,onChange:s,rows:3,placeholder:"e.g., You are a helpful assistant..."})]}),eF=(0,eC.default)("grip-vertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),{Option:eL}=el.Select,eR=({messages:e,onAddMessage:r,onUpdateMessage:a,onRemoveMessage:l,onMoveMessage:n})=>{let[o,i]=(0,s.useState)(null),[c,d]=(0,s.useState)(null),m=()=>{i(null),d(null)};return(0,t.jsxs)(A.Card,{className:"p-3",children:[(0,t.jsxs)("div",{className:"mb-2",children:[(0,t.jsx)(O.Text,{className:"text-sm font-medium",children:"Prompt messages"}),(0,t.jsxs)(O.Text,{className:"text-gray-500 text-xs mt-1",children:["Use ",(0,t.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-xs",children:"{{variable}}"})," syntax for template variables"]})]}),(0,t.jsx)("div",{className:"space-y-2",children:e.map((s,r)=>(0,t.jsxs)("div",{draggable:!0,onDragStart:()=>{i(r)},onDragOver:e=>{e.preventDefault(),d(r)},onDrop:e=>{e.preventDefault(),null!==o&&o!==r&&n(o,r),i(null),d(null)},onDragEnd:m,className:`border border-gray-300 rounded overflow-hidden bg-white transition-all ${o===r?"opacity-50":""} ${c===r&&o!==r?"border-blue-500 border-2":""}`,children:[(0,t.jsxs)("div",{className:"bg-gray-50 px-2 py-1.5 border-b border-gray-300 flex items-center justify-between",children:[(0,t.jsxs)(el.Select,{value:s.role,onChange:e=>a(r,"role",e),style:{width:100},size:"small",bordered:!1,children:[(0,t.jsx)(eL,{value:"user",children:"User"}),(0,t.jsx)(eL,{value:"assistant",children:"Assistant"}),(0,t.jsx)(eL,{value:"system",children:"System"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[e.length>1&&(0,t.jsx)("button",{onClick:()=>l(r),className:"text-gray-400 hover:text-red-500",children:(0,t.jsx)(eD,{size:14})}),(0,t.jsx)("div",{className:"cursor-grab active:cursor-grabbing text-gray-400 hover:text-gray-600",children:(0,t.jsx)(eF,{size:16})})]})]}),(0,t.jsx)("div",{className:"p-2",children:(0,t.jsx)(ez,{value:s.content,onChange:e=>a(r,"content",e),rows:3,placeholder:"Enter prompt content..."})})]},r))}),(0,t.jsxs)("button",{onClick:r,className:"mt-2 text-xs text-blue-600 hover:text-blue-700 flex items-center",children:[(0,t.jsx)(eP.PlusIcon,{size:14,className:"mr-1"}),"Add message"]})]})};var eU=e.i(447593);let eH=({extractedVariables:e,variables:s,onVariableChange:r})=>0===e.length?null:(0,t.jsxs)("div",{className:"p-4 border-b border-gray-200 bg-blue-50",children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Fill in template variables to start testing"}),(0,t.jsx)("div",{className:"space-y-2",children:e.map(e=>(0,t.jsxs)("div",{children:[(0,t.jsxs)("label",{className:"block text-xs text-gray-600 mb-1 font-medium",children:["{{",e,"}}"]}),(0,t.jsx)(ey.Input,{value:s[e]||"",onChange:t=>r(e,t.target.value),placeholder:`Enter value for ${e}`,size:"small"})]},e))})]});var eV=e.i(56456),eJ=e.i(482725),eW=e.i(983561);let eK=({hasVariables:e})=>(0,t.jsxs)("div",{className:"h-full flex flex-col items-center justify-center text-gray-400",children:[(0,t.jsx)(eW.RobotOutlined,{style:{fontSize:"48px",marginBottom:"16px"}}),(0,t.jsx)("span",{className:"text-base",children:e?"Fill in the variables above, then type a message to start testing":"Type a message below to start testing your prompt"})]});var eq=e.i(771674),eG=e.i(918789),eX=e.i(285903);let eY=({message:e})=>(0,t.jsx)("div",{className:`mb-4 flex ${"user"===e.role?"justify-end":"justify-start"}`,children:(0,t.jsxs)("div",{className:"max-w-[85%] rounded-lg shadow-xs p-3.5 px-4",style:{backgroundColor:"user"===e.role?"#f0f8ff":"#ffffff",border:"user"===e.role?"1px solid #e6f0fa":"1px solid #f0f0f0"},children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full mr-1",style:{backgroundColor:"user"===e.role?"#e6f0fa":"#f5f5f5"},children:"user"===e.role?(0,t.jsx)(eq.UserOutlined,{style:{fontSize:"12px",color:"#2563eb"}}):(0,t.jsx)(eW.RobotOutlined,{style:{fontSize:"12px",color:"#4b5563"}})}),(0,t.jsx)("strong",{className:"text-sm capitalize",children:e.role}),"assistant"===e.role&&e.model&&(0,t.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-sm bg-gray-100 text-gray-600 font-normal",children:e.model})]}),(0,t.jsxs)("div",{className:"whitespace-pre-wrap wrap-break-word max-w-full message-content",style:{wordWrap:"break-word",overflowWrap:"break-word",wordBreak:"break-word",hyphens:"auto"},children:["assistant"===e.role?(0,t.jsx)(eG.default,{components:{code({node:e,inline:s,className:r,children:a,...l}){let n=/language-(\w+)/.exec(r||"");return!s&&n?(0,t.jsx)(ei.Prism,{style:ec.coy,language:n[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...l,children:String(a).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${r} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...l,children:a})},pre:({node:e,...s})=>(0,t.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...s})},children:e.content}):(0,t.jsx)("div",{className:"whitespace-pre-wrap",children:e.content}),"assistant"===e.role&&(e.timeToFirstToken||e.totalLatency||e.usage)&&(0,t.jsx)(eX.default,{timeToFirstToken:e.timeToFirstToken,totalLatency:e.totalLatency,usage:e.usage})]})]})}),eZ=({messages:e,isLoading:s,hasVariables:r,messagesEndRef:a})=>{let l=(0,t.jsx)(eV.LoadingOutlined,{style:{fontSize:24},spin:!0});return(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto p-4 pb-0",children:[0===e.length&&(0,t.jsx)(eK,{hasVariables:r}),e.map((e,s)=>(0,t.jsx)(eY,{message:e},s)),s&&(0,t.jsx)("div",{className:"flex justify-center items-center my-4",children:(0,t.jsx)(eJ.Spin,{indicator:l})}),(0,t.jsx)("div",{ref:a,style:{height:"1px"}})]})},eQ=({extractedVariables:e,variables:s})=>{let r=e.filter(e=>!s[e]||""===s[e].trim());return 0===r.length?null:(0,t.jsx)("div",{className:"mb-3 p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)("div",{className:"flex items-start gap-2",children:[(0,t.jsx)("span",{className:"text-yellow-600 text-sm",children:"⚠️"}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 font-medium mb-1",children:"Please fill in all template variables above"}),(0,t.jsxs)("p",{className:"text-xs text-yellow-700",children:["Missing: ",r.map(e=>`{{${e}}}`).join(", ")]})]})]})})};var e0=e.i(132104);let{TextArea:e1}=ey.Input,e2=({inputMessage:e,isLoading:s,isDisabled:r,onInputChange:a,onSend:l,onKeyDown:n,onCancel:o})=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center flex-1 bg-white border border-gray-300 rounded-xl px-3 py-1 min-h-[44px]",children:[(0,t.jsx)(e1,{value:e,onChange:e=>a(e.target.value),onKeyDown:n,placeholder:"Type your message... (Shift+Enter for new line)",disabled:s,className:"flex-1",autoSize:{minRows:1,maxRows:4},style:{resize:"none",border:"none",boxShadow:"none",background:"transparent",padding:"4px 0",fontSize:"14px",lineHeight:"20px"}}),(0,t.jsx)(F.Button,{onClick:l,disabled:r,className:"shrink-0 ml-2 w-8! h-8! min-w-8! p-0! rounded-full! bg-blue-600! hover:bg-blue-700! disabled:bg-gray-300! border-none! text-white! disabled:text-gray-500! flex! items-center! justify-center!",children:(0,t.jsx)(e0.ArrowUpOutlined,{style:{fontSize:"14px"}})})]}),s&&(0,t.jsx)(F.Button,{onClick:o,className:"bg-red-50 hover:bg-red-100 text-red-600 border-red-200",children:"Cancel"})]}),e4=({prompt:e,accessToken:r})=>{let{isLoading:a,messages:n,inputMessage:o,variables:i,variablesFilled:c,extractedVariables:d,allVariablesFilled:m,messagesEndRef:p,setInputMessage:x,handleSendMessage:u,handleCancelRequest:h,handleClearConversation:g,handleKeyDown:f,handleVariableChange:j}=((e,t)=>{let[r,a]=(0,s.useState)(!1),[n,o]=(0,s.useState)([]),[i,c]=(0,s.useState)(""),[d,m]=(0,s.useState)({}),[p,x]=(0,s.useState)(!1),[u,h]=(0,s.useState)(null),g=(0,s.useRef)(null),f=y(e),j=f.every(e=>d[e]&&""!==d[e].trim());(0,s.useEffect)(()=>{g.current&&setTimeout(()=>{g.current?.scrollIntoView({behavior:"smooth",block:"end"})},100)},[n]);let v=async()=>{let s;if(!t)return void ea.default.fromBackend("Access token is required");if(f.length>0&&!j)return void ea.default.fromBackend("Please fill in all template variables");if(!i.trim())return;!p&&f.length>0&&x(!0);let r={role:"user",content:i};o(e=>[...e,r]),c("");let m=new AbortController;h(m),a(!0);let u=Date.now();try{let r,a,c=N(e),p=(0,l.getProxyBaseUrl)(),x={dotprompt_content:c};0===n.length?x.prompt_variables=d:x.conversation_history=[...n.map(e=>({role:e.role,content:e.content})),{role:"user",content:i}];let h=await fetch(`${p}/prompts/test`,{method:"POST",headers:{[(0,l.getGlobalLitellmHeaderName)()]:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify(x),signal:m.signal});if(!h.ok){let e=await h.text();throw Error(`HTTP error! status: ${h.status}, ${e}`)}if(!h.body)throw Error("No response body");let g=h.body.getReader(),f=new TextDecoder,j="";for(o(e=>[...e,{role:"assistant",content:""}]);;){let{done:e,value:t}=await g.read();if(e)break;for(let e of f.decode(t).split("\n"))if(e.startsWith("data: ")){let t=e.slice(6);if("[DONE]"===t)continue;try{let e=JSON.parse(t);!r&&e.model&&(r=e.model),e.usage&&(a=e.usage);let l=e.choices?.[0]?.delta?.content;l&&(s||(s=Date.now()-u),j+=l,o(e=>{let t=[...e];return t[t.length-1]={role:"assistant",content:j,model:r,timeToFirstToken:s},t}))}catch(e){console.error("Error parsing chunk:",e)}}}let v=Date.now()-u;o(e=>{let t=[...e];return t[t.length-1]={...t[t.length-1],totalLatency:v,usage:a},t})}catch(e){"AbortError"===e.name||(console.error("Error testing prompt:",e),o(t=>{let s=t[t.length-1];return s&&"assistant"===s.role&&""===s.content?[...t.slice(0,-1),{role:"assistant",content:`Error: ${e.message}`}]:[...t,{role:"assistant",content:`Error: ${e.message}`}]}))}finally{a(!1),h(null)}};return{isLoading:r,messages:n,inputMessage:i,variables:d,variablesFilled:p,extractedVariables:f,allVariablesFilled:j,messagesEndRef:g,setInputMessage:c,handleSendMessage:v,handleCancelRequest:()=>{u&&(u.abort(),h(null),a(!1),ea.default.info("Request cancelled"))},handleClearConversation:()=>{o([]),x(!1),ea.default.success("Chat history cleared.")},handleKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),v())},handleVariableChange:(e,t)=>{m({...d,[e]:t})}}})(e,r);return(0,t.jsxs)("div",{className:"flex flex-col h-full bg-white",children:[!c&&(0,t.jsx)(eH,{extractedVariables:d,variables:i,onVariableChange:j}),n.length>0&&(0,t.jsx)("div",{className:"p-3 border-b border-gray-200 bg-white flex justify-end",children:(0,t.jsx)(F.Button,{onClick:g,className:"bg-gray-100 hover:bg-gray-200 text-gray-700 border-gray-300",icon:eU.ClearOutlined,children:"Clear Chat"})}),(0,t.jsx)(eZ,{messages:n,isLoading:a,hasVariables:d.length>0,messagesEndRef:p}),(0,t.jsxs)("div",{className:"p-4 border-t border-gray-200 bg-white",children:[(0,t.jsx)(eQ,{extractedVariables:d,variables:i}),(0,t.jsx)(e2,{inputMessage:o,isLoading:a,isDisabled:a||!o.trim()||d.length>0&&!m,onInputChange:x,onSend:u,onKeyDown:f,onCancel:h})]})]})},e6=({visible:e,promptName:s,isSaving:r,onNameChange:a,onPublish:l,onCancel:n})=>(0,t.jsx)(Z.Modal,{title:"Publish Prompt",open:e,onCancel:n,footer:[(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(F.Button,{variant:"secondary",onClick:n,children:"Cancel"}),(0,t.jsx)(F.Button,{onClick:l,loading:r,children:"Publish"})]},"footer")],children:(0,t.jsxs)("div",{className:"py-4",children:[(0,t.jsx)(O.Text,{className:"mb-2",children:"Name"}),(0,t.jsx)(ey.Input,{value:s,onChange:e=>a(e.target.value),placeholder:"Enter prompt name",onPressEnter:l,autoFocus:!0}),(0,t.jsx)(O.Text,{className:"text-gray-500 text-xs mt-2",children:"Published prompts can be used in API calls and are versioned for easy tracking."})]})}),e5=({prompt:e})=>{let s=N(e);return(0,t.jsxs)("div",{className:"p-6",children:[(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-gray-700 mb-2",children:"Generated .prompt file"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"This is the dotprompt format that will be saved to the database"})]}),(0,t.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-lg p-4 overflow-auto",children:(0,t.jsx)("pre",{className:"text-sm text-gray-900 font-mono whitespace-pre-wrap",children:s})})]})};var e3=e.i(608856),e7=e.i(573421),e8=e.i(981339);let{Text:e9}=e.i(898586).Typography,te=({isOpen:e,onClose:r,accessToken:a,promptId:n,activeVersionId:o,onSelectVersion:i})=>{let[c,d]=(0,s.useState)([]),[m,p]=(0,s.useState)(!1);(0,s.useEffect)(()=>{e&&a&&n&&x()},[e,a,n]);let x=async()=>{p(!0);try{let e=n.includes(".v")?n.split(".v")[0]:n,t=await (0,l.getPromptVersions)(a,e);d(t.prompts)}catch(e){console.error("Error fetching prompt versions:",e)}finally{p(!1)}},u=e=>{if(e.version)return`v${e.version}`;let t=e.litellm_params?.prompt_id||e.prompt_id;return t.includes(".v")?`v${t.split(".v")[1]}`:t.includes("_v")?`v${t.split("_v")[1]}`:"v1"};return(0,t.jsx)(e3.Drawer,{title:"Version History",placement:"right",onClose:r,open:e,width:400,mask:!1,maskClosable:!1,children:m?(0,t.jsx)(e8.Skeleton,{active:!0,paragraph:{rows:4}}):0===c.length?(0,t.jsx)("div",{className:"text-center py-8 text-gray-500",children:"No version history available."}):(0,t.jsx)(e7.List,{dataSource:c,renderItem:(e,s)=>{var r;let a=e.version||parseInt(u(e).replace("v","")),l=null;o&&(o.includes(".v")?l=parseInt(o.split(".v")[1]):o.includes("_v")&&(l=parseInt(o.split("_v")[1])));let n=l?a===l:0===s;return(0,t.jsxs)("div",{className:`mb-4 p-4 rounded-lg border cursor-pointer transition-all hover:shadow-md ${n?"border-blue-500 bg-blue-50":"border-gray-200 bg-white hover:border-blue-300"}`,onClick:()=>i?.(e),children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eA.Tag,{className:"m-0",children:u(e)}),0===s&&(0,t.jsx)(eA.Tag,{color:"blue",className:"m-0",children:"Latest"})]}),n&&(0,t.jsx)(eA.Tag,{color:"green",className:"m-0",children:"Active"})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)(e9,{className:"text-sm text-gray-600 font-medium",children:(r=e.created_at)?new Date(r).toLocaleString():"-"}),(0,t.jsx)(e9,{type:"secondary",className:"text-xs",children:e.prompt_info?.prompt_type==="db"?"Saved to Database":"Config Prompt"})]})]},`${e.prompt_id}-v${e.version||a}`)}})})},tt=({onClose:e,onSuccess:r,accessToken:a,initialPromptData:n})=>{let[o,i]=(0,s.useState)((()=>{if(n)try{return C(n)}catch(e){console.error("Error parsing existing prompt:",e),ea.default.fromBackend("Failed to parse prompt data")}return{name:"New prompt",model:"gpt-4o",config:{temperature:1,max_tokens:1e3},tools:[],developerMessage:"",messages:[{role:"user",content:"Enter task specifics. Use {{template_variables}} for dynamic inputs"}],environment:"development"}})()),[c,d]=(0,s.useState)(!!n),[m,p]=(0,s.useState)(!1),[x,u]=(0,s.useState)((()=>{if(!n?.prompt_spec)return;let e=n.prompt_spec.prompt_id,t=n.prompt_spec.version||n.prompt_spec.litellm_params?.prompt_id;return"number"==typeof t?`${e}.v${t}`:"string"==typeof t&&(t.includes(".v")||t.includes("_v"))?t:e})()),[h,g]=(0,s.useState)(!1),[f,j]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,w]=(0,s.useState)(!1),[_,k]=(0,s.useState)("pretty"),S=e=>{void 0!==e?b(e):b(null),g(!0)},T=async()=>{if(!a)return void ea.default.fromBackend("Access token is required");if(!o.name||""===o.name.trim())return void ea.default.fromBackend("Please enter a valid prompt name");w(!0);try{let t=o.name.replace(/[^a-zA-Z0-9_-]/g,"_").toLowerCase(),s=N(o),i={prompt_id:t,litellm_params:{prompt_integration:"dotprompt",prompt_id:t,dotprompt_content:s},prompt_info:{prompt_type:"db",environment:o.environment}};c&&n?.prompt_spec?.prompt_id?(await (0,l.updatePromptCall)(a,n.prompt_spec.prompt_id,i),ea.default.success("Prompt updated successfully!")):(await (0,l.createPromptCall)(a,i),ea.default.success("Prompt created successfully!")),r(),e()}catch(e){console.error("Error saving prompt:",e),ea.default.fromBackend(c?"Failed to update prompt":"Failed to save prompt")}finally{w(!1),j(!1)}},$=x&&x.includes(".v")?`v${x.split(".v")[1]}`:null;return(0,t.jsxs)("div",{className:"flex h-full bg-white",children:[(0,t.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,t.jsx)(ek,{promptName:o.name,onNameChange:e=>i({...o,name:e}),onBack:e,onSave:()=>{o.name&&""!==o.name.trim()&&"New prompt"!==o.name?T():j(!0)},isSaving:y,editMode:c,onShowHistory:()=>p(!0),version:$,promptModel:o.model,promptVariables:(()=>{let e,t={},s=[o.developerMessage,...o.messages.map(e=>e.content)].join(" "),r=/\{\{(\w+)\}\}/g;for(;null!==(e=r.exec(s));){let s=e[1];t[s]||(t[s]=`example_${s}`)}return t})(),accessToken:a,environment:o.environment,onEnvironmentChange:async e=>{if(i({...o,environment:e}),c&&a&&n?.prompt_spec?.prompt_id)try{let t=await (0,l.getPromptInfo)(a,n.prompt_spec.prompt_id,e);if(t?.prompt_spec){let s=C(t);i({...s,environment:e});let r=t.prompt_spec.version||1;u(`${t.prompt_spec.prompt_id}.v${r}`)}}catch{}}}),(0,t.jsxs)("div",{className:"flex-1 flex overflow-hidden",children:[(0,t.jsxs)("div",{className:"w-1/2 overflow-y-auto bg-white border-r border-gray-200 shrink-0",children:[(0,t.jsxs)("div",{className:"border-b border-gray-200 bg-white px-6 py-4 flex items-center gap-3",children:[(0,t.jsx)(e$,{model:o.model,temperature:o.config.temperature,maxTokens:o.config.max_tokens,accessToken:a,onModelChange:e=>i({...o,model:e}),onTemperatureChange:e=>i({...o,config:{...o.config,temperature:e}}),onMaxTokensChange:e=>i({...o,config:{...o.config,max_tokens:e}})}),(0,t.jsxs)("div",{className:"ml-auto inline-flex items-center bg-gray-200 rounded-full p-0.5",children:[(0,t.jsx)("button",{className:`px-3 py-1 text-xs font-medium rounded-full transition-colors ${"pretty"===_?"bg-white text-gray-900 shadow-xs":"text-gray-600"}`,onClick:()=>k("pretty"),children:"PRETTY"}),(0,t.jsx)("button",{className:`px-3 py-1 text-xs font-medium rounded-full transition-colors ${"dotprompt"===_?"bg-white text-gray-900 shadow-xs":"text-gray-600"}`,onClick:()=>k("dotprompt"),children:"DOTPROMPT"})]})]}),"pretty"===_?(0,t.jsxs)("div",{className:"p-6 space-y-4 pb-20",children:[(0,t.jsx)(eI,{tools:o.tools,onAddTool:()=>S(),onEditTool:S,onRemoveTool:e=>{i({...o,tools:o.tools.filter((t,s)=>s!==e)})}}),(0,t.jsx)(eM,{value:o.developerMessage,onChange:e=>i({...o,developerMessage:e})}),(0,t.jsx)(eR,{messages:o.messages,onAddMessage:()=>{i({...o,messages:[...o.messages,{role:"user",content:""}]})},onUpdateMessage:(e,t,s)=>{let r=[...o.messages];r[e][t]=s,i({...o,messages:r})},onRemoveMessage:e=>{o.messages.length>1&&i({...o,messages:o.messages.filter((t,s)=>s!==e)})},onMoveMessage:(e,t)=>{let s=[...o.messages],[r]=s.splice(e,1);s.splice(t,0,r),i({...o,messages:s})}})]}):(0,t.jsx)(e5,{prompt:o})]}),(0,t.jsx)("div",{className:"w-1/2 shrink-0",children:(0,t.jsx)(e4,{prompt:o,accessToken:a})})]})]}),(0,t.jsx)(e6,{visible:f,promptName:o.name,isSaving:y,onNameChange:e=>i({...o,name:e}),onPublish:T,onCancel:()=>j(!1)}),h&&(0,t.jsx)(eb,{visible:h,initialJson:null!==v?o.tools[v].json:"",onSave:e=>{try{let t=JSON.parse(e),s={name:t.function?.name||"Unnamed Tool",description:t.function?.description||"",json:e};if(null!==v){let e=[...o.tools];e[v]=s,i({...o,tools:e})}else i({...o,tools:[...o.tools,s]});g(!1),b(null)}catch(e){ea.default.fromBackend("Invalid JSON format")}},onClose:()=>{g(!1),b(null)}}),(0,t.jsx)(te,{isOpen:m,onClose:()=>p(!1),accessToken:a,promptId:n?.prompt_spec?.prompt_id||o.name,activeVersionId:x,onSelectVersion:e=>{try{let t=C({prompt_spec:e});i(t);let s=e.version||1;u(`${e.prompt_id}.v${s}`)}catch(e){console.error("Error loading version:",e),ea.default.fromBackend("Failed to load prompt version")}}})]})};var ts=e.i(708347),tr=e.i(868499),ta=e.i(967489);let tl="All Environments",tn=[{label:"Development",value:"development"},{label:"Staging",value:"staging"},{label:"Production",value:"production"}],to=[{label:tl,value:null},...tn],ti=({accessToken:e,userRole:n})=>{let[o,i]=(0,s.useState)([]),[c,d]=(0,s.useState)(!0),[m,p]=(0,s.useState)(void 0),[x,u]=(0,s.useState)(null),[h,g]=(0,s.useState)(!1),[j,v]=(0,s.useState)(!1),[b,y]=(0,s.useState)(null),[N,w]=(0,s.useState)(!1),[C,_]=(0,s.useState)(null);n&&(0,ts.isAdminRole)(n);let k=!!n&&(0,ts.isProxyAdminRole)(n),S=async()=>{if(!e)return void d(!1);d(!0);try{let t=await (0,l.getPromptsList)(e,m);i(t.prompts)}catch(e){console.error("Error fetching prompts:",e)}finally{d(!1)}};(0,s.useEffect)(()=>{S()},[e,m]);let T=()=>{S(),v(!1),y(null),u(null)},$=async()=>{if(C&&e){w(!0);try{await (0,l.deletePromptCall)(e,C.id),ea.default.success(`Prompt "${C.name}" deleted successfully`),S()}catch(e){console.error("Error deleting prompt:",e),ea.default.fromBackend("Failed to delete prompt")}finally{w(!1),_(null)}}};return(0,t.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[j?(0,t.jsx)(tt,{onClose:()=>{v(!1),y(null)},onSuccess:T,accessToken:e,initialPromptData:b}):x?(0,t.jsx)(em,{promptId:x,onClose:()=>u(null),accessToken:e,isAdmin:k,onDelete:S,onEdit:e=>{y(e),v(!0)}}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,t.jsx)("div",{className:"flex gap-2",children:k&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(f.Button,{onClick:()=>{x&&u(null),y(null),v(!0)},disabled:!e,children:[(0,t.jsx)(r.Plus,{}),"Add New Prompt"]}),(0,t.jsxs)(f.Button,{onClick:()=>{x&&u(null),g(!0)},disabled:!e,variant:"secondary",children:[(0,t.jsx)(a.Upload,{}),"Upload .prompt File"]})]})}),(0,t.jsxs)(ta.Select,{items:to,value:m??null,onValueChange:e=>p(e??void 0),children:[(0,t.jsx)(ta.SelectTrigger,{className:"w-[180px]",children:(0,t.jsx)(ta.SelectValue,{placeholder:tl})}),(0,t.jsxs)(ta.SelectContent,{children:[(0,t.jsx)(ta.SelectItem,{value:null,children:tl}),tn.map(e=>(0,t.jsx)(ta.SelectItem,{value:e.value,children:e.label},e.value))]})]})]}),(0,t.jsx)(B,{promptsList:o,isLoading:c,onPromptClick:e=>{u(e)},onDeleteClick:(e,t)=>{_({id:e,name:t})},accessToken:e,isAdmin:k})]}),(0,t.jsx)(ej,{visible:h,onClose:()=>{g(!1)},accessToken:e,onSuccess:T}),C&&(0,t.jsx)(tr.AlertDialog,{open:!0,onOpenChange:e=>{e||N||_(null)},children:(0,t.jsxs)(tr.AlertDialogContent,{children:[(0,t.jsxs)(tr.AlertDialogHeader,{children:[(0,t.jsx)(tr.AlertDialogTitle,{children:"Delete Prompt"}),(0,t.jsxs)(tr.AlertDialogDescription,{children:["Are you sure you want to delete prompt: ",C.name," ? This action cannot be undone."]})]}),(0,t.jsxs)(tr.AlertDialogFooter,{children:[(0,t.jsx)(tr.AlertDialogCancel,{disabled:N,children:"Cancel"}),(0,t.jsx)(f.Button,{variant:"destructive",onClick:$,disabled:N,children:"Delete"})]})]})})]})};var tc=e.i(541202),td=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:s}=(0,td.default)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tc.DeprecationBanner,{featureName:"Prompt Management"}),(0,t.jsx)(ti,{accessToken:e,userRole:s})]})}],66899)}]); \ No newline at end of file + `}),(0,t.jsx)(eO,{value:e,onChange:e=>r(e.target.value),placeholder:a,rows:l,className:"font-sans"}),p.length>0&&(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 items-center",children:[(0,t.jsx)("span",{className:"text-xs text-gray-500 mr-1",children:"Detected variables:"}),p.map((e,s)=>(0,t.jsx)(eB.Popover,{content:(0,t.jsxs)("div",{className:"p-2",style:{minWidth:"200px"},children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"Edit variable name"}),(0,t.jsx)(ey.Input,{size:"small",value:c,onChange:e=>d(e.target.value),onPressEnter:m,placeholder:"Variable name",autoFocus:!0}),(0,t.jsxs)("div",{className:"flex gap-2 mt-2",children:[(0,t.jsx)("button",{onClick:m,className:"text-xs px-2 py-1 bg-blue-500 text-white rounded-sm hover:bg-blue-600",children:"Save"}),(0,t.jsx)("button",{onClick:()=>{i(null),d("")},className:"text-xs px-2 py-1 bg-gray-200 text-gray-700 rounded-sm hover:bg-gray-300",children:"Cancel"})]})]}),open:o?.start===e.start,onOpenChange:e=>{e||(i(null),d(""))},trigger:"click",children:(0,t.jsx)(eA.Tag,{color:"orange",className:"cursor-pointer hover:opacity-80 transition-all m-0",icon:(0,t.jsx)(eE.EditOutlined,{}),onClick:()=>{i({oldName:e.name,start:e.start,end:e.end}),d(e.name)},children:e.name})},`${e.start}-${s}`))]})]})},eM=({value:e,onChange:s})=>(0,t.jsxs)(A.Card,{className:"p-3",children:[(0,t.jsx)(O.Text,{className:"block mb-2 text-sm font-medium",children:"Developer message"}),(0,t.jsx)(O.Text,{className:"text-gray-500 text-xs mb-2",children:"Optional system instructions for the model"}),(0,t.jsx)(ez,{value:e,onChange:s,rows:3,placeholder:"e.g., You are a helpful assistant..."})]}),eF=(0,eC.default)("grip-vertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),{Option:eL}=el.Select,eR=({messages:e,onAddMessage:r,onUpdateMessage:a,onRemoveMessage:l,onMoveMessage:n})=>{let[o,i]=(0,s.useState)(null),[c,d]=(0,s.useState)(null),m=()=>{i(null),d(null)};return(0,t.jsxs)(A.Card,{className:"p-3",children:[(0,t.jsxs)("div",{className:"mb-2",children:[(0,t.jsx)(O.Text,{className:"text-sm font-medium",children:"Prompt messages"}),(0,t.jsxs)(O.Text,{className:"text-gray-500 text-xs mt-1",children:["Use ",(0,t.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-xs",children:"{{variable}}"})," syntax for template variables"]})]}),(0,t.jsx)("div",{className:"space-y-2",children:e.map((s,r)=>(0,t.jsxs)("div",{draggable:!0,onDragStart:()=>{i(r)},onDragOver:e=>{e.preventDefault(),d(r)},onDrop:e=>{e.preventDefault(),null!==o&&o!==r&&n(o,r),i(null),d(null)},onDragEnd:m,className:`border border-gray-300 rounded overflow-hidden bg-white transition-all ${o===r?"opacity-50":""} ${c===r&&o!==r?"border-blue-500 border-2":""}`,children:[(0,t.jsxs)("div",{className:"bg-gray-50 px-2 py-1.5 border-b border-gray-300 flex items-center justify-between",children:[(0,t.jsxs)(el.Select,{value:s.role,onChange:e=>a(r,"role",e),style:{width:100},size:"small",bordered:!1,children:[(0,t.jsx)(eL,{value:"user",children:"User"}),(0,t.jsx)(eL,{value:"assistant",children:"Assistant"}),(0,t.jsx)(eL,{value:"system",children:"System"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[e.length>1&&(0,t.jsx)("button",{onClick:()=>l(r),className:"text-gray-400 hover:text-red-500",children:(0,t.jsx)(eD,{size:14})}),(0,t.jsx)("div",{className:"cursor-grab active:cursor-grabbing text-gray-400 hover:text-gray-600",children:(0,t.jsx)(eF,{size:16})})]})]}),(0,t.jsx)("div",{className:"p-2",children:(0,t.jsx)(ez,{value:s.content,onChange:e=>a(r,"content",e),rows:3,placeholder:"Enter prompt content..."})})]},r))}),(0,t.jsxs)("button",{onClick:r,className:"mt-2 text-xs text-blue-600 hover:text-blue-700 flex items-center",children:[(0,t.jsx)(eP.PlusIcon,{size:14,className:"mr-1"}),"Add message"]})]})};var eU=e.i(447593);let eH=({extractedVariables:e,variables:s,onVariableChange:r})=>0===e.length?null:(0,t.jsxs)("div",{className:"p-4 border-b border-gray-200 bg-blue-50",children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Fill in template variables to start testing"}),(0,t.jsx)("div",{className:"space-y-2",children:e.map(e=>(0,t.jsxs)("div",{children:[(0,t.jsxs)("label",{className:"block text-xs text-gray-600 mb-1 font-medium",children:["{{",e,"}}"]}),(0,t.jsx)(ey.Input,{value:s[e]||"",onChange:t=>r(e,t.target.value),placeholder:`Enter value for ${e}`,size:"small"})]},e))})]});var eV=e.i(56456),eJ=e.i(482725),eW=e.i(983561);let eK=({hasVariables:e})=>(0,t.jsxs)("div",{className:"h-full flex flex-col items-center justify-center text-gray-400",children:[(0,t.jsx)(eW.RobotOutlined,{style:{fontSize:"48px",marginBottom:"16px"}}),(0,t.jsx)("span",{className:"text-base",children:e?"Fill in the variables above, then type a message to start testing":"Type a message below to start testing your prompt"})]});var eq=e.i(771674),eG=e.i(918789),eX=e.i(285903);let eY=({message:e})=>(0,t.jsx)("div",{className:`mb-4 flex ${"user"===e.role?"justify-end":"justify-start"}`,children:(0,t.jsxs)("div",{className:"max-w-[85%] rounded-lg shadow-xs p-3.5 px-4",style:{backgroundColor:"user"===e.role?"#f0f8ff":"#ffffff",border:"user"===e.role?"1px solid #e6f0fa":"1px solid #f0f0f0"},children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full mr-1",style:{backgroundColor:"user"===e.role?"#e6f0fa":"#f5f5f5"},children:"user"===e.role?(0,t.jsx)(eq.UserOutlined,{style:{fontSize:"12px",color:"#2563eb"}}):(0,t.jsx)(eW.RobotOutlined,{style:{fontSize:"12px",color:"#4b5563"}})}),(0,t.jsx)("strong",{className:"text-sm capitalize",children:e.role}),"assistant"===e.role&&e.model&&(0,t.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-sm bg-gray-100 text-gray-600 font-normal",children:e.model})]}),(0,t.jsxs)("div",{className:"whitespace-pre-wrap wrap-break-word max-w-full message-content",style:{wordWrap:"break-word",overflowWrap:"break-word",wordBreak:"break-word",hyphens:"auto"},children:["assistant"===e.role?(0,t.jsx)(eG.default,{components:{code({node:e,inline:s,className:r,children:a,...l}){let n=/language-(\w+)/.exec(r||"");return!s&&n?(0,t.jsx)(ei.Prism,{style:ec.coy,language:n[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...l,children:String(a).replace(/\n$/,"")}):(0,t.jsx)("code",{className:`${r} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...l,children:a})},pre:({node:e,...s})=>(0,t.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...s})},children:e.content}):(0,t.jsx)("div",{className:"whitespace-pre-wrap",children:e.content}),"assistant"===e.role&&(e.timeToFirstToken||e.totalLatency||e.usage)&&(0,t.jsx)(eX.default,{timeToFirstToken:e.timeToFirstToken,totalLatency:e.totalLatency,usage:e.usage})]})]})}),eZ=({messages:e,isLoading:s,hasVariables:r,messagesEndRef:a})=>{let l=(0,t.jsx)(eV.LoadingOutlined,{style:{fontSize:24},spin:!0});return(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto p-4 pb-0",children:[0===e.length&&(0,t.jsx)(eK,{hasVariables:r}),e.map((e,s)=>(0,t.jsx)(eY,{message:e},s)),s&&(0,t.jsx)("div",{className:"flex justify-center items-center my-4",children:(0,t.jsx)(eJ.Spin,{indicator:l})}),(0,t.jsx)("div",{ref:a,style:{height:"1px"}})]})},eQ=({extractedVariables:e,variables:s})=>{let r=e.filter(e=>!s[e]||""===s[e].trim());return 0===r.length?null:(0,t.jsx)("div",{className:"mb-3 p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)("div",{className:"flex items-start gap-2",children:[(0,t.jsx)("span",{className:"text-yellow-600 text-sm",children:"⚠️"}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 font-medium mb-1",children:"Please fill in all template variables above"}),(0,t.jsxs)("p",{className:"text-xs text-yellow-700",children:["Missing: ",r.map(e=>`{{${e}}}`).join(", ")]})]})]})})};var e0=e.i(132104);let{TextArea:e1}=ey.Input,e2=({inputMessage:e,isLoading:s,isDisabled:r,onInputChange:a,onSend:l,onKeyDown:n,onCancel:o})=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center flex-1 bg-white border border-gray-300 rounded-xl px-3 py-1 min-h-[44px]",children:[(0,t.jsx)(e1,{value:e,onChange:e=>a(e.target.value),onKeyDown:n,placeholder:"Type your message... (Shift+Enter for new line)",disabled:s,className:"flex-1",autoSize:{minRows:1,maxRows:4},style:{resize:"none",border:"none",boxShadow:"none",background:"transparent",padding:"4px 0",fontSize:"14px",lineHeight:"20px"}}),(0,t.jsx)(F.Button,{onClick:l,disabled:r,className:"shrink-0 ml-2 w-8! h-8! min-w-8! p-0! rounded-full! bg-blue-600! hover:bg-blue-700! disabled:bg-gray-300! border-none! text-white! disabled:text-gray-500! flex! items-center! justify-center!",children:(0,t.jsx)(e0.ArrowUpOutlined,{style:{fontSize:"14px"}})})]}),s&&(0,t.jsx)(F.Button,{onClick:o,className:"bg-red-50 hover:bg-red-100 text-red-600 border-red-200",children:"Cancel"})]}),e4=({prompt:e,accessToken:r})=>{let{isLoading:a,messages:n,inputMessage:o,variables:i,variablesFilled:c,extractedVariables:d,allVariablesFilled:m,messagesEndRef:p,setInputMessage:x,handleSendMessage:u,handleCancelRequest:h,handleClearConversation:g,handleKeyDown:f,handleVariableChange:j}=((e,t)=>{let[r,a]=(0,s.useState)(!1),[n,o]=(0,s.useState)([]),[i,c]=(0,s.useState)(""),[d,m]=(0,s.useState)({}),[p,x]=(0,s.useState)(!1),[u,h]=(0,s.useState)(null),g=(0,s.useRef)(null),f=y(e),j=f.every(e=>d[e]&&""!==d[e].trim());(0,s.useEffect)(()=>{g.current&&setTimeout(()=>{g.current?.scrollIntoView({behavior:"smooth",block:"end"})},100)},[n]);let v=async()=>{let s;if(!t)return void ea.default.fromBackend("Access token is required");if(f.length>0&&!j)return void ea.default.fromBackend("Please fill in all template variables");if(!i.trim())return;!p&&f.length>0&&x(!0);let r={role:"user",content:i};o(e=>[...e,r]),c("");let m=new AbortController;h(m),a(!0);let u=Date.now();try{let r,a,c=N(e),p=(0,l.getProxyBaseUrl)(),x={dotprompt_content:c};0===n.length?x.prompt_variables=d:x.conversation_history=[...n.map(e=>({role:e.role,content:e.content})),{role:"user",content:i}];let h=await fetch(`${p}/prompts/test`,{method:"POST",headers:{[(0,l.getGlobalLitellmHeaderName)()]:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify(x),signal:m.signal});if(!h.ok){let e=await h.text();throw Error(`HTTP error! status: ${h.status}, ${e}`)}if(!h.body)throw Error("No response body");let g=h.body.getReader(),f=new TextDecoder,j="";for(o(e=>[...e,{role:"assistant",content:""}]);;){let{done:e,value:t}=await g.read();if(e)break;for(let e of f.decode(t).split("\n"))if(e.startsWith("data: ")){let t=e.slice(6);if("[DONE]"===t)continue;try{let e=JSON.parse(t);!r&&e.model&&(r=e.model),e.usage&&(a=e.usage);let l=e.choices?.[0]?.delta?.content;l&&(s||(s=Date.now()-u),j+=l,o(e=>{let t=[...e];return t[t.length-1]={role:"assistant",content:j,model:r,timeToFirstToken:s},t}))}catch(e){console.error("Error parsing chunk:",e)}}}let v=Date.now()-u;o(e=>{let t=[...e];return t[t.length-1]={...t[t.length-1],totalLatency:v,usage:a},t})}catch(e){"AbortError"===e.name||(console.error("Error testing prompt:",e),o(t=>{let s=t[t.length-1];return s&&"assistant"===s.role&&""===s.content?[...t.slice(0,-1),{role:"assistant",content:`Error: ${e.message}`}]:[...t,{role:"assistant",content:`Error: ${e.message}`}]}))}finally{a(!1),h(null)}};return{isLoading:r,messages:n,inputMessage:i,variables:d,variablesFilled:p,extractedVariables:f,allVariablesFilled:j,messagesEndRef:g,setInputMessage:c,handleSendMessage:v,handleCancelRequest:()=>{u&&(u.abort(),h(null),a(!1),ea.default.info("Request cancelled"))},handleClearConversation:()=>{o([]),x(!1),ea.default.success("Chat history cleared.")},handleKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),v())},handleVariableChange:(e,t)=>{m({...d,[e]:t})}}})(e,r);return(0,t.jsxs)("div",{className:"flex flex-col h-full bg-white",children:[!c&&(0,t.jsx)(eH,{extractedVariables:d,variables:i,onVariableChange:j}),n.length>0&&(0,t.jsx)("div",{className:"p-3 border-b border-gray-200 bg-white flex justify-end",children:(0,t.jsx)(F.Button,{onClick:g,className:"bg-gray-100 hover:bg-gray-200 text-gray-700 border-gray-300",icon:eU.ClearOutlined,children:"Clear Chat"})}),(0,t.jsx)(eZ,{messages:n,isLoading:a,hasVariables:d.length>0,messagesEndRef:p}),(0,t.jsxs)("div",{className:"p-4 border-t border-gray-200 bg-white",children:[(0,t.jsx)(eQ,{extractedVariables:d,variables:i}),(0,t.jsx)(e2,{inputMessage:o,isLoading:a,isDisabled:a||!o.trim()||d.length>0&&!m,onInputChange:x,onSend:u,onKeyDown:f,onCancel:h})]})]})},e6=({visible:e,promptName:s,isSaving:r,onNameChange:a,onPublish:l,onCancel:n})=>(0,t.jsx)(Z.Modal,{title:"Publish Prompt",open:e,onCancel:n,footer:[(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(F.Button,{variant:"secondary",onClick:n,children:"Cancel"}),(0,t.jsx)(F.Button,{onClick:l,loading:r,children:"Publish"})]},"footer")],children:(0,t.jsxs)("div",{className:"py-4",children:[(0,t.jsx)(O.Text,{className:"mb-2",children:"Name"}),(0,t.jsx)(ey.Input,{value:s,onChange:e=>a(e.target.value),placeholder:"Enter prompt name",onPressEnter:l,autoFocus:!0}),(0,t.jsx)(O.Text,{className:"text-gray-500 text-xs mt-2",children:"Published prompts can be used in API calls and are versioned for easy tracking."})]})}),e5=({prompt:e})=>{let s=N(e);return(0,t.jsxs)("div",{className:"p-6",children:[(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-gray-700 mb-2",children:"Generated .prompt file"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"This is the dotprompt format that will be saved to the database"})]}),(0,t.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-lg p-4 overflow-auto",children:(0,t.jsx)("pre",{className:"text-sm text-gray-900 font-mono whitespace-pre-wrap",children:s})})]})};var e3=e.i(608856),e7=e.i(573421),e8=e.i(981339);let{Text:e9}=e.i(898586).Typography,te=({isOpen:e,onClose:r,accessToken:a,promptId:n,activeVersionId:o,onSelectVersion:i})=>{let[c,d]=(0,s.useState)([]),[m,p]=(0,s.useState)(!1);(0,s.useEffect)(()=>{e&&a&&n&&x()},[e,a,n]);let x=async()=>{p(!0);try{let e=n.includes(".v")?n.split(".v")[0]:n,t=await (0,l.getPromptVersions)(a,e);d(t.prompts)}catch(e){console.error("Error fetching prompt versions:",e)}finally{p(!1)}},u=e=>{if(e.version)return`v${e.version}`;let t=e.litellm_params?.prompt_id||e.prompt_id;return t.includes(".v")?`v${t.split(".v")[1]}`:t.includes("_v")?`v${t.split("_v")[1]}`:"v1"};return(0,t.jsx)(e3.Drawer,{title:"Version History",placement:"right",onClose:r,open:e,width:400,mask:!1,maskClosable:!1,children:m?(0,t.jsx)(e8.Skeleton,{active:!0,paragraph:{rows:4}}):0===c.length?(0,t.jsx)("div",{className:"text-center py-8 text-gray-500",children:"No version history available."}):(0,t.jsx)(e7.List,{dataSource:c,renderItem:(e,s)=>{var r;let a=e.version||parseInt(u(e).replace("v","")),l=null;o&&(o.includes(".v")?l=parseInt(o.split(".v")[1]):o.includes("_v")&&(l=parseInt(o.split("_v")[1])));let n=l?a===l:0===s;return(0,t.jsxs)("div",{className:`mb-4 p-4 rounded-lg border cursor-pointer transition-all hover:shadow-md ${n?"border-blue-500 bg-blue-50":"border-gray-200 bg-white hover:border-blue-300"}`,onClick:()=>i?.(e),children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eA.Tag,{className:"m-0",children:u(e)}),0===s&&(0,t.jsx)(eA.Tag,{color:"blue",className:"m-0",children:"Latest"})]}),n&&(0,t.jsx)(eA.Tag,{color:"green",className:"m-0",children:"Active"})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)(e9,{className:"text-sm text-gray-600 font-medium",children:(r=e.created_at)?new Date(r).toLocaleString():"-"}),(0,t.jsx)(e9,{type:"secondary",className:"text-xs",children:e.prompt_info?.prompt_type==="db"?"Saved to Database":"Config Prompt"})]})]},`${e.prompt_id}-v${e.version||a}`)}})})},tt=({onClose:e,onSuccess:r,accessToken:a,initialPromptData:n})=>{let[o,i]=(0,s.useState)((()=>{if(n)try{return C(n)}catch(e){console.error("Error parsing existing prompt:",e),ea.default.fromBackend("Failed to parse prompt data")}return{name:"New prompt",model:"gpt-4o",config:{temperature:1,max_tokens:1e3},tools:[],developerMessage:"",messages:[{role:"user",content:"Enter task specifics. Use {{template_variables}} for dynamic inputs"}],environment:"development"}})()),[c]=(0,s.useState)(!!n),[d,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)((()=>{if(!n?.prompt_spec)return;let e=n.prompt_spec.prompt_id,t=n.prompt_spec.version||n.prompt_spec.litellm_params?.prompt_id;return"number"==typeof t?`${e}.v${t}`:"string"==typeof t&&(t.includes(".v")||t.includes("_v"))?t:e})()),[u,h]=(0,s.useState)(!1),[g,f]=(0,s.useState)(!1),[j,v]=(0,s.useState)(null),[b,y]=(0,s.useState)(!1),[w,_]=(0,s.useState)("pretty"),k=e=>{void 0!==e?v(e):v(null),h(!0)},S=async()=>{if(!a)return void ea.default.fromBackend("Access token is required");if(!o.name||""===o.name.trim())return void ea.default.fromBackend("Please enter a valid prompt name");y(!0);try{let t=o.name.replace(/[^a-zA-Z0-9_-]/g,"_").toLowerCase(),s=N(o),i={prompt_id:t,litellm_params:{prompt_integration:"dotprompt",prompt_id:t,dotprompt_content:s},prompt_info:{prompt_type:"db",environment:o.environment}};c&&n?.prompt_spec?.prompt_id?(await (0,l.updatePromptCall)(a,n.prompt_spec.prompt_id,i),ea.default.success("Prompt updated successfully!")):(await (0,l.createPromptCall)(a,i),ea.default.success("Prompt created successfully!")),r(),e()}catch(e){console.error("Error saving prompt:",e),ea.default.fromBackend(c?"Failed to update prompt":"Failed to save prompt")}finally{y(!1),f(!1)}},T=p&&p.includes(".v")?`v${p.split(".v")[1]}`:null;return(0,t.jsxs)("div",{className:"flex h-full bg-white",children:[(0,t.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,t.jsx)(ek,{promptName:o.name,onNameChange:e=>i({...o,name:e}),onBack:e,onSave:()=>{o.name&&""!==o.name.trim()&&"New prompt"!==o.name?S():f(!0)},isSaving:b,editMode:c,onShowHistory:()=>m(!0),version:T,promptModel:o.model,promptVariables:(()=>{let e,t={},s=[o.developerMessage,...o.messages.map(e=>e.content)].join(" "),r=/\{\{(\w+)\}\}/g;for(;null!==(e=r.exec(s));){let s=e[1];t[s]||(t[s]=`example_${s}`)}return t})(),accessToken:a,environment:o.environment,onEnvironmentChange:async e=>{if(i({...o,environment:e}),c&&a&&n?.prompt_spec?.prompt_id)try{let t=await (0,l.getPromptInfo)(a,n.prompt_spec.prompt_id,e);if(t?.prompt_spec){let s=C(t);i({...s,environment:e});let r=t.prompt_spec.version||1;x(`${t.prompt_spec.prompt_id}.v${r}`)}}catch{}}}),(0,t.jsxs)("div",{className:"flex-1 flex overflow-hidden",children:[(0,t.jsxs)("div",{className:"w-1/2 overflow-y-auto bg-white border-r border-gray-200 shrink-0",children:[(0,t.jsxs)("div",{className:"border-b border-gray-200 bg-white px-6 py-4 flex items-center gap-3",children:[(0,t.jsx)(e$,{model:o.model,temperature:o.config.temperature,maxTokens:o.config.max_tokens,accessToken:a,onModelChange:e=>i({...o,model:e}),onTemperatureChange:e=>i({...o,config:{...o.config,temperature:e}}),onMaxTokensChange:e=>i({...o,config:{...o.config,max_tokens:e}})}),(0,t.jsxs)("div",{className:"ml-auto inline-flex items-center bg-gray-200 rounded-full p-0.5",children:[(0,t.jsx)("button",{className:`px-3 py-1 text-xs font-medium rounded-full transition-colors ${"pretty"===w?"bg-white text-gray-900 shadow-xs":"text-gray-600"}`,onClick:()=>_("pretty"),children:"PRETTY"}),(0,t.jsx)("button",{className:`px-3 py-1 text-xs font-medium rounded-full transition-colors ${"dotprompt"===w?"bg-white text-gray-900 shadow-xs":"text-gray-600"}`,onClick:()=>_("dotprompt"),children:"DOTPROMPT"})]})]}),"pretty"===w?(0,t.jsxs)("div",{className:"p-6 space-y-4 pb-20",children:[(0,t.jsx)(eI,{tools:o.tools,onAddTool:()=>k(),onEditTool:k,onRemoveTool:e=>{i({...o,tools:o.tools.filter((t,s)=>s!==e)})}}),(0,t.jsx)(eM,{value:o.developerMessage,onChange:e=>i({...o,developerMessage:e})}),(0,t.jsx)(eR,{messages:o.messages,onAddMessage:()=>{i({...o,messages:[...o.messages,{role:"user",content:""}]})},onUpdateMessage:(e,t,s)=>{let r=[...o.messages];r[e][t]=s,i({...o,messages:r})},onRemoveMessage:e=>{o.messages.length>1&&i({...o,messages:o.messages.filter((t,s)=>s!==e)})},onMoveMessage:(e,t)=>{let s=[...o.messages],[r]=s.splice(e,1);s.splice(t,0,r),i({...o,messages:s})}})]}):(0,t.jsx)(e5,{prompt:o})]}),(0,t.jsx)("div",{className:"w-1/2 shrink-0",children:(0,t.jsx)(e4,{prompt:o,accessToken:a})})]})]}),(0,t.jsx)(e6,{visible:g,promptName:o.name,isSaving:b,onNameChange:e=>i({...o,name:e}),onPublish:S,onCancel:()=>f(!1)}),u&&(0,t.jsx)(eb,{visible:u,initialJson:null!==j?o.tools[j].json:"",onSave:e=>{try{let t=JSON.parse(e),s={name:t.function?.name||"Unnamed Tool",description:t.function?.description||"",json:e};if(null!==j){let e=[...o.tools];e[j]=s,i({...o,tools:e})}else i({...o,tools:[...o.tools,s]});h(!1),v(null)}catch(e){ea.default.fromBackend("Invalid JSON format")}},onClose:()=>{h(!1),v(null)}}),(0,t.jsx)(te,{isOpen:d,onClose:()=>m(!1),accessToken:a,promptId:n?.prompt_spec?.prompt_id||o.name,activeVersionId:p,onSelectVersion:e=>{try{let t=C({prompt_spec:e});i(t);let s=e.version||1;x(`${e.prompt_id}.v${s}`)}catch(e){console.error("Error loading version:",e),ea.default.fromBackend("Failed to load prompt version")}}})]})};var ts=e.i(708347),tr=e.i(868499),ta=e.i(967489);let tl="All Environments",tn=[{label:"Development",value:"development"},{label:"Staging",value:"staging"},{label:"Production",value:"production"}],to=[{label:tl,value:null},...tn],ti=({accessToken:e,userRole:n})=>{let[o,i]=(0,s.useState)([]),[c,d]=(0,s.useState)(!0),[m,p]=(0,s.useState)(void 0),[x,u]=(0,s.useState)(null),[h,g]=(0,s.useState)(!1),[j,v]=(0,s.useState)(!1),[b,y]=(0,s.useState)(null),[N,w]=(0,s.useState)(!1),[C,_]=(0,s.useState)(null),k=!!n&&(0,ts.isProxyAdminRole)(n),S=async()=>{if(!e)return void d(!1);d(!0);try{let t=await (0,l.getPromptsList)(e,m);i(t.prompts)}catch(e){console.error("Error fetching prompts:",e)}finally{d(!1)}};(0,s.useEffect)(()=>{S()},[e,m]);let T=()=>{S(),v(!1),y(null),u(null)},$=async()=>{if(C&&e){w(!0);try{await (0,l.deletePromptCall)(e,C.id),ea.default.success(`Prompt "${C.name}" deleted successfully`),S()}catch(e){console.error("Error deleting prompt:",e),ea.default.fromBackend("Failed to delete prompt")}finally{w(!1),_(null)}}};return(0,t.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[j?(0,t.jsx)(tt,{onClose:()=>{v(!1),y(null)},onSuccess:T,accessToken:e,initialPromptData:b}):x?(0,t.jsx)(em,{promptId:x,onClose:()=>u(null),accessToken:e,isAdmin:k,onDelete:S,onEdit:e=>{y(e),v(!0)}}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,t.jsx)("div",{className:"flex gap-2",children:k&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(f.Button,{onClick:()=>{x&&u(null),y(null),v(!0)},disabled:!e,children:[(0,t.jsx)(r.Plus,{}),"Add New Prompt"]}),(0,t.jsxs)(f.Button,{onClick:()=>{x&&u(null),g(!0)},disabled:!e,variant:"secondary",children:[(0,t.jsx)(a.Upload,{}),"Upload .prompt File"]})]})}),(0,t.jsxs)(ta.Select,{items:to,value:m??null,onValueChange:e=>p(e??void 0),children:[(0,t.jsx)(ta.SelectTrigger,{className:"w-[180px]",children:(0,t.jsx)(ta.SelectValue,{placeholder:tl})}),(0,t.jsxs)(ta.SelectContent,{children:[(0,t.jsx)(ta.SelectItem,{value:null,children:tl}),tn.map(e=>(0,t.jsx)(ta.SelectItem,{value:e.value,children:e.label},e.value))]})]})]}),(0,t.jsx)(B,{promptsList:o,isLoading:c,onPromptClick:e=>{u(e)},onDeleteClick:(e,t)=>{_({id:e,name:t})},accessToken:e,isAdmin:k})]}),(0,t.jsx)(ej,{visible:h,onClose:()=>{g(!1)},accessToken:e,onSuccess:T}),C&&(0,t.jsx)(tr.AlertDialog,{open:!0,onOpenChange:e=>{e||N||_(null)},children:(0,t.jsxs)(tr.AlertDialogContent,{children:[(0,t.jsxs)(tr.AlertDialogHeader,{children:[(0,t.jsx)(tr.AlertDialogTitle,{children:"Delete Prompt"}),(0,t.jsxs)(tr.AlertDialogDescription,{children:["Are you sure you want to delete prompt: ",C.name," ? This action cannot be undone."]})]}),(0,t.jsxs)(tr.AlertDialogFooter,{children:[(0,t.jsx)(tr.AlertDialogCancel,{disabled:N,children:"Cancel"}),(0,t.jsx)(f.Button,{variant:"destructive",onClick:$,disabled:N,children:"Delete"})]})]})})]})};var tc=e.i(541202),td=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:s}=(0,td.default)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tc.DeprecationBanner,{featureName:"Prompt Management"}),(0,t.jsx)(ti,{accessToken:e,userRole:s})]})}],66899)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0sm3ln66e4502.js b/litellm/proxy/_experimental/out/_next/static/chunks/0sm3ln66e4502.js deleted file mode 100644 index ec541035eb6..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0sm3ln66e4502.js +++ /dev/null @@ -1,3 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97859,e=>{"use strict";e.s(["AGENT_CALL_TYPES",0,["asend_message"],"ERROR_CODE_OPTIONS",0,[{label:"400 - Bad Request",value:"400"},{label:"401 - Invalid Authentication",value:"401"},{label:"403 - Permission Denied",value:"403"},{label:"404 - Not Found",value:"404"},{label:"408 - Request Timeout",value:"408"},{label:"422 - Unprocessable Entity",value:"422"},{label:"429 - Rate Limited",value:"429"},{label:"500 - Internal Server Error",value:"500"},{label:"502 - Bad Gateway",value:"502"},{label:"503 - Service Unavailable",value:"503"},{label:"529 - Overloaded",value:"529"}],"MCP_CALL_TYPES",0,["call_mcp_tool","list_mcp_tools"],"QUICK_SELECT_OPTIONS",0,[{label:"Last Minute",value:1,unit:"minutes"},{label:"Last 15 Minutes",value:15,unit:"minutes"},{label:"Last Hour",value:1,unit:"hours"},{label:"Last 4 Hours",value:4,unit:"hours"},{label:"Last 24 Hours",value:24,unit:"hours"},{label:"Last 7 Days",value:7,unit:"days"}]])},894660,283086,e=>{"use strict";var t=e.i(801312);e.s(["LeftOutlined",()=>t.default],894660);let s=(0,e.i(475254).default)("sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);e.s(["Sparkles",0,s],283086)},3565,502626,e=>{"use strict";var t=e.i(843476),s=e.i(271645),r=e.i(464571),l=e.i(608856),a=e.i(560025),n=e.i(492030),i=e.i(166406),o=e.i(894660),d=e.i(240647),c=e.i(531245),m=e.i(283086),x=e.i(195116);e.i(622826);var u=e.i(548151),p=e.i(97859),h=e.i(487486),g=e.i(115504);function f({origin:e,className:s}){return"autorouter_classifier"!==e?null:(0,t.jsx)(h.Badge,{variant:"secondary",title:"Tier classification call made by the auto-router, not a request the caller sent",className:(0,g.cn)("px-2 py-0 text-[10px] font-normal",s),children:"Classify"})}var y=e.i(770914),j=e.i(262218),b=e.i(592968),v=e.i(898586),N=e.i(149192),_=e.i(536591),_=_,w=e.i(755151),k=e.i(166540),S=e.i(916925);let C="24px",T="request",L="response",A="monospace",M="#f0f0f0",{Text:E}=v.Typography;function I({log:e,onClose:s,onPrevious:r,onNext:l,statusLabel:a,statusColor:n,environment:i}){let o=e.custom_llm_provider||"",d=o?(0,S.getProviderLogoAndName)(o):null;return(0,t.jsxs)("div",{style:{padding:"16px 24px",borderBottom:`1px solid ${M}`,backgroundColor:"#fff",position:"sticky",top:0,zIndex:10},children:[(0,t.jsx)(z,{model:e.model,modelGroup:e.model_group,internalCallOrigin:e.metadata?.internal_call_origin,providerLogo:d?.logo,providerName:d?.displayName}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:8},children:[(0,t.jsx)(D,{requestId:e.request_id}),(0,t.jsx)(O,{onPrevious:r,onNext:l,onClose:s})]}),(0,t.jsx)(R,{log:e,statusLabel:a,statusColor:n,environment:i})]})}function z({model:e,modelGroup:s,internalCallOrigin:r,providerLogo:l,providerName:a}){return(0,t.jsxs)(y.Space,{size:8,style:{marginBottom:8},children:[l&&(0,t.jsx)("img",{src:l,alt:a||"Provider",style:{width:24,height:24},onError:e=>{e.target.style.display="none"}}),(0,t.jsxs)(y.Space,{size:8,direction:"horizontal",children:[(0,t.jsx)(E,{strong:!0,style:{fontSize:14},children:e}),a&&(0,t.jsx)(E,{type:"secondary",style:{fontSize:12},children:a}),(0,t.jsx)(u.AutoRouterTag,{modelGroup:s}),(0,t.jsx)(f,{origin:r})]})]})}function D({requestId:e}){return(0,t.jsx)("div",{style:{flex:1,minWidth:0},children:(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)(E,{strong:!0,copyable:{text:e,tooltips:["Copy Request ID","Copied!"]},style:{fontSize:16,fontFamily:A,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",display:"block"},children:e})})})}function O({onPrevious:e,onNext:s,onClose:l}){let a={border:"1px solid #d9d9d9",borderRadius:4,padding:"0 4px",fontSize:12,fontFamily:"monospace",marginLeft:4,background:"#fafafa"};return(0,t.jsxs)(y.Space,{size:4,split:(0,t.jsx)("div",{style:{width:1,height:20,background:M}}),children:[(0,t.jsxs)(r.Button,{type:"text",size:"small",onClick:e,children:[(0,t.jsx)(_.default,{}),(0,t.jsx)("span",{style:a,children:"K"})]}),(0,t.jsxs)(r.Button,{type:"text",size:"small",onClick:s,children:[(0,t.jsx)(w.DownOutlined,{}),(0,t.jsx)("span",{style:a,children:"J"})]}),(0,t.jsx)(b.Tooltip,{title:"ESC to close",children:(0,t.jsx)(r.Button,{type:"text",icon:(0,t.jsx)(N.CloseOutlined,{}),onClick:l})})]})}function R({log:e,statusLabel:s,statusColor:r,environment:l}){return(0,t.jsxs)(y.Space,{size:12,children:[(0,t.jsx)(j.Tag,{color:r,children:s}),(0,t.jsxs)(j.Tag,{children:["Env: ",l]}),(0,t.jsxs)(y.Space,{size:8,children:[(0,t.jsx)(E,{type:"secondary",style:{fontSize:13},children:(0,k.default)(e.startTime).format("MMM D, YYYY h:mm:ss A")}),(0,t.jsxs)(E,{type:"secondary",style:{fontSize:13},children:["(",(0,k.default)(e.startTime).fromNow(),")"]})]})]})}var B=e.i(869216),P=e.i(175712),q=e.i(653496),F=e.i(560445),$=e.i(362024),W=e.i(91739),J=e.i(482725),H=e.i(827252),Y=e.i(500330);let G=e=>e>=.8?"text-green-600":"text-yellow-600",U=({entities:e})=>{let[r,l]=(0,s.useState)(!0),[a,n]=(0,s.useState)({});return e&&0!==e.length?(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"flex items-center mb-2 cursor-pointer",onClick:()=>l(!r),children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${r?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h4",{className:"font-medium",children:["Detected Entities (",e.length,")"]})]}),r&&(0,t.jsx)("div",{className:"space-y-2",children:e.map((e,s)=>{let r=a[s]||!1;return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>{n(e=>({...e,[s]:!e[s]}))},children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${r?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsx)("span",{className:"font-medium mr-2",children:e.entity_type}),(0,t.jsxs)("span",{className:`font-mono ${G(e.score)}`,children:["Score: ",e.score.toFixed(2)]})]}),(0,t.jsxs)("span",{className:"text-xs text-gray-500",children:["Position: ",e.start,"-",e.end]})]}),r&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4 mb-2",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Entity Type:"}),(0,t.jsx)("span",{children:e.entity_type})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Position:"}),(0,t.jsxs)("span",{children:["Characters ",e.start,"-",e.end]})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Confidence:"}),(0,t.jsx)("span",{className:G(e.score),children:e.score.toFixed(2)})]})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[e.recognition_metadata&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Recognizer:"}),(0,t.jsx)("span",{children:e.recognition_metadata.recognizer_name})]}),(0,t.jsxs)("div",{className:"flex overflow-hidden",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Identifier:"}),(0,t.jsx)("span",{className:"truncate text-xs font-mono",children:e.recognition_metadata.recognizer_identifier})]})]}),e.analysis_explanation&&(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Explanation:"}),(0,t.jsx)("span",{children:e.analysis_explanation})]})]})]})})]},s)})})]}):null},K=(e,s="slate")=>(0,t.jsx)("span",{className:`px-2 py-1 rounded-md text-xs font-medium inline-block ${{green:"bg-green-100 text-green-800",red:"bg-red-100 text-red-800",blue:"bg-blue-50 text-blue-700",slate:"bg-slate-100 text-slate-800",amber:"bg-amber-100 text-amber-800"}[s]}`,children:e}),V=e=>e?K("detected","red"):K("not detected","slate"),Q=({title:e,count:r,defaultOpen:l=!0,right:a,children:n})=>{let[i,o]=(0,s.useState)(l);return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>o(e=>!e),children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${i?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h5",{className:"font-medium",children:[e," ","number"==typeof r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal",children:["(",r,")"]})]})]}),(0,t.jsx)("div",{children:a})]}),i&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:n})]})},X=({label:e,children:s,mono:r})=>(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:e}),(0,t.jsx)("span",{className:r?"font-mono text-sm break-all":"",children:s})]}),Z=()=>(0,t.jsx)("div",{className:"my-3 border-t"}),ee=({response:e})=>{if(!e)return null;let s=e.outputs??e.output??[],r="GUARDRAIL_INTERVENED"===e.action?"red":"green",l=(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[e.guardrailCoverage?.textCharacters&&K(`text guarded ${e.guardrailCoverage.textCharacters.guarded??0}/${e.guardrailCoverage.textCharacters.total??0}`,"blue"),e.guardrailCoverage?.images&&K(`images guarded ${e.guardrailCoverage.images.guarded??0}/${e.guardrailCoverage.images.total??0}`,"blue")]}),a=e.usage&&(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(e.usage).map(([e,s])=>"number"==typeof s?(0,t.jsxs)("span",{className:"px-2 py-1 bg-slate-100 text-slate-800 rounded-md text-xs font-medium",children:[e,": ",s]},e):null)});return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"border rounded-lg p-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Action:",children:K(e.action??"N/A",r)}),e.actionReason&&(0,t.jsx)(X,{label:"Action Reason:",children:e.actionReason}),e.blockedResponse&&(0,t.jsx)(X,{label:"Blocked Response:",children:(0,t.jsx)("span",{className:"italic",children:e.blockedResponse})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Coverage:",children:l}),(0,t.jsx)(X,{label:"Usage:",children:a})]})]}),s.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(Z,{}),(0,t.jsx)("h4",{className:"font-medium mb-2",children:"Outputs"}),(0,t.jsx)("div",{className:"space-y-2",children:s.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsx)("div",{className:"text-sm whitespace-pre-wrap",children:e.text??(0,t.jsx)("em",{children:"(non-text output)"})})},s))})]})]}),e.assessments?.length?(0,t.jsx)("div",{className:"space-y-3",children:e.assessments.map((e,s)=>{let r=(0,t.jsxs)("div",{className:"flex flex-wrap gap-1",children:[e.wordPolicy&&K("word","slate"),e.contentPolicy&&K("content","slate"),e.topicPolicy&&K("topic","slate"),e.sensitiveInformationPolicy&&K("sensitive-info","slate"),e.contextualGroundingPolicy&&K("contextual-grounding","slate"),e.automatedReasoningPolicy&&K("automated-reasoning","slate")]});return(0,t.jsxs)(Q,{title:`Assessment #${s+1}`,defaultOpen:!0,right:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[e.invocationMetrics?.guardrailProcessingLatency!=null&&K(`${e.invocationMetrics.guardrailProcessingLatency} ms`,"amber"),r]}),children:[e.wordPolicy&&(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Word Policy"}),(e.wordPolicy.customWords?.length??0)>0&&(0,t.jsx)(Q,{title:"Custom Words",defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:e.wordPolicy.customWords.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-mono text-sm break-all",children:e.match})]}),V(e.detected)]},s))})}),(e.wordPolicy.managedWordLists?.length??0)>0&&(0,t.jsx)(Q,{title:"Managed Word Lists",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.wordPolicy.managedWordLists.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-mono text-sm break-all",children:e.match}),e.type&&K(e.type,"slate")]}),V(e.detected)]},s))})})]}),e.contentPolicy?.filters?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Content Policy"}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"min-w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"text-left text-gray-600",children:[(0,t.jsx)("th",{className:"py-1 pr-4",children:"Type"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Action"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Detected"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Strength"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Confidence"})]})}),(0,t.jsx)("tbody",{children:e.contentPolicy.filters.map((e,s)=>(0,t.jsxs)("tr",{className:"border-t",children:[(0,t.jsx)("td",{className:"py-1 pr-4",children:e.type??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:K(e.action??"—",e.detected?"red":"slate")}),(0,t.jsx)("td",{className:"py-1 pr-4",children:V(e.detected)}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.filterStrength??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.confidence??"—"})]},s))})]})})]}):null,e.contextualGroundingPolicy?.filters?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Contextual Grounding"}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"min-w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"text-left text-gray-600",children:[(0,t.jsx)("th",{className:"py-1 pr-4",children:"Type"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Action"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Detected"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Score"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Threshold"})]})}),(0,t.jsx)("tbody",{children:e.contextualGroundingPolicy.filters.map((e,s)=>(0,t.jsxs)("tr",{className:"border-t",children:[(0,t.jsx)("td",{className:"py-1 pr-4",children:e.type??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:K(e.action??"—",e.detected?"red":"slate")}),(0,t.jsx)("td",{className:"py-1 pr-4",children:V(e.detected)}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.score??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.threshold??"—"})]},s))})]})})]}):null,e.sensitiveInformationPolicy&&(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Sensitive Information"}),(e.sensitiveInformationPolicy.piiEntities?.length??0)>0&&(0,t.jsx)(Q,{title:"PII Entities",defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:e.sensitiveInformationPolicy.piiEntities.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.action??"N/A",e.detected?"red":"slate"),e.type&&K(e.type,"slate"),(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.match})]}),V(e.detected)]},s))})}),(e.sensitiveInformationPolicy.regexes?.length??0)>0&&(0,t.jsx)(Q,{title:"Custom Regexes",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.sensitiveInformationPolicy.regexes.map((e,s)=>(0,t.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between p-2 bg-gray-50 rounded-sm gap-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-medium",children:e.name??"regex"}),(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.regex})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.detected),e.match&&(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.match})]})]},s))})})]}),e.topicPolicy?.topics?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Topic Policy"}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:e.topicPolicy.topics.map((e,s)=>(0,t.jsx)("div",{className:"px-3 py-1.5 bg-gray-50 rounded-md text-xs",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-medium",children:e.name??"topic"}),e.type&&K(e.type,"slate"),V(e.detected)]})},s))})]}):null,e.invocationMetrics&&(0,t.jsx)(Q,{title:"Invocation Metrics",defaultOpen:!1,children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Latency (ms)",children:e.invocationMetrics.guardrailProcessingLatency??"—"}),(0,t.jsx)(X,{label:"Coverage:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[e.invocationMetrics.guardrailCoverage?.textCharacters&&K(`text ${e.invocationMetrics.guardrailCoverage.textCharacters.guarded??0}/${e.invocationMetrics.guardrailCoverage.textCharacters.total??0}`,"blue"),e.invocationMetrics.guardrailCoverage?.images&&K(`images ${e.invocationMetrics.guardrailCoverage.images.guarded??0}/${e.invocationMetrics.guardrailCoverage.images.total??0}`,"blue")]})})]}),(0,t.jsx)("div",{className:"space-y-2",children:(0,t.jsx)(X,{label:"Usage:",children:(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:e.invocationMetrics.usage&&Object.entries(e.invocationMetrics.usage).map(([e,s])=>"number"==typeof s?(0,t.jsxs)("span",{className:"px-2 py-1 bg-slate-100 text-slate-800 rounded-md text-xs font-medium",children:[e,": ",s]},e):null)})})})]})}),e.automatedReasoningPolicy?.findings?.length?(0,t.jsx)(Q,{title:"Automated Reasoning Findings",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.automatedReasoningPolicy.findings.map((e,s)=>(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-2 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)},s))})}):null]},s)})}):null,(0,t.jsx)(Q,{title:"Raw Bedrock Guardrail Response",defaultOpen:!1,children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)})})]})},et=(e,s="slate")=>(0,t.jsx)("span",{className:`px-2 py-1 rounded-md text-xs font-medium inline-block ${{green:"bg-green-100 text-green-800",red:"bg-red-100 text-red-800",blue:"bg-blue-50 text-blue-700",slate:"bg-slate-100 text-slate-800",amber:"bg-amber-100 text-amber-800"}[s]}`,children:e}),es=({title:e,count:r,defaultOpen:l=!0,children:a})=>{let[n,i]=(0,s.useState)(l);return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>i(e=>!e),children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${n?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h5",{className:"font-medium",children:[e," ","number"==typeof r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal",children:["(",r,")"]})]})]})}),n&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:a})]})},er=({label:e,children:s,mono:r})=>(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:e}),(0,t.jsx)("span",{className:r?"font-mono text-sm break-all":"",children:s})]}),el=({response:e})=>{if(!e||"string"==typeof e)return"string"==typeof e&&e?(0,t.jsx)("div",{className:"bg-white rounded-lg border border-red-200 p-4",children:(0,t.jsxs)("div",{className:"text-red-800",children:[(0,t.jsx)("h5",{className:"font-medium mb-2",children:"Error"}),(0,t.jsx)("p",{className:"text-sm",children:e})]})}):null;let s=Array.isArray(e)?e:[];if(0===s.length)return(0,t.jsx)("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:(0,t.jsx)("div",{className:"text-gray-600 text-sm",children:"No detections found"})});let r=s.filter(e=>"pattern"===e.type),l=s.filter(e=>"blocked_word"===e.type),a=s.filter(e=>"category_keyword"===e.type),n=s.filter(e=>"BLOCK"===e.action).length,i=s.filter(e=>"MASK"===e.action).length,o=s.length;return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(er,{label:"Total Detections:",children:(0,t.jsx)("span",{className:"font-semibold",children:o})}),(0,t.jsx)(er,{label:"Actions:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[n>0&&et(`${n} blocked`,"red"),i>0&&et(`${i} masked`,"blue"),0===n&&0===i&&et("passed","green")]})})]}),(0,t.jsx)("div",{className:"space-y-2",children:(0,t.jsx)(er,{label:"By Type:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[r.length>0&&et(`${r.length} patterns`,"slate"),l.length>0&&et(`${l.length} keywords`,"slate"),a.length>0&&et(`${a.length} categories`,"slate")]})})})]})}),r.length>0&&(0,t.jsx)(es,{title:"Patterns Matched",count:r.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:r.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Pattern:",children:e.pattern_name||"unknown"})}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),l.length>0&&(0,t.jsx)(es,{title:"Blocked Words Detected",count:l.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:l.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(er,{label:"Keyword:",mono:!0,children:e.keyword||"unknown"}),e.description&&(0,t.jsx)(er,{label:"Description:",children:e.description})]}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),a.length>0&&(0,t.jsx)(es,{title:"Category Keywords Detected",count:a.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:a.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(er,{label:"Category:",children:e.category||"unknown"}),(0,t.jsx)(er,{label:"Keyword:",mono:!0,children:e.keyword||"unknown"}),e.severity&&(0,t.jsx)(er,{label:"Severity:",children:et(e.severity,"high"===e.severity?"red":"medium"===e.severity?"amber":"slate")})]}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),(0,t.jsx)(es,{title:"Raw Detection Data",defaultOpen:!1,children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(s,null,2)})})]})};var ea=e.i(602869);let en=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"7",stroke:"#16A34A",strokeWidth:"1.5",fill:"#F0FDF4"}),(0,t.jsx)("path",{d:"M5 8l2 2 4-4",stroke:"#16A34A",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),ei=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"7",stroke:"#DC2626",strokeWidth:"1.5",fill:"#FEF2F2"}),(0,t.jsx)("path",{d:"M6 6l4 4M10 6l-4 4",stroke:"#DC2626",strokeWidth:"1.5",strokeLinecap:"round"})]}),eo=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",className:"animate-spin",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"6",stroke:"#D1D5DB",strokeWidth:"2"}),(0,t.jsx)("path",{d:"M8 2a6 6 0 0 1 6 6",stroke:"#6366F1",strokeWidth:"2",strokeLinecap:"round"})]}),ed=({title:e,data:r,loading:l,error:a})=>{let[n,i]=(0,s.useState)(!1);return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg bg-white",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>i(!n),children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[l?(0,t.jsx)(eo,{}):a?(0,t.jsx)(b.Tooltip,{title:a,children:(0,t.jsx)("span",{className:"text-gray-400 text-sm",children:"--"})}):r?.compliant?(0,t.jsx)(en,{}):(0,t.jsx)(ei,{}),(0,t.jsx)("span",{className:"font-medium text-sm text-gray-900",children:e})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[!l&&!a&&r&&(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-semibold uppercase ${r.compliant?"bg-green-100 text-green-700 border border-green-200":"bg-red-100 text-red-700 border border-red-200"}`,children:r.compliant?"COMPLIANT":"NON-COMPLIANT"}),a&&(0,t.jsx)("span",{className:"px-2 py-0.5 rounded-sm text-[11px] font-medium bg-gray-100 text-gray-500 border border-gray-200",children:"UNAVAILABLE"}),(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",className:`transition-transform ${n?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"M6 8l4 4 4-4",stroke:"#6B7280",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})]}),n&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 py-3",children:[l&&(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Checking compliance..."}),a&&(0,t.jsx)("p",{className:"text-sm text-red-600",children:a}),r&&(0,t.jsx)("div",{className:"space-y-2",children:r.checks.map((e,s)=>(0,t.jsxs)("div",{className:"flex items-start gap-2",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:e.passed?(0,t.jsx)(en,{}):(0,t.jsx)(ei,{})}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900",children:e.check_name}),(0,t.jsx)("span",{className:"text-[10px] font-mono text-gray-400",children:e.article})]}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:e.detail})]})]},s))})]})]})},ec=({accessToken:e,logEntry:r})=>{let[l,a]=(0,s.useState)(null),[n,i]=(0,s.useState)(null),[o,d]=(0,s.useState)(!1),[c,m]=(0,s.useState)(!1),[x,u]=(0,s.useState)(null),[p,h]=(0,s.useState)(null);return(0,s.useEffect)(()=>{if(!e||!r.request_id)return;let t={request_id:r.request_id,user_id:r.user,model:r.model,timestamp:r.startTime,guardrail_information:r.metadata?.guardrail_information};d(!0),u(null),(0,ea.checkEuAiActCompliance)(e,t).then(a).catch(e=>u(e.message||"Failed to check EU AI Act compliance")).finally(()=>d(!1)),m(!0),h(null),(0,ea.checkGdprCompliance)(e,t).then(i).catch(e=>h(e.message||"Failed to check GDPR compliance")).finally(()=>m(!1))},[e,r]),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Regulatory Compliance"}),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)(ed,{title:"EU AI Act",data:l,loading:o,error:x}),(0,t.jsx)(ed,{title:"GDPR",data:n,loading:c,error:p})]})]})},em=new Set(["presidio","bedrock","litellm_content_filter"]),ex=(e,t)=>{if(null==e)return!1;if("string"==typeof e)return e===t;if(Array.isArray(e))return e.includes(t);if("object"==typeof e&&"default"in e){let s=e.default;if("string"==typeof s)return s===t;if(Array.isArray(s))return s.some(e=>"string"==typeof e&&e===t)}return!1},eu=e=>Object.values(e.masked_entity_count||{}).reduce((e,t)=>e+("number"==typeof t?t:0),0),ep=e=>"success"===(e.guardrail_status??"").toLowerCase(),eh=e=>e.policy_template||e.guardrail_name,eg=()=>(0,t.jsxs)("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none",children:[(0,t.jsx)("circle",{cx:"20",cy:"20",r:"20",fill:"#EEF2FF"}),(0,t.jsx)("path",{d:"M20 10l8 4v6c0 5.25-3.4 10.15-8 11.5C15.4 30.15 12 25.25 12 20v-6l8-4z",stroke:"#6366F1",strokeWidth:"1.5",fill:"none"}),(0,t.jsx)("path",{d:"M16 20l3 3 5-6",stroke:"#6366F1",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})]}),ef=({className:e})=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",className:e,children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#16A34A",strokeWidth:"1.5",fill:"#F0FDF4"}),(0,t.jsx)("path",{d:"M7 11l3 3 5-6",stroke:"#16A34A",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),ey=({className:e})=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",className:e,children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#DC2626",strokeWidth:"1.5",fill:"#FEF2F2"}),(0,t.jsx)("path",{d:"M8 8l6 6M14 8l-6 6",stroke:"#DC2626",strokeWidth:"1.5",strokeLinecap:"round"})]}),ej=()=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#3B82F6",strokeWidth:"1.5",fill:"#EFF6FF"}),(0,t.jsx)("path",{d:"M9 7.5l6 3.5-6 3.5V7.5z",fill:"#3B82F6"})]}),eb=()=>(0,t.jsx)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",children:(0,t.jsx)("circle",{cx:"11",cy:"11",r:"5",fill:"#9CA3AF"})}),ev=({expanded:e})=>(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",className:`transition-transform ${e?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"M6 8l4 4 4-4",stroke:"#6B7280",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),eN=()=>(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:(0,t.jsx)("path",{d:"M8 2v8m0 0l-3-3m3 3l3-3M3 12h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),e_=({matchDetails:e})=>e&&0!==e.length?(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("h5",{className:"text-sm font-medium mb-2 text-gray-700",children:["Match Details (",e.length,")"]}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"border-b text-left text-gray-500",children:[(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Type"}),(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Method"}),(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Action"}),(0,t.jsx)("th",{className:"pb-2 font-medium",children:"Detail"})]})}),(0,t.jsx)("tbody",{children:e.map((e,s)=>(0,t.jsxs)("tr",{className:"border-b border-gray-100",children:[(0,t.jsx)("td",{className:"py-2 pr-4",children:e.type}),(0,t.jsx)("td",{className:"py-2 pr-4",children:(0,t.jsx)("span",{className:"px-2 py-0.5 bg-slate-100 text-slate-700 rounded-sm text-xs",children:e.detection_method??"-"})}),(0,t.jsx)("td",{className:"py-2 pr-4",children:(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-xs font-medium ${"BLOCK"===e.action_taken?"bg-red-100 text-red-800":"bg-blue-50 text-blue-700"}`,children:e.action_taken??"-"})}),(0,t.jsxs)("td",{className:"py-2 font-mono text-xs text-gray-600 break-all",children:[e.category?`[${e.category}] `:"",e.snippet??"-"]})]},s))})]})})]}):null,ew=({response:e})=>{let[r,l]=(0,s.useState)(!1);return(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>l(!r),children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(ev,{expanded:r}),(0,t.jsx)("h5",{className:"font-medium text-sm ml-1",children:"Raw Guardrail Response"})]})}),r&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)})})]})})},ek=({entries:e})=>{let r=(0,s.useMemo)(()=>[...e].sort((e,t)=>(e.start_time??0)-(t.start_time??0)),[e]),l=(0,s.useMemo)(()=>{if(0===r.length)return[];let e=r[0].start_time,t=[];t.push({type:"request",label:"Request received",offsetMs:0});let s=r.filter(e=>ex(e.guardrail_mode,"pre_call")),l=r.filter(e=>ex(e.guardrail_mode,"post_call")||ex(e.guardrail_mode,"logging_only")),a=r.filter(e=>ex(e.guardrail_mode,"during_call"));for(let r of s){let s=Math.round((r.end_time-e)*1e3);t.push({type:"guardrail",label:`Pre-call guardrail: ${eh(r)}`,offsetMs:s,status:ep(r)?"PASSED":"FAILED",isSuccess:ep(r)})}let n=s.length>0?Math.max(...s.map(e=>e.end_time)):e,i=Math.round((((l.length>0?Math.min(...l.map(e=>e.start_time)):void 0)??n+1)-e)*1e3);for(let s of(t.push({type:"llm",label:"LLM call",offsetMs:i}),a)){let r=Math.round((s.end_time-e)*1e3);t.push({type:"guardrail",label:`During-call guardrail: ${eh(s)}`,offsetMs:r,status:ep(s)?"PASSED":"FAILED",isSuccess:ep(s)})}for(let s of l){let r=Math.round((s.end_time-e)*1e3);t.push({type:"guardrail",label:`Post-call guardrail: ${eh(s)}`,offsetMs:r,status:ep(s)?"PASSED":"FAILED",isSuccess:ep(s)})}let o=Math.round((Math.max(...r.map(e=>e.end_time))-e)*1e3)+1;return t.push({type:"response",label:"Response returned",offsetMs:o}),t},[r]);return(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Request Lifecycle"}),(0,t.jsx)("div",{className:"relative",children:l.map((e,s)=>(0,t.jsxs)("div",{className:"flex items-start gap-3 relative",children:[(0,t.jsxs)("div",{className:"flex flex-col items-center",children:[(0,t.jsx)("div",{className:"shrink-0",children:"request"===e.type||"response"===e.type?(0,t.jsx)(eb,{}):"llm"===e.type?(0,t.jsx)(ej,{}):e.isSuccess?(0,t.jsx)(ef,{}):(0,t.jsx)(ey,{})}),s{let r,l,[a,n]=(0,s.useState)(!1),i=ep(e),o=eu(e),d=eh(e),c=(r=Math.round(1e3*e.duration),`${r}ms`),m=null==(l=(e=>{if(null==e)return null;if("string"==typeof e)return e;if(Array.isArray(e)){let t=e[0];return"string"==typeof t?t:null}if("object"==typeof e&&"default"in e){let t=e.default;if("string"==typeof t)return t;if(Array.isArray(t)){let e=t[0];return"string"==typeof e?e:null}}return null})(e.guardrail_mode))||""===l?"—":l.replace(/_/g,"-").toUpperCase(),x=(e=>{if(!ep(e))return null;if(null!=e.risk_score)return e.risk_score;let t=eu(e),s=e.patterns_checked??0,r=e.confidence_score??0;if(0===s&&0===r)return 0;let l=7*(s>0?t/s:0)+3*r;return t>0&&l<2&&(l=2),Math.min(10,Math.round(10*l)/10)})(e),u=e.guardrail_provider??"presidio",p=e.guardrail_response,h=Array.isArray(p)?p:[],g="bedrock"!==u||null===p||"object"!=typeof p||Array.isArray(p)?void 0:p,f=null!=e.patterns_checked?`${o}/${e.patterns_checked} matched`:o>0?`${o} matched`:null;return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg bg-white",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 px-4 py-3 cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>n(!a),children:[(0,t.jsx)("div",{className:"shrink-0",children:i?(0,t.jsx)(ef,{}):(0,t.jsx)(ey,{})}),(0,t.jsxs)("div",{className:"flex items-center gap-2 flex-wrap flex-1 min-w-0",children:[(0,t.jsx)("span",{className:"font-semibold text-gray-900 text-sm truncate",children:d}),(0,t.jsx)("span",{className:"px-2 py-0.5 border border-blue-200 bg-blue-50 text-blue-700 rounded-sm text-[11px] font-semibold uppercase shrink-0",children:m}),(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-semibold uppercase shrink-0 ${i?"bg-green-100 text-green-700 border border-green-200":"bg-red-100 text-red-700 border border-red-200"}`,children:i?"PASSED":"FAILED"}),f&&(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-medium shrink-0 ${0===o?"bg-green-50 text-green-700 border border-green-200":"bg-amber-50 text-amber-700 border border-amber-200"}`,children:f}),null!=e.confidence_score&&(0,t.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-600 border border-gray-200 rounded-sm text-[11px] font-medium shrink-0",children:[(100*e.confidence_score).toFixed(0),"% conf"]}),null!=x&&i&&(0,t.jsx)(b.Tooltip,{title:`Risk score: ${x}/10`,children:(0,t.jsxs)("span",{className:`px-2 py-0.5 border rounded-sm text-[11px] font-semibold shrink-0 ${x<=3?"text-green-600 bg-green-50 border-green-200":x<=6?"text-amber-600 bg-amber-50 border-amber-200":"text-red-600 bg-red-50 border-red-200"}`,children:["Risk ",x,"/10"]})})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 shrink-0",children:[(0,t.jsx)("span",{className:"text-sm text-gray-500 font-mono",children:c}),e.detection_method&&(0,t.jsx)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-600 border border-gray-200 rounded-sm text-[11px] font-medium",children:e.detection_method.split(",")[0].trim()}),(0,t.jsx)(ev,{expanded:a})]})]}),a&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 py-3",children:[e.classification&&(0,t.jsxs)("div",{className:"mb-3 bg-gray-50 rounded-lg p-3 space-y-1",children:[(0,t.jsx)("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:"Classification"}),e.classification.category&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Category:"}),(0,t.jsx)("span",{children:e.classification.category})]}),e.classification.article_reference&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Reference:"}),(0,t.jsx)("span",{className:"font-mono",children:e.classification.article_reference})]}),null!=e.classification.confidence&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Confidence:"}),(0,t.jsxs)("span",{children:[(100*e.classification.confidence).toFixed(0),"%"]})]}),e.classification.reason&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Reason:"}),(0,t.jsx)("span",{children:e.classification.reason})]})]}),e.match_details&&e.match_details.length>0&&(0,t.jsx)(e_,{matchDetails:e.match_details}),o>0&&(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:"Masked Entities"}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(e.masked_entity_count||{}).map(([e,s])=>(0,t.jsxs)("span",{className:"px-2 py-1 bg-blue-50 text-blue-700 rounded-sm text-xs font-medium",children:[e,": ",s]},e))})]}),"presidio"===u&&h.length>0&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(U,{entities:h})}),"bedrock"===u&&g&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(ee,{response:g})}),"litellm_content_filter"===u&&p&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(el,{response:p})}),u&&!em.has(u)&&p&&(0,t.jsx)(ew,{response:p})]})]})},eC=({data:e,accessToken:r,logEntry:l})=>{let a=(0,s.useMemo)(()=>Array.isArray(e)?e.filter(e=>!!e):e?[e]:[],[e]),n=a.filter(ep).length,i=n===a.length,o=(0,s.useMemo)(()=>Math.round(1e3*a.reduce((e,t)=>e+(t.duration??0),0)),[a]);return((0,s.useMemo)(()=>Array.from(new Set(a.map(e=>e.policy_template).filter(Boolean))),[a]),0===a.length)?null:(0,t.jsxs)("div",{className:"bg-white rounded-xl border border-gray-200 shadow-xs w-full max-w-full overflow-hidden mb-6",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)(eg,{}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900",children:"Guardrails & Policy Compliance"}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-0.5",children:[(0,t.jsxs)("span",{className:"text-sm text-gray-500",children:[a.length," guardrail",1!==a.length?"s":""," evaluated"]}),(0,t.jsx)("span",{className:"text-gray-300",children:"|"}),(0,t.jsxs)("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold ${i?"bg-green-50 text-green-700 border border-green-200":"bg-red-50 text-red-700 border border-red-200"}`,children:[i?(0,t.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:(0,t.jsx)("path",{d:"M3 6l2.5 2.5L9 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):null,n," Passed"]})]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-6",children:[(0,t.jsx)("div",{className:"text-right",children:(0,t.jsxs)("div",{className:"text-sm font-medium text-gray-900",children:["Total: ",o,"ms overhead"]})}),(0,t.jsxs)("button",{onClick:()=>{let e=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),t=URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download=`guardrail-compliance-log-${new Date().toISOString().slice(0,10)}.json`,s.click(),URL.revokeObjectURL(t)},className:"inline-flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-lg text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 transition-colors",children:[(0,t.jsx)(eN,{}),"Export Compliance Log"]})]})]}),r&&l&&(0,t.jsx)("div",{className:"px-6 py-4 border-b border-gray-100",children:(0,t.jsx)(ec,{accessToken:r,logEntry:l})}),(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-6 py-5",children:(0,t.jsx)(ek,{entries:a})}),(0,t.jsxs)("div",{className:"px-6 py-5",children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Evaluation Details"}),(0,t.jsx)("div",{className:"space-y-3",children:a.map((e,s)=>(0,t.jsx)(eS,{entry:e},`${e.guardrail_name??"guardrail"}-${s}`))})]})]})]})};var eT=e.i(291542),eL=e.i(245704),eA=e.i(518617),eM=e.i(19732);let{Text:eE}=v.Typography;function eI({data:e}){let s=Array.isArray(e)?e:[e];return s.length?(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[(0,t.jsx)(eM.ExperimentOutlined,{style:{fontSize:16,color:"#6366f1"}}),(0,t.jsx)(eE,{strong:!0,style:{fontSize:15},children:"LLM Judge Results"})]}),s.map((e,s)=>(0,t.jsx)(ez,{entry:e},e.eval_id||s))]}):null}function ez({entry:e}){let s=e.passed,r=s?"#52c41a":"#ff4d4f",l=(e.verdicts||[]).filter(e=>"overall"!==(e.criterion_name||"").toLowerCase()),a=[{title:"Criterion",dataIndex:"criterion_name",key:"criterion_name",width:160,render:e=>(0,t.jsx)(eE,{strong:!0,style:{whiteSpace:"nowrap"},children:e})},{title:"Weight",dataIndex:"weight",key:"weight",width:65,render:e=>null!=e?(0,t.jsxs)(eE,{type:"secondary",style:{fontSize:12},children:[e,"%"]}):null},{title:"Score",dataIndex:"score",key:"score",width:65,render:e=>(0,t.jsx)(eE,{style:{color:e>=70?"#52c41a":e>=50?"#faad14":"#ff4d4f",fontWeight:600},children:e})},{title:(0,t.jsx)(b.Tooltip,{title:"Score × Weight — how much each criterion contributes to the final score",children:(0,t.jsx)("span",{style:{borderBottom:"1px dashed #aaa",cursor:"help"},children:"Weighted"})}),key:"weighted",width:75,render:(e,s)=>{if(null==s.weight)return null;let r=s.score*s.weight/100;return(0,t.jsx)(eE,{type:"secondary",style:{fontSize:12},children:r%1==0?r:r.toFixed(1)})}},{title:"Comment",dataIndex:"reasoning",key:"reasoning",ellipsis:{showTitle:!1},render:e=>(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)("span",{style:{fontSize:12},children:e})})}];return(0,t.jsxs)(P.Card,{size:"small",className:"mb-3",style:{borderLeft:`3px solid ${r}`},title:(0,t.jsxs)(y.Space,{children:[s?(0,t.jsx)(eL.CheckCircleOutlined,{style:{color:"#52c41a"}}):(0,t.jsx)(eA.CloseCircleOutlined,{style:{color:"#ff4d4f"}}),(0,t.jsx)(eE,{strong:!0,children:e.eval_name}),(0,t.jsx)(j.Tag,{color:s?"success":"error",children:s?"PASSED":"FAILED"}),(0,t.jsx)(b.Tooltip,{title:"Weighted average of all criterion scores. Each criterion has a weight (%) set when the eval was created — higher-weight criteria count more toward the final score.",children:(0,t.jsxs)(eE,{type:"secondary",style:{fontSize:12,cursor:"help",borderBottom:"1px dashed #aaa"},children:[e.overall_score?.toFixed(0)," / 100",null!=e.threshold&&` (threshold: ${e.threshold})`]})})]}),extra:(0,t.jsxs)(y.Space,{size:"small",children:[e.judge_model&&(0,t.jsxs)(eE,{type:"secondary",style:{fontSize:12},children:["Judge: ",e.judge_model]}),null!=e.iteration&&(0,t.jsxs)(eE,{type:"secondary",style:{fontSize:12},children:["Iter: ",e.iteration+1]})]}),children:[e.eval_error&&(0,t.jsxs)(eE,{type:"warning",style:{display:"block",marginBottom:8,fontSize:12},children:["Judge error: ",e.eval_error]}),l.length>0?(0,t.jsx)(eT.Table,{dataSource:l,columns:a,pagination:!1,size:"small",rowKey:"criterion_name",scroll:{x:!0},summary:()=>{if(!l.some(e=>null!=e.weight))return null;let e=l.reduce((e,t)=>e+(null!=t.weight?t.score*t.weight/100:0),0);return(0,t.jsxs)(eT.Table.Summary.Row,{children:[(0,t.jsx)(eT.Table.Summary.Cell,{index:0,children:(0,t.jsx)(eE,{strong:!0,style:{fontSize:12},children:"Total"})}),(0,t.jsx)(eT.Table.Summary.Cell,{index:1}),(0,t.jsx)(eT.Table.Summary.Cell,{index:2}),(0,t.jsx)(eT.Table.Summary.Cell,{index:3,children:(0,t.jsx)(eE,{strong:!0,style:{fontSize:12,color:r},children:e%1==0?e:e.toFixed(1)})}),(0,t.jsx)(eT.Table.Summary.Cell,{index:4})]})}}):(0,t.jsxs)(eE,{type:"secondary",style:{fontSize:12},children:["Score: ",e.overall_score?.toFixed(1)," — no per-criterion breakdown available."]})]})}let eD=e=>null==e?"-":`$${(0,Y.formatNumberWithCommas)(e,8)}`,eO=e=>null==e?"-":`${(100*e).toFixed(2)}%`,eR=({costBreakdown:e,totalSpend:s,promptTokens:r,completionTokens:l,cacheHit:a,rawInputTokens:n,cacheReadTokens:i,cacheCreationTokens:o})=>{let d=a?.toLowerCase()==="true",c=void 0!==r||void 0!==l,m=e?.input_cost!==void 0||e?.output_cost!==void 0,x=e?.additional_costs&&Object.entries(e.additional_costs).some(([,e])=>null!=e&&0!==e);if(!(m||c||x||e&&(void 0!==e.discount_percent&&0!==e.discount_percent||void 0!==e.discount_amount&&0!==e.discount_amount||void 0!==e.margin_percent&&0!==e.margin_percent||void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount||void 0!==e.margin_total_amount&&0!==e.margin_total_amount)))return null;let u=e&&(void 0!==e.discount_percent&&0!==e.discount_percent||void 0!==e.discount_amount&&0!==e.discount_amount),p=e&&(void 0!==e.margin_percent&&0!==e.margin_percent||void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount||void 0!==e.margin_total_amount&&0!==e.margin_total_amount),h=d?0:e?.input_cost,g=d?0:e?.output_cost,f=d?0:e?.original_cost,y=d?0:e?.total_cost??s;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{className:"flex items-center justify-between w-full",children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Cost Breakdown"}),(0,t.jsxs)("div",{className:"flex items-center space-x-2 mr-4",children:[(0,t.jsx)("span",{className:"text-sm text-gray-500",children:"Total:"}),(0,t.jsxs)("span",{className:"text-sm font-semibold text-gray-900",children:[eD(s),d&&" (Cached)"]})]})]}),children:(0,t.jsxs)("div",{className:"p-6 space-y-4",children:[(0,t.jsxs)("div",{className:"space-y-2 max-w-2xl",children:[(()=>{if(e?.cache_read_cost!==void 0||e?.cache_creation_cost!==void 0){let s=d?0:(h??0)-(e?.cache_read_cost??0)-(e?.cache_creation_cost??0);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Input Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(s),null!=n&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",n.toLocaleString()," tokens)"]})]})]}),(e?.cache_read_cost??0)>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Prompt Cache Read Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(d?0:e?.cache_read_cost),(i??0)>0&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",(i??0).toLocaleString()," tokens)"]})]})]}),(e?.cache_creation_cost??0)>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Prompt Cache Write Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(d?0:e?.cache_creation_cost),(o??0)>0&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",(o??0).toLocaleString()," tokens)"]})]})]})]})}return(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Input Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(h),void 0!==r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",r.toLocaleString()," prompt tokens)"]})]})]})})(),(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Output Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(g),void 0!==l&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",l.toLocaleString()," completion tokens)"]})]})]}),e?.tool_usage_cost!==void 0&&e.tool_usage_cost>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Tool Usage Cost:"}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(e.tool_usage_cost)})]}),e?.additional_costs&&Object.entries(e.additional_costs).filter(([,e])=>null!=e&&0!==e).map(([e,s])=>(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsxs)("span",{className:"text-gray-600 font-medium w-1/3",children:[e,":"]}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(s)})]},e))]}),!d&&(0,t.jsx)("div",{className:"pt-2 border-t border-gray-100 max-w-2xl",children:(0,t.jsxs)("div",{className:"flex text-sm font-semibold",children:[(0,t.jsx)("span",{className:"text-gray-900 w-1/3",children:"Original LLM Cost:"}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(f)})]})}),(u||p)&&(0,t.jsxs)("div",{className:"pt-2 space-y-2 max-w-2xl",children:[u&&(0,t.jsxs)("div",{className:"space-y-2",children:[void 0!==e.discount_percent&&0!==e.discount_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsxs)("span",{className:"font-medium w-1/3",children:["Discount (",eO(e.discount_percent),"):"]}),(0,t.jsxs)("span",{className:"text-gray-900",children:["-",eD(e.discount_amount)]})]}),void 0!==e.discount_amount&&void 0===e.discount_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Discount Amount:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:["-",eD(e.discount_amount)]})]})]}),p&&(0,t.jsxs)("div",{className:"space-y-2",children:[void 0!==e.margin_percent&&0!==e.margin_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsxs)("span",{className:"font-medium w-1/3",children:["Margin (",eO(e.margin_percent),"):"]}),(0,t.jsxs)("span",{className:"text-gray-900",children:["+",eD((e.margin_total_amount||0)-(e.margin_fixed_amount||0))]})]}),void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Margin:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:["+",eD(e.margin_fixed_amount)]})]})]})]}),(0,t.jsx)("div",{className:"mt-4 pt-4 border-t border-gray-200 max-w-2xl",children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("span",{className:"font-bold text-sm text-gray-900 w-1/3",children:"Final Calculated Cost:"}),(0,t.jsxs)("span",{className:"text-sm font-bold text-gray-900",children:[eD(y),d&&" (Cached)"]})]})})]})}]})})},eB=({show:e})=>e?(0,t.jsxs)("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 flex items-start",children:[(0,t.jsx)("div",{className:"text-blue-500 mr-3 shrink-0 mt-0.5",children:(0,t.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,t.jsx)("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),(0,t.jsx)("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-sm font-medium text-blue-800",children:"Request/Response Data Not Available"}),(0,t.jsxs)("p",{className:"text-sm text-blue-700 mt-1",children:["To view request and response details, enable prompt storage in your LiteLLM configuration by adding the following to your ",(0,t.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded-sm",children:"proxy_config.yaml"})," file, or toggle the setting in ",(0,t.jsx)("strong",{children:"Admin Settings → Logging Settings"}),"."]}),(0,t.jsx)("pre",{className:"mt-2 bg-white p-3 rounded-sm border border-blue-200 text-xs font-mono overflow-auto",children:`general_settings: - store_model_in_db: true - store_prompts_in_spend_logs: true`}),(0,t.jsx)("p",{className:"text-xs text-blue-700 mt-2",children:"Note: This will only affect new requests after the configuration change."})]})]}):null;function eP({data:e}){let[r,l]=(0,s.useState)({});if(!e||0===e.length)return null;let a=e=>new Date(1e3*e).toLocaleString();return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Vector Store Requests"}),children:(0,t.jsx)("div",{className:"p-4",children:e.map((e,s)=>{var n,i;return(0,t.jsxs)("div",{className:"mb-6 last:mb-0",children:[(0,t.jsx)("div",{className:"bg-white rounded-lg border p-4 mb-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Query:"}),(0,t.jsx)("span",{className:"font-mono",children:e.query})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Vector Store ID:"}),(0,t.jsx)("span",{className:"font-mono",children:e.vector_store_id})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Provider:"}),(0,t.jsx)("span",{className:"flex items-center",children:(()=>{let{logo:s,displayName:r}=(0,S.getProviderLogoAndName)(e.custom_llm_provider);return(0,t.jsxs)(t.Fragment,{children:[s&&(0,t.jsx)("img",{src:s,alt:`${r} logo`,className:"h-5 w-5 mr-2"}),r]})})()})]})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Start Time:"}),(0,t.jsx)("span",{children:a(e.start_time)})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"End Time:"}),(0,t.jsx)("span",{children:a(e.end_time)})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Duration:"}),(0,t.jsx)("span",{children:(n=e.start_time,i=e.end_time,`${((i-n)*1e3).toFixed(2)}ms`)})]})]})]})}),(0,t.jsx)("h4",{className:"font-medium mb-2",children:"Search Results"}),(0,t.jsx)("div",{className:"space-y-2",children:e.vector_store_search_response.data.map((e,a)=>{let n=r[`${s}-${a}`]||!1;return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center p-3 bg-gray-50 cursor-pointer",onClick:()=>{let e;return e=`${s}-${a}`,void l(t=>({...t,[e]:!t[e]}))},children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${n?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)("span",{className:"font-medium mr-2",children:["Result ",a+1]}),(0,t.jsxs)("span",{className:"text-gray-500 text-sm",children:["Score: ",(0,t.jsx)("span",{className:"font-mono",children:e.score.toFixed(4)})]})]})]}),n&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:e.content.map((e,s)=>(0,t.jsxs)("div",{className:"mb-2 last:mb-0",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-1",children:e.type}),(0,t.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap break-all bg-gray-50 p-2 rounded-sm",children:e.text})]},s))})]},a)})})]},s)})})}]})})}let{Text:eq}=v.Typography;function eF({value:e,maxWidth:s=180}){return e?(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)(eq,{copyable:{text:e,tooltips:["Copy","Copied!"]},style:{maxWidth:s,display:"inline-block",verticalAlign:"bottom",fontFamily:A,fontSize:12},ellipsis:!0,children:e})}):(0,t.jsx)(eq,{type:"secondary",children:"-"})}let{Text:e$}=v.Typography;function eW({prompt:e=0,completion:s=0,total:r=0}){return(0,t.jsxs)(e$,{children:[r.toLocaleString()," (",e.toLocaleString()," prompt tokens + ",s.toLocaleString()," completion tokens)"]})}let eJ=e=>!!e&&e instanceof Date,eH=e=>"object"==typeof e&&null!==e,eY=e=>!!e&&e instanceof Object&&"function"==typeof e;function eG(e,t){return void 0===t&&(t=!1),!e||t?`"${e}"`:e}function eU(e){let{field:t,value:r,data:l,lastElement:a,openBracket:n,closeBracket:i,level:o,style:d,shouldExpandNode:c,clickToExpandNode:m,outerRef:x,beforeExpandChange:u}=e,p=(0,s.useRef)(!1),[h,g]=(0,s.useState)(()=>c(o,r,t)),f=(0,s.useRef)(null);(0,s.useEffect)(()=>{p.current?g(c(o,r,t)):p.current=!0},[c]);let y=(0,s.useId)();if(0===l.length)return function(e){let{field:t,openBracket:r,closeBracket:l,lastElement:a,style:n}=e;return(0,s.createElement)("div",{className:n.basicChildStyle,role:"treeitem","aria-selected":void 0},(t||""===t)&&(0,s.createElement)("span",{className:n.label},eG(t,n.quotesForFieldNames),":"),(0,s.createElement)("span",{className:n.punctuation},r),(0,s.createElement)("span",{className:n.punctuation},l),!a&&(0,s.createElement)("span",{className:n.punctuation},","))}({field:t,openBracket:n,closeBracket:i,lastElement:a,style:d});let j=h?d.collapseIcon:d.expandIcon,b=h?d.ariaLables.collapseJson:d.ariaLables.expandJson,v=o+1,N=l.length-1,_=e=>{h!==e&&(!u||u({level:o,value:r,field:t,newExpandValue:e}))&&g(e)},w=e=>{if("ArrowRight"===e.key||"ArrowLeft"===e.key)e.preventDefault(),_("ArrowRight"===e.key);else if("ArrowUp"===e.key||"ArrowDown"===e.key){e.preventDefault();let t="ArrowUp"===e.key?-1:1;if(!x.current)return;let s=x.current.querySelectorAll("[role=button]"),r=-1;for(let e=0;e{var e;_(!h);let t=f.current;if(!t)return;let s=null==(e=x.current)?void 0:e.querySelector('[role=button][tabindex="0"]');s&&(s.tabIndex=-1),t.tabIndex=0,t.focus()};return(0,s.createElement)("div",{className:d.basicChildStyle,role:"treeitem","aria-expanded":h,"aria-selected":void 0},(0,s.createElement)("span",{className:j,onClick:k,onKeyDown:w,role:"button","aria-label":b,"aria-expanded":h,"aria-controls":h?y:void 0,ref:f,tabIndex:0===o?0:-1}),(t||""===t)&&(m?(0,s.createElement)("span",{className:d.clickableLabel,onClick:k,onKeyDown:w},eG(t,d.quotesForFieldNames),":"):(0,s.createElement)("span",{className:d.label},eG(t,d.quotesForFieldNames),":")),(0,s.createElement)("span",{className:d.punctuation},n),h?(0,s.createElement)("ul",{id:y,role:"group",className:d.childFieldsContainer},l.map((e,t)=>(0,s.createElement)(eX,{key:e[0]||t,field:e[0],value:e[1],style:d,lastElement:t===N,level:v,shouldExpandNode:c,clickToExpandNode:m,beforeExpandChange:u,outerRef:x}))):(0,s.createElement)("span",{className:d.collapsedContent,onClick:k,onKeyDown:w}),(0,s.createElement)("span",{className:d.punctuation},i),!a&&(0,s.createElement)("span",{className:d.punctuation},","))}function eK(e){let{field:t,value:s,style:r,lastElement:l,shouldExpandNode:a,clickToExpandNode:n,level:i,outerRef:o,beforeExpandChange:d}=e;return eU({field:t,value:s,lastElement:l||!1,level:i,openBracket:"{",closeBracket:"}",style:r,shouldExpandNode:a,clickToExpandNode:n,data:Object.keys(s).map(e=>[e,s[e]]),outerRef:o,beforeExpandChange:d})}function eV(e){let{field:t,value:s,style:r,lastElement:l,level:a,shouldExpandNode:n,clickToExpandNode:i,outerRef:o,beforeExpandChange:d}=e;return eU({field:t,value:s,lastElement:l||!1,level:a,openBracket:"[",closeBracket:"]",style:r,shouldExpandNode:n,clickToExpandNode:i,data:s.map(e=>[void 0,e]),outerRef:o,beforeExpandChange:d})}function eQ(e){let t,{field:r,value:l,style:a,lastElement:n}=e,i=a.otherValue;if(null===l)t="null",i=a.nullValue;else if(void 0===l)t="undefined",i=a.undefinedValue;else if("string"==typeof l||l instanceof String){var o;o=!a.noQuotesForStringValues,t=a.stringifyStringValues?JSON.stringify(l):o?`"${l}"`:l,i=a.stringValue}else if("boolean"==typeof l||l instanceof Boolean)t=l?"true":"false",i=a.booleanValue;else if("number"==typeof l||l instanceof Number)t=l.toString(),i=a.numberValue;else"bigint"==typeof l||l instanceof BigInt?(t=`${l.toString()}n`,i=a.numberValue):t=eJ(l)?l.toISOString():eY(l)?"function() { }":l.toString();return(0,s.createElement)("div",{className:a.basicChildStyle,role:"treeitem","aria-selected":void 0},(r||""===r)&&(0,s.createElement)("span",{className:a.label},eG(r,a.quotesForFieldNames),":"),(0,s.createElement)("span",{className:i},t),!n&&(0,s.createElement)("span",{className:a.punctuation},","))}function eX(e){let t=e.value;return Array.isArray(t)?(0,s.createElement)(eV,Object.assign({},e)):!eH(t)||eJ(t)||eY(t)?(0,s.createElement)(eQ,Object.assign({},e)):(0,s.createElement)(eK,Object.assign({},e))}let eZ={container:"_2IvMF _GzYRV",basicChildStyle:"_2bkNM",childFieldsContainer:"_1BXBN",label:"_1MGIk",clickableLabel:"_2YKJg _1MGIk _1MFti",nullValue:"_2T6PJ",undefinedValue:"_1Gho6",stringValue:"_vGjyY",booleanValue:"_3zQKs",numberValue:"_1bQdo",otherValue:"_1xvuR",punctuation:"_3uHL6 _3eOF8",collapseIcon:"_oLqym _f10Tu _1MFti _1LId0",expandIcon:"_2AXVT _f10Tu _1MFti _1UmXx",collapsedContent:"_2KJWg _1pNG9 _1MFti",noQuotesForStringValues:!1,quotesForFieldNames:!1,ariaLables:{collapseJson:"collapse JSON",expandJson:"expand JSON"},stringifyStringValues:!1},e0=()=>!0,e1=e=>{let{data:t,style:r=eZ,shouldExpandNode:l=e0,clickToExpandNode:a=!1,beforeExpandChange:n,compactTopLevel:i,...o}=e,d=(0,s.useRef)(null);return(0,s.createElement)("div",Object.assign({"aria-label":"JSON view"},o,{className:r.container,ref:d,role:"tree"}),i&&eH(t)?Object.entries(t).map(e=>{let[t,i]=e;return(0,s.createElement)(eX,{key:t,field:t,value:i,style:{...eZ,...r},lastElement:!0,level:1,shouldExpandNode:l,clickToExpandNode:a,beforeExpandChange:n,outerRef:d})}):(0,s.createElement)(eX,{value:t,style:{...eZ,...r},lastElement:!0,level:0,shouldExpandNode:l,clickToExpandNode:a,outerRef:d,beforeExpandChange:n}))},{Text:e2}=v.Typography;function e4({data:e}){return e?(0,t.jsx)("div",{style:{maxHeight:400,overflow:"auto",background:"#fafafa",padding:12,borderRadius:4},children:(0,t.jsx)("div",{className:"**:[[role='tree']]:bg-white **:[[role='tree']]:text-slate-900",children:(0,t.jsx)(e1,{data:e,style:eZ,clickToExpandNode:!0})})}):(0,t.jsx)(e2,{type:"secondary",children:"No data"})}var e5=e.i(199931);let e6={complexity:"Auto-Router v2",adaptive:"Adaptive router",quality:"Quality router"};function e3({label:e,children:s}){return(0,t.jsxs)("div",{className:"flex gap-3 py-1 text-sm",children:[(0,t.jsx)("span",{className:"w-28 shrink-0 text-muted-foreground",children:e}),(0,t.jsx)("span",{className:"min-w-0 break-words",children:s})]})}function e8({decision:e,className:s}){if(!e||!e.cause)return null;let{router_model_name:r,router_type:l,routed_model:a,tier:n,request_type:i,score:o,signals:d,escalated:c,escalation_keyword:m,tier_boundaries:x}=e,u=void 0!==o&&"reasoning_override"!==e.cause?function(e,t){if(!t)return null;let{simple_medium:s,medium_complex:r,complex_reasoning:l}=t;return void 0===s||void 0===r||void 0===l?null:e0&&(0,t.jsx)(e3,{label:"Signals",children:(0,t.jsx)("span",{className:"flex flex-wrap gap-1",children:d.map(e=>(0,t.jsx)(h.Badge,{variant:"outline",className:"font-normal",children:e},e))})})]})]})}let e9=e=>e.request_duration_ms??Date.parse(e.endTime)-Date.parse(e.startTime);function e7(e){if("string"==typeof e)try{return JSON.parse(e)}catch{}return e}function te(e){return Array.isArray(e)?e:e?[e]:[]}function tt(e){if("string"==typeof e)try{return JSON.parse(e)}catch{}return e}var ts=e.i(366308);let{Text:tr}=v.Typography;function tl({tool:e}){let s=Object.entries(e.parameters?.properties||{}).map(([t,s])=>({key:t,name:t,type:s.type||"any",description:s.description||"-",required:e.parameters?.required?.includes(t)||!1})),r=[{title:"Parameter",dataIndex:"name",key:"name",render:(e,s)=>(0,t.jsxs)(tr,{code:!0,children:[e,s.required&&(0,t.jsx)(tr,{type:"danger",children:"*"})]})},{title:"Type",dataIndex:"type",key:"type",render:e=>(0,t.jsx)(tr,{code:!0,style:{color:"#1890ff"},children:e})},{title:"Description",dataIndex:"description",key:"description",render:e=>(0,t.jsx)(tr,{type:"secondary",children:e})}];return(0,t.jsxs)("div",{children:[e.description&&(0,t.jsx)("div",{style:{marginBottom:16},children:(0,t.jsx)(tr,{style:{lineHeight:1.6,whiteSpace:"pre-wrap"},children:e.description})}),s.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsx)(tr,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:8},children:"Parameters"}),(0,t.jsx)(eT.Table,{dataSource:s,columns:r,pagination:!1,size:"small",bordered:!0})]}),e.called&&e.callData&&(0,t.jsxs)("div",{style:{marginTop:16},children:[(0,t.jsx)(tr,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:8},children:"Called With"}),(0,t.jsx)("div",{style:{background:"#f6ffed",border:"1px solid #b7eb8f",borderRadius:4,padding:12},children:(0,t.jsx)("pre",{style:{margin:0,fontSize:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:JSON.stringify(e.callData.arguments,null,2)})})]})]})}function ta({tool:e}){let s={type:"function",function:{name:e.name,description:e.description,parameters:e.parameters}};return(0,t.jsx)("pre",{style:{margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:12,background:"#fafafa",padding:12,borderRadius:4,maxHeight:300,overflow:"auto"},children:JSON.stringify(s,null,2)})}let{Text:tn}=v.Typography;function ti({tool:e}){let[r,l]=(0,s.useState)("formatted");return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:12},children:[(0,t.jsx)(tn,{type:"secondary",style:{fontSize:12},children:"Description"}),(0,t.jsxs)(W.Radio.Group,{size:"small",value:r,onChange:e=>l(e.target.value),children:[(0,t.jsx)(W.Radio.Button,{value:"formatted",children:"Formatted"}),(0,t.jsx)(W.Radio.Button,{value:"json",children:"JSON"})]})]}),"formatted"===r?(0,t.jsx)(tl,{tool:e}):(0,t.jsx)(ta,{tool:e})]})}let{Text:to}=v.Typography;function td({tool:e}){let[r,l]=(0,s.useState)(!1);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:8,overflow:"hidden"},children:[(0,t.jsxs)("div",{onClick:()=>l(!r),style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"12px 16px",cursor:"pointer",background:r?"#fafafa":"#fff",transition:"background 0.2s"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10},children:[(0,t.jsx)(ts.ToolOutlined,{style:{color:"#8c8c8c",fontSize:14}}),(0,t.jsxs)(to,{style:{fontSize:14},children:[e.index,". ",e.name]})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,t.jsx)(j.Tag,{color:e.called?"blue":"default",children:e.called?"called":"not called"}),r?(0,t.jsx)(w.DownOutlined,{style:{fontSize:12,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:12,color:"#8c8c8c"}})]})]}),r&&(0,t.jsx)("div",{style:{padding:"16px",borderTop:"1px solid #f0f0f0",background:"#fff"},children:(0,t.jsx)(ti,{tool:e})})]})}let{Text:tc}=v.Typography;function tm({log:e}){let s=function(e){let t,s=!(t=tt(e.proxy_server_request||e.messages))||Array.isArray(t)?[]:"object"==typeof t&&t.tools&&Array.isArray(t.tools)?t.tools:[];if(0===s.length)return[];let r=function(e){let t=tt(e.response);if(!t||"object"!=typeof t)return[];let s=t.choices;if(Array.isArray(s)&&s.length>0){let e=s[0].message;if(e&&Array.isArray(e.tool_calls))return e.tool_calls}if(Array.isArray(t.content)){let e=t.content.filter(e=>"tool_use"===e.type);if(e.length>0)return e.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input||{})}}))}if(Array.isArray(t.tool_calls))return t.tool_calls;if(Array.isArray(t.results)){let e=[];for(let s of t.results)if("response.done"===s.type&&s.response?.output)for(let t of s.response.output)"function_call"===t.type&&e.push({id:t.call_id||"",type:"function",function:{name:t.name||"",arguments:t.arguments||"{}"}});if(e.length>0)return e}return[]}(e),l=new Set(r.map(e=>e.function?.name).filter(Boolean)),a=new Map;return r.forEach(e=>{let t=e.function?.name;t&&a.set(t,{id:e.id,name:t,arguments:function(e){try{return JSON.parse(e)}catch{return{}}}(e.function?.arguments||"{}")})}),s.map((e,t)=>{let s=e.function?.name||e.name||`Tool ${t+1}`;return{index:t+1,name:s,description:e.function?.description||e.description||"",parameters:e.function?.parameters||e.input_schema||{},called:l.has(s),callData:a.get(s)}})}(e);if(0===s.length)return null;let r=s.length,l=s.filter(e=>e.called).length,a=s.slice(0,2).map(e=>e.name).join(", "),n=s.length>2;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Tools"}),(0,t.jsxs)(tc,{type:"secondary",style:{fontSize:14},children:[r," provided, ",l," called"]}),(0,t.jsxs)(tc,{type:"secondary",style:{fontSize:14},children:["• ",a,n&&"..."]})]}),children:(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:8},children:s.map(e=>(0,t.jsx)(td,{tool:e},e.name))})}]})})}let tx=e=>{if(!e)return{};if("string"==typeof e)try{return JSON.parse(e)}catch{return{raw:e}}return e};var tu=e.i(888259);e.i(247167);var tp=e.i(931067);let th={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"}}]},name:"message",theme:"outlined"};var tg=e.i(9583),tf=s.forwardRef(function(e,t){return s.createElement(tg.default,(0,tp.default)({},e,{ref:t,icon:th}))}),_=_;let{Text:ty}=v.Typography;function tj({type:e,tokens:s,cost:l,onCopy:a,isCollapsed:n,onToggleCollapse:o,turnCount:d}){return(0,t.jsxs)("div",{onClick:o,style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",borderBottom:n?"none":"1px solid #f0f0f0",background:"#fafafa",cursor:o?"pointer":"default",transition:"background 0.15s ease"},onMouseEnter:e=>{o&&(e.currentTarget.style.background="#f5f5f5")},onMouseLeave:e=>{e.currentTarget.style.background="#fafafa"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16},children:[o&&(0,t.jsx)("div",{style:{display:"flex",alignItems:"center"},children:n?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(_.default,{style:{fontSize:10,color:"#8c8c8c"}})}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:["input"===e?(0,t.jsx)(tf,{style:{color:"#8c8c8c",fontSize:14}}):(0,t.jsx)("span",{style:{fontSize:14,filter:"grayscale(1)",opacity:.6},children:"✨"}),(0,t.jsx)(ty,{style:{fontWeight:500,fontSize:14},children:"input"===e?"Input":"Output"})]}),void 0!==s&&(0,t.jsxs)(ty,{type:"secondary",style:{fontSize:12},children:["Tokens: ",s.toLocaleString()]}),void 0!==l&&(0,t.jsxs)(ty,{type:"secondary",style:{fontSize:12},children:["Cost: $",l.toFixed(6)]}),void 0!==d&&d>0&&(0,t.jsxs)(ty,{type:"secondary",style:{fontSize:12},children:["Turns: ",d]})]}),(0,t.jsx)(b.Tooltip,{title:"Copy",children:(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(i.CopyOutlined,{}),onClick:e=>{e.stopPropagation(),a()}})})]})}let{Text:tb}=v.Typography;function tv({label:e,content:r,defaultExpanded:l=!1}){let[a,n]=(0,s.useState)(l),[i,o]=(0,s.useState)(!1),c=r?.length||0;return r&&0!==c?(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{onClick:()=>n(!a),onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer",padding:"4px 0",borderRadius:4,background:i?"#f5f5f5":"transparent",transition:"background 0.15s ease",marginBottom:4*!!a},children:[a?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:10,color:"#8c8c8c"}}),(0,t.jsx)(tb,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:e}),(0,t.jsxs)(tb,{type:"secondary",style:{fontSize:10},children:["(",c.toLocaleString()," chars)"]})]}),(0,t.jsx)("div",{style:{maxHeight:a?"2000px":"0px",overflow:"hidden",transition:"max-height 0.2s ease-out, opacity 0.2s ease-out",opacity:+!!a},children:(0,t.jsx)("div",{style:{paddingLeft:16,fontSize:13,lineHeight:1.7,color:"#262626",borderLeft:"1px solid #f0f0f0",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:r})})]}):null}let{Text:tN}=v.Typography;function t_({tool:e,compact:s=!1}){return(0,t.jsxs)("div",{style:{background:"#f8f9fa",border:"1px solid #e9ecef",borderRadius:6,padding:s?"6px 10px":"10px 14px",marginTop:8,fontFamily:"monospace",fontSize:12,position:"relative"},children:[(0,t.jsx)("div",{style:{position:"absolute",top:-8,left:12,background:"#fff",padding:"0 6px",fontSize:10,color:"#8c8c8c",border:"1px solid #e9ecef",borderRadius:3},children:"function"}),(0,t.jsx)(tN,{strong:!0,style:{fontSize:13,display:"block",marginBottom:6},children:e.name}),Object.keys(e.arguments).length>0&&(0,t.jsx)("div",{children:Object.entries(e.arguments).map(([e,s])=>(0,t.jsxs)("div",{style:{marginBottom:2},children:[(0,t.jsxs)(tN,{type:"secondary",style:{fontSize:12},children:[e,":"," "]}),(0,t.jsx)(tN,{style:{fontSize:12},children:JSON.stringify(s)})]},e))})]})}let{Text:tw}=v.Typography;function tk({label:e,content:s,toolCalls:r,isCompact:l=!1}){let a=s&&"null"!==s&&s.length>0?s:null,n=r&&r.length>0;return a||n?(0,t.jsxs)("div",{style:{marginBottom:8*!!l},children:[(0,t.jsx)(tw,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:3},children:e}),a&&(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.7,color:"#262626",whiteSpace:"pre-wrap",wordBreak:"break-word",marginBottom:6*!!n},children:a}),n&&(0,t.jsx)("div",{children:r.map((e,s)=>(0,t.jsx)(t_,{tool:e,compact:l},e.id||s))})]}):null}let{Text:tS}=v.Typography;function tC({messages:e}){let[r,l]=(0,s.useState)(!1),[a,n]=(0,s.useState)(!1);return 0===e.length?null:(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{onClick:()=>l(!r),onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer",padding:"4px 0",borderRadius:4,background:a?"#f5f5f5":"transparent",transition:"background 0.15s ease",marginBottom:4*!!r},children:[r?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:10,color:"#8c8c8c"}}),(0,t.jsxs)(tS,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:["HISTORY (",e.length," message",1!==e.length?"s":"",")"]})]}),(0,t.jsx)("div",{style:{maxHeight:r?"2000px":"0px",overflow:"hidden",transition:"max-height 0.2s ease-out, opacity 0.2s ease-out",opacity:+!!r},children:(0,t.jsx)("div",{style:{paddingLeft:16,borderLeft:"1px solid #f0f0f0"},children:e.map((e,s)=>(0,t.jsx)(tk,{label:e.role.toUpperCase(),content:e.content,toolCalls:e.toolCalls,isCompact:!0},s))})})]})}function tT({messages:e,promptTokens:r,inputCost:l}){let[a,n]=(0,s.useState)(!1);if(0===e.length)return null;let i=e.find(e=>"system"===e.role),o=e.filter(e=>"system"!==e.role),d=o.length>0?o[o.length-1]:null,c=o.slice(0,-1);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,marginBottom:8,overflow:"hidden"},children:[(0,t.jsx)(tj,{type:"input",tokens:r,cost:l,onCopy:()=>{let e=d?.content||"";navigator.clipboard.writeText(e),tu.default.success("Input copied")},isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsxs)("div",{style:{padding:"12px 16px"},children:[i&&(0,t.jsx)(tv,{label:"SYSTEM",content:i.content,defaultExpanded:!!(i.content&&i.content.length<200)}),c.length>0&&(0,t.jsx)(tC,{messages:c}),d&&(0,t.jsx)(tk,{label:d.role.toUpperCase(),content:d.content,toolCalls:d.toolCalls})]})})]})}let{Text:tL}=v.Typography;function tA({message:e,completionTokens:r,outputCost:l}){let[a,n]=(0,s.useState)(!1),i=()=>{if(!e)return;let t=e.content||"";navigator.clipboard.writeText(t),tu.default.success("Output copied")};return e?(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tj,{type:"output",tokens:r,cost:l,onCopy:i,isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:(0,t.jsx)(tk,{label:"ASSISTANT",content:e.content,toolCalls:e.toolCalls})})})]}):(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tj,{type:"output",tokens:r,cost:l,onCopy:i,isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:(0,t.jsx)(tL,{type:"secondary",style:{fontSize:13,fontStyle:"italic"},children:"No response data available"})})})]})}var tM=e.i(782273),tE=e.i(313603),tI=e.i(793916),_=_;let{Text:tz}=v.Typography;function tD({response:e,metrics:s}){let r=e?.results||[],l=e?.usage,a=r.find(e=>"session.created"===e.type||"session.updated"===e.type),n=r.filter(e=>"response.done"===e.type);return(0,t.jsxs)("div",{children:[a?.session&&(0,t.jsx)(tO,{session:a.session,turnCount:n.length}),n.length>0&&(0,t.jsx)(tR,{responses:n.map(e=>e.response).filter(Boolean),totalUsage:l,metrics:s}),!a&&0===n.length&&(0,t.jsx)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,padding:"16px",color:"#8c8c8c",fontStyle:"italic",fontSize:13},children:"No recognized realtime events found"})]})}function tO({session:e,turnCount:r}){let[l,a]=(0,s.useState)(!0);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,marginBottom:8,overflow:"hidden"},children:[(0,t.jsx)("div",{onClick:()=>a(!l),style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",borderBottom:l?"none":"1px solid #f0f0f0",background:"#fafafa",cursor:"pointer",transition:"background 0.15s ease"},onMouseEnter:e=>{e.currentTarget.style.background="#f5f5f5"},onMouseLeave:e=>{e.currentTarget.style.background="#fafafa"},children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)("div",{style:{display:"flex",alignItems:"center"},children:l?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(_.default,{style:{fontSize:10,color:"#8c8c8c"}})}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,t.jsx)(tE.SettingOutlined,{style:{color:"#8c8c8c",fontSize:14}}),(0,t.jsx)(tz,{style:{fontWeight:500,fontSize:14},children:"Session"})]}),(0,t.jsx)(tz,{type:"secondary",style:{fontSize:12},children:e.model}),r>0&&(0,t.jsxs)(j.Tag,{color:"purple",style:{margin:0,fontWeight:500},children:[r," ",1===r?"turn":"turns"]}),e.voice&&(0,t.jsxs)(j.Tag,{color:"blue",style:{margin:0},children:[(0,t.jsx)(tM.SoundOutlined,{})," ",e.voice]}),e.modalities&&(0,t.jsx)("div",{style:{display:"flex",gap:4},children:e.modalities.map(e=>(0,t.jsxs)(j.Tag,{style:{margin:0},children:["audio"===e?(0,t.jsx)(tI.AudioOutlined,{}):(0,t.jsx)(tf,{})," ",e]},e))})]})}),(0,t.jsx)("div",{style:{maxHeight:l?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!l},children:(0,t.jsxs)("div",{style:{padding:"12px 16px"},children:[(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"8px 24px",fontSize:13},children:[(0,t.jsx)(tF,{label:"Model",value:e.model}),(0,t.jsx)(tF,{label:"Voice",value:e.voice}),(0,t.jsx)(tF,{label:"Temperature",value:e.temperature}),(0,t.jsx)(tF,{label:"Max Output Tokens",value:e.max_response_output_tokens}),(0,t.jsx)(tF,{label:"Input Audio Format",value:e.input_audio_format}),(0,t.jsx)(tF,{label:"Output Audio Format",value:e.output_audio_format}),e.turn_detection&&(0,t.jsx)(tF,{label:"Turn Detection",value:e.turn_detection.type}),e.tools&&e.tools.length>0&&(0,t.jsx)(tF,{label:"Tools",value:`${e.tools.length} tool(s)`})]}),e.instructions&&(0,t.jsxs)("div",{style:{marginTop:12},children:[(0,t.jsx)(tz,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:4},children:"Instructions"}),(0,t.jsx)("div",{style:{fontSize:12,lineHeight:1.6,color:"#595959",background:"#fafafa",padding:"8px 12px",borderRadius:4,border:"1px solid #f0f0f0",whiteSpace:"pre-wrap",wordBreak:"break-word",maxHeight:120,overflowY:"auto"},children:e.instructions})]})]})})]})}function tR({responses:e,totalUsage:r,metrics:l}){let[a,n]=(0,s.useState)(!1),i=r?.total_tokens,o=e.length;return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tj,{type:"output",tokens:l?.completion_tokens??i,cost:l?.output_cost,onCopy:()=>{let t=e.flatMap(e=>(e.output||[]).flatMap(e=>(e.content||[]).map(t=>`${e.role}: ${t.transcript||t.text||""}`))).join("\n");navigator.clipboard.writeText(t)},isCollapsed:a,onToggleCollapse:()=>n(!a),turnCount:o}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:e.map((e,s)=>(0,t.jsx)(tB,{response:e,index:s},e.id||s))})})]})}function tB({response:e,index:s}){let r=e.output||[],l=e.usage;return(0,t.jsxs)("div",{style:{marginBottom:12,paddingBottom:12,borderBottom:"1px solid #f5f5f5"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[(0,t.jsx)(j.Tag,{color:"completed"===e.status?"green":"orange",style:{margin:0},children:e.status||"unknown"}),l&&(0,t.jsxs)(tz,{type:"secondary",style:{fontSize:11},children:[l.input_tokens??0," in / ",l.output_tokens??0," out tokens"]}),e.conversation_id&&(0,t.jsx)(b.Tooltip,{title:e.conversation_id,children:(0,t.jsxs)(tz,{type:"secondary",style:{fontSize:11,cursor:"help"},children:["conv: ",e.conversation_id.slice(0,12),"..."]})})]}),r.map((e,s)=>(0,t.jsx)(tP,{output:e},e.id||s)),l?.input_token_details&&(0,t.jsx)(tq,{label:"Input",details:l.input_token_details}),l?.output_token_details&&(0,t.jsx)(tq,{label:"Output",details:l.output_token_details})]})}function tP({output:e}){let s=e.content||[];return s.some(e=>e.transcript||e.text)?(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsx)(tz,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:3},children:e.role?.toUpperCase()||"ASSISTANT"}),s.map((e,s)=>{let r=e.transcript||e.text;return r?(0,t.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",gap:8,marginBottom:4},children:["audio"===e.type&&(0,t.jsx)(tI.AudioOutlined,{style:{color:"#8c8c8c",fontSize:12,marginTop:3,flexShrink:0}}),"text"===e.type&&(0,t.jsx)(tf,{style:{color:"#8c8c8c",fontSize:12,marginTop:3,flexShrink:0}}),(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.7,color:"#262626",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:r})]},s):null})]}):null}function tq({label:e,details:s}){let r=Object.entries(s).filter(([,e])=>"number"==typeof e||"object"==typeof e&&null!==e);return 0===r.length?null:(0,t.jsxs)("div",{style:{marginTop:4},children:[(0,t.jsxs)(tz,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:[e," Token Breakdown"]}),(0,t.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:4},children:r.map(([e,s])=>"number"==typeof s?(0,t.jsxs)(j.Tag,{style:{margin:0},children:[e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),": ",s.toLocaleString()]},e):null)})]})}function tF({label:e,value:s}){return null==s?null:(0,t.jsxs)("div",{children:[(0,t.jsx)(tz,{type:"secondary",style:{fontSize:11},children:e}),(0,t.jsx)("div",{style:{fontSize:13,color:"#262626"},children:String(s)})]})}function t$({request:e,response:s,metrics:r}){let l,a,n;if(s&&s.results&&Array.isArray(s.results)&&0!==s.results.length&&s.results.some(e=>"session.created"===e.type||"session.updated"===e.type||"response.done"===e.type))return(0,t.jsx)(tD,{response:s,metrics:r});let{requestMessages:i,responseMessage:o}=(l=[],(Array.isArray(e)?e:Array.isArray(e?.messages)?e.messages:[]).forEach(e=>{let t;l.push({role:e.role||"user",content:"string"==typeof(t=e.content)?t:Array.isArray(t)?t.map(e=>"string"==typeof e?e:"text"===e.type?e.text:"image_url"===e.type?"[Image]":JSON.stringify(e)).join("\n"):JSON.stringify(t),toolCallId:e.tool_call_id})}),a=null,(n=s?.choices?.[0]?.message)&&(a={role:n.role||"assistant",content:n.content||"",toolCalls:(e=>{if(e&&Array.isArray(e))return e.map(e=>({id:e.id||"",name:e.function?.name||"unknown",arguments:tx(e.function?.arguments)}))})(n.tool_calls)}),{requestMessages:l,responseMessage:a});return(0,t.jsxs)("div",{children:[(0,t.jsx)(tT,{messages:i,promptTokens:r?.prompt_tokens,inputCost:r?.input_cost}),(0,t.jsx)(tA,{message:o,completionTokens:r?.completion_tokens,outputCost:r?.output_cost})]})}let{Text:tW}=v.Typography;function tJ({logEntry:e,isLoadingDetails:s=!1,accessToken:r}){var l,a;let n=e.metadata||{},i="failure"===n.status,o=i?n.error_information:null,d=!!(l=e.messages)&&(Array.isArray(l)?l.length>0:"object"==typeof l&&Object.keys(l).length>0),c=!!(a=e.response)&&Object.keys(e7(a)).length>0,m=!d&&!c&&!i&&!s,x=n?.guardrail_information,u=te(x),p=u.length>0,h=u.reduce((e,t)=>{let s=t?.masked_entity_count;return s?e+Object.values(s).reduce((e,t)=>"number"==typeof t?e+t:e,0):e},0),g=0===u.length?"-":1===u.length?u[0]?.guardrail_name??"-":`${u.length} guardrails`,f=n?.eval_information,y=n.vector_store_request_metadata&&Array.isArray(n.vector_store_request_metadata)&&n.vector_store_request_metadata.length>0;return(0,t.jsxs)("div",{style:{padding:`${C} ${C} 0`},children:[i&&o&&(0,t.jsx)(F.Alert,{type:"error",showIcon:!0,message:"Request Failed",description:(0,t.jsx)(tH,{errorInfo:o}),className:"mb-6"}),e.request_tags&&Object.keys(e.request_tags).length>0&&(0,t.jsx)(tY,{tags:e.request_tags}),(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)(P.Card,{title:"Request Details",size:"small",bordered:!1,style:{marginBottom:0},children:(0,t.jsxs)(B.Descriptions,{column:2,size:"small",children:[(0,t.jsx)(B.Descriptions.Item,{label:"Model",children:e.model}),(0,t.jsx)(B.Descriptions.Item,{label:"Provider",children:e.custom_llm_provider||"-"}),(0,t.jsx)(B.Descriptions.Item,{label:"Call Type",children:e.call_type}),(0,t.jsx)(B.Descriptions.Item,{label:"Model ID",children:(0,t.jsx)(eF,{value:e.model_id})}),(0,t.jsx)(B.Descriptions.Item,{label:"API Base",children:(0,t.jsx)(eF,{value:e.api_base,maxWidth:200})}),e.requester_ip_address&&(0,t.jsx)(B.Descriptions.Item,{label:"IP Address",children:e.requester_ip_address}),p&&(0,t.jsx)(B.Descriptions.Item,{label:"Guardrail",children:(0,t.jsx)(tG,{label:g,maskedCount:h})})]})})}),(0,t.jsx)(e8,{decision:n?.routing_decision}),(0,t.jsx)(tV,{logEntry:e,metadata:n}),(0,t.jsx)(eR,{costBreakdown:n?.cost_breakdown,totalSpend:e.spend??0,promptTokens:e.prompt_tokens,completionTokens:e.completion_tokens,cacheHit:e.cache_hit,rawInputTokens:n?.additional_usage_values?.prompt_tokens_details?.text_tokens,cacheReadTokens:n?.additional_usage_values?.cache_read_input_tokens,cacheCreationTokens:n?.additional_usage_values?.cache_creation_input_tokens}),(0,t.jsx)(tm,{log:e}),m&&(0,t.jsx)("div",{className:"mb-6",children:(0,t.jsx)(eB,{show:m})}),s?(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6 p-8 text-center",children:[(0,t.jsx)(J.Spin,{size:"default"}),(0,t.jsx)("div",{style:{marginTop:8,color:"#999"},children:"Loading request & response data..."})]}):(0,t.jsx)(tQ,{hasResponse:c,hasError:i,getRawRequest:()=>e7(e.proxy_server_request||e.messages),getFormattedResponse:()=>i&&o?{error:{message:o.error_message||"An error occurred",type:o.error_class||"error",code:o.error_code||"unknown",param:null}}:e7(e.response),logEntry:e}),p&&(0,t.jsx)("div",{id:"guardrail-section",children:(0,t.jsx)(eC,{data:x,accessToken:r??null,logEntry:{request_id:e.request_id,user:e.user,model:e.model,startTime:e.startTime,metadata:e.metadata}})}),null!=f&&(0,t.jsx)(eI,{data:f}),y&&(0,t.jsx)(eP,{data:n.vector_store_request_metadata}),e.metadata&&Object.keys(e.metadata).length>0&&(0,t.jsx)(tZ,{metadata:e.metadata}),(0,t.jsx)("div",{style:{height:C}})]})}function tH({errorInfo:e}){return(0,t.jsxs)("div",{children:[e.error_code&&(0,t.jsxs)("div",{children:[(0,t.jsx)(tW,{strong:!0,children:"Error Code:"})," ",e.error_code]}),e.error_message&&(0,t.jsxs)("div",{children:[(0,t.jsx)(tW,{strong:!0,children:"Message:"})," ",e.error_message]})]})}function tY({tags:e}){return(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden p-4 mb-6",children:[(0,t.jsx)(tW,{strong:!0,style:{display:"block",marginBottom:8,fontSize:16},children:"Tags"}),(0,t.jsx)(y.Space,{size:8,wrap:!0,children:Object.entries(e).map(([e,s])=>(0,t.jsxs)(j.Tag,{children:[e,": ",String(s)]},e))})]})}function tG({label:e,maskedCount:s}){return(0,t.jsxs)(y.Space,{size:8,children:[(0,t.jsx)("a",{onClick:()=>{let e=document.getElementById("guardrail-section");e&&e.scrollIntoView({behavior:"smooth"})},style:{cursor:"pointer"},children:e}),s>0&&(0,t.jsxs)(j.Tag,{color:"blue",children:[s," masked"]})]})}let tU="https://docs.litellm.ai/docs/completion/prompt_caching";function tK({label:e,tooltip:s,docsUrl:r}){return(0,t.jsxs)(y.Space,{size:4,children:[e,(0,t.jsx)(b.Tooltip,{title:(0,t.jsxs)(t.Fragment,{children:[s," ",(0,t.jsx)("a",{href:r,target:"_blank",rel:"noreferrer",style:{color:"#91caff",textDecoration:"underline"},children:"Docs"})]}),children:(0,t.jsx)(H.InfoCircleOutlined,{style:{color:"#8c8c8c"}})})]})}function tV({logEntry:e,metadata:s}){let r=e.completionStartTime,l=r&&r!==e.endTime?new Date(r).getTime()-new Date(e.startTime).getTime():null,a=String(e.cache_hit??"").toLowerCase(),n="true"===a,i=Number(s?.additional_usage_values?.cache_read_input_tokens)||0,o=Number(s?.additional_usage_values?.cache_creation_input_tokens)||0,d=function(e){let t=e?.additional_usage_values?.prompt_tokens_details?.text_tokens??e?.usage_object?.prompt_tokens_details?.text_tokens;if(null==t)return;let s=Number(t);return Number.isFinite(s)?s:void 0}(s),c="anthropic_messages"===e.call_type&&void 0!==d;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)(P.Card,{title:"Metrics",size:"small",style:{marginBottom:0},children:(0,t.jsxs)(B.Descriptions,{column:2,size:"small",children:[c?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(B.Descriptions.Item,{label:"Input Tokens",children:(0,Y.formatNumberWithCommas)(d)}),(0,t.jsx)(B.Descriptions.Item,{label:"Output Tokens",children:(0,Y.formatNumberWithCommas)(e.completion_tokens)})]}):(0,t.jsx)(B.Descriptions.Item,{label:"Tokens",children:(0,t.jsx)(eW,{prompt:e.prompt_tokens,completion:e.completion_tokens,total:e.total_tokens})}),(0,t.jsxs)(B.Descriptions.Item,{label:"Cost",children:["$",(0,Y.formatNumberWithCommas)(e.spend||0,8)]}),(0,t.jsxs)(B.Descriptions.Item,{label:"Duration",children:[null!=e.request_duration_ms?(e.request_duration_ms/1e3).toFixed(3):"-"," s"]}),null!=l&&l>0&&(0,t.jsxs)(B.Descriptions.Item,{label:"Time to First Token",children:[(l/1e3).toFixed(3)," s"]}),(n||"false"===a)&&(0,t.jsx)(B.Descriptions.Item,{label:(0,t.jsx)(tK,{label:"Response Cache",tooltip:"Whether this request was served from LiteLLM's response cache (e.g. Redis / in-memory), skipping the LLM provider call entirely. This is separate from provider prompt caching; a Miss here does not mean prompt caching failed.",docsUrl:"https://docs.litellm.ai/docs/proxy/caching"}),children:(0,t.jsx)(j.Tag,{color:n?"green":"default",children:n?"Hit":"Miss"})}),i>0&&(0,t.jsx)(B.Descriptions.Item,{label:(0,t.jsx)(tK,{label:"Prompt Cache Read Tokens",tooltip:"Input tokens read from the LLM provider's prompt cache (e.g. Anthropic / OpenAI), billed at a discounted rate. Reported by the provider.",docsUrl:tU}),children:(0,Y.formatNumberWithCommas)(i)}),o>0&&(0,t.jsx)(B.Descriptions.Item,{label:(0,t.jsx)(tK,{label:"Prompt Cache Creation Tokens",tooltip:"Input tokens written to the LLM provider's prompt cache for reuse by later requests.",docsUrl:tU}),children:(0,Y.formatNumberWithCommas)(o)}),s?.litellm_overhead_time_ms!==void 0&&null!==s.litellm_overhead_time_ms&&(0,t.jsxs)(B.Descriptions.Item,{label:"LiteLLM Overhead",children:[s.litellm_overhead_time_ms.toFixed(2)," ms"]}),(0,t.jsx)(B.Descriptions.Item,{label:"Retries",children:s?.attempted_retries!==void 0&&s?.attempted_retries!==null?s.attempted_retries>0?(0,t.jsxs)(t.Fragment,{children:[s.attempted_retries,void 0!==s.max_retries&&null!==s.max_retries?` / ${s.max_retries}`:""]}):(0,t.jsx)(j.Tag,{color:"green",children:"None"}):"-"}),(0,t.jsx)(B.Descriptions.Item,{label:"Start Time",children:(0,k.default)(e.startTime).format("YYYY-MM-DDTHH:mm:ss.SSS[Z]")}),(0,t.jsx)(B.Descriptions.Item,{label:"End Time",children:(0,k.default)(e.endTime).format("YYYY-MM-DDTHH:mm:ss.SSS[Z]")})]})})})}function tQ({hasResponse:e,hasError:r,getRawRequest:l,getFormattedResponse:a,logEntry:n}){let[i,o]=(0,s.useState)(T),[d,c]=(0,s.useState)("pretty"),m=n.spend??0,x=n.prompt_tokens||0,u=n.completion_tokens||0,p=x+u,h=n.metadata?.cost_breakdown,g=h?.input_cost!==void 0&&h?.output_cost!==void 0,f=g?h.input_cost??0:p>0?m*x/p:0,y=g?h.output_cost??0:p>0?m*u/p:0;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%"},onClick:e=>{e.target.closest(".ant-radio-group")&&e.stopPropagation()},children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",style:{margin:0},children:"Request & Response"}),(0,t.jsxs)(W.Radio.Group,{size:"small",value:d,onChange:e=>c(e.target.value),children:[(0,t.jsx)(W.Radio.Button,{value:"pretty",children:"Pretty"}),(0,t.jsx)(W.Radio.Button,{value:"json",children:"JSON"})]})]}),children:(0,t.jsx)("div",{children:"pretty"===d?(0,t.jsx)(t$,{request:l(),response:a(),metrics:{prompt_tokens:x,completion_tokens:u,input_cost:f,output_cost:y}}):(0,t.jsx)(q.Tabs,{activeKey:i,onChange:e=>o(e),tabBarExtraContent:(0,t.jsx)(tW,{copyable:{text:JSON.stringify(i===T?l():a(),null,2),tooltips:["Copy JSON","Copied!"]},disabled:i===L&&!e&&!r}),items:[{key:T,label:"Request",children:(0,t.jsx)("div",{style:{paddingTop:16,paddingBottom:16},children:(0,t.jsx)(e4,{data:l(),mode:"formatted"})})},{key:L,label:"Response",children:(0,t.jsx)("div",{style:{paddingTop:16,paddingBottom:16},children:e||r?(0,t.jsx)(e4,{data:a(),mode:"formatted"}):(0,t.jsx)("div",{style:{textAlign:"center",padding:20,color:"#999",fontStyle:"italic"},children:"Response data not available"})})}]})})}]})})}function tX({guardrailEntries:e}){let s=e.every(e=>{let t=e?.guardrail_status||e?.status;return"pass"===t||"passed"===t||"success"===t});return(0,t.jsx)("div",{style:{textAlign:"left",marginBottom:12},children:(0,t.jsxs)("div",{onClick:()=>{let e=document.getElementById("guardrail-section");e&&e.scrollIntoView({behavior:"smooth"})},style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 12px",borderRadius:16,cursor:"pointer",fontSize:13,fontWeight:500,backgroundColor:s?"#f0fdf4":"#fef2f2",color:s?"#15803d":"#b91c1c",border:`1px solid ${s?"#bbf7d0":"#fecaca"}`},children:[s?"✓":"✗"," ",e.length," guardrail",1!==e.length?"s":""," ","evaluated",(0,t.jsx)("span",{style:{fontSize:11,opacity:.7},children:"↓"})]})})}function tZ({metadata:e}){return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Metadata"}),children:(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:(0,t.jsx)(tW,{copyable:{text:JSON.stringify(e,null,2),tooltips:["Copy Metadata","Copied!"]}})}),(0,t.jsx)("pre",{style:{maxHeight:300,overflowY:"auto",fontSize:12,fontFamily:A,whiteSpace:"pre-wrap",wordBreak:"break-all",margin:0},children:JSON.stringify(e,null,2)})]})}]})})}var t0=e.i(266027),t1=e.i(135214);let t2="text-slate-500 shrink-0";function t4({callType:e,isAutoRouted:s}){return p.MCP_CALL_TYPES.includes(e)?(0,t.jsx)(x.Wrench,{size:12,className:t2}):p.AGENT_CALL_TYPES.includes(e)?(0,t.jsx)(c.Bot,{size:12,className:t2}):s?(0,t.jsx)(u.AutoRouterIcon,{size:12,className:t2}):(0,t.jsx)(m.Sparkles,{size:12,className:t2})}function t5({row:e,isSelected:s,onClick:r}){let l=(0,u.useIsAutoRoutedModelGroup)(e.model_group),a=null!=e.request_duration_ms?(e.request_duration_ms/1e3).toFixed(3):e.startTime&&e.endTime?((Date.parse(e.endTime)-Date.parse(e.startTime))/1e3).toFixed(3):"-";return(0,t.jsxs)("button",{type:"button",className:`w-full text-left pl-8 pr-2 py-1 transition-colors ${s?"bg-blue-50":"hover:bg-slate-100"}`,onClick:r,children:[(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(t4,{callType:e.call_type,isAutoRouted:l}),(0,t.jsx)("span",{className:"text-xs font-medium text-slate-900 truncate",children:function(e,t){let s=(t||"").trim();if(p.MCP_CALL_TYPES.includes(e))return s.replace(/^mcp:\s*/i,"").split("/").pop()||s||"mcp_tool";let r=(s.split("/").pop()||s).replace(/-20\d{6}.*$/i,"").replace(/:.*$/,""),l=r.match(/claude-[a-z0-9-]+/i);return l?l[0]:r||"llm_call"}(e.call_type,e.model)}),(0,t.jsx)(f,{origin:e.metadata?.internal_call_origin,className:"ml-auto"})]}),(0,t.jsxs)("div",{className:"text-[10px] text-slate-500 mt-0 flex items-center gap-1.5 font-mono",children:[(0,t.jsxs)("span",{children:[a,"s"]}),e.spend?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{children:"·"}),(0,t.jsx)("span",{children:(0,Y.getSpendString)(e.spend)})]}):null,e.total_tokens?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)("span",{children:[e.total_tokens," tok"]})]}):null]})]})}e.s(["LogDetailsDrawer",0,function({open:e,onClose:c,logEntry:m,sessionId:x,accessToken:u,allLogs:h=[],onSelectLog:g,startTime:f}){let y=!!x,[j,b]=(0,s.useState)(null),[v,N]=(0,s.useState)("duration"),[_,w]=(0,s.useState)(!1),[k,S]=(0,s.useState)(!1),{data:C}=(0,t0.useQuery)({queryKey:["sessionLogs",x],queryFn:async()=>{if(!x||!u)return{logs:[],total:0};let e=await (0,ea.sessionSpendLogsCall)(u,x,1,100),t=e.data||e||[],s=Math.min(e.total_pages??1,50);if(s>1){let e=[];for(let t=2;t<=s;t+=5){let r=Math.min(t+5-1,s),l=await Promise.all(Array.from({length:r-t+1},(e,s)=>(0,ea.sessionSpendLogsCall)(u,x,t+s,100)));e.push(...l)}for(let s of e)t=t.concat(s.data||[])}let r=e.total??t.length;return{logs:t.map(e=>({...e,request_duration_ms:e.request_duration_ms??Date.parse(e.endTime)-Date.parse(e.startTime)})),total:r}},enabled:!!(e&&y&&x&&u)}),T=(0,s.useMemo)(()=>{var e;return e=C?.logs??[],"start_time"===v?[...e].sort((e,t)=>new Date(e.startTime).getTime()-new Date(t.startTime).getTime()):[...e].sort((e,t)=>e9(t)-e9(e))},[C,v]),L=C?.total??T.length,A=L>T.length,M=(0,s.useMemo)(()=>T.reduce((e,t)=>!e||new Date(t.startTime).getTime()>new Date(e.startTime).getTime()?t:e,null),[T]),E=(0,s.useMemo)(()=>{if(!y)return m;if(!T.length)return null;let e=M??T[0];return j?T.find(e=>e.request_id===j)||e:m?.request_id&&T.find(e=>e.request_id===m.request_id)||e},[y,m,j,T,M]);(0,s.useEffect)(()=>{y&&T.length&&(j&&T.some(e=>e.request_id===j)||b(m?.request_id&&T.some(e=>e.request_id===m.request_id)?m.request_id:(M??T[0]).request_id))},[y,m,j,T,M]),(0,s.useEffect)(()=>{e?w(!1):(y&&b(null),N("duration"),S(!1))},[e,y]);let{selectNextLog:z,selectPreviousLog:D}=function({isOpen:e,currentLog:t,allLogs:r,onClose:l,onSelectLog:a}){(0,s.useEffect)(()=>{let t=t=>{var s;if(!((s=t.target)instanceof HTMLInputElement||s instanceof HTMLTextAreaElement)&&e)switch(t.key){case"Escape":l();break;case"j":case"J":n();break;case"k":case"K":i()}};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,t,r]);let n=()=>{if(!t||!r.length||!a)return;let e=r.findIndex(e=>e.request_id===t.request_id);e{if(!t||!r.length||!a)return;let e=r.findIndex(e=>e.request_id===t.request_id);e>0&&a(r[e-1])};return{selectNextLog:n,selectPreviousLog:i}}({isOpen:e,currentLog:E,allLogs:y?T:h,onClose:c,onSelectLog:e=>{y&&b(e.request_id),g?.(e)}}),O=((e,t,s)=>{let{accessToken:r}=(0,t1.default)();return(0,t0.useQuery)({queryKey:["logDetails",e,t,r],queryFn:async()=>r&&e&&t?await (0,ea.uiSpendLogDetailsCall)(r,e,t):null,enabled:s&&!!r&&!!e&&!!t,staleTime:6e5,gcTime:6e5})})(E?.request_id,f,e&&!!E?.request_id),R=O.data,B=O.isLoading,P=(0,s.useMemo)(()=>E?{...E,messages:R?.messages||E.messages,response:R?.response||E.response,proxy_server_request:R?.proxy_server_request||E.proxy_server_request}:null,[E,R]),q=E?.metadata||{},F="failure"===q.status?"Failure":"Success",$="failure"===q.status?"error":"success",W=q?.user_api_key_team_alias||"default",J=T.reduce((e,t)=>e+(t.spend||0),0),H=T.length>0?new Date(Math.min(...T.map(e=>new Date(e.startTime).getTime()))):null,G=T.length>0?new Date(Math.max(...T.map(e=>new Date(e.endTime).getTime()))):null,U=H&&G?((G.getTime()-H.getTime())/1e3).toFixed(2):"0.00",K=T.filter(e=>!p.MCP_CALL_TYPES.includes(e.call_type)&&!p.AGENT_CALL_TYPES.includes(e.call_type)).length,V=T.filter(e=>p.AGENT_CALL_TYPES.includes(e.call_type)).length,Q=T.filter(e=>p.MCP_CALL_TYPES.includes(e.call_type)).length,X=y?T:E?[E]:[],Z=y?x||"":E?.request_id||"",ee=Z.length>14?`${Z.slice(0,11)}...`:Z,et=async()=>{if(Z)try{await navigator.clipboard.writeText(Z),S(!0),setTimeout(()=>S(!1),1200)}catch{}};return E&&P?(0,t.jsx)(l.Drawer,{title:null,placement:"right",onClose:c,open:e,width:"60%",closable:!1,mask:!0,maskClosable:!0,styles:{body:{padding:0,overflow:"hidden"},header:{display:"none"}},children:(0,t.jsxs)("div",{style:{height:"100%"},className:"flex relative",children:[_?(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(d.RightOutlined,{}),onClick:()=>w(!1),className:"absolute top-2 left-2 z-20 bg-white! border! border-slate-200! rounded-md!","aria-label":"Expand trace sidebar"}):(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(o.LeftOutlined,{}),onClick:()=>w(!0),className:"absolute top-2 left-2 z-20 bg-white! border! border-slate-200! rounded-md!","aria-label":"Collapse trace sidebar"}),!_&&(0,t.jsxs)("div",{className:"border-r border-slate-200 bg-slate-50 flex flex-col",style:{width:224},children:[(0,t.jsxs)("div",{className:"pl-12 pr-3 py-2 border-b border-slate-200 bg-white",children:[(0,t.jsx)("div",{className:"flex items-start justify-between gap-2",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:y?"Session":"Trace"}),(0,t.jsxs)("div",{className:"font-mono text-[12px] text-slate-900 leading-tight flex items-center gap-1",children:[(0,t.jsx)("span",{className:"truncate",children:ee}),(0,t.jsx)("button",{type:"button",onClick:et,className:"text-slate-400 hover:text-slate-600","aria-label":"Copy trace id",children:k?(0,t.jsx)(n.CheckOutlined,{className:"text-[11px]"}):(0,t.jsx)(i.CopyOutlined,{className:"text-[11px]"})})]})]})}),(0,t.jsxs)("div",{className:"mt-1 text-[11px] text-slate-500 font-mono",children:[X.length," req",[y?K:X.filter(e=>!p.MCP_CALL_TYPES.includes(e.call_type)&&!p.AGENT_CALL_TYPES.includes(e.call_type)).length,y?V:X.filter(e=>p.AGENT_CALL_TYPES.includes(e.call_type)).length,y?Q:X.filter(e=>p.MCP_CALL_TYPES.includes(e.call_type)).length].map((e,s)=>{let r=[" LLM"," Agent"," MCP"][s];return e>0?(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),e,r]},r):null}),(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),y?(0,Y.getSpendString)(J):(0,Y.getSpendString)(E.spend||0),y&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),U,"s"]})]}),y&&A&&(0,t.jsxs)("div",{className:"mt-1 text-[11px] text-amber-600 font-mono",children:["Showing most recent ",X.length," of ",L]}),y&&(0,t.jsx)(a.Segmented,{block:!0,size:"small",className:"mt-1.5 [&_.ant-segmented-item-label]:text-[11px]",options:[{label:"Duration",value:"duration"},{label:"Start time",value:"start_time"}],value:v,onChange:e=>N(e)})]}),(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto",children:[te(q?.guardrail_information).length>0&&(0,t.jsx)("div",{className:"px-3 pt-2",children:(0,t.jsx)(tX,{guardrailEntries:te(q?.guardrail_information)})}),y?(0,t.jsx)("div",{className:"py-1",children:(0,t.jsxs)("div",{className:"relative pl-2",children:[(0,t.jsx)("div",{className:"absolute left-4 top-1 bottom-1 border-l border-slate-300"}),X.map((e,s)=>{let r=s===X.length-1;return(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("div",{className:"absolute left-4 top-3 w-3 border-t border-slate-300"}),r&&(0,t.jsx)("div",{className:"absolute left-4 top-3 bottom-0 w-px bg-slate-50"}),(0,t.jsx)(t5,{row:e,isSelected:e.request_id===E.request_id,onClick:()=>{b(e.request_id),g?.(e)}})]},e.request_id)})]})}):(0,t.jsx)("div",{className:"py-1",children:X.map(e=>(0,t.jsx)(t5,{row:e,isSelected:e.request_id===E.request_id,onClick:()=>g?.(e)},e.request_id))})]})]}),(0,t.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden",children:[(0,t.jsx)(I,{log:E,onClose:c,onPrevious:D,onNext:z,statusLabel:F,statusColor:$,environment:W}),(0,t.jsx)("div",{className:"flex-1 overflow-y-auto",children:(0,t.jsx)(tJ,{logEntry:P,isLoadingDetails:B,accessToken:u??null})})]})]})}):null}],502626),e.s([],3565)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0t3wvditulk42.js b/litellm/proxy/_experimental/out/_next/static/chunks/0t3wvditulk42.js deleted file mode 100644 index 130a4b1597f..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0t3wvditulk42.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,951047,380883,925395,268416,865296,320311,e=>{"use strict";e.s([],951047),e.i(247167);var t=e.i(271645),n=e.i(896499),r=e.i(146376),o=e.i(733332);let i=t.createContext(void 0);e.s(["TooltipRootContext",0,i,"useTooltipRootContext",0,function(e){let n=t.useContext(i);if(void 0===n&&!e)throw Error((0,o.default)(72));return n}],380883);var s=e.i(574735),a=e.i(667865),u=e.i(229315),l=e.i(647554),c=e.i(157940);function d(e){return null!=e&&null!=e.clientX}var p=e.i(17989),f=e.i(675606),g=e.i(264111),v=e.i(176782),m=e.i(616269),h=e.i(301252),S=e.i(56434),C=e.i(116786),x=e.i(990627);let b={...C.popupStoreSelectors,disabled:(0,m.createSelector)(e=>e.disabled),instantType:(0,m.createSelector)(e=>e.instantType),isInstantPhase:(0,m.createSelector)(e=>e.isInstantPhase),trackCursorAxis:(0,m.createSelector)(e=>e.trackCursorAxis),disableHoverablePopup:(0,m.createSelector)(e=>e.disableHoverablePopup),lastOpenChangeReason:(0,m.createSelector)(e=>e.openChangeReason),closeOnClick:(0,m.createSelector)(e=>e.closeOnClick),closeDelay:(0,m.createSelector)(e=>e.closeDelay),hasViewport:(0,m.createSelector)(e=>e.hasViewport)};class E extends h.ReactStore{constructor(e,n,r=!1){const o=new x.PopupTriggerMap,i={...(0,C.createInitialPopupStoreState)(),disabled:!1,instantType:void 0,isInstantPhase:!1,trackCursorAxis:"none",disableHoverablePopup:!1,openChangeReason:null,closeOnClick:!0,closeDelay:0,hasViewport:!1,...e};i.floatingRootContext=(0,C.createPopupFloatingRootContext)(o,n,r),super(i,{popupRef:t.createRef(),onOpenChange:void 0,onOpenChangeComplete:void 0,triggerElements:o},b)}setOpen=(e,t)=>{(0,g.applyPopupOpenChange)(this,e,t,{extraState:{openChangeReason:t.reason}})};cancelPendingOpen(e){this.state.floatingRootContext.dispatchOpenChange(!1,(0,f.createChangeEventDetails)(S.REASONS.triggerPress,e))}static useStore(e,t){return(0,g.usePopupStore)(e,(e,n)=>new E(t,e,n)).store}}e.s(["TooltipStore",0,E],925395);var y=e.i(843476);let R=(0,n.fastComponent)(function(e){let{disabled:n=!1,defaultOpen:o=!1,open:s,disableHoverablePopup:a=!1,trackCursorAxis:u="none",actionsRef:l,onOpenChange:c,onOpenChangeComplete:d,handle:p,triggerId:v,defaultTriggerId:m=null,children:h}=e,C=E.useStore(p?.store,{open:o,openProp:s,activeTriggerId:m,triggerIdProp:v});(0,g.useInitialOpenSync)(C,s,o,m),C.useControlledProp("openProp",s),C.useControlledProp("triggerIdProp",v),C.useContextCallback("onOpenChange",c),C.useContextCallback("onOpenChangeComplete",d);let x=C.useState("open"),b=!n&&x,R=C.useState("activeTriggerId"),P=C.useState("mounted"),T=C.useState("payload");C.useSyncedValues({trackCursorAxis:u,disableHoverablePopup:a}),C.useSyncedValue("disabled",n),(0,g.useImplicitActiveTrigger)(C,{closeOnActiveTriggerUnmount:!0});let{forceUnmount:I,transitionStatus:w}=(0,g.useOpenStateTransitions)(b,C),A=C.useState("isInstantPhase"),M=C.useState("instantType"),D=C.useState("lastOpenChangeReason"),N=t.useRef(null);(0,r.useIsoLayoutEffect)(()=>{x&&n&&C.setOpen(!1,(0,f.createChangeEventDetails)(S.REASONS.disabled))},[x,n,C]),(0,r.useIsoLayoutEffect)(()=>{"ending"===w&&D===S.REASONS.none||"ending"!==w&&A?("delay"!==M&&(N.current=M),C.set("instantType","delay")):null!==N.current&&(C.set("instantType",N.current),N.current=null)},[w,A,D,M,C]),(0,r.useIsoLayoutEffect)(()=>{b&&null==R&&C.set("payload",void 0)},[C,R,b]);let k=t.useCallback(()=>{C.setOpen(!1,(0,f.createChangeEventDetails)(S.REASONS.imperativeAction))},[C]);t.useImperativeHandle(l,()=>({unmount:I,close:k}),[I,k]);let L=b||P||!n&&"none"!==u;return(0,y.jsxs)(i.Provider,{value:C,children:[L&&(0,y.jsx)(O,{store:C,disabled:n,trackCursorAxis:u}),"function"==typeof h?h({payload:T}):h]})});function O({store:e,disabled:n,trackCursorAxis:r}){let o=e.useState("floatingRootContext"),i=(0,p.useDismiss)(o,{enabled:!n,referencePress:()=>e.select("closeOnClick")}),f=function(e,n={}){let{enabled:r=!0,axis:o="both"}=n,i="rootStore"in e?e.rootStore:e,p=i.useState("open"),f=i.useState("floatingElement"),g=i.useState("domReferenceElement"),v=i.context.dataRef,m=t.useRef(!1),h=t.useRef(null),[S,C]=t.useState(),[x,b]=t.useState([]),E=(0,a.useStableCallback)(e=>{i.set("positionReference",e)}),y=(0,a.useStableCallback)((e,t,n)=>{if(!m.current&&(!v.current.openEvent||d(v.current.openEvent))){var r,s;let a,u,l;i.set("positionReference",(r=n??g,s={x:e,y:t,axis:o,dataRef:v,pointerType:S},a=null,u=null,l=!1,{contextElement:r||void 0,getBoundingClientRect(){let e=r?.getBoundingClientRect()||{width:0,height:0,x:0,y:0},t="x"===s.axis||"both"===s.axis,n="y"===s.axis||"both"===s.axis,o=["mouseenter","mousemove"].includes(s.dataRef.current.openEvent?.type||"")&&"touch"!==s.pointerType,i=e.width,c=e.height,d=e.x,p=e.y;return null==a&&s.x&&t&&(a=e.x-s.x),null==u&&s.y&&n&&(u=e.y-s.y),d-=a||0,p-=u||0,i=0,c=0,!l||o?(i="y"===s.axis?e.width:0,c="x"===s.axis?e.height:0,d=t&&null!=s.x?s.x:d,p=n&&null!=s.y?s.y:p):l&&!o&&(c="x"===s.axis?e.height:c,i="y"===s.axis?e.width:i),l=!0,{width:i,height:c,x:d,y:p,top:p,right:d+i,bottom:p+c,left:d}}}))}}),R=(0,a.useStableCallback)(e=>{p?h.current||(y(e.clientX,e.clientY,e.currentTarget),b([])):y(e.clientX,e.clientY,e.currentTarget)}),O=(0,c.isMouseLikePointerType)(S)?f:p;t.useEffect(()=>{if(!r)return void E(g);if(!O)return;function e(){h.current?.(),h.current=null}let t=(0,u.getWindow)(f);return!v.current.openEvent||d(v.current.openEvent)?h.current=(0,s.addEventListener)(t,"mousemove",function(t){let n=(0,l.getTarget)(t);(0,l.contains)(f,n)?e():y(t.clientX,t.clientY)}):E(g),e},[O,r,f,v,g,i,y,E,x]),t.useEffect(()=>()=>{i.set("positionReference",null)},[i]),t.useEffect(()=>{r&&!f&&(m.current=!1)},[r,f]),t.useEffect(()=>{!r&&p&&(m.current=!0)},[r,p]);let P=t.useMemo(()=>{function e(e){C(e.pointerType)}return{onPointerDown:e,onPointerEnter:e,onMouseMove:R,onMouseEnter:R}},[R]);return t.useMemo(()=>r?{reference:P,trigger:P}:{},[r,P])}(o,{enabled:!n&&"none"!==r,axis:"none"===r?void 0:r}),m=t.useMemo(()=>(0,v.mergeProps)(f.reference,i.reference),[f.reference,i.reference]),h=t.useMemo(()=>(0,v.mergeProps)(f.trigger,i.trigger),[f.trigger,i.trigger]),S=t.useMemo(()=>(0,v.mergeProps)(g.FOCUSABLE_POPUP_PROPS,f.floating,i.floating),[f.floating,i.floating]);return(0,g.usePopupInteractionProps)(e,{activeTriggerProps:m,inactiveTriggerProps:h,popupProps:S}),null}e.s(["TooltipRoot",0,R],268416);let P=t.createContext(void 0);e.s(["TooltipProviderContext",0,P,"useTooltipProviderContext",0,function(){return t.useContext(P)}],865296);var T=e.i(439957),I=e.i(944681);let w=t.createContext({hasProvider:!1,timeoutMs:0,delayRef:{current:0},initialDelayRef:{current:0},timeout:new T.Timeout,currentIdRef:{current:null},currentContextRef:{current:null}});e.s(["FloatingDelayGroup",0,function(e){let{children:n,delay:o,timeoutMs:i=0}=e,s=t.useRef(o),a=t.useRef(o),u=t.useRef(null),l=t.useRef(null),c=(0,T.useTimeout)();return(0,r.useIsoLayoutEffect)(()=>{if(a.current=o,!u.current){s.current=o;return}s.current={open:(0,I.getDelay)(s.current,"open"),close:(0,I.getDelay)(o,"close")}},[o,u,s,a]),(0,y.jsx)(w.Provider,{value:t.useMemo(()=>({hasProvider:!0,delayRef:s,initialDelayRef:a,currentIdRef:u,timeoutMs:i,currentContextRef:l,timeout:c}),[i,c]),children:n})},"useDelayGroup",0,function(e,n={open:!1}){let{open:o}=n,i="rootStore"in e?e.rootStore:e,s=i.useState("floatingId"),{currentIdRef:a,delayRef:u,timeoutMs:l,initialDelayRef:c,currentContextRef:d,hasProvider:p,timeout:g}=t.useContext(w),[v,m]=t.useState(!1),h=t.useRef(o),C=t.useRef(!1);return(0,r.useIsoLayoutEffect)(()=>{h.current=o},[o]),(0,r.useIsoLayoutEffect)(()=>()=>{C.current=!0},[]),(0,r.useIsoLayoutEffect)(()=>{function e(){C.current||m(!1),d.current?.setIsInstantPhase(!1),a.current=null,d.current=null,u.current=c.current,g.clear()}if(a.current&&!o&&a.current===s){if(m(!1),l)return g.start(l,()=>{i.select("open")||a.current&&a.current!==s||e()}),()=>{(h.current||a.current!==s)&&g.clear()};e()}},[o,s,a,u,l,c,d,g,i]),(0,r.useIsoLayoutEffect)(()=>{if(!o)return;let e=d.current,t=a.current;g.clear(),d.current={onOpenChange:i.setOpen,setIsInstantPhase:m},a.current=s,u.current={open:0,close:(0,I.getDelay)(c.current,"close")},null!==t&&t!==s?(m(!0),e?.setIsInstantPhase(!0),e?.onOpenChange(!1,(0,f.createChangeEventDetails)(S.REASONS.none))):(m(!1),e?.setIsInstantPhase(!1))},[o,s,i,a,u,c,d,g]),(0,r.useIsoLayoutEffect)(()=>()=>{a.current===s&&(d.current=null,h.current)&&(a.current=null,u.current=c.current,g.clear())},[d,a,u,s,c,g]),t.useMemo(()=>({hasProvider:p,delayRef:u,isInstantPhase:v}),[p,u,v])}],320311)},413082,e=>{"use strict";var t=e.i(271645),n=e.i(574735),r=e.i(328744),o=e.i(365420),i=e.i(108868),s=e.i(439957),a=e.i(229315),u=e.i(451321),l=e.i(647554),c=e.i(596296),d=e.i(675606),p=e.i(56434);let f=r.platform.os.mac&&r.platform.engine.webkit;e.s(["useFocus",0,function(e,r={}){let{enabled:g=!0,delay:v}=r,m="rootStore"in e?e.rootStore:e,{events:h,dataRef:S}=m.context,C=t.useRef(!1),x=t.useRef(null),b=t.useRef(!0),E=(0,s.useTimeout)();t.useEffect(()=>{let e=m.select("domReferenceElement");if(!g)return;let t=(0,a.getWindow)(e);return(0,o.mergeCleanups)((0,n.addEventListener)(t,"blur",function(){let e=m.select("domReferenceElement");!m.select("open")&&(0,a.isHTMLElement)(e)&&e===(0,l.activeElement)((0,i.ownerDocument)(e))&&(C.current=!0)}),f&&(0,n.addEventListener)(t,"keydown",function(){b.current=!0},!0),f&&(0,n.addEventListener)(t,"pointerdown",function(){b.current=!1},!0))},[m,g]),t.useEffect(()=>{if(g)return h.on("openchange",e),()=>{h.off("openchange",e)};function e(e){if(e.reason===p.REASONS.triggerPress||e.reason===p.REASONS.escapeKey){let e=m.select("domReferenceElement");(0,a.isElement)(e)&&(x.current=e,C.current=!0)}}},[h,g,m]);let y=t.useMemo(()=>{function e(){C.current=!1,x.current=null}return{onMouseLeave(){e()},onFocus(t){let n=t.currentTarget;if(C.current){if(x.current===n)return;e()}let r=(0,l.getTarget)(t.nativeEvent);if((0,a.isElement)(r)){if(f&&!t.relatedTarget){if(!b.current&&!(0,c.isTypeableElement)(r))return}else if(!(0,c.matchesFocusVisible)(r))return}let o=(0,c.isTargetInsideEnabledTrigger)(t.relatedTarget,m.context.triggerElements),{nativeEvent:i,currentTarget:s}=t,u="function"==typeof v?v():v;m.select("open")&&o||0===u||void 0===u?m.setOpen(!0,(0,d.createChangeEventDetails)(p.REASONS.triggerFocus,i,s)):E.start(u,()=>{C.current||m.setOpen(!0,(0,d.createChangeEventDetails)(p.REASONS.triggerFocus,i,s))})},onBlur(t){e();let n=t.relatedTarget,r=t.nativeEvent,o=(0,a.isElement)(n)&&n.hasAttribute((0,u.createAttribute)("focus-guard"))&&"outside"===n.getAttribute("data-type");E.start(0,()=>{let e=m.select("domReferenceElement"),t=(0,l.activeElement)((0,i.ownerDocument)(e));if(!n&&t===e||(0,l.contains)(S.current.floatingContext?.refs.floating.current,t)||(0,l.contains)(e,t)||o)return;let s=n??t;(0,c.isTargetInsideEnabledTrigger)(s,m.context.triggerElements)||m.setOpen(!1,(0,d.createChangeEventDetails)(p.REASONS.triggerFocus,r))})}}},[S,v,m,E]);return t.useMemo(()=>g?{reference:y,trigger:y}:{},[g,y])}])},746798,378680,e=>{"use strict";var t,n,r=e.i(843476);e.i(951047);var o=e.i(268416);e.i(247167);var i=e.i(733332),s=e.i(271645),a=e.i(229315),u=e.i(896499),l=e.i(439957),c=e.i(446265),d=e.i(380883),p=e.i(405005),f=e.i(552245),g=e.i(264111),v=e.i(788015),m=e.i(865296),h=e.i(650316),S=e.i(320311),C=e.i(413082),x=e.i(872135),b=e.i(647554),E=e.i(157940),y=e.i(675606),R=e.i(56434);let O=((t={})[t.popupOpen=p.CommonTriggerDataAttributes.popupOpen]="popupOpen",t.triggerDisabled="data-trigger-disabled",t);var P=e.i(673752);let T="data-base-ui-tooltip-trigger";function I(e){if("composedPath"in e){let t=e.composedPath();for(let e=0;e"ending"===j.select("transitionStatus"),shouldOpen:()=>!er.current}),el=(0,C.useFocus)(_,{enabled:!$}).reference,ec=j.useState("triggerProps",X),ed=X||"none"!==et;return(0,f.useRenderElement)("button",e,{state:{open:V},ref:[t,W,B],props:[eu,el,ed?ec:void 0,{onMouseOver(e){(e=>{let t,n=er.current,r=I(e),o=(er.current=t=ea(r),t&&(Q.openChangeTimeout.clear(),Q.restTimeout.clear(),Q.restTimeoutPending=!1,eo.clear()),t),i=B.current,s=i&&r&&(0,b.contains)(i,r);if(o&&j.select("open")&&j.select("lastOpenChangeReason")===R.REASONS.triggerHover)return j.setOpen(!1,(0,y.createChangeEventDetails)(R.REASONS.triggerHover,e));if(n&&!o&&s&&!ee.current&&!j.select("open")&&i&&(0,E.isMouseLikePointerType)(ei.current)){let t=()=>{er.current||ee.current||j.select("open")||j.setOpen(!0,(0,y.createChangeEventDetails)(R.REASONS.triggerHover,e,i))},n=es();0===n?(eo.clear(),t()):eo.start(n,t)}})(e.nativeEvent)},onFocus(e){ea(I(e.nativeEvent))&&e.preventBaseUIHandler()},onMouseLeave(){er.current=!1,eo.clear(),ei.current=void 0},onPointerEnter(e){ei.current=e.pointerType},onPointerDown(e){ei.current=e.pointerType,j.set("closeOnClick",D),D&&!j.select("open")&&j.cancelPendingOpen(e.nativeEvent)},onClick(e){D&&!j.select("open")&&j.cancelPendingOpen(e.nativeEvent)},id:H,[O.triggerDisabled]:$?"":void 0,[T]:$?void 0:""},L],stateAttributesMapping:p.triggerOpenStateMapping})}),A=s.createContext(void 0);var M=e.i(174080),D=e.i(726674);let N=s.forwardRef(function(e,t){let{children:n,container:o,className:i,render:a,style:u,...l}=e,{portalNode:c,portalSubtree:d}=(0,D.useFloatingPortalNode)({container:o,ref:t,componentProps:e,elementProps:l});return d||c?(0,r.jsxs)(s.Fragment,{children:[d,c&&M.createPortal(n,c)]}):null});e.s(["FloatingPortalLite",0,N],378680);let k=s.forwardRef(function(e,t){let{keepMounted:n=!1,...o}=e;return(0,d.useTooltipRootContext)().useState("mounted")||n?(0,r.jsx)(A.Provider,{value:n,children:(0,r.jsx)(N,{ref:t,...o})}):null}),L=s.createContext(void 0);function F(){let e=s.useContext(L);if(void 0===e)throw Error((0,i.default)(71));return e}var j=e.i(329365),H=e.i(638396),z=e.i(360495),V=e.i(789579);let _=s.forwardRef(function(e,t){let{render:n,className:o,anchor:a,positionMethod:u="absolute",side:l="top",align:c="center",sideOffset:p=0,alignOffset:f=0,collisionBoundary:g="clipping-ancestors",collisionPadding:v=5,arrowPadding:m=5,sticky:h=!1,disableAnchorTracking:S=!1,collisionAvoidance:C=H.POPUP_COLLISION_AVOIDANCE,style:x,...b}=e,E=(0,d.useTooltipRootContext)(),y=function(){let e=s.useContext(A);if(void 0===e)throw Error((0,i.default)(70));return e}(),R=E.useState("open"),O=E.useState("mounted"),P=E.useState("trackCursorAxis"),T=E.useState("disableHoverablePopup"),I=E.useState("floatingRootContext"),w=E.useState("instantType"),M=E.useState("transitionStatus"),D=E.useState("hasViewport"),N=(0,j.useAnchorPositioning)({anchor:a,positionMethod:u,floatingRootContext:I,mounted:O,side:l,sideOffset:p,align:c,alignOffset:f,collisionBoundary:g,collisionPadding:v,sticky:h,arrowPadding:m,disableAnchorTracking:S,keepMounted:y,collisionAvoidance:C,adaptiveOrigin:D?z.adaptiveOrigin:void 0}),k=s.useMemo(()=>({open:R,side:N.side,align:N.align,anchorHidden:N.anchorHidden,instant:"none"!==P?"tracking-cursor":w}),[R,N.side,N.align,N.anchorHidden,P,w]),F=(0,V.usePositioner)(e,k,{styles:N.positionerStyles,transitionStatus:M,props:b,refs:[t,E.useStateSetter("positionerElement")],hidden:!O,inert:!R||"both"===P||T});return(0,r.jsx)(L.Provider,{value:N,children:F})});var B=e.i(209407),U=e.i(137584),G=e.i(815982),W=e.i(431157);let X={...p.popupStateMapping,...B.transitionStatusMapping},Y=s.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,s=(0,d.useTooltipRootContext)(),{side:a,align:u}=F(),l=s.useState("open"),c=s.useState("instantType"),p=s.useState("transitionStatus"),g=s.useState("popupProps"),v=s.useState("floatingRootContext"),m=s.useState("disabled"),h=s.useState("closeDelay");(0,U.useOpenChangeComplete)({open:l,ref:s.context.popupRef,onComplete(){l&&s.context.onOpenChangeComplete?.(!0)}}),(0,W.useHoverFloatingInteraction)(v,{enabled:!m,closeDelay:h});let S=s.useStateSetter("popupElement");return(0,f.useRenderElement)("div",e,{state:{open:l,side:a,align:u,instant:c,transitionStatus:p},ref:[t,s.context.popupRef,S],props:[g,(0,G.getDisabledMountTransitionStyles)(p),i],stateAttributesMapping:X})}),K=s.forwardRef(function(e,t){let{render:n,className:r,style:o,...i}=e,s=(0,d.useTooltipRootContext)(),{arrowRef:a,side:u,align:l,arrowUncentered:c,arrowStyles:g}=F(),v=s.useState("open"),m=s.useState("instantType");return(0,f.useRenderElement)("div",e,{state:{open:v,side:u,align:l,uncentered:c,instant:m},ref:[t,a],props:[{style:g,"aria-hidden":!0},i],stateAttributesMapping:p.popupStateMapping})}),q=((n={}).popupWidth="--popup-width",n.popupHeight="--popup-height",n);var J=e.i(818390);let Q={activationDirection:e=>e?{"data-activation-direction":e}:null},Z=s.forwardRef(function(e,t){let{render:n,className:r,style:o,children:i,...s}=e,a=(0,d.useTooltipRootContext)(),u=F(),l=a.useState("instantType"),{children:c,state:p}=(0,J.usePopupViewport)({store:a,side:u.side,cssVars:q,children:i}),g={activationDirection:p.activationDirection,transitioning:p.transitioning,instant:l};return(0,f.useRenderElement)("div",e,{state:g,ref:t,props:[s,{children:c}],stateAttributesMapping:Q})});var $=e.i(925395);class ee{constructor(){this.store=new $.TooltipStore}open(e){let t=e?this.store.context.triggerElements.getById(e):void 0;if(e&&!t)throw Error((0,i.default)(81,e));this.store.setOpen(!0,(0,y.createChangeEventDetails)(R.REASONS.imperativeAction,void 0,t))}close(){this.store.setOpen(!1,(0,y.createChangeEventDetails)(R.REASONS.imperativeAction,void 0,void 0))}get isOpen(){return this.store.select("open")}}e.s(["Arrow",0,K,"Handle",0,ee,"Popup",0,Y,"Portal",0,k,"Positioner",0,_,"Provider",0,function(e){let{delay:t,closeDelay:n,timeout:o=400}=e,i=s.useMemo(()=>({delay:t,closeDelay:n}),[t,n]),a=s.useMemo(()=>({open:t,close:n}),[t,n]);return(0,r.jsx)(m.TooltipProviderContext.Provider,{value:i,children:(0,r.jsx)(S.FloatingDelayGroup,{delay:a,timeoutMs:o,children:e.children})})},"Root",()=>o.TooltipRoot,"Trigger",0,w,"Viewport",0,Z,"createHandle",0,function(){return new ee}],599643);var et=e.i(599643),et=et,en=e.i(115504);e.s(["Tooltip",0,function({...e}){return(0,r.jsx)(et.Root,{"data-slot":"tooltip",...e})},"TooltipContent",0,function({className:e,side:t="top",sideOffset:n=4,align:o="center",alignOffset:i=0,children:s,...a}){return(0,r.jsx)(et.Portal,{children:(0,r.jsx)(et.Positioner,{align:o,alignOffset:i,side:t,sideOffset:n,className:"isolate z-50",children:(0,r.jsxs)(et.Popup,{"data-slot":"tooltip-content",className:(0,en.cn)("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 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-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 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),...a,children:[s,(0,r.jsx)(et.Arrow,{className:"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5"})]})})})},"TooltipProvider",0,function({delay:e=0,...t}){return(0,r.jsx)(et.Provider,{"data-slot":"tooltip-provider",delay:e,...t})},"TooltipTrigger",0,function({...e}){return(0,r.jsx)(et.Trigger,{"data-slot":"tooltip-trigger",...e})}],746798)},793479,e=>{"use strict";var t=e.i(843476),n=e.i(271645),r=e.i(115504);let o=n.forwardRef(({className:e,type:n,...o},i)=>(0,t.jsx)("input",{type:n,"data-slot":"input",className:(0,r.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:i,...o}));o.displayName="Input",e.s(["Input",0,o])},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])},995926,e=>{"use strict";var t=e.i(841947);e.s(["XIcon",()=>t.default])},409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>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 n=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,n,"useCompositeListContext",0,function(){return t.useContext(n)}])},53687,e=>{"use strict";var t=e.i(271645),n=e.i(921374),r=e.i(667865),o=e.i(146376),i=e.i(545356),s=e.i(843476);function a(){return new Map}function u(){return new Set}function l(e,t){let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING||n&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:n&Node.DOCUMENT_POSITION_PRECEDING||n&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:c,elementsRef:d,labelsRef:p,onMapChange:f}=e,g=(0,r.useStableCallback)(f),v=t.useRef(0),m=(0,n.useRefWithInit)(u).current,h=(0,n.useRefWithInit)(a).current,[S,C]=t.useState(0),x=t.useRef(S),b=(0,r.useStableCallback)((e,t)=>{h.set(e,t??null),x.current+=1,C(x.current)}),E=(0,r.useStableCallback)(e=>{h.delete(e),x.current+=1,C(x.current)}),y=t.useMemo(()=>{let e=new Map;return Array.from(h.keys()).filter(e=>e.isConnected).sort(l).forEach((t,n)=>{let r=h.get(t)??{};e.set(t,{...r,index:n})}),e},[h,S]);(0,o.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===y.size)return;let e=new MutationObserver(e=>{let t=new Set,n=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(n),e.addedNodes.forEach(n)}),0===t.size&&(x.current+=1,C(x.current))});return y.forEach((t,n)=>{n.parentElement&&e.observe(n.parentElement,{childList:!0})}),()=>{e.disconnect()}},[y]),(0,o.useIsoLayoutEffect)(()=>{x.current===S&&(d.current.length!==y.size&&(d.current.length=y.size),p&&p.current.length!==y.size&&(p.current.length=y.size),v.current=y.size),g(y)},[g,y,d,p,S]),(0,o.useIsoLayoutEffect)(()=>()=>{d.current=[]},[d]),(0,o.useIsoLayoutEffect)(()=>()=>{p&&(p.current=[])},[p]);let R=(0,r.useStableCallback)(e=>(m.add(e),()=>{m.delete(e)}));(0,o.useIsoLayoutEffect)(()=>{m.forEach(e=>e(y))},[m,y]);let O=t.useMemo(()=>({register:b,unregister:E,subscribeMapChange:R,elementsRef:d,labelsRef:p,nextIndexRef:v}),[b,E,R,d,p,v]);return(0,s.jsx)(i.CompositeListContext.Provider,{value:O,children:c})}])},673553,e=>{"use strict";var t,n=e.i(271645),r=e.i(146376),o=e.i(545356);let i=((t={})[t.None=0]="None",t[t.GuessFromOrder=1]="GuessFromOrder",t);e.s(["IndexGuessBehavior",0,i,"useCompositeListItem",0,function(e={}){let{label:t,metadata:s,textRef:a,indexGuessBehavior:u,index:l}=e,{register:c,unregister:d,subscribeMapChange:p,elementsRef:f,labelsRef:g,nextIndexRef:v}=(0,o.useCompositeListContext)(),m=n.useRef(-1),[h,S]=n.useState(l??(u===i.GuessFromOrder?()=>{if(-1===m.current){let e=v.current;v.current+=1,m.current=e}return m.current}:-1)),C=n.useRef(null),x=n.useCallback(e=>{if(C.current=e,-1!==h&&null!==e&&(f.current[h]=e,g)){let n=void 0!==t;g.current[h]=n?t:a?.current?.textContent??e.textContent}},[h,f,g,t,a]);return(0,r.useIsoLayoutEffect)(()=>{if(null!=l)return;let e=C.current;if(e)return c(e,s),()=>{d(e)}},[l,c,d,s]),(0,r.useIsoLayoutEffect)(()=>{if(null==l)return p(e=>{let t=C.current?e.get(C.current)?.index:null;null!=t&&S(t)})},[l,p,S]),{ref:x,index:h}}])},590803,e=>{"use strict";e.s(["isElementDisabled",0,function(e){return null==e||e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled")}])},395530,e=>{"use strict";var t=e.i(271645),n=e.i(828918),r=e.i(838452),o=e.i(673553);e.s(["useCompositeItem",0,function(e={}){let{highlightItemOnHover:i,highlightedIndex:s,onHighlightedIndexChange:a}=(0,r.useCompositeRootContext)(),{ref:u,index:l}=(0,o.useCompositeListItem)(e),c=s===l,d=t.useRef(null),p=(0,n.useMergedRefs)(u,d);return{compositeProps:{tabIndex:c?0:-1,onFocus(){a(l)},onMouseMove(){let e=d.current;if(!i||!e)return;let t=e.hasAttribute("disabled")||"true"===e.ariaDisabled;c||t||e.focus()}},compositeRef:p,index:l}}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0u0-hzwjwlynn.js b/litellm/proxy/_experimental/out/_next/static/chunks/0u0-hzwjwlynn.js new file mode 100644 index 00000000000..628d3dfe2a1 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0u0-hzwjwlynn.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,596115,e=>{"use strict";var a=e.i(843476),t=e.i(109799),s=e.i(271645),l=e.i(602869),i=e.i(727749),r=e.i(761911);e.i(707701);var n=e.i(807235),o=e.i(541071);let d=(0,e.i(475254).default)("user-plus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);var c=e.i(494862);e.i(622826);var m=e.i(997422),u=e.i(547227),g=e.i(519455),h=e.i(755146),p=e.i(115504);function x({team:e,onJoinTeam:t}){return(0,a.jsxs)(h.DropdownMenu,{children:[(0,a.jsx)(h.DropdownMenuTrigger,{"aria-label":"Open team actions","data-testid":`available-team-actions-${e.team_id}`,className:(0,p.cn)((0,g.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,a.jsx)(o.MoreHorizontal,{className:"size-4"})}),(0,a.jsx)(h.DropdownMenuContent,{align:"end",className:"w-44",children:(0,a.jsxs)(h.DropdownMenuItem,{"data-testid":"available-team-action-join",onClick:()=>t(e.team_id),children:[(0,a.jsx)(d,{}),"Join team"]})})]})}let _=[{id:"team_alias",desc:!1}];function j(){return(0,a.jsxs)("div",{className:"flex flex-col items-center gap-1 py-6",children:[(0,a.jsx)("div",{className:"mb-1 flex size-10 items-center justify-center rounded-lg bg-muted",children:(0,a.jsx)(r.Users,{className:"size-5 text-muted-foreground"})}),(0,a.jsx)("div",{className:"text-sm font-medium text-foreground",children:"No available teams to join"}),(0,a.jsxs)("div",{className:"text-sm text-muted-foreground",children:["See how to set available teams"," ",(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/self_serve#all-settings-for-self-serve--sso-flow",target:"_blank",rel:"noopener noreferrer",className:"text-primary underline-offset-4 hover:underline",children:"here"})]})]})}let b=({teams:e,isLoading:t,onJoinTeam:l})=>{let[i,r]=(0,s.useState)(_),o=(0,s.useMemo)(()=>(({onJoinTeam:e})=>[{id:"team_alias",accessorKey:"team_alias",meta:{title:"Team Name"},header:({column:e})=>(0,a.jsx)(c.DataTableSortHeader,{column:e,title:"Team Name"}),size:220,enableSorting:!0,cell:({row:e})=>(0,a.jsx)(m.IdentityCell,{title:e.original.team_alias,className:"max-w-72",titleClassName:"font-medium"})},{id:"description",accessorKey:"description",meta:{title:"Description"},header:"Description",size:280,enableSorting:!1,cell:({row:e})=>{let t=e.original.description;return(0,a.jsx)("span",{className:"block max-w-72 truncate text-sm text-muted-foreground",title:t||void 0,children:t||"No description available"})}},{id:"members",accessorFn:e=>e.members_with_roles.length,meta:{title:"Members"},header:({column:e})=>(0,a.jsx)(c.DataTableSortHeader,{column:e,title:"Members"}),size:120,enableSorting:!0,cell:({row:e})=>(0,a.jsxs)("span",{className:"text-sm text-muted-foreground",children:[e.original.members_with_roles.length," members"]})},{id:"models",meta:{title:"Models"},header:"Models",size:260,enableSorting:!1,cell:({row:e})=>(0,a.jsx)(u.ModelsCell,{models:e.original.models})},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,a.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:t})=>(0,a.jsx)("div",{className:"flex justify-end",children:(0,a.jsx)(x,{team:t.original,onJoinTeam:e})})}])({onJoinTeam:l}),[l]);return(0,a.jsx)(n.DataTable,{data:e,columns:o,getRowId:(e,a)=>e.team_id||String(a),sortingMode:"client",sorting:i,onSortingChange:r,isLoading:t,loadingMessage:"Loading available teams…",noDataMessage:(0,a.jsx)(j,{}),size:"compact"})},f=({accessToken:e,userID:t})=>{let[r,n]=(0,s.useState)([]),[o,d]=(0,s.useState)(!0);(0,s.useEffect)(()=>{let a=!1;return(async()=>{if(!e||!t)return d(!1);try{let t=await (0,l.availableTeamListCall)(e);a||n(t)}catch(e){console.error("Error fetching available teams:",e)}finally{a||d(!1)}})(),()=>{a=!0}},[e,t]);let c=async a=>{if(e&&t)try{await (0,l.teamMemberAddCall)(e,a,{user_id:t,role:"user"}),i.default.success("Successfully joined team"),n(e=>e.filter(e=>e.team_id!==a))}catch(e){console.error("Error joining team:",e),i.default.fromBackend("Failed to join team")}};return(0,a.jsx)(b,{teams:r,isLoading:o,onJoinTeam:c})};var y=e.i(56567),v=e.i(175712),w=e.i(464571),S=e.i(28651),N=e.i(898586),C=e.i(482725),T=e.i(199133),k=e.i(262218),z=e.i(621192),M=e.i(178654),I=e.i(751904),F=e.i(987432),D=e.i(860585),A=e.i(355619),O=e.i(162386),P=e.i(363256);let{Title:L,Text:E}=N.Typography,B=["/key/generate","/key/update","/key/delete","/key/regenerate","/key/service-account/generate","/key/{key_id}/regenerate","/key/block","/key/unblock","/key/bulk_update","/key/{key_id}/reset_spend","/key/info","/key/list","/key/aliases","/team/daily/activity"],V=({label:e,description:t,isEditing:s,viewContent:l,editContent:i})=>(0,a.jsxs)(z.Row,{className:"py-5 border-b border-gray-100 last:border-0",children:[(0,a.jsxs)(M.Col,{span:8,className:"pr-6",children:[(0,a.jsx)("div",{className:"text-sm font-semibold text-gray-900",children:e}),(0,a.jsx)("div",{className:"text-xs text-gray-500 mt-1 leading-relaxed",children:t})]}),(0,a.jsx)(M.Col,{span:16,className:"flex items-center",children:(0,a.jsx)("div",{className:"w-full",children:s?i:l})})]}),R=()=>(0,a.jsx)(E,{className:"text-gray-400 italic",children:"Not set"}),U=(e,t)=>e&&0!==e.length?(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:e.map(e=>(0,a.jsx)(k.Tag,{color:"blue",children:t?t(e):e},e))}):(0,a.jsx)(R,{}),H={max_budget:null,budget_duration:null,tpm_limit:null,rpm_limit:null,models:[],team_member_permissions:[],organization_id:null},K=({accessToken:e})=>{var r;let n,[o,d]=(0,s.useState)(!0),[c,m]=(0,s.useState)(H),[u,g]=(0,s.useState)(!1),[h,p]=(0,s.useState)(H),[x,_]=(0,s.useState)(!1),[j,b]=(0,s.useState)(!1),{data:f,isLoading:y}=(0,t.useOrganizations)();(0,s.useEffect)(()=>{(async()=>{if(!e)return d(!1);try{let a=await (0,l.getDefaultTeamSettings)(e),t={...H,...a.values||{}};m(t),p(t)}catch(e){console.error("Error fetching team SSO settings:",e),b(!0),i.default.fromBackend("Failed to fetch team settings")}finally{d(!1)}})()},[e]);let N=async()=>{if(e){_(!0);try{let a=await (0,l.updateDefaultTeamSettings)(e,h),t={...H,...a.settings||{}};m(t),p(t),g(!1),i.default.success("Default team settings updated successfully")}catch(e){console.error("Error updating team settings:",e),i.default.fromBackend("Failed to update team settings")}finally{_(!1)}}},z=(e,a)=>{p(t=>({...t,[e]:a}))};return o?(0,a.jsx)("div",{className:"flex justify-center items-center h-64",children:(0,a.jsx)(C.Spin,{size:"large"})}):j?(0,a.jsx)(v.Card,{children:(0,a.jsx)(E,{children:"No team settings available or you do not have permission to view them."})}):(0,a.jsxs)(v.Card,{styles:{body:{padding:32}},children:[(0,a.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(L,{level:3,className:"m-0 text-gray-900",children:"Default Team Settings"}),(0,a.jsx)(E,{className:"text-gray-500 mt-1 block",children:"These settings will be applied by default when creating new teams."})]}),(0,a.jsx)("div",{children:u?(0,a.jsxs)("div",{className:"flex gap-3",children:[(0,a.jsx)(w.Button,{onClick:()=>{g(!1),p(c)},disabled:x,children:"Cancel"}),(0,a.jsx)(w.Button,{type:"primary",onClick:N,loading:x,icon:(0,a.jsx)(F.SaveOutlined,{}),children:"Save Changes"})]}):(0,a.jsx)(w.Button,{onClick:()=>g(!0),icon:(0,a.jsx)(I.EditOutlined,{}),children:"Edit Settings"})})]}),(0,a.jsxs)("div",{className:"mt-8",children:[(0,a.jsxs)("div",{className:"mb-8",children:[(0,a.jsx)("div",{className:"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2",children:"Budget & Rate Limits"}),(0,a.jsxs)("div",{className:"border-t border-gray-100",children:[(0,a.jsx)(V,{label:"Max Budget",description:"Maximum budget (in USD) for new automatically created teams.",isEditing:u,viewContent:null!=c.max_budget?(0,a.jsxs)(E,{children:["$",Number(c.max_budget).toLocaleString()]}):(0,a.jsx)(R,{}),editContent:(0,a.jsx)(S.InputNumber,{className:"w-full",style:{maxWidth:320},value:h.max_budget,onChange:e=>z("max_budget",e),placeholder:"Not set",prefix:"$",min:0})}),(0,a.jsx)(V,{label:"Budget Duration",description:"How frequently the team's budget resets.",isEditing:u,viewContent:c.budget_duration?(0,a.jsx)(E,{children:(0,D.getBudgetDurationLabel)(c.budget_duration)}):(0,a.jsx)(R,{}),editContent:(0,a.jsx)(D.default,{value:h.budget_duration||null,onChange:e=>z("budget_duration",e??null),style:{maxWidth:320}})}),(0,a.jsx)(V,{label:"TPM Limit",description:"Maximum tokens per minute allowed across all models.",isEditing:u,viewContent:null!=c.tpm_limit?(0,a.jsx)(E,{children:c.tpm_limit.toLocaleString()}):(0,a.jsx)(R,{}),editContent:(0,a.jsx)(S.InputNumber,{className:"w-full",style:{maxWidth:320},value:h.tpm_limit,onChange:e=>z("tpm_limit",e),placeholder:"Not set",min:0})}),(0,a.jsx)(V,{label:"RPM Limit",description:"Maximum requests per minute allowed across all models.",isEditing:u,viewContent:null!=c.rpm_limit?(0,a.jsx)(E,{children:c.rpm_limit.toLocaleString()}):(0,a.jsx)(R,{}),editContent:(0,a.jsx)(S.InputNumber,{className:"w-full",style:{maxWidth:320},value:h.rpm_limit,onChange:e=>z("rpm_limit",e),placeholder:"Not set",min:0})})]})]}),(0,a.jsxs)("div",{className:"mb-8",children:[(0,a.jsx)("div",{className:"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2",children:"Access & Permissions"}),(0,a.jsxs)("div",{className:"border-t border-gray-100",children:[(0,a.jsx)(V,{label:"Default Organization",description:"Teams created without an explicit organization are assigned to this organization.",isEditing:u,viewContent:c.organization_id?(0,a.jsx)(E,{children:(r=c.organization_id,n=f?.find(e=>e.organization_id===r),n?.organization_alias?`${n.organization_alias} (${r})`:r)}):(0,a.jsx)(R,{}),editContent:(0,a.jsx)(P.default,{organizations:f,loading:y,value:h.organization_id??void 0,onChange:e=>z("organization_id",e||null),placeholder:"Select an organization",style:{maxWidth:320}})}),(0,a.jsx)(V,{label:"Models",description:"Default list of models that new teams can access.",isEditing:u,viewContent:U(c.models,A.getModelDisplayName),editContent:(0,a.jsx)(O.ModelSelect,{value:h.models||[],onChange:e=>z("models",e),context:"global",style:{width:"100%"},options:{includeSpecialOptions:!0}})}),(0,a.jsx)(V,{label:"Team Member Permissions",description:"Default permissions granted to members of newly created teams. /key/info and /key/health are always included.",isEditing:u,viewContent:U(c.team_member_permissions),editContent:(0,a.jsx)(T.Select,{mode:"multiple",style:{width:"100%"},value:h.team_member_permissions||[],onChange:e=>z("team_member_permissions",e),placeholder:"Select permissions",tagRender:({label:e,closable:t,onClose:s})=>(0,a.jsx)(k.Tag,{color:"blue",closable:t,onClose:s,className:"mr-1 mt-1 mb-1",children:e}),children:B.map(e=>(0,a.jsx)(T.Select.Option,{value:e,children:e},e))})})]})]})]})]})};var q=e.i(708347),W=e.i(827252),$=e.i(677667),J=e.i(130643),G=e.i(898667),Y=e.i(779241),Q=e.i(808613),X=e.i(311451),Z=e.i(372943),ee=e.i(212931),ea=e.i(790848),et=e.i(653496),es=e.i(368869),el=e.i(592968),ei=e.i(107233),er=e.i(912598),en=e.i(263005),eo=e.i(785242),ed=e.i(438847),ec=e.i(981080),em=e.i(531649),eu=e.i(552546),eg=e.i(793479),eh=e.i(741466),ep=e.i(655063),ex=e.i(174886),e_=e.i(465261),ej=e.i(852008),eb=e.i(788699),ef=e.i(727612),ey=e.i(200208),ev=e.i(630500),ew=e.i(302747),eS=e.i(500330);let eN={members:{icon:r.Users,className:"bg-violet-50 text-violet-700 ring-violet-600/20"},models:{icon:ej.Layers,className:"bg-sky-50 text-sky-700 ring-sky-600/20"},keys:{icon:e_.KeyRound,className:"bg-emerald-50 text-emerald-700 ring-emerald-600/20"}},eC=e=>e.members_count??e.members_with_roles?.length??0,eT=e=>e.models?.length??0;function ek({team:e}){let t=[{key:"members",label:"members",count:eC(e)},{key:"models",label:"models",count:eT(e)},{key:"keys",label:"keys",count:e.keys_count??e.keys?.length??0}];return(0,a.jsx)("div",{className:"flex items-center gap-1.5",children:t.map(e=>{let t=eN[e.key],s=t.icon;return(0,a.jsxs)("span",{title:`${e.count} ${e.label}`,className:(0,p.cn)("inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium ring-1 ring-inset [&_svg]:size-3.5",t.className),children:[(0,a.jsx)(s,{}),(0,a.jsx)("span",{className:"tabular-nums",children:e.count})]},e.key)})})}function ez({label:e,value:t}){return(0,a.jsxs)("div",{children:[(0,a.jsxs)("span",{className:"text-[10px] font-semibold text-muted-foreground",children:[e," "]}),(0,a.jsx)("span",{className:"tabular-nums",children:null!=t?(0,eS.formatNumberWithCommas)(t):"Unlimited"})]})}function eM({team:e,canManage:t,onEditTeam:s,onDeleteTeam:l}){return(0,a.jsxs)(h.DropdownMenu,{children:[(0,a.jsx)(h.DropdownMenuTrigger,{"aria-label":"Open team actions","data-testid":`team-actions-${e.team_id}`,className:(0,p.cn)((0,g.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,a.jsx)(o.MoreHorizontal,{className:"size-4"})}),(0,a.jsxs)(h.DropdownMenuContent,{align:"end",className:"w-44",children:[t&&(0,a.jsxs)(h.DropdownMenuItem,{onClick:()=>s(e),"data-testid":"team-action-edit",children:[(0,a.jsx)(eb.Pencil,{}),"Edit team"]}),(0,a.jsxs)(h.DropdownMenuItem,{onClick:()=>{(0,eS.copyToClipboard)(e.team_id,"Team ID copied")},"data-testid":"team-action-copy",children:[(0,a.jsx)(ex.Copy,{}),"Copy team ID"]}),t&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(h.DropdownMenuSeparator,{}),(0,a.jsxs)(h.DropdownMenuItem,{variant:"destructive",onClick:()=>l(e),"data-testid":"team-action-delete",children:[(0,a.jsx)(ef.Trash2,{}),"Delete team"]})]})]})]})}let eI={members:!1,models:!1,rate_limits:!1,updated_at:!1},eF=[{id:"created_at",desc:!0}],eD={org_id:"Organization",alias:"Team alias",team_id:"Team ID"};function eA({userRole:e,userID:l,onSelectTeam:i,onEditTeam:r,onDeleteTeam:o}){let{data:d}=(0,t.useOrganizations)(),u=(0,s.useMemo)(()=>d??[],[d]),[g,h]=(0,s.useState)(eF),[p,x]=(0,s.useState)({pageIndex:0,pageSize:50}),[_,j]=(0,s.useState)([]),[b,f]=(0,s.useState)(!1),[y,v]=(0,s.useState)(""),[w]=(0,ep.useDebouncedValue)(y,{wait:eh.DEBOUNCE_WAIT_MS}),S=(0,s.useCallback)(e=>{let a=_.find(a=>a.id===e);return"string"==typeof a?.value&&a.value.trim()?a.value.trim():void 0},[_]),N="Admin"===e||"Admin Viewer"===e,C={organizationID:S("org_id"),team_alias:S("alias"),teamID:S("team_id"),search:w.trim()||void 0,searchTeamIdMatch:"prefix",userID:N?void 0:l??void 0,sortBy:g[0]?.id,sortOrder:(e=>{let a=e[0];if(a)return a.desc?"desc":"asc"})(g)},{data:T,isPending:k,isFetching:z,refetch:M}=(0,eo.useTeamsTable)(p.pageIndex+1,p.pageSize,C),I=(0,s.useMemo)(()=>T?.teams??[],[T]),F=T?.total??0,D=(0,s.useCallback)(e=>{v(e),x(e=>({...e,pageIndex:0}))},[]),A=(0,s.useCallback)(e=>{h(e),x(e=>({...e,pageIndex:0}))},[]),O=(0,s.useCallback)(e=>{j(e),x(e=>({...e,pageIndex:0}))},[]),P=(0,s.useMemo)(()=>(({organizations:e,userRole:t,onSelectTeam:s,onEditTeam:l,onDeleteTeam:i})=>{let r="Admin"===t;return[{id:"team_alias",accessorKey:"team_alias",meta:{title:"Team",renderSkeleton:()=>(0,a.jsxs)("div",{className:"flex flex-col gap-2 py-1",children:[(0,a.jsx)(ew.Skeleton,{className:"h-4 w-32"}),(0,a.jsx)(ew.Skeleton,{className:"h-3.5 w-24 opacity-65"})]})},header:({column:e})=>(0,a.jsx)(c.DataTableSortHeader,{column:e,title:"Team",variant:"header-cycle"}),size:260,enableSorting:!0,cell:({row:e})=>{let t=e.original,l=!!t.team_alias;return(0,a.jsx)(m.IdentityCell,{title:t.team_alias||t.team_id,subtitle:l?t.team_id:void 0,onClick:()=>s(t)})}},{id:"organization_alias",accessorKey:"organization_id",meta:{title:"Organization"},header:"Organization",size:160,enableSorting:!1,cell:t=>{let s=t.getValue();if(!s)return(0,a.jsx)("span",{className:"text-muted-foreground",children:"—"});let l=e.find(e=>e.organization_id===s),i=l?.organization_alias||s,r=t.cell.column.getSize();return(0,a.jsx)("span",{className:"block truncate text-sm",style:{maxWidth:r},title:i,children:i})}},{id:"resources",meta:{title:"Resources",renderSkeleton:()=>(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)(ew.Skeleton,{className:"h-6 w-12 rounded-md"}),(0,a.jsx)(ew.Skeleton,{className:"h-6 w-12 rounded-md"}),(0,a.jsx)(ew.Skeleton,{className:"h-6 w-12 rounded-md opacity-65"})]})},header:"Resources",size:210,enableSorting:!1,cell:({row:e})=>(0,a.jsx)(ek,{team:e.original})},{id:"spend",accessorKey:"spend",meta:{title:"Spend / Budget",skeleton:"meter"},header:"Spend / Budget",size:200,enableSorting:!1,cell:({row:e})=>(0,a.jsx)(ev.SpendBudgetCell,{spend:e.original.spend,maxBudget:e.original.max_budget})},{id:"created_at",accessorKey:"created_at",meta:{title:"Created"},header:({column:e})=>(0,a.jsx)(c.DataTableSortHeader,{column:e,title:"Created",variant:"header-cycle"}),size:130,enableSorting:!0,cell:e=>(0,a.jsx)(ey.DateCell,{value:e.getValue(),precision:"date"})},{id:"members",meta:{title:"Members"},header:"Members",size:110,enableSorting:!1,cell:({row:e})=>(0,a.jsx)("span",{className:"text-sm tabular-nums",children:eC(e.original)})},{id:"models",meta:{title:"Models"},header:"Models",size:100,enableSorting:!1,cell:({row:e})=>(0,a.jsx)("span",{className:"text-sm tabular-nums",children:eT(e.original)})},{id:"rate_limits",meta:{title:"Rate Limits",skeleton:"twoLine"},header:"Rate Limits",size:140,enableSorting:!1,cell:({row:e})=>(0,a.jsxs)("div",{className:"text-xs leading-tight",children:[(0,a.jsx)(ez,{label:"TPM",value:e.original.tpm_limit}),(0,a.jsx)(ez,{label:"RPM",value:e.original.rpm_limit})]})},{id:"updated_at",accessorKey:"updated_at",meta:{title:"Updated"},header:"Updated",size:130,enableSorting:!1,cell:e=>(0,a.jsx)(ey.DateCell,{value:e.getValue(),precision:"date",fallback:"Never"})},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,a.jsx)("span",{className:"sr-only",children:"Actions"}),size:60,enableSorting:!1,enableHiding:!1,cell:({row:e})=>(0,a.jsx)("div",{className:"flex justify-end",children:(0,a.jsx)(eM,{team:e.original,canManage:r,onEditTeam:l,onDeleteTeam:i})})}]})({organizations:u,userRole:e,onSelectTeam:i,onEditTeam:r,onDeleteTeam:o}),[u,e,i,r,o]),L=(0,s.useMemo)(()=>u.filter(e=>e.organization_id).map(e=>{let a=e.organization_id;return{label:e.organization_alias||a,value:a,sublabel:e.organization_alias?a:void 0}}),[u]),E=(0,s.useCallback)((e,a)=>{let t=String(a);return"org_id"===e&&u.find(e=>e.organization_id===t)?.organization_alias||t},[u]);return(0,a.jsx)(n.DataTable,{data:I,columns:P,getRowId:e=>e.team_id,defaultColumnVisibility:eI,sortingMode:"server",sorting:g,onSortingChange:A,paginationMode:"server",pagination:p,onPaginationChange:x,rowCount:F,filterMode:"server",columnFilters:_,onColumnFiltersChange:O,enableColumnResizing:!0,columnResizeMode:"onChange",isLoading:k,loadingMessage:"Loading teams...",noDataMessage:"No teams found",maxBodyHeight:"calc(75vh - 210px)",size:"compact",toolbar:e=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(em.DataTableToolbar,{table:e,searchValue:y,onSearchChange:D,searchPlaceholder:"Search teams by name or ID…",onRefresh:()=>M?.(),isRefreshing:z,onOpenFilters:()=>f(!0),filterLabels:eD,formatFilterValue:E}),(0,a.jsx)(ec.DataTableFilterDrawer,{table:e,open:b,onOpenChange:f,title:"Filters",description:"Narrow down your teams",children:({get:e,set:t})=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(ec.DataTableFilterField,{label:"Organization",children:(0,a.jsx)(eu.SearchSelect,{options:L,value:e("org_id")||void 0,onValueChange:e=>t("org_id",e),placeholder:"Select an organization…",emptyText:"No organizations found"})}),(0,a.jsx)(ec.DataTableFilterField,{label:"Team alias",children:(0,a.jsx)(eg.Input,{value:e("alias")??"",onChange:e=>t("alias",e.target.value),placeholder:"Enter team alias…"})}),(0,a.jsx)(ec.DataTableFilterField,{label:"Team ID",children:(0,a.jsx)(eg.Input,{value:e("team_id")??"",onChange:e=>t("team_id",e.target.value),placeholder:"Enter team ID…"})})]})})]})})}var eO=e.i(9314),eP=e.i(930421),eL=e.i(187315),eE=e.i(844565),eB=e.i(552130),eV=e.i(533882),eR=e.i(651904),eU=e.i(460285),eH=e.i(75921),eK=e.i(390605),eq=e.i(431703),eW=e.i(435451),e$=e.i(916940),eJ=e.i(788259),eG=e.i(127952),eY=e.i(395819);let eQ=(e,a,t)=>"Admin"===e||!!t&&!!a&&t.some(e=>e.members?.some(e=>e.user_id===a&&"org_admin"===e.user_role)),eX=(e,a,t)=>"Admin"===e?t||[]:t&&a?t.filter(e=>e.members?.some(e=>e.user_id===a&&"org_admin"===e.user_role)):[],eZ=({accessToken:e,userID:n,userRole:o,premiumUser:d=!1})=>{let c,m,u,h,p,{data:x}=(0,t.useOrganizations)(),_=x??null,{data:j=[],isLoading:b}=(0,eL.useTeamMetadataSchema)(),v=(0,er.useQueryClient)(),S=()=>v.invalidateQueries({queryKey:eo.teamsTableKeys.all}),[C]=(0,s.useState)(null),[k,z]=(0,s.useState)(null),[M]=Q.Form.useForm(),[I,F]=(0,s.useState)(null),[D,P]=(0,ed.useQueryState)("team",ed.parseAsString.withOptions({history:"push"})),[L,E]=(0,s.useState)(!1),[B,V]=(0,s.useState)(!1),[R,U]=(0,s.useState)([]),[H,ec]=(0,s.useState)(!1),[em,eu]=(0,s.useState)(null),[eg,eh]=(0,s.useState)(!1),[ep,ex]=(0,s.useState)([]),[e_,ej]=(0,s.useState)([]),[eb,ef]=(0,s.useState)([]),[ey,ev]=(0,s.useState)({}),[ew,eS]=(0,s.useState)(null),[eN,eC]=(0,s.useState)(0);(0,s.useEffect)(()=>{M.setFieldValue("models",[])},[k,R]),(0,s.useEffect)(()=>{if(B){let e=eX(o,n,_);if("Admin"!==o&&1===e.length){let a=e[0];M.setFieldValue("organization_id",a.organization_id),z(a)}else M.setFieldValue("organization_id",C?.organization_id||null),z(C)}},[B,o,n,_,C]),(0,s.useEffect)(()=>{let a=async()=>{try{if(null==e)return;let a=(await (0,l.getPoliciesList)(e)).policies.map(e=>e.policy_name);ej(a)}catch(e){console.error("Failed to fetch policies:",e)}};(async()=>{try{if(null==e)return;let a=(await (0,l.getGuardrailsList)(e)).guardrails.map(e=>e.guardrail_name);ex(a)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),a()},[e]);let eT=async e=>{eu(e),ec(!0)},ek=async()=>{if(null!=em&&null!=e)try{eh(!0),await (0,l.teamDeleteCall)(e,em.team_id),await S(),i.default.success("Team deleted successfully")}catch(e){i.default.fromBackend("Error deleting the team: "+e)}finally{eh(!1),ec(!1),eu(null)}};(0,s.useEffect)(()=>{(async()=>{try{if(null===n||null===o||null===e)return;let a=await (0,A.fetchAvailableModelsForTeamOrKey)(n,o,e);a&&U(a)}catch(e){console.error("Error fetching user models:",e)}})()},[e,n,o]);let ez=async a=>{try{if(null!=e){let t=a?.organization_id||C?.organization_id;""===t||"string"!=typeof t?a.organization_id=null:a.organization_id=t.trim(),i.default.info("Creating Team");let s={...(0,eP.metadataPairsToObject)(a.metadata),...eb.length>0?{logging:eb.filter(e=>e.callback_name)}:{}};if(a.metadata=Object.keys(s).length>0?JSON.stringify(s):void 0,a.secret_manager_settings&&"string"==typeof a.secret_manager_settings)if(""===a.secret_manager_settings.trim())delete a.secret_manager_settings;else try{a.secret_manager_settings=JSON.parse(a.secret_manager_settings)}catch(e){throw Error("Failed to parse secret manager settings: "+e)}let r=Array.isArray(a.object_permission_search_tools)&&a.object_permission_search_tools.length>0;if(a.allowed_vector_store_ids&&a.allowed_vector_store_ids.length>0||a.allowed_mcp_servers_and_groups&&(a.allowed_mcp_servers_and_groups.servers?.length>0||a.allowed_mcp_servers_and_groups.accessGroups?.length>0||a.allowed_mcp_servers_and_groups.toolPermissions)){if(a.object_permission||(a.object_permission={}),a.allowed_vector_store_ids&&a.allowed_vector_store_ids.length>0&&(a.object_permission.vector_stores=a.allowed_vector_store_ids,delete a.allowed_vector_store_ids),a.allowed_mcp_servers_and_groups){let{servers:e,accessGroups:t}=a.allowed_mcp_servers_and_groups;e&&e.length>0&&(a.object_permission.mcp_servers=e),t&&t.length>0&&(a.object_permission.mcp_access_groups=t),delete a.allowed_mcp_servers_and_groups}a.mcp_tool_permissions&&Object.keys(a.mcp_tool_permissions).length>0&&(a.object_permission.mcp_tool_permissions=a.mcp_tool_permissions,delete a.mcp_tool_permissions)}if(a.allowed_mcp_access_groups&&a.allowed_mcp_access_groups.length>0&&(a.object_permission||(a.object_permission={}),a.object_permission.mcp_access_groups=a.allowed_mcp_access_groups,delete a.allowed_mcp_access_groups),a.allowed_agents_and_groups){let{agents:e,accessGroups:t}=a.allowed_agents_and_groups;a.object_permission||(a.object_permission={}),e&&e.length>0&&(a.object_permission.agents=e),t&&t.length>0&&(a.object_permission.agent_access_groups=t),delete a.allowed_agents_and_groups}r&&(a.object_permission||(a.object_permission={}),a.object_permission.search_tools=a.object_permission_search_tools,delete a.object_permission_search_tools),Object.keys(ey).length>0&&(a.model_aliases=ey),ew?.router_settings&&Object.values(ew.router_settings).some(e=>null!=e&&""!==e)&&(a.router_settings=ew.router_settings),await (0,l.teamCreateCall)(e,{...a,models:(0,eY.normalizeTeamModelSelection)(a.models)}),i.default.success("Team created"),await S(),M.resetFields(),ef([]),ev({}),eS(null),eC(e=>e+1),V(!1)}}catch(e){console.error("Error creating the team:",e),i.default.fromBackend("Error creating the team: "+(0,eq.extractProxyErrorMessage)(e))}},{token:eM}=es.theme.useToken(),{Text:eI}=N.Typography,{Content:eF}=Z.Layout,eD=[{key:"your-teams",label:"Your Teams",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eA,{userRole:o,userID:n,onSelectTeam:e=>{F(e),P(e.team_id),E(!1)},onEditTeam:e=>{F(e),P(e.team_id),E(!0)},onDeleteTeam:eT}),(0,a.jsx)(eG.default,{isOpen:H,title:"Delete Team?",alertMessage:0===(c=em?.keys_count??em?.keys?.length??0)?void 0:`Warning: This team has ${c} keys associated with it. Deleting the team will also delete all associated keys, along with any models created for this team. This action is irreversible.`,message:"Are you sure you want to delete this team, all its keys, and any models created for it? This action cannot be undone.",resourceInformationTitle:"Team Information",resourceInformation:[{label:"Team ID",value:em?.team_id,code:!0},{label:"Team Name",value:em?.team_alias},{label:"Keys",value:em?.keys_count??em?.keys?.length??0},{label:"Members",value:em?.members_with_roles?.length}],requiredConfirmation:em?.team_alias,onCancel:()=>{ec(!1),eu(null)},onOk:ek,confirmLoading:eg})]})},{key:"available-teams",label:"Available Teams",children:(0,a.jsx)(f,{accessToken:e,userID:n})},...(0,q.isProxyAdminRole)(o||"")?[{key:"default-settings",label:"Default Team Settings",children:(0,a.jsx)(K,{accessToken:e,userID:n||"",userRole:o||""})}]:[]];return(0,a.jsxs)(eF,{style:{padding:eM.paddingLG,paddingInline:2*eM.paddingLG},children:[D?(0,a.jsx)(y.default,{teamId:D,onUpdate:()=>{S()},onClose:()=>{F(null),P(null),E(!1)},accessToken:e,is_team_admin:(e=>{if(null==e||null==e.members_with_roles)return!1;for(let a=0;aV(!0),"data-testid":"create-team-button",children:[(0,a.jsx)(ei.Plus,{className:"size-4"}),"Create Team"]}),(0,a.jsx)("div",{className:"h-6 w-px bg-gray-200"})]}):void 0}})]}),eQ(o,n,_)&&(0,a.jsx)(ee.Modal,{title:"Create Team",open:B,width:1e3,footer:null,onOk:()=>{V(!1),M.resetFields(),ef([]),ev({}),eS(null),eC(e=>e+1)},onCancel:()=>{V(!1),M.resetFields(),ef([]),ev({}),eS(null),eC(e=>e+1)},destroyOnHidden:!0,children:(0,a.jsxs)(Q.Form,{form:M,onFinish:ez,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Q.Form.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(Y.TextInput,{placeholder:"","data-testid":"team-name-input"})}),(m=eX(o,n,_),u="Admin"!==o,h=1===m.length,p=0===m.length,(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Organization"," ",(0,a.jsx)(el.Tooltip,{title:(0,a.jsxs)("span",{children:["Organizations can have multiple teams. Learn more about"," ",(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/user_management_heirarchy",target:"_blank",rel:"noopener noreferrer",style:{color:"#1890ff",textDecoration:"underline"},onClick:e=>e.stopPropagation(),children:"user management hierarchy"})]}),children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",initialValue:C?C.organization_id:null,className:"mt-8",rules:u?[{required:!0,message:"Please select an organization"}]:[],help:u&&h?"You can only create teams within this organization":u?"required":"",children:(0,a.jsx)(T.Select,{showSearch:!0,allowClear:!u,disabled:u&&h,placeholder:p?"No organizations available":"Search or select an Organization",onChange:e=>{M.setFieldValue("organization_id",e),z(m?.find(a=>a.organization_id===e)||null)},filterOption:(e,a)=>!!a&&(a.children?.toString()||"").toLowerCase().includes(e.toLowerCase()),optionFilterProp:"children",children:m?.map(e=>(0,a.jsxs)(T.Select.Option,{value:e.organization_id,children:[(0,a.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,a.jsxs)("span",{className:"text-gray-500",children:["(",e.organization_id,")"]})]},e.organization_id))})}),u&&!h&&m.length>1&&(0,a.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,a.jsx)(eI,{style:{color:"#1e40af",fontSize:14},children:"Please select an organization to create a team for. You can only create teams within organizations where you are an admin."})})]})),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Models"," ",(0,a.jsx)(el.Tooltip,{title:"These are the models that your selected team has access to. Leave empty to grant no models directly, e.g. when the team gets its models from access groups",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",children:(0,a.jsx)(O.ModelSelect,{value:M.getFieldValue("models")||[],onChange:e=>M.setFieldValue("models",e),organizationID:M.getFieldValue("organization_id"),options:{includeSpecialOptions:!0,showAllProxyModelsOverride:!M.getFieldValue("organization_id")},context:"team",dataTestId:"create-team-models-select"})}),(0,a.jsx)(Q.Form.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(eW.default,{step:.01,precision:2,width:200})}),(0,a.jsx)(Q.Form.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(T.Select,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(T.Select.Option,{value:"24h",children:"daily"}),(0,a.jsx)(T.Select.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(T.Select.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(Q.Form.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(eW.default,{step:1,width:400})}),(0,a.jsx)(Q.Form.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(eW.default,{step:1,width:400})}),(0,a.jsx)(Q.Form.Item,{label:"Metadata",help:'Values are saved as text. Enter JSON for typed values, e.g. 3, true, or {"region": "us"}.',children:(0,a.jsx)(eP.default,{form:M,schemaFields:j,schemaLoading:b})}),(0,a.jsxs)($.Accordion,{className:"mt-20 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Additional Settings"})}),(0,a.jsxs)(J.AccordionBody,{children:[(0,a.jsx)(Q.Form.Item,{label:"Team ID",name:"team_id",help:"ID of the team you want to create. If not provided, it will be generated automatically.",children:(0,a.jsx)(Y.TextInput,{onChange:e=>{e.target.value=e.target.value.trim()}})}),(0,a.jsx)(Q.Form.Item,{label:"Team Member Budget (USD)",name:"team_member_budget",normalize:e=>e?Number(e):void 0,tooltip:"This is the individual budget for a user in the team.",children:(0,a.jsx)(eW.default,{step:.01,precision:2,width:200})}),(0,a.jsx)(Q.Form.Item,{label:"Team Member Key Duration (eg: 1d, 1mo)",name:"team_member_key_duration",tooltip:"Set a limit to the duration of a team member's key. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days), 1mo (month)",children:(0,a.jsx)(Y.TextInput,{placeholder:"e.g., 30d"})}),(0,a.jsx)(Q.Form.Item,{label:"Team Member RPM Limit",name:"team_member_rpm_limit",tooltip:"The RPM (Requests Per Minute) limit for individual team members",children:(0,a.jsx)(eW.default,{step:1,width:400})}),(0,a.jsx)(Q.Form.Item,{label:"Team Member TPM Limit",name:"team_member_tpm_limit",tooltip:"The TPM (Tokens Per Minute) limit for individual team members",children:(0,a.jsx)(eW.default,{step:1,width:400})}),(0,a.jsx)(Q.Form.Item,{label:"Secret Manager Settings",name:"secret_manager_settings",help:d?"Enter secret manager configuration as a JSON object.":"Premium feature - Upgrade to manage secret manager settings.",rules:[{validator:async(e,a)=>{if(!a)return Promise.resolve();try{return JSON.parse(a),Promise.resolve()}catch(e){return Promise.reject(Error("Please enter valid JSON"))}}}],children:(0,a.jsx)(X.Input.TextArea,{rows:4,placeholder:'{"namespace": "admin", "mount": "secret", "path_prefix": "litellm"}',disabled:!d})}),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Guardrails"," ",(0,a.jsx)(el.Tooltip,{title:"Setup your first guardrail",children:(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-8",help:"Select existing guardrails or enter new ones",children:(0,a.jsx)(T.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter guardrails",options:ep.map(e=>({value:e,label:e}))})}),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,a.jsx)(el.Tooltip,{title:"When enabled, this team will bypass any guardrails configured to run on every request (global guardrails)",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:"Bypass global guardrails for this team",children:(0,a.jsx)(ea.Switch,{disabled:!d,checkedChildren:d?"Yes":"Premium feature - Upgrade to disable global guardrails by team",unCheckedChildren:d?"No":"Premium feature - Upgrade to disable global guardrails by team"})}),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Policies"," ",(0,a.jsx)(el.Tooltip,{title:"Apply policies to this team to control guardrails and other settings",children:(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-8",help:"Select existing policies or enter new ones",children:(0,a.jsx)(T.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter policies",options:e_.map(e=>({value:e,label:e}))})}),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Access Groups"," ",(0,a.jsx)(el.Tooltip,{title:"Assign access groups to this team. Access groups control which models, MCP servers, and agents this team can use",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-8",help:"Select access groups to assign to this team",children:(0,a.jsx)(eO.default,{placeholder:"Select access groups (optional)"})}),(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,a.jsx)(el.Tooltip,{title:"Select which vector stores this team can access by default. Leave empty for access to all vector stores",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-8",help:"Select vector stores this team can access. Leave empty for access to all vector stores",children:(0,a.jsx)(e$.default,{onChange:e=>M.setFieldValue("allowed_vector_store_ids",e),value:M.getFieldValue("allowed_vector_store_ids"),accessToken:e||"",placeholder:"Select vector stores (optional)"})}),(0,a.jsx)(Q.Form.Item,{label:"Allowed Pass Through Routes",name:"allowed_passthrough_routes",className:"mt-8",tooltip:d?(0,q.isProxyAdminRole)(o||"")?void 0:"Only proxy admins can set allowed pass through routes":"Premium feature - Upgrade to set allowed pass through routes",children:(0,a.jsx)(eE.default,{accessToken:e||"",placeholder:"Select pass through routes (optional)",disabled:!d||!(0,q.isProxyAdminRole)(o||"")})})]})]}),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"MCP Settings"})}),(0,a.jsxs)(J.AccordionBody,{children:[(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,a.jsx)(el.Tooltip,{title:"Select which MCP servers or access groups this team can access",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",className:"mt-4",help:"Select MCP servers or access groups this team can access",children:(0,a.jsx)(eH.default,{onChange:e=>M.setFieldValue("allowed_mcp_servers_and_groups",e),value:M.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:e||"",placeholder:"Select MCP servers or access groups (optional)",allowAllProxyMcpServers:(0,q.isProxyAdminRole)(o||"")})}),(0,a.jsx)(Q.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,a.jsx)(X.Input,{type:"hidden"})}),(0,a.jsx)(Q.Form.Item,{noStyle:!0,shouldUpdate:(e,a)=>e.allowed_mcp_servers_and_groups!==a.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==a.mcp_tool_permissions,children:()=>(0,a.jsx)("div",{className:"mt-6",children:(0,a.jsx)(eK.default,{accessToken:e||"",selectedServers:M.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[],toolPermissions:M.getFieldValue("mcp_tool_permissions")||{},onChange:e=>M.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Agent Settings"})}),(0,a.jsx)(J.AccordionBody,{children:(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Allowed Agents"," ",(0,a.jsx)(el.Tooltip,{title:"Select which agents or access groups this team can access",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",className:"mt-4",help:"Select agents or access groups this team can access",children:(0,a.jsx)(eB.default,{onChange:e=>M.setFieldValue("allowed_agents_and_groups",e),value:M.getFieldValue("allowed_agents_and_groups"),accessToken:e||"",placeholder:"Select agents or access groups (optional)"})})})]}),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Search Tool Settings"})}),(0,a.jsx)(J.AccordionBody,{children:(0,a.jsx)(Q.Form.Item,{label:(0,a.jsxs)("span",{children:["Allowed Search Tools"," ",(0,a.jsx)(el.Tooltip,{title:"Select which search tools this team can access. Leave empty to allow all search tools.",children:(0,a.jsx)(W.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"object_permission_search_tools",className:"mt-4",help:"Restrict which configured search tools keys on this team may call.",children:(0,a.jsx)(eJ.default,{onChange:e=>M.setFieldValue("object_permission_search_tools",e),value:M.getFieldValue("object_permission_search_tools"),accessToken:e||"",placeholder:"Select search tools (optional, empty = all allowed)"})})})]}),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Logging Settings"})}),(0,a.jsx)(J.AccordionBody,{children:(0,a.jsx)("div",{className:"mt-4",children:(0,a.jsx)(eR.default,{value:eb,onChange:ef,premiumUser:d})})})]}),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Router Settings"})}),(0,a.jsx)(J.AccordionBody,{children:(0,a.jsx)("div",{className:"mt-4 w-full",children:(0,a.jsx)(eU.default,{accessToken:e||"",value:ew||void 0,onChange:eS,modelData:R.length>0?{data:R.map(e=>({model_name:e}))}:void 0},eN)})})]},`router-settings-accordion-${eN}`),(0,a.jsxs)($.Accordion,{className:"mt-8 mb-8",children:[(0,a.jsx)(G.AccordionHeader,{children:(0,a.jsx)("b",{children:"Model Aliases"})}),(0,a.jsx)(J.AccordionBody,{children:(0,a.jsxs)("div",{className:"mt-4",children:[(0,a.jsx)(eI,{type:"secondary",style:{fontSize:14,marginBottom:16,display:"block"},children:"Create custom aliases for models that can be used by team members in API calls. This allows you to create shortcuts for specific models."}),(0,a.jsx)(eV.default,{accessToken:e||"",initialModelAliases:ey,onAliasUpdate:ev,showExampleConfig:!1})]})})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(w.Button,{htmlType:"submit","data-testid":"create-team-submit",children:"Create Team"})})]})})]})};var e0=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userId:t,userRole:s,premiumUser:l}=(0,e0.default)();return(0,a.jsx)(eZ,{accessToken:e,userID:t,userRole:s,premiumUser:l??!1})}],596115)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0uqgz7kckt4h1.js b/litellm/proxy/_experimental/out/_next/static/chunks/0uqgz7kckt4h1.js new file mode 100644 index 00000000000..654935186a4 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0uqgz7kckt4h1.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,648214,e=>{"use strict";var s=e.i(843476),t=e.i(135214),r=e.i(994388),l=e.i(366283),i=e.i(304967),a=e.i(269200),n=e.i(942232),o=e.i(977572),d=e.i(427612),c=e.i(64848),u=e.i(496020),p=e.i(560445),m=e.i(464571),h=e.i(808613),g=e.i(311451),_=e.i(212931),x=e.i(770914),f=e.i(653496),y=e.i(898586),j=e.i(271645),v=e.i(844444),b=e.i(700514),S=e.i(727749),w=e.i(602869),k=e.i(629569),I=e.i(599724),T=e.i(350967),C=e.i(779241),E=e.i(290571),N=e.i(444755);let O=(0,e.i(673706).makeClassName)("Divider"),P=j.default.forwardRef((e,s)=>{let{className:t,children:r}=e,l=(0,E.__rest)(e,["className","children"]);return j.default.createElement("div",Object.assign({ref:s,className:(0,N.tremorTwMerge)(O("root"),"w-full mx-auto my-6 flex justify-between gap-3 items-center text-tremor-default","text-tremor-content","dark:text-dark-tremor-content",t)},l),r?j.default.createElement(j.default.Fragment,null,j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")}),j.default.createElement("div",{className:(0,N.tremorTwMerge)("text-inherit whitespace-nowrap")},r),j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")})):j.default.createElement("div",{className:(0,N.tremorTwMerge)("w-full h-[1px] bg-tremor-border dark:bg-dark-tremor-border")}))});P.displayName="Divider";var F=e.i(237016),A=e.i(596239),M=e.i(438957),B=e.i(166406),L=e.i(270377);e.i(247167);var U=e.i(931067);let R={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.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:"plus-circle",theme:"outlined"};var D=e.i(9583),z=j.forwardRef(function(e,s){return j.createElement(D.default,(0,U.default)({},e,{ref:s,icon:R}))}),V=e.i(190702);let q=({accessToken:e,userID:t,proxySettings:a})=>{let[n]=h.Form.useForm(),[o,d]=(0,j.useState)(!1),[c,u]=(0,j.useState)(null),[p,m]=(0,j.useState)("");(0,j.useEffect)(()=>{let e="";m(e=a&&a.PROXY_BASE_URL&&void 0!==a.PROXY_BASE_URL?a.PROXY_BASE_URL:window.location.origin)},[a]);let g=`${p}/scim/v2`,_=async s=>{if(!e||!t)return void S.default.fromBackend("You need to be logged in to create a SCIM token");try{d(!0);let r={key_alias:s.key_alias||"SCIM Access Token",team_id:null,models:[],allowed_routes:["/scim/*"]},l=await (0,w.keyCreateCall)(e,t,r);u(l),S.default.success("SCIM token created successfully")}catch(e){console.error("Error creating SCIM token:",e),S.default.fromBackend("Failed to create SCIM token: "+(0,V.parseErrorMessage)(e))}finally{d(!1)}};return(0,s.jsx)(T.Grid,{numItems:1,children:(0,s.jsxs)(i.Card,{children:[(0,s.jsx)("div",{className:"flex items-center mb-4",children:(0,s.jsx)(k.Title,{children:"SCIM Configuration"})}),(0,s.jsx)(I.Text,{className:"text-gray-600",children:"System for Cross-domain Identity Management (SCIM) allows you to automatically provision and manage users and groups in LiteLLM."}),(0,s.jsx)(P,{}),(0,s.jsxs)("div",{className:"space-y-8",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center mb-2",children:[(0,s.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-blue-100 text-blue-700 mr-2",children:"1"}),(0,s.jsxs)(k.Title,{className:"text-lg flex items-center",children:[(0,s.jsx)(A.LinkOutlined,{className:"h-5 w-5 mr-2"}),"SCIM Tenant URL"]})]}),(0,s.jsx)(I.Text,{className:"text-gray-600 mb-3",children:"Use this URL in your identity provider SCIM integration settings."}),(0,s.jsxs)("div",{className:"flex items-center",children:[(0,s.jsx)(C.TextInput,{value:g,disabled:!0,className:"grow"}),(0,s.jsx)(F.CopyToClipboard,{text:g,onCopy:()=>S.default.success("URL copied to clipboard"),children:(0,s.jsxs)(r.Button,{variant:"primary",className:"ml-2 flex items-center",children:[(0,s.jsx)(B.CopyOutlined,{className:"h-4 w-4 mr-1"}),"Copy"]})})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center mb-2",children:[(0,s.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-blue-100 text-blue-700 mr-2",children:"2"}),(0,s.jsxs)(k.Title,{className:"text-lg flex items-center",children:[(0,s.jsx)(M.KeyOutlined,{className:"h-5 w-5 mr-2"}),"Authentication Token"]})]}),(0,s.jsx)(l.Callout,{title:"Using SCIM",color:"blue",className:"mb-4",children:"You need a SCIM token to authenticate with the SCIM API. Create one below and use it in your SCIM provider configuration."}),c?(0,s.jsxs)(i.Card,{className:"border border-yellow-300 bg-yellow-50",children:[(0,s.jsxs)("div",{className:"flex items-center mb-2 text-yellow-800",children:[(0,s.jsx)(L.ExclamationCircleOutlined,{className:"h-5 w-5 mr-2"}),(0,s.jsx)(k.Title,{className:"text-lg text-yellow-800",children:"Your SCIM Token"})]}),(0,s.jsx)(I.Text,{className:"text-yellow-800 mb-4 font-medium",children:"Make sure to copy this token now. You will not be able to see it again."}),(0,s.jsxs)("div",{className:"flex items-center",children:[(0,s.jsx)(C.TextInput,{value:c.key,className:"grow mr-2 bg-white",type:"password",disabled:!0}),(0,s.jsx)(F.CopyToClipboard,{text:c.key,onCopy:()=>S.default.success("Token copied to clipboard"),children:(0,s.jsxs)(r.Button,{variant:"primary",className:"flex items-center",children:[(0,s.jsx)(B.CopyOutlined,{className:"h-4 w-4 mr-1"}),"Copy"]})})]}),(0,s.jsxs)(r.Button,{className:"mt-4 flex items-center",variant:"secondary",onClick:()=>u(null),children:[(0,s.jsx)(z,{className:"h-4 w-4 mr-1"}),"Create Another Token"]})]}):(0,s.jsx)("div",{className:"bg-gray-50 p-4 rounded-lg",children:(0,s.jsxs)(h.Form,{form:n,onFinish:_,layout:"vertical",children:[(0,s.jsx)(h.Form.Item,{name:"key_alias",label:"Token Name",rules:[{required:!0,message:"Please enter a name for your token"}],children:(0,s.jsx)(C.TextInput,{placeholder:"SCIM Access Token"})}),(0,s.jsx)(h.Form.Item,{children:(0,s.jsxs)(r.Button,{variant:"primary",type:"submit",loading:o,className:"flex items-center",children:[(0,s.jsx)(M.KeyOutlined,{className:"h-4 w-4 mr-1"}),"Create SCIM Token"]})})]})})]})]})]})})};var G=e.i(153472),K=e.i(954616),H=e.i(912598);let $=async(e,s)=>{let t=(0,w.getProxyBaseUrl)(),r=t?`${t}/config/update`:"/config/update",l=await fetch(r,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({general_settings:{store_prompts_in_spend_logs:s.store_prompts_in_spend_logs,...s.maximum_spend_logs_retention_period&&{maximum_spend_logs_retention_period:s.maximum_spend_logs_retention_period}}})});if(!l.ok){let e=await l.json().catch(()=>({}));throw Error(e?.error?.message||e?.message||e?.detail||"Failed to update spend logs settings")}return await l.json()};var Q=e.i(637235),W=e.i(175712),Y=e.i(981339),J=e.i(790848);let X=()=>{let[e]=h.Form.useForm(),{mutate:r,isPending:l}=(()=>{let{accessToken:e}=(0,t.default)(),s=(0,H.useQueryClient)();return(0,K.useMutation)({mutationFn:async s=>{if(!e)throw Error("Access token is required");return await $(e,s)},onSuccess:()=>{s.invalidateQueries({queryKey:G.proxyConfigKeys.all})}})})(),{mutate:i,isPending:a}=(0,G.useDeleteProxyConfigField)(),{data:n,isLoading:o}=(0,G.useProxyConfig)(G.ConfigType.GENERAL_SETTINGS),d=(0,j.useMemo)(()=>{if(!n)return{store_prompts_in_spend_logs:!1,maximum_spend_logs_retention_period:void 0};let e=n.find(e=>"store_prompts_in_spend_logs"===e.field_name),s=n.find(e=>"maximum_spend_logs_retention_period"===e.field_name);return{store_prompts_in_spend_logs:e?.field_value??!1,maximum_spend_logs_retention_period:s?.field_value??void 0}},[n]);return(0,s.jsx)(W.Card,{title:"Logging Settings",children:(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",style:{width:"100%"},children:[(0,s.jsx)(y.Typography.Paragraph,{style:{marginBottom:0},type:"secondary",children:"Proxy-wide settings that control how request and response data are written to spend logs."}),o?(0,s.jsx)(Y.Skeleton,{active:!0,paragraph:{rows:4}}):(0,s.jsxs)(h.Form,{form:e,layout:"vertical",onFinish:e=>{let s=e.maximum_spend_logs_retention_period,t="string"==typeof s&&""!==s.trim(),l={store_prompts_in_spend_logs:e.store_prompts_in_spend_logs,...t&&{maximum_spend_logs_retention_period:s}},a=()=>r(l,{onSuccess:()=>S.default.success("Spend logs settings updated successfully"),onError:e=>S.default.fromBackend("Failed to save spend logs settings: "+(0,V.parseErrorMessage)(e))});t?a():i({config_type:G.ConfigType.GENERAL_SETTINGS,field_name:G.GeneralSettingsFieldName.MAXIMUM_SPEND_LOGS_RETENTION_PERIOD},{onError:e=>console.warn("Failed to delete retention period field (may not exist):",e),onSettled:a})},initialValues:d,children:[(0,s.jsx)(h.Form.Item,{label:"Store Prompts in Spend Logs",name:"store_prompts_in_spend_logs",tooltip:n?.find(e=>"store_prompts_in_spend_logs"===e.field_name)?.field_description||"When enabled, prompts will be stored in spend logs for tracking and analysis purposes.",valuePropName:"checked",children:(0,s.jsx)(J.Switch,{})}),(0,s.jsx)(h.Form.Item,{label:"Maximum Spend Logs Retention Period (Optional)",name:"maximum_spend_logs_retention_period",tooltip:n?.find(e=>"maximum_spend_logs_retention_period"===e.field_name)?.field_description||"Set the maximum retention period for spend logs (e.g., '7d' for 7 days, '30d' for 30 days). Leave empty for no limit.",children:(0,s.jsx)(g.Input,{placeholder:"e.g., 7d, 30d",prefix:(0,s.jsx)(Q.ClockCircleOutlined,{})})}),(0,s.jsx)(h.Form.Item,{children:(0,s.jsx)(m.Button,{type:"primary",htmlType:"submit",loading:l||a,children:l||a?"Saving...":"Save Settings"})})]})]})})};var Z=e.i(266027),ee=e.i(243652);let es=(0,ee.createQueryKeys)("sso"),et=()=>{let{accessToken:e,userId:s,userRole:r}=(0,t.default)();return(0,Z.useQuery)({queryKey:es.detail("settings"),queryFn:async()=>await (0,w.getSSOSettings)(e),enabled:!!(e&&s&&r)})};var er=e.i(869216),el=e.i(262218),ei=e.i(823429),ei=ei,ea=e.i(98919),en=e.i(727612),eo=e.i(174553),ed=e.i(336712),ec=e.i(39182);let eu={google:ed.default.src,microsoft:ec.default.src,okta:"https://www.okta.com/sites/default/files/Okta_Logo_BrightBlue_Medium.png",generic:"",saml:""},ep={google:"Google SSO",microsoft:"Microsoft SSO",okta:"Okta / Auth0 SSO",generic:"Generic SSO",saml:"SAML SSO"},em={internal_user_viewer:"Internal Viewer",internal_user:"Internal User",proxy_admin_viewer:"Proxy Admin Viewer",proxy_admin:"Proxy Admin"};var eh=e.i(536916),eg=e.i(199133);let e_={google:{envVarMap:{google_client_id:"GOOGLE_CLIENT_ID",google_client_secret:"GOOGLE_CLIENT_SECRET"},fields:[{label:"Google Client ID",name:"google_client_id"},{label:"Google Client Secret",name:"google_client_secret"}]},microsoft:{envVarMap:{microsoft_client_id:"MICROSOFT_CLIENT_ID",microsoft_client_secret:"MICROSOFT_CLIENT_SECRET",microsoft_tenant:"MICROSOFT_TENANT"},fields:[{label:"Microsoft Client ID",name:"microsoft_client_id"},{label:"Microsoft Client Secret",name:"microsoft_client_secret"},{label:"Microsoft Tenant",name:"microsoft_tenant"}]},okta:{envVarMap:{generic_client_id:"GENERIC_CLIENT_ID",generic_client_secret:"GENERIC_CLIENT_SECRET",generic_authorization_endpoint:"GENERIC_AUTHORIZATION_ENDPOINT",generic_token_endpoint:"GENERIC_TOKEN_ENDPOINT",generic_userinfo_endpoint:"GENERIC_USERINFO_ENDPOINT",generic_scope:"GENERIC_SCOPE"},fields:[{label:"Generic Client ID",name:"generic_client_id"},{label:"Generic Client Secret",name:"generic_client_secret"},{label:"Authorization Endpoint",name:"generic_authorization_endpoint",placeholder:"https://your-domain/authorize"},{label:"Token Endpoint",name:"generic_token_endpoint",placeholder:"https://your-domain/token"},{label:"Userinfo Endpoint",name:"generic_userinfo_endpoint",placeholder:"https://your-domain/userinfo"},{label:"Scopes",name:"generic_scope",placeholder:"openid email profile",required:!1}]},generic:{envVarMap:{generic_client_id:"GENERIC_CLIENT_ID",generic_client_secret:"GENERIC_CLIENT_SECRET",generic_authorization_endpoint:"GENERIC_AUTHORIZATION_ENDPOINT",generic_token_endpoint:"GENERIC_TOKEN_ENDPOINT",generic_userinfo_endpoint:"GENERIC_USERINFO_ENDPOINT",generic_scope:"GENERIC_SCOPE"},fields:[{label:"Generic Client ID",name:"generic_client_id"},{label:"Generic Client Secret",name:"generic_client_secret"},{label:"Authorization Endpoint",name:"generic_authorization_endpoint"},{label:"Token Endpoint",name:"generic_token_endpoint"},{label:"Userinfo Endpoint",name:"generic_userinfo_endpoint"},{label:"Scopes",name:"generic_scope",placeholder:"openid email profile",required:!1}]},saml:{envVarMap:{saml_idp_metadata_url:"SAML_IDP_METADATA_URL",saml_idp_metadata_xml:"SAML_IDP_METADATA_XML",saml_sp_entity_id:"SAML_SP_ENTITY_ID",saml_allow_unsolicited:"SAML_ALLOW_UNSOLICITED"},fields:[{label:"IdP Metadata URL",name:"saml_idp_metadata_url",required:!1,placeholder:"https://idp.example.com/metadata (use this or the metadata XML below)"},{label:"IdP Metadata XML",name:"saml_idp_metadata_xml",required:!1,type:"textarea",placeholder:"Paste the IdP metadata XML here if you do not have a metadata URL"},{label:"SP Entity ID",name:"saml_sp_entity_id",required:!1,placeholder:"Defaults to /sso/saml/metadata"},{label:"Allow IdP-initiated (unsolicited) responses",name:"saml_allow_unsolicited",required:!1,type:"checkbox"}]}},ex=e=>{let t=e_[e];return t?t.fields.map(e=>{let t,r=!1!==e.required?[{required:!0,message:`Please enter the ${e.label.toLowerCase()}`}]:[];return t="checkbox"===e.type?(0,s.jsx)(eh.Checkbox,{}):"textarea"===e.type?(0,s.jsx)(g.Input.TextArea,{rows:4,placeholder:e.placeholder}):"password"===e.type||e.name.includes("client")?(0,s.jsx)(g.Input.Password,{}):(0,s.jsx)(C.TextInput,{placeholder:e.placeholder}),(0,s.jsx)(h.Form.Item,{label:e.label,name:e.name,rules:r,valuePropName:"checkbox"===e.type?"checked":void 0,children:t},e.name)}):null},ef=({form:e,onFormSubmit:t})=>(0,s.jsx)("div",{children:(0,s.jsxs)(h.Form,{form:e,onFinish:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,s.jsx)(h.Form.Item,{label:"SSO Provider",name:"sso_provider",rules:[{required:!0,message:"Please select an SSO provider"}],children:(0,s.jsx)(eg.Select,{children:Object.entries(eu).map(([e,t])=>(0,s.jsx)(eg.Select.Option,{value:e,children:(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",padding:"4px 0"},children:[t&&(0,s.jsx)(eo.Logo,{src:t,label:ep[e]||e,className:"h-6 w-6 mr-3 object-contain"}),(0,s.jsx)("span",{children:ep[e]||e.charAt(0).toUpperCase()+e.slice(1)+" SSO"})]})},e))})}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let s=e("sso_provider");return s?ex(s):null}}),(0,s.jsx)(h.Form.Item,{label:"Proxy Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Proxy Base URL",name:"proxy_base_url",normalize:e=>e?.trim(),rules:[{required:!0,message:"Please enter the proxy base url"},{pattern:/^https?:\/\/.+/,message:"URL must start with http:// or https://"},{validator:(e,s)=>s&&/^https?:\/\/.+/.test(s)&&s.endsWith("/")?Promise.reject("URL must not end with a trailing slash"):Promise.resolve()}],children:(0,s.jsx)(C.TextInput,{placeholder:"https://example.com"})}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("sso_provider");return"okta"===t||"generic"===t?(0,s.jsx)(h.Form.Item,{label:"Use Role Mappings",name:"use_role_mappings",valuePropName:"checked",children:(0,s.jsx)(eh.Checkbox,{})}):null}}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.use_role_mappings!==s.use_role_mappings||e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("use_role_mappings"),r=e("sso_provider");return t&&("okta"===r||"generic"===r)?(0,s.jsx)(h.Form.Item,{label:"Group Claim",name:"group_claim",rules:[{required:!0,message:"Please enter the group claim"}],children:(0,s.jsx)(C.TextInput,{})}):null}}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.use_role_mappings!==s.use_role_mappings||e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("use_role_mappings"),r=e("sso_provider");return t&&("okta"===r||"generic"===r)?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(h.Form.Item,{label:"Default Role",name:"default_role",initialValue:"Internal User",children:(0,s.jsxs)(eg.Select,{children:[(0,s.jsx)(eg.Select.Option,{value:"internal_user_viewer",children:"Internal Viewer"}),(0,s.jsx)(eg.Select.Option,{value:"internal_user",children:"Internal User"}),(0,s.jsx)(eg.Select.Option,{value:"proxy_admin_viewer",children:"Admin Viewer"}),(0,s.jsx)(eg.Select.Option,{value:"proxy_admin",children:"Proxy Admin"})]})}),(0,s.jsx)(h.Form.Item,{label:"Proxy Admin Teams",name:"proxy_admin_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Admin Viewer Teams",name:"admin_viewer_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Internal User Teams",name:"internal_user_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Internal Viewer Teams",name:"internal_viewer_teams",children:(0,s.jsx)(C.TextInput,{})})]}):null}}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("sso_provider");return"okta"===t||"generic"===t?(0,s.jsx)(h.Form.Item,{label:"Use Team Mappings",name:"use_team_mappings",valuePropName:"checked",children:(0,s.jsx)(eh.Checkbox,{})}):null}}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.use_team_mappings!==s.use_team_mappings||e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("use_team_mappings"),r=e("sso_provider");return t&&("okta"===r||"generic"===r)?(0,s.jsx)(h.Form.Item,{label:"Team IDs JWT Field",name:"team_ids_jwt_field",rules:[{required:!0,message:"Please enter the team IDs JWT field"}],children:(0,s.jsx)(C.TextInput,{})}):null}})]})}),ey=()=>{let{accessToken:e}=(0,t.default)();return(0,K.useMutation)({mutationFn:async s=>{if(!e)throw Error("Access token is required");return await (0,w.updateSSOSettings)(e,s)}})},ej=e=>{let{proxy_admin_teams:s,admin_viewer_teams:t,internal_user_teams:r,internal_viewer_teams:l,default_role:i,group_claim:a,use_role_mappings:n,use_team_mappings:o,team_ids_jwt_field:d,...c}=e,u={...c};"boolean"==typeof u.saml_allow_unsolicited&&(u.saml_allow_unsolicited=u.saml_allow_unsolicited?"true":"false");let p=c.sso_provider;if(n&&("okta"===p||"generic"===p)){let e=e=>e&&""!==e.trim()?e.split(",").map(e=>e.trim()).filter(e=>e.length>0):[];u.role_mappings={provider:"generic",group_claim:a,default_role:({internal_user_viewer:"internal_user_viewer",internal_user:"internal_user",proxy_admin_viewer:"proxy_admin_viewer",proxy_admin:"proxy_admin"})[i]||"internal_user",roles:{proxy_admin:e(s),proxy_admin_viewer:e(t),internal_user:e(r),internal_user_viewer:e(l)}}}return o&&("okta"===p||"generic"===p)&&(u.team_mappings={team_ids_jwt_field:d}),u},ev=e=>e.google_client_id?"google":e.microsoft_client_id?"microsoft":e.generic_client_id?e.generic_authorization_endpoint?.includes("okta")||e.generic_authorization_endpoint?.includes("auth0")?"okta":"generic":e.saml_idp_metadata_url||e.saml_idp_metadata_xml?"saml":null,eb=({isVisible:e,onCancel:t,onSuccess:r})=>{let[l]=h.Form.useForm(),{mutateAsync:i,isPending:a}=ey(),n=async e=>{let s=ej(e);await i(s,{onSuccess:()=>{S.default.success("SSO settings added successfully"),r()},onError:e=>{S.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}})},o=()=>{l.resetFields(),t()};return(0,s.jsx)(_.Modal,{title:"Add SSO",open:e,width:800,footer:(0,s.jsxs)(x.Space,{children:[(0,s.jsx)(m.Button,{onClick:o,disabled:a,children:"Cancel"}),(0,s.jsx)(m.Button,{loading:a,onClick:()=>l.submit(),children:a?"Adding...":"Add SSO"})]}),onCancel:o,children:(0,s.jsx)(ef,{form:l,onFormSubmit:n})})};var eS=e.i(127952);let ew=({isVisible:e,onCancel:t,onSuccess:r})=>{let{data:l}=et(),{mutateAsync:i,isPending:a}=ey(),n=async()=>{await i({google_client_id:null,google_client_secret:null,microsoft_client_id:null,microsoft_client_secret:null,microsoft_tenant:null,generic_client_id:null,generic_client_secret:null,generic_authorization_endpoint:null,generic_token_endpoint:null,generic_userinfo_endpoint:null,saml_idp_metadata_url:null,saml_idp_metadata_xml:null,saml_sp_entity_id:null,saml_allow_unsolicited:null,proxy_base_url:null,user_email:null,sso_provider:null,role_mappings:null,team_mappings:null},{onSuccess:()=>{S.default.success("SSO settings cleared successfully"),t(),r()},onError:e=>{S.default.fromBackend("Failed to clear SSO settings: "+(0,V.parseErrorMessage)(e))}})};return(0,s.jsx)(eS.default,{isOpen:e,title:"Confirm Clear SSO Settings",alertMessage:"This action cannot be undone.",message:"Are you sure you want to clear all SSO settings? Users will no longer be able to login using SSO after this change.",resourceInformationTitle:"SSO Settings",resourceInformation:[{label:"Provider",value:l?.values&&ev(l?.values)||"Generic"}],onCancel:t,onOk:n,confirmLoading:a})},ek=({isVisible:e,onCancel:t,onSuccess:r})=>{let[l]=h.Form.useForm(),i=et(),{mutateAsync:a,isPending:n}=ey();(0,j.useEffect)(()=>{if(e&&i.data&&i.data.values){let e=i.data,s=ev(e.values),t={};if(e.values.role_mappings){let s=e.values.role_mappings,r=e=>e&&0!==e.length?e.join(", "):"";t={use_role_mappings:!0,group_claim:s.group_claim,default_role:s.default_role||"internal_user",proxy_admin_teams:r(s.roles?.proxy_admin),admin_viewer_teams:r(s.roles?.proxy_admin_viewer),internal_user_teams:r(s.roles?.internal_user),internal_viewer_teams:r(s.roles?.internal_user_viewer)}}let r={};e.values.team_mappings&&(r={use_team_mappings:!0,team_ids_jwt_field:e.values.team_mappings.team_ids_jwt_field});let a={sso_provider:s,...e.values,...t,...r,...null!=e.values.saml_allow_unsolicited?{saml_allow_unsolicited:"true"===e.values.saml_allow_unsolicited}:{}};l.resetFields(),setTimeout(()=>{l.setFieldsValue(a)},100)}},[e,i.data,l]);let o=async e=>{try{let s=ej(e);await a(s,{onSuccess:()=>{S.default.success("SSO settings updated successfully"),r()},onError:e=>{S.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}})}catch(e){S.default.fromBackend("Failed to process SSO settings: "+(0,V.parseErrorMessage)(e))}},d=()=>{l.resetFields(),t()};return(0,s.jsx)(_.Modal,{title:"Edit SSO Settings",open:e,width:800,footer:(0,s.jsxs)(x.Space,{children:[(0,s.jsx)(m.Button,{onClick:d,disabled:n,children:"Cancel"}),(0,s.jsx)(m.Button,{loading:n,onClick:()=>l.submit(),children:n?"Saving...":"Save"})]}),onCancel:d,children:(0,s.jsx)(ef,{form:l,onFormSubmit:o})})};var eI=e.i(286536),eT=e.i(77705);function eC({defaultHidden:e=!0,value:t}){let[r,l]=(0,j.useState)(e);return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"font-mono text-gray-600 flex-1",children:t?r?"•".repeat(t.length):t:(0,s.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})}),t&&(0,s.jsx)(m.Button,{type:"text",size:"small",icon:r?(0,s.jsx)(eI.Eye,{className:"w-4 h-4"}):(0,s.jsx)(eT.EyeOff,{className:"w-4 h-4"}),onClick:()=>l(!r),className:"text-gray-400 hover:text-gray-600"})]})}var eE=e.i(312361),eN=e.i(291542),eO=e.i(761911);let{Title:eP,Text:eF}=y.Typography;function eA({roleMappings:e}){if(!e)return null;let t=[{title:"Role",dataIndex:"role",key:"role",render:e=>(0,s.jsx)(eF,{strong:!0,children:em[e]})},{title:"Mapped Groups",dataIndex:"groups",key:"groups",render:e=>(0,s.jsx)(s.Fragment,{children:e.length>0?e.map((e,t)=>(0,s.jsx)(el.Tag,{color:"blue",children:e},t)):(0,s.jsx)(eF,{className:"text-gray-400 italic",children:"No groups mapped"})})}];return(0,s.jsxs)(W.Card,{children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(eO.Users,{className:"w-6 h-6 text-gray-400 mb-2"}),(0,s.jsx)(eP,{level:3,children:"Role Mappings"})]}),(0,s.jsxs)("div",{className:"space-y-8",children:[(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(eP,{level:5,children:"Group Claim"}),(0,s.jsx)("div",{children:(0,s.jsx)(eF,{code:!0,children:e.group_claim})})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)(eP,{level:5,children:"Default Role"}),(0,s.jsx)("div",{children:(0,s.jsx)(eF,{strong:!0,children:em[e.default_role]})})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsx)(eN.Table,{columns:t,dataSource:Object.entries(e.roles).map(([e,s])=>({role:e,groups:s})),pagination:!1,bordered:!0,size:"small",className:"w-full"})]})]})}var eM=e.i(21548);let{Title:eB,Paragraph:eL}=y.Typography;function eU({onAdd:e}){return(0,s.jsx)("div",{className:"bg-white p-12 rounded-lg border border-dashed border-gray-300 text-center w-full",children:(0,s.jsx)(eM.Empty,{image:eM.Empty.PRESENTED_IMAGE_SIMPLE,description:(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(eB,{level:4,children:"No SSO Configuration Found"}),(0,s.jsx)(eL,{type:"secondary",className:"max-w-md mx-auto",children:"Configure Single Sign-On (SSO) to enable seamless authentication for your team members using your identity provider."})]}),children:(0,s.jsx)(m.Button,{type:"primary",size:"large",onClick:e,className:"flex items-center gap-2 mx-auto mt-4",children:"Configure SSO"})})})}let{Title:eR,Text:eD}=y.Typography;function ez(){return(0,s.jsx)(W.Card,{children:(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(ea.Shield,{className:"w-6 h-6 text-gray-400"}),(0,s.jsxs)("div",{children:[(0,s.jsx)(eR,{level:3,children:"SSO Configuration"}),(0,s.jsx)(eD,{type:"secondary",children:"Manage Single Sign-On authentication settings"})]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(Y.Skeleton.Button,{active:!0,size:"default",style:{width:170,height:32}}),(0,s.jsx)(Y.Skeleton.Button,{active:!0,size:"default",style:{width:190,height:32}})]})]}),(0,s.jsxs)(er.Descriptions,{bordered:!0,...{column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}},children:[(0,s.jsx)(er.Descriptions.Item,{label:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,s.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:100,height:16}})})}),(0,s.jsx)(er.Descriptions.Item,{label:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:200,height:16}})}),(0,s.jsx)(er.Descriptions.Item,{label:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:250,height:16}})}),(0,s.jsx)(er.Descriptions.Item,{label:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:180,height:16}})}),(0,s.jsx)(er.Descriptions.Item,{label:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:80,height:16}}),children:(0,s.jsx)(Y.Skeleton.Node,{active:!0,style:{width:220,height:16}})})]})]})})}let{Title:eV,Text:eq}=y.Typography;function eG(){let{data:e,refetch:t,isLoading:r}=et(),[l,i]=(0,j.useState)(!1),[a,n]=(0,j.useState)(!1),[o,d]=(0,j.useState)(!1),c=[e?.values.google_client_id,e?.values.microsoft_client_id,e?.values.generic_client_id,e?.values.saml_idp_metadata_url,e?.values.saml_idp_metadata_xml].some(Boolean),u=e?.values?ev(e.values):null,p=!!e?.values.role_mappings,h=!!e?.values.team_mappings,g=e=>(0,s.jsx)(eq,{className:"font-mono text-gray-600 text-sm",copyable:!!e,children:e||"-"}),_=e=>e||(0,s.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"}),f=e=>e.team_mappings?.team_ids_jwt_field?(0,s.jsx)(el.Tag,{children:e.team_mappings.team_ids_jwt_field}):(0,s.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"}),y={column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}},v={google:{providerText:ep.google,fields:[{label:"Client ID",render:e=>(0,s.jsx)(eC,{value:e.google_client_id})},{label:"Client Secret",render:e=>(0,s.jsx)(eC,{value:e.google_client_secret})},{label:"Proxy Base URL",render:e=>_(e.proxy_base_url)}]},microsoft:{providerText:ep.microsoft,fields:[{label:"Client ID",render:e=>(0,s.jsx)(eC,{value:e.microsoft_client_id})},{label:"Client Secret",render:e=>(0,s.jsx)(eC,{value:e.microsoft_client_secret})},{label:"Tenant",render:e=>_(e.microsoft_tenant)},{label:"Proxy Base URL",render:e=>_(e.proxy_base_url)}]},okta:{providerText:ep.okta,fields:[{label:"Client ID",render:e=>(0,s.jsx)(eC,{value:e.generic_client_id})},{label:"Client Secret",render:e=>(0,s.jsx)(eC,{value:e.generic_client_secret})},{label:"Authorization Endpoint",render:e=>g(e.generic_authorization_endpoint)},{label:"Token Endpoint",render:e=>g(e.generic_token_endpoint)},{label:"User Info Endpoint",render:e=>g(e.generic_userinfo_endpoint)},{label:"Scopes",render:e=>_(e.generic_scope)},{label:"Proxy Base URL",render:e=>_(e.proxy_base_url)},h?{label:"Team IDs JWT Field",render:e=>f(e)}:null]},generic:{providerText:ep.generic,fields:[{label:"Client ID",render:e=>(0,s.jsx)(eC,{value:e.generic_client_id})},{label:"Client Secret",render:e=>(0,s.jsx)(eC,{value:e.generic_client_secret})},{label:"Authorization Endpoint",render:e=>g(e.generic_authorization_endpoint)},{label:"Token Endpoint",render:e=>g(e.generic_token_endpoint)},{label:"User Info Endpoint",render:e=>g(e.generic_userinfo_endpoint)},{label:"Scopes",render:e=>_(e.generic_scope)},{label:"Proxy Base URL",render:e=>_(e.proxy_base_url)},h?{label:"Team IDs JWT Field",render:e=>f(e)}:null]},saml:{providerText:ep.saml,fields:[{label:"IdP Metadata URL",render:e=>g(e.saml_idp_metadata_url)},{label:"IdP Metadata XML",render:e=>e.saml_idp_metadata_xml?(0,s.jsx)(el.Tag,{children:"Provided"}):(0,s.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})},{label:"SP Entity ID",render:e=>g(e.saml_sp_entity_id)},{label:"Allow IdP-initiated (unsolicited) responses",render:e=>(0,s.jsx)(el.Tag,{color:"true"===e.saml_allow_unsolicited?"green":"default",children:"true"===e.saml_allow_unsolicited?"Enabled":"Disabled"})},{label:"Proxy Base URL",render:e=>_(e.proxy_base_url)}]}};return(0,s.jsxs)(s.Fragment,{children:[r?(0,s.jsx)(ez,{}):(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,s.jsx)(W.Card,{children:(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(ea.Shield,{className:"w-6 h-6 text-gray-400"}),(0,s.jsxs)("div",{children:[(0,s.jsx)(eV,{level:3,children:"SSO Configuration"}),(0,s.jsx)(eq,{type:"secondary",children:"Manage Single Sign-On authentication settings"})]})]}),(0,s.jsx)("div",{className:"flex items-center gap-3",children:c&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(m.Button,{icon:(0,s.jsx)(ei.default,{className:"w-4 h-4"}),onClick:()=>d(!0),children:"Edit SSO Settings"}),(0,s.jsx)(m.Button,{danger:!0,icon:(0,s.jsx)(en.Trash2,{className:"w-4 h-4"}),onClick:()=>i(!0),children:"Delete SSO Settings"})]})})]}),c?(()=>{if(!e?.values||!u)return null;let{values:t}=e,r=v[u];return r?(0,s.jsxs)(er.Descriptions,{bordered:!0,...y,children:[(0,s.jsx)(er.Descriptions.Item,{label:"Provider",children:(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[eu[u]&&(0,s.jsx)(eo.Logo,{src:eu[u],label:ep[u]||u,className:"h-6 w-6 object-contain"}),(0,s.jsx)("span",{children:r.providerText})]})}),r.fields.map((e,r)=>e&&(0,s.jsx)(er.Descriptions.Item,{label:e.label,children:e.render(t)},r))]}):null})():(0,s.jsx)(eU,{onAdd:()=>n(!0)})]})}),p&&(0,s.jsx)(eA,{roleMappings:e?.values.role_mappings})]}),(0,s.jsx)(ew,{isVisible:l,onCancel:()=>i(!1),onSuccess:()=>t()}),(0,s.jsx)(eb,{isVisible:a,onCancel:()=>n(!1),onSuccess:()=>{n(!1),t()}}),(0,s.jsx)(ek,{isVisible:o,onCancel:()=>d(!1),onSuccess:()=>{d(!1),t()}})]})}var eK=e.i(292639);let eH=(0,ee.createQueryKeys)("uiSettings");var e$=e.i(111672);let eQ={"api-keys":"Manage virtual keys for API access and authentication","llm-playground":"Interactive playground for testing LLM requests",models:"Configure and manage LLM models and endpoints",agents:"Create and manage AI agents",agentic:"Manage agentic resources: agents, workflow runs, and memory",workflows:"Track and inspect durable workflow run history","mcp-servers":"Configure Model Context Protocol servers",memory:"Inspect and manage agent memory entries stored under /v1/memory",guardrails:"Set up content moderation and safety guardrails",policies:"Define access control and usage policies","search-tools":"Configure RAG search and retrieval tools","tool-policies":"Configure tool use policies and permissions","vector-stores":"Manage vector databases for embeddings",new_usage:"View usage analytics and metrics","cost-optimization":"Track and configure cost-saving features: prompt compression, caching, and auto routing",logs:"Access request and response logs","guardrails-monitor":"Monitor guardrail performance and view logs",users:"Manage internal user accounts and permissions",teams:"Create and manage teams for access control",organizations:"Manage organizations and their members",projects:"Manage projects within teams","access-groups":"Manage access groups for role-based permissions",budgets:"Set and monitor spending budgets",api_ref:"Browse API documentation and endpoints","model-hub-table":"Explore available AI models and providers","learning-resources":"Access tutorials and documentation",caching:"Configure response caching and coordination Redis settings","transform-request":"Set up request transformation rules","cost-tracking":"Track and analyze API costs","ui-theme":"Customize dashboard appearance","tag-management":"Organize resources with tags",prompts:"Manage and version prompt templates",skills:"Browse and manage Claude Code skills",usage:"View legacy usage dashboard","router-settings":"Configure routing and load balancing settings","logging-and-alerts":"Set up logging and alert configurations","admin-panel":"Access admin panel and settings"};var eW=e.i(708347);let eY=e=>!e||0===e.length||e.some(e=>eW.internalUserRoles.includes(e));var eJ=e.i(362024);function eX({enabledPagesInternalUsers:e,enabledPagesPropertyDescription:t,isUpdating:r,onUpdate:l}){let i=null!=e,a=(0,j.useMemo)(()=>{let e;return e=[],e$.menuGroups.forEach(s=>{s.items.forEach(t=>{if(t.page&&"tools"!==t.page&&"experimental"!==t.page&&"settings"!==t.page&&eY(t.roles)){let r="string"==typeof t.label?t.label:t.key;e.push({page:t.page,label:r,group:s.groupLabel,description:eQ[t.page]||"No description available"})}if(t.children){let r="string"==typeof t.label?t.label:t.key;t.children.forEach(t=>{if(eY(t.roles)){let l="string"==typeof t.label?t.label:t.key;e.push({page:t.page,label:l,group:`${s.groupLabel} > ${r}`,description:eQ[t.page]||"No description available"})}})}})}),e},[]),n=(0,j.useMemo)(()=>{let e={};return a.forEach(s=>{e[s.group]||(e[s.group]=[]),e[s.group].push(s)}),e},[a]),[o,d]=(0,j.useState)(e||[]);return(0,j.useMemo)(()=>{e?d(e):d([])},[e]),(0,s.jsxs)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:[(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsxs)(x.Space,{align:"center",children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Internal User Page Visibility"}),!i&&(0,s.jsx)(el.Tag,{color:"default",style:{marginLeft:"8px"},children:"Not set (all pages visible)"}),i&&(0,s.jsxs)(el.Tag,{color:"blue",style:{marginLeft:"8px"},children:[o.length," page",1!==o.length?"s":""," selected"]})]}),t&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:t}),(0,s.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px",fontStyle:"italic"},children:"By default, all pages are visible to internal users. Select specific pages to restrict visibility."}),(0,s.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px",color:"#8b5cf6"},children:"Note: Only pages accessible to internal user roles are shown here. Admin-only pages are excluded as they cannot be made visible to internal users regardless of this setting."})]}),(0,s.jsx)(eJ.Collapse,{items:[{key:"page-visibility",label:"Configure Page Visibility",children:(0,s.jsxs)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:[(0,s.jsx)(eh.Checkbox.Group,{value:o,onChange:d,style:{width:"100%"},children:(0,s.jsx)(x.Space,{direction:"vertical",size:"middle",style:{width:"100%"},children:Object.entries(n).map(([e,t])=>(0,s.jsxs)("div",{children:[(0,s.jsx)(y.Typography.Text,{strong:!0,style:{fontSize:"11px",color:"#6b7280",letterSpacing:"0.05em",display:"block",marginBottom:"8px"},children:e}),(0,s.jsx)(x.Space,{direction:"vertical",size:"small",style:{marginLeft:"16px",width:"100%"},children:t.map(e=>(0,s.jsx)("div",{style:{marginBottom:"4px"},children:(0,s.jsx)(eh.Checkbox,{value:e.page,children:(0,s.jsxs)(x.Space,{direction:"vertical",size:0,children:[(0,s.jsx)(y.Typography.Text,{children:e.label}),(0,s.jsx)(y.Typography.Text,{type:"secondary",style:{fontSize:"12px"},children:e.description})]})})},e.page))})]},e))})}),(0,s.jsxs)(x.Space,{children:[(0,s.jsx)(m.Button,{type:"primary",onClick:()=>{l({enabled_ui_pages_internal_users:o.length>0?o:null})},loading:r,disabled:r,children:"Save Page Visibility Settings"}),i&&(0,s.jsx)(m.Button,{onClick:()=>{d([]),l({enabled_ui_pages_internal_users:null})},loading:r,disabled:r,children:"Reset to Default (All Pages)"})]})]})}]})]})}function eZ(){let e,{accessToken:r}=(0,t.default)(),{data:l,isLoading:i,isError:a,error:n}=(0,eK.useUISettings)(),{mutate:o,isPending:d,error:c}=(e=(0,H.useQueryClient)(),(0,K.useMutation)({mutationFn:async e=>{if(!r)throw Error("Access token is required");return(0,w.updateUiSettings)(r,e)},onSuccess:()=>{e.invalidateQueries({queryKey:eH.all})}})),u=l?.field_schema,m=u?.properties?.disable_model_add_for_internal_users,h=u?.properties?.disable_team_admin_delete_team_user,g=u?.properties?.require_auth_for_public_ai_hub,_=u?.properties?.forward_client_headers_to_llm_api,f=u?.properties?.forward_llm_provider_auth_headers,j=u?.properties?.enable_projects_ui,v=u?.properties?.enable_chat_ui,b=u?.properties?.enabled_ui_pages_internal_users,k=u?.properties?.disable_agents_for_internal_users,I=u?.properties?.allow_agents_for_team_admins,T=u?.properties?.disable_vector_stores_for_internal_users,C=u?.properties?.allow_vector_stores_for_team_admins,E=u?.properties?.scope_user_search_to_org,N=u?.properties?.disable_custom_api_keys,O=l?.values??{},P=!!O.disable_model_add_for_internal_users,F=!!O.disable_team_admin_delete_team_user,A=!!O.disable_agents_for_internal_users,M=!!O.disable_vector_stores_for_internal_users;return(0,s.jsx)(W.Card,{title:"UI Settings",children:i?(0,s.jsx)(Y.Skeleton,{active:!0}):a?(0,s.jsx)(p.Alert,{type:"error",message:"Could not load UI settings",description:n instanceof Error?n.message:void 0}):(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",style:{width:"100%"},children:[u?.description&&(0,s.jsx)(y.Typography.Paragraph,{style:{marginBottom:0},children:u.description}),c&&(0,s.jsx)(p.Alert,{type:"error",message:"Could not update UI settings",description:c instanceof Error?c.message:void 0}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:P,disabled:d,loading:d,onChange:e=>{o({disable_model_add_for_internal_users:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":m?.description??"Disable model add for internal users"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Disable model add for internal users"}),m?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:m.description})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:F,disabled:d,loading:d,onChange:e=>{o({disable_team_admin_delete_team_user:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":h?.description??"Disable team admin delete team user"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Disable team admin delete team user"}),h?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:h.description})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:O.require_auth_for_public_ai_hub,disabled:d,loading:d,onChange:e=>{o({require_auth_for_public_ai_hub:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":g?.description??"Require authentication for public AI Hub"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Require authentication for public AI Hub"}),g?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:g.description})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.forward_client_headers_to_llm_api,disabled:d,loading:d,onChange:e=>{o({forward_client_headers_to_llm_api:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":_?.description??"Forward client headers to LLM API"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Forward client headers to LLM API"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:_?.description??"Forwards client headers (Authorization, anthropic-beta, and x-* custom headers) to the upstream LLM. Enable for Claude Code with a Max subscription (forwards the OAuth token) or to pass custom/tracing headers through to the provider. Independent of the BYOK toggle — enable only the one(s) you need."})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.forward_llm_provider_auth_headers,disabled:d,loading:d,onChange:e=>{o({forward_llm_provider_auth_headers:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":f?.description??"Forward LLM provider auth headers"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Forward LLM provider auth headers"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:f?.description??"Forwards provider auth headers (x-api-key, x-goog-api-key, api-key, ocp-apim-subscription-key) to the upstream LLM, overriding any deployment-configured key for that request. Enable for Claude Code BYOK (clients bring their own API key). Independent of the client-headers toggle — enable only the one(s) you need."})]})]}),j&&(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.enable_projects_ui,disabled:d,loading:d,onChange:e=>{o({enable_projects_ui:e},{onSuccess:()=>{S.default.success("UI settings updated successfully. Refreshing page..."),setTimeout(()=>window.location.reload(),1e3)},onError:e=>{S.default.fromBackend(e)}})},"aria-label":j.description??"Enable Projects UI"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"[BETA] Enable Projects (page will refresh)"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:j.description??"If enabled, shows the Projects feature in the UI sidebar and the project field in key management."})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.enable_chat_ui,disabled:d,loading:d,onChange:e=>{o({enable_chat_ui:e},{onSuccess:()=>{S.default.success("UI settings updated successfully. Refreshing page..."),setTimeout(()=>window.location.reload(),1e3)},onError:e=>{S.default.fromBackend(e)}})},"aria-label":v?.description??"Enable Chat page"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"[BETA] Enable Chat page (page will refresh)"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:v?.description??"If enabled, shows the Chat page in the UI sidebar, letting users chat with an LLM and connect their own MCP server credentials via OAuth."})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:A,disabled:d,loading:d,onChange:e=>{o({disable_agents_for_internal_users:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":k?.description??"Disable agents for internal users"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Disable agents for internal users"}),k?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:k.description})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",style:{marginLeft:32},children:[(0,s.jsx)(J.Switch,{checked:!!O.allow_agents_for_team_admins,disabled:d||!A,loading:d,onChange:e=>{o({allow_agents_for_team_admins:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":I?.description??"Allow agents for team admins"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,type:A?void 0:"secondary",children:"Allow agents for team admins"}),I?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:I.description})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:M,disabled:d,loading:d,onChange:e=>{o({disable_vector_stores_for_internal_users:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":T?.description??"Disable vector stores for internal users"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Disable vector stores for internal users"}),T?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:T.description})]})]}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",style:{marginLeft:32},children:[(0,s.jsx)(J.Switch,{checked:!!O.allow_vector_stores_for_team_admins,disabled:d||!M,loading:d,onChange:e=>{o({allow_vector_stores_for_team_admins:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":C?.description??"Allow vector stores for team admins"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,type:M?void 0:"secondary",children:"Allow vector stores for team admins"}),C?.description&&(0,s.jsx)(y.Typography.Text,{type:"secondary",children:C.description})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.scope_user_search_to_org,disabled:d,loading:d,onChange:e=>{o({scope_user_search_to_org:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":E?.description??"Scope user search to organization"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Scope user search to organization"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:E?.description??"If enabled, the user search endpoint restricts results by organization. When off, any authenticated user can search all users."})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsxs)(x.Space,{align:"start",size:"middle",children:[(0,s.jsx)(J.Switch,{checked:!!O.disable_custom_api_keys,disabled:d,loading:d,onChange:e=>{o({disable_custom_api_keys:e},{onSuccess:()=>{S.default.success("UI settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})},"aria-label":N?.description??"Disable custom Virtual key values"}),(0,s.jsxs)(x.Space,{direction:"vertical",size:4,children:[(0,s.jsx)(y.Typography.Text,{strong:!0,children:"Disable custom Virtual key values"}),(0,s.jsx)(y.Typography.Text,{type:"secondary",children:N?.description??"If true, users cannot specify custom key values. All keys must be auto-generated."})]})]}),(0,s.jsx)(eE.Divider,{}),(0,s.jsx)(eX,{enabledPagesInternalUsers:O.enabled_ui_pages_internal_users,enabledPagesPropertyDescription:b?.description,isUpdating:d,onUpdate:e=>{o(e,{onSuccess:()=>{S.default.success("Page visibility settings updated successfully")},onError:e=>{S.default.fromBackend(e)}})}})]})})}var e0=e.i(66146),e1=e.i(439573),e4=e.i(519455),e6=e.i(515288),e2=e.i(110204),e3=e.i(967489),e8=e.i(699375),e5=e.i(624687),e7=e.i(714004),e9=e.i(302747);let se={info:"Info",warning:"Warning",error:"Error"},ss={enabled:!1,message:"",severity:"info",revision:""};function st(){let e,{accessToken:r}=(0,t.default)(),{data:l,isLoading:i}=(0,e0.useUserBanner)(r),{mutate:a,isPending:n}=(e=(0,H.useQueryClient)(),(0,K.useMutation)({mutationFn:async e=>{if(!r)throw Error("Access token is required");return await (0,w.updateUserBanner)(r,e)},onSuccess:()=>{e.invalidateQueries({queryKey:e0.userBannerKeys.all})}})),o=l??ss;return(0,s.jsx)(sr,{persisted:o,isLoading:i,isPending:n,saveBanner:a},JSON.stringify(o))}function sr({persisted:e,isLoading:t,isPending:r,saveBanner:l}){let[i,a]=(0,j.useState)({enabled:e.enabled,message:e.message,severity:e.severity}),n=i.enabled&&""===i.message.trim();return(0,s.jsxs)(e6.Card,{children:[(0,s.jsxs)(e6.CardHeader,{children:[(0,s.jsx)(e6.CardTitle,{children:"User Banner"}),(0,s.jsx)(e6.CardDescription,{children:"Publish an announcement to all dashboard users. Markdown is supported; the banner appears below the header on every page until you unpublish it. Users can dismiss it, and it reappears whenever the content changes."})]}),(0,s.jsx)(e6.CardContent,{children:t?(0,s.jsx)(e9.Skeleton,{className:"h-40 w-full"}):(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)(e8.Switch,{checked:i.enabled,onCheckedChange:e=>a({...i,enabled:e}),"aria-label":"Publish user banner"}),(0,s.jsx)(e2.Label,{children:"Publish user banner"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(e2.Label,{htmlFor:"user-banner-message",children:"Message"}),(0,s.jsx)(e5.Textarea,{id:"user-banner-message",value:i.message,maxLength:4e3,rows:3,placeholder:"**Scheduled maintenance** tonight at 10 PM UTC. See [status page](https://example.com).",onChange:e=>a({...i,message:e.target.value})}),n&&(0,s.jsx)("p",{className:"text-sm text-destructive",children:"Add a message before publishing."})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(e2.Label,{children:"Severity"}),(0,s.jsxs)(e3.Select,{value:i.severity,onValueChange:e=>a({...i,severity:e??"info"}),children:[(0,s.jsx)(e3.SelectTrigger,{className:"w-48","aria-label":"Banner severity",children:(0,s.jsx)(e3.SelectValue,{placeholder:"Severity"})}),(0,s.jsx)(e3.SelectContent,{children:Object.keys(se).map(e=>(0,s.jsx)(e3.SelectItem,{value:e,children:se[e]},e))})]})]}),""!==i.message.trim()&&(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(e2.Label,{children:"Preview"}),(0,s.jsxs)(e1.Alert,{variant:i.severity,children:[e7.SEVERITY_ICONS[i.severity],(0,s.jsx)(e1.AlertDescription,{children:(0,s.jsx)(e7.UserBannerMarkdown,{message:i.message})})]})]}),(0,s.jsx)("div",{children:(0,s.jsx)(e4.Button,{onClick:()=>{l(i,{onSuccess:()=>{S.default.success("User banner updated successfully")},onError:e=>{S.default.fromBackend(e)}})},disabled:r||n,children:r?"Saving...":"Save banner"})})]})})]})}var sl=e.i(431703);let si=async e=>{let s=(0,w.getProxyBaseUrl)(),t=s?`${s}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",r=await fetch(t,{method:"GET",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,sl.deriveErrorMessage)(e))}return await r.json()},sa=async(e,s)=>{let t=(0,w.getProxyBaseUrl)(),r=t?`${t}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",l=await fetch(r,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(s)});if(!l.ok){let e=await l.json();throw Error((0,sl.deriveErrorMessage)(e))}return await l.json()},sn=async e=>{let s=(0,w.getProxyBaseUrl)(),t=s?`${s}/config_overrides/hashicorp_vault`:"/config_overrides/hashicorp_vault",r=await fetch(t,{method:"DELETE",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,sl.deriveErrorMessage)(e))}return await r.json()},so=async e=>{let s=(0,w.getProxyBaseUrl)(),t=s?`${s}/config_overrides/hashicorp_vault/test_connection`:"/config_overrides/hashicorp_vault/test_connection",r=await fetch(t,{method:"POST",headers:{[(0,w.getGlobalLitellmHeaderName)()]:`Bearer ${e}`}});if(!r.ok){let e=await r.json();throw Error((0,sl.deriveErrorMessage)(e))}return await r.json()},sd=(0,ee.createQueryKeys)("hashicorpVaultConfig"),sc=()=>{let{accessToken:e}=(0,t.default)();return(0,Z.useQuery)({queryKey:sd.list({}),queryFn:async()=>{if(!e)throw Error("Access token is required");return si(e)},enabled:!!e,staleTime:36e5,gcTime:36e5})},su=e=>{let s=(0,H.useQueryClient)();return(0,K.useMutation)({mutationFn:async s=>{if(!e)throw Error("Access token is required");return sa(e,s)},onSuccess:()=>{s.invalidateQueries({queryKey:sd.all})}})};var sp=e.i(525720),ei=ei,sm=e.i(465261);let sh=(0,e.i(475254).default)("plug-zap",[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]]),sg=new Set(["vault_token","approle_secret_id","client_key"]),s_={vault_addr:"Vault Address",vault_namespace:"Namespace",vault_mount_name:"KV Mount Name",vault_path_prefix:"Path Prefix",vault_token:"Token",approle_role_id:"Role ID",approle_secret_id:"Secret ID",approle_mount_path:"Mount Path",client_cert:"Client Certificate",client_key:"Client Key",vault_cert_role:"Certificate Role"},sx=[{title:"Connection",fields:["vault_addr","vault_namespace","vault_mount_name","vault_path_prefix"]},{title:"Token Authentication",subtitle:"Use a Vault token to authenticate. Only one auth method is required.",fields:["vault_token"]},{title:"AppRole Authentication",subtitle:"Use AppRole credentials to authenticate. Only one auth method is required.",fields:["approle_role_id","approle_secret_id","approle_mount_path"]},{title:"TLS",subtitle:"Optional client certificate for mTLS.",fields:["client_cert","client_key","vault_cert_role"]}],sf=({isVisible:e,onCancel:r,onSuccess:l})=>{let[i]=h.Form.useForm(),{accessToken:a}=(0,t.default)(),{data:n}=sc(),{mutate:o,isPending:d}=su(a),c=n?.field_schema,u=c?.properties??{},p=n?.values??{};(0,j.useEffect)(()=>{if(e&&n){i.resetFields();let e={};for(let[s,t]of Object.entries(p))sg.has(s)||(e[s]=t);i.setFieldsValue(e)}},[e,n,i]);let f=()=>{i.resetFields(),r()},v=e=>{let t=u[e];if(!t)return null;let r="vault_addr"===e?[{pattern:/^https?:\/\/.+/,message:"Must start with http:// or https://"}]:void 0,l=sg.has(e),i=p[e],a=l&&null!=i&&""!==i?`Leave blank to keep existing (${i})`:t?.description;return(0,s.jsx)(h.Form.Item,{name:e,label:s_[e]??e,rules:r,children:l?(0,s.jsx)(g.Input.Password,{placeholder:a}):(0,s.jsx)(g.Input,{placeholder:t?.description})},e)};return(0,s.jsx)(_.Modal,{title:"Edit Hashicorp Vault Configuration",open:e,width:700,footer:(0,s.jsxs)(x.Space,{children:[(0,s.jsx)(m.Button,{onClick:f,disabled:d,children:"Cancel"}),(0,s.jsx)(m.Button,{type:"primary",loading:d,onClick:()=>i.submit(),children:d?"Saving...":"Save"})]}),onCancel:f,children:(0,s.jsx)(h.Form,{form:i,layout:"vertical",onFinish:e=>{let s={};for(let[t,r]of Object.entries(e))null!=r&&""!==r?s[t]=r:sg.has(t)||(s[t]="");o(s,{onSuccess:()=>{S.default.success("Hashicorp Vault configuration updated successfully"),l()},onError:e=>{S.default.fromBackend(e)}})},children:sx.map((e,t)=>(0,s.jsxs)("div",{children:[t>0&&(0,s.jsx)(eE.Divider,{}),(0,s.jsx)(y.Typography.Title,{level:5,style:{marginBottom:4},children:e.title}),e.subtitle&&(0,s.jsx)(y.Typography.Paragraph,{type:"secondary",style:{marginBottom:16},children:e.subtitle}),e.fields.map(v)]},e.title))})})},{Title:sy,Paragraph:sj}=y.Typography;function sv({onAdd:e}){return(0,s.jsx)("div",{className:"bg-white p-12 rounded-lg border border-dashed border-gray-300 text-center w-full",children:(0,s.jsx)(eM.Empty,{image:eM.Empty.PRESENTED_IMAGE_SIMPLE,description:(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(sy,{level:4,children:"No Vault Configuration Found"}),(0,s.jsx)(sj,{type:"secondary",className:"max-w-md mx-auto",children:"Configure Hashicorp Vault to securely manage provider API keys and secrets for your LiteLLM deployment."})]}),children:(0,s.jsx)(m.Button,{type:"primary",size:"large",onClick:e,className:"flex items-center gap-2 mx-auto mt-4",children:"Configure Vault"})})})}let{Title:sb,Text:sS}=y.Typography,sw={column:{xxl:1,xl:1,lg:1,md:1,sm:1,xs:1}};function sk(){let e,{accessToken:r}=(0,t.default)(),{data:l,isLoading:i,isError:a,error:n}=sc(),{mutate:o,isPending:d}=(e=(0,H.useQueryClient)(),(0,K.useMutation)({mutationFn:async()=>{if(!r)throw Error("Access token is required");return sn(r)},onSuccess:()=>{e.invalidateQueries({queryKey:sd.all})}})),{mutate:c,isPending:u}=su(r),[h,g]=(0,j.useState)(!1),[_,f]=(0,j.useState)(!1),[v,b]=(0,j.useState)(null),[w,k]=(0,j.useState)(!1),I=l?.values??{},T=!!I.vault_addr,C=async()=>{if(r){k(!0);try{let e=await so(r);S.default.success(e.message||"Connection to Vault successful!")}catch(e){S.default.fromBackend(e)}finally{k(!1)}}};return(0,s.jsxs)(s.Fragment,{children:[i?(0,s.jsx)(W.Card,{children:(0,s.jsx)(Y.Skeleton,{active:!0})}):a?(0,s.jsx)(W.Card,{children:(0,s.jsx)(p.Alert,{type:"error",message:"Could not load Hashicorp Vault configuration",description:n instanceof Error?n.message:void 0})}):(0,s.jsx)(W.Card,{children:(0,s.jsxs)(x.Space,{direction:"vertical",size:"large",className:"w-full",children:[(0,s.jsxs)(sp.Flex,{justify:"space-between",align:"center",children:[(0,s.jsxs)(sp.Flex,{align:"center",gap:12,children:[(0,s.jsx)(sm.KeyRound,{className:"w-6 h-6 text-gray-400"}),(0,s.jsxs)("div",{children:[(0,s.jsx)(sb,{level:3,style:{marginBottom:0},children:"Hashicorp Vault"}),(0,s.jsx)(sS,{type:"secondary",children:"Manage secret manager configuration"})]})]}),(0,s.jsx)(x.Space,{children:T&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(m.Button,{icon:(0,s.jsx)(sh,{className:"w-4 h-4"}),loading:w,onClick:C,children:"Test Connection"}),(0,s.jsx)(m.Button,{icon:(0,s.jsx)(ei.default,{className:"w-4 h-4"}),onClick:()=>g(!0),children:"Edit Configuration"}),(0,s.jsx)(m.Button,{danger:!0,icon:(0,s.jsx)(en.Trash2,{className:"w-4 h-4"}),onClick:()=>f(!0),children:"Delete Configuration"})]})})]}),T&&(0,s.jsx)(p.Alert,{type:"info",showIcon:!0,message:'Secrets must be stored with the field name "key"',description:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(sS,{code:!0,children:"vault kv put secret/SECRET_NAME key=secret_value"}),(0,s.jsx)("br",{}),(0,s.jsx)(y.Typography.Link,{href:"https://docs.litellm.ai/docs/secret_managers/hashicorp_vault",target:"_blank",children:"View documentation"})]})}),T?(()=>{let e=Object.entries(I).filter(([e,s])=>null!=s&&""!==s);return 0===e.length?null:(0,s.jsxs)(er.Descriptions,{bordered:!0,...sw,children:[(0,s.jsx)(er.Descriptions.Item,{label:"Auth Method",children:(0,s.jsx)(sS,{children:I.approle_role_id||I.approle_secret_id?"AppRole":I.client_cert&&I.client_key?"TLS Certificate":I.vault_token?"Token":"None"})}),e.map(([e])=>{let t;return(0,s.jsx)(er.Descriptions.Item,{label:s_[e]??e,children:(t=I[e])?sg.has(e)?(0,s.jsxs)(sp.Flex,{justify:"space-between",align:"center",children:[(0,s.jsx)(sS,{className:"font-mono text-gray-600",children:t}),(0,s.jsx)(m.Button,{type:"text",size:"small",danger:!0,icon:(0,s.jsx)(en.Trash2,{className:"w-3.5 h-3.5"}),onClick:()=>b(e)})]}):(0,s.jsx)(sS,{className:"font-mono text-gray-600",children:t}):(0,s.jsx)("span",{className:"text-gray-400 italic",children:"Not configured"})},e)})]})})():(0,s.jsx)(sv,{onAdd:()=>g(!0)})]})}),(0,s.jsx)(sf,{isVisible:h,onCancel:()=>g(!1),onSuccess:()=>g(!1)}),(0,s.jsx)(eS.default,{isOpen:_,title:"Delete Hashicorp Vault Configuration?",message:"Models using Vault secrets will lose access to their API keys until a new configuration is saved.",resourceInformationTitle:"Vault Configuration",resourceInformation:[{label:"Vault Address",value:I.vault_addr}],onCancel:()=>f(!1),onOk:()=>{o(void 0,{onSuccess:()=>{S.default.success("Hashicorp Vault configuration deleted"),f(!1)},onError:e=>{S.default.fromBackend(e)}})},confirmLoading:d}),(0,s.jsx)(eS.default,{isOpen:null!==v,title:`Clear ${v?s_[v]??v:""}?`,message:"This will remove the stored value.",resourceInformationTitle:"Field",resourceInformation:[{label:"Field",value:v?s_[v]??v:""}],onCancel:()=>b(null),onOk:()=>{v&&c({[v]:""},{onSuccess:()=>{S.default.success(`${s_[v]??v} cleared`),b(null)},onError:e=>{S.default.fromBackend(e)}})},confirmLoading:u})]})}var sI=e.i(955135),sT=e.i(751904),sC=e.i(646563);let{Title:sE,Text:sN,Paragraph:sO}=y.Typography;function sP(){let{accessToken:e}=(0,t.default)(),[r,l]=(0,j.useState)([]),[i,a]=(0,j.useState)(!0),[n,o]=(0,j.useState)(!1),[d,c]=(0,j.useState)(!1),[u,p]=(0,j.useState)(null),[f]=h.Form.useForm();(0,j.useEffect)(()=>{e&&(0,w.getConfigFieldSetting)(e,"plugins").then(e=>{let s=e?.field_value;l(Array.isArray(s)?s:[])}).catch(()=>l([])).finally(()=>a(!1))},[e]);let y=async s=>{if(e){o(!0);try{await (0,w.updateConfigFieldSetting)(e,"plugins",s),l(s)}finally{o(!1)}}},v=async()=>{let e=await f.validateFields(),s=null!==u?r.map((s,t)=>t===u?e:s):[...r,e];await y(s),c(!1)},b=[{title:"Name",dataIndex:"name",key:"name",render:e=>(0,s.jsx)(sN,{code:!0,children:e})},{title:"Display Name",dataIndex:"display_name",key:"display_name"},{title:"URL",dataIndex:"url",key:"url",render:e=>(0,s.jsx)("a",{href:e,target:"_blank",rel:"noopener noreferrer",children:e})},{title:"Plugin Key",dataIndex:"plugin_key",key:"plugin_key",render:e=>e?(0,s.jsx)(sN,{code:!0,children:"•".repeat(8)}):(0,s.jsx)(sN,{type:"secondary",children:"—"})},{title:"Actions",key:"actions",render:(e,t,l)=>(0,s.jsxs)(x.Space,{children:[(0,s.jsx)(m.Button,{icon:(0,s.jsx)(sT.EditOutlined,{}),size:"small",onClick:()=>{p(l),f.setFieldsValue({...r[l],plugin_key:""}),c(!0)}}),(0,s.jsx)(m.Button,{icon:(0,s.jsx)(sI.DeleteOutlined,{}),size:"small",danger:!0,onClick:()=>{y(r.filter((e,s)=>s!==l))}})]})}];return(0,s.jsxs)(W.Card,{children:[(0,s.jsx)(sE,{level:4,children:"Plugins"}),(0,s.jsx)(sO,{children:"Register external services as plugins. Once added, users can toggle to the plugin from the mode switcher in the top-left of the sidebar."}),(0,s.jsxs)(sO,{type:"secondary",style:{fontSize:12},children:["Each plugin must expose ",(0,s.jsx)(sN,{code:!0,children:"GET /api/plugin-manifest"})," returning nav items and capabilities."]}),(0,s.jsx)(m.Button,{type:"primary",icon:(0,s.jsx)(sC.PlusOutlined,{}),onClick:()=>{p(null),f.resetFields(),c(!0)},style:{marginBottom:16},children:"Add Plugin"}),(0,s.jsx)(eN.Table,{dataSource:r,columns:b,rowKey:"name",loading:i,pagination:!1,size:"small"}),(0,s.jsx)(_.Modal,{title:null!==u?"Edit Plugin":"Add Plugin",open:d,onOk:v,onCancel:()=>c(!1),confirmLoading:n,okText:"Save",children:(0,s.jsxs)(h.Form,{form:f,layout:"vertical",style:{marginTop:16},children:[(0,s.jsx)(h.Form.Item,{name:"name",label:"Name (identifier)",rules:[{required:!0,message:"Required"}],extra:"Used in URLs and config. No spaces. E.g. litellm-platform-plugin",children:(0,s.jsx)(g.Input,{placeholder:"litellm-platform-plugin"})}),(0,s.jsx)(h.Form.Item,{name:"display_name",label:"Display Name",rules:[{required:!0,message:"Required"}],children:(0,s.jsx)(g.Input,{placeholder:"Agent Control Plane"})}),(0,s.jsx)(h.Form.Item,{name:"url",label:"URL",rules:[{required:!0,message:"Required"},{type:"url",message:"Must be a valid URL"}],extra:"Base URL of the plugin service",children:(0,s.jsx)(g.Input,{placeholder:"https://your-plugin.example.com"})}),(0,s.jsx)(h.Form.Item,{name:"plugin_key",label:"Plugin Key",extra:"Optional. The plugin's own credential, injected as Authorization: Bearer only when litellm reverse-proxies API calls to the plugin's backend (/plugin-proxy//*). Leave blank for plugins that use the forwarded litellm user token (e.g. iframe plugins) — that path uses the user's token, not this key.",children:(0,s.jsx)(g.Input.Password,{placeholder:null!==u?"Leave blank to keep current key":"sk-... (optional)"})})]})})]})}let sF=({isAddSSOModalVisible:e,isInstructionsModalVisible:t,handleAddSSOOk:r,handleAddSSOCancel:l,handleShowInstructions:i,handleInstructionsOk:a,handleInstructionsCancel:n,form:o,accessToken:d,ssoConfigured:c=!1})=>{let[u,p]=(0,j.useState)(!1);(0,j.useEffect)(()=>{(async()=>{if(e&&d)try{let e=await (0,w.getSSOSettings)(d);if(e&&e.values){let s=(e=>{if(e.google_client_id)return"google";if(e.microsoft_client_id)return"microsoft";if(e.generic_client_id){let s="string"==typeof e.generic_authorization_endpoint?e.generic_authorization_endpoint:"";return s.includes("okta")||s.includes("auth0")?"okta":"generic"}return e.saml_idp_metadata_url||e.saml_idp_metadata_xml?"saml":null})(e.values),t={};if(e.values.role_mappings){let s=e.values.role_mappings,r=e=>e&&0!==e.length?e.join(", "):"";t={use_role_mappings:!0,group_claim:s.group_claim,default_role:s.default_role||"internal_user",proxy_admin_teams:r(s.roles?.proxy_admin),admin_viewer_teams:r(s.roles?.proxy_admin_viewer),internal_user_teams:r(s.roles?.internal_user),internal_viewer_teams:r(s.roles?.internal_user_viewer)}}let r={sso_provider:s,proxy_base_url:e.values.proxy_base_url,user_email:e.values.user_email,...e.values,...t,saml_allow_unsolicited:"true"===e.values.saml_allow_unsolicited};o.resetFields(),setTimeout(()=>{o.setFieldsValue(r)},100)}}catch(e){console.error("Failed to load SSO settings:",e)}})()},[e,d,o]);let g=async e=>{if(!d)return void S.default.fromBackend("No access token available");try{let{proxy_admin_teams:s,admin_viewer_teams:t,internal_user_teams:r,internal_viewer_teams:l,default_role:a,group_claim:n,use_role_mappings:o,...c}=e,u={...c};if("boolean"==typeof u.saml_allow_unsolicited&&(u.saml_allow_unsolicited=u.saml_allow_unsolicited?"true":"false"),o){let e=e=>e&&""!==e.trim()?e.split(",").map(e=>e.trim()).filter(e=>e.length>0):[];u.role_mappings={provider:"generic",group_claim:n,default_role:({internal_user_viewer:"internal_user_viewer",internal_user:"internal_user",proxy_admin_viewer:"proxy_admin_viewer",proxy_admin:"proxy_admin"})[a]||"internal_user",roles:{proxy_admin:e(s),proxy_admin_viewer:e(t),internal_user:e(r),internal_user_viewer:e(l)}}}await (0,w.updateSSOSettings)(d,u),i(e)}catch(e){S.default.fromBackend("Failed to save SSO settings: "+(0,V.parseErrorMessage)(e))}},x=async()=>{if(!d)return void S.default.fromBackend("No access token available");try{await (0,w.updateSSOSettings)(d,{google_client_id:null,google_client_secret:null,microsoft_client_id:null,microsoft_client_secret:null,microsoft_tenant:null,generic_client_id:null,generic_client_secret:null,generic_authorization_endpoint:null,generic_token_endpoint:null,generic_userinfo_endpoint:null,saml_idp_metadata_url:null,saml_idp_metadata_xml:null,saml_sp_entity_id:null,saml_allow_unsolicited:null,generic_scope:null,proxy_base_url:null,user_email:null,sso_provider:null,role_mappings:null}),o.resetFields(),p(!1),r(),S.default.success("SSO settings cleared successfully")}catch(e){console.error("Failed to clear SSO settings:",e),S.default.fromBackend("Failed to clear SSO settings")}};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(_.Modal,{title:c?"Edit SSO Settings":"Add SSO",open:e,width:800,footer:null,onOk:r,onCancel:l,children:(0,s.jsxs)(h.Form,{form:o,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(h.Form.Item,{label:"SSO Provider",name:"sso_provider",rules:[{required:!0,message:"Please select an SSO provider"}],children:(0,s.jsx)(eg.Select,{children:Object.entries(eu).map(([e,t])=>(0,s.jsx)(eg.Select.Option,{value:e,children:(0,s.jsxs)("div",{style:{display:"flex",alignItems:"center",padding:"4px 0"},children:[t&&(0,s.jsx)(eo.Logo,{src:t,label:ep[e]||e,className:"h-6 w-6 mr-3 object-contain"}),(0,s.jsx)("span",{children:ep[e]||e.charAt(0).toUpperCase()+e.slice(1)+" SSO"})]})},e))})}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let s=e("sso_provider");return s?ex(s):null}}),(0,s.jsx)(h.Form.Item,{label:"Proxy Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Proxy Base URL",name:"proxy_base_url",normalize:e=>e?.trim(),rules:[{required:!0,message:"Please enter the proxy base url"},{pattern:/^https?:\/\/.+/,message:"URL must start with http:// or https://"},{validator:(e,s)=>s&&/^https?:\/\/.+/.test(s)&&s.endsWith("/")?Promise.reject("URL must not end with a trailing slash"):Promise.resolve()}],children:(0,s.jsx)(C.TextInput,{placeholder:"https://example.com"})}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.sso_provider!==s.sso_provider,children:({getFieldValue:e})=>{let t=e("sso_provider");return"okta"===t||"generic"===t?(0,s.jsx)(h.Form.Item,{label:"Use Role Mappings",name:"use_role_mappings",valuePropName:"checked",children:(0,s.jsx)(eh.Checkbox,{})}):null}}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.use_role_mappings!==s.use_role_mappings,children:({getFieldValue:e})=>e("use_role_mappings")?(0,s.jsx)(h.Form.Item,{label:"Group Claim",name:"group_claim",rules:[{required:!0,message:"Please enter the group claim"}],children:(0,s.jsx)(C.TextInput,{})}):null}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.use_role_mappings!==s.use_role_mappings,children:({getFieldValue:e})=>e("use_role_mappings")?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(h.Form.Item,{label:"Default Role",name:"default_role",initialValue:"Internal User",children:(0,s.jsxs)(eg.Select,{children:[(0,s.jsx)(eg.Select.Option,{value:"internal_user_viewer",children:"Internal Viewer"}),(0,s.jsx)(eg.Select.Option,{value:"internal_user",children:"Internal User"}),(0,s.jsx)(eg.Select.Option,{value:"proxy_admin_viewer",children:"Admin Viewer"}),(0,s.jsx)(eg.Select.Option,{value:"proxy_admin",children:"Proxy Admin"})]})}),(0,s.jsx)(h.Form.Item,{label:"Proxy Admin Teams",name:"proxy_admin_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Admin Viewer Teams",name:"admin_viewer_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Internal User Teams",name:"internal_user_teams",children:(0,s.jsx)(C.TextInput,{})}),(0,s.jsx)(h.Form.Item,{label:"Internal Viewer Teams",name:"internal_viewer_teams",children:(0,s.jsx)(C.TextInput,{})})]}):null})]}),(0,s.jsxs)("div",{style:{textAlign:"right",marginTop:"10px",display:"flex",justifyContent:"flex-end",alignItems:"center",gap:"8px"},children:[c&&(0,s.jsx)(m.Button,{onClick:()=>p(!0),style:{backgroundColor:"#6366f1",borderColor:"#6366f1",color:"white"},onMouseEnter:e=>{e.currentTarget.style.backgroundColor="#5558eb",e.currentTarget.style.borderColor="#5558eb"},onMouseLeave:e=>{e.currentTarget.style.backgroundColor="#6366f1",e.currentTarget.style.borderColor="#6366f1"},children:"Clear"}),(0,s.jsx)(m.Button,{htmlType:"submit",children:"Save"})]})]})}),(0,s.jsxs)(_.Modal,{title:"Confirm Clear SSO Settings",open:u,onOk:x,onCancel:()=>p(!1),okText:"Yes, Clear",cancelText:"Cancel",okButtonProps:{danger:!0,style:{backgroundColor:"#dc2626",borderColor:"#dc2626"}},children:[(0,s.jsx)("p",{children:"Are you sure you want to clear all SSO settings? This action cannot be undone."}),(0,s.jsx)("p",{children:"Users will no longer be able to login using SSO after this change."})]}),(0,s.jsxs)(_.Modal,{title:"SSO Setup Instructions",open:t,width:800,footer:null,onOk:a,onCancel:n,children:[(0,s.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,s.jsx)(I.Text,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,s.jsx)(I.Text,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,s.jsx)(I.Text,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,s.jsx)(I.Text,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,s.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,s.jsx)(m.Button,{onClick:a,children:"Done"})})]})]})},sA=({accessToken:e,onSuccess:t})=>{let[r]=h.Form.useForm(),[l,i]=(0,j.useState)(!1);(0,j.useEffect)(()=>{(async()=>{if(e)try{let s=await (0,w.getSSOSettings)(e);if(s&&s.values){let e=s.values.ui_access_mode,t={};e&&"object"==typeof e?t={ui_access_mode_type:e.type,restricted_sso_group:e.restricted_sso_group,sso_group_jwt_field:e.sso_group_jwt_field}:"string"==typeof e&&(t={ui_access_mode_type:e,restricted_sso_group:s.values.restricted_sso_group,sso_group_jwt_field:s.values.team_ids_jwt_field||s.values.sso_group_jwt_field}),r.setFieldsValue(t)}}catch(e){console.error("Failed to load UI access settings:",e)}})()},[e,r]);let a=async s=>{if(!e)return void S.default.fromBackend("No access token available");i(!0);try{let r;r="all_authenticated_users"===s.ui_access_mode_type?{ui_access_mode:"none"}:{ui_access_mode:{type:s.ui_access_mode_type,restricted_sso_group:s.restricted_sso_group,sso_group_jwt_field:s.sso_group_jwt_field}},await (0,w.updateSSOSettings)(e,r),t()}catch(e){console.error("Failed to save UI access settings:",e),S.default.fromBackend("Failed to save UI access settings")}finally{i(!1)}};return(0,s.jsxs)("div",{style:{padding:"16px"},children:[(0,s.jsx)("div",{style:{marginBottom:"16px"},children:(0,s.jsx)(I.Text,{style:{fontSize:"14px",color:"#6b7280"},children:"Configure who can access the UI interface and how group information is extracted from JWT tokens."})}),(0,s.jsxs)(h.Form,{form:r,onFinish:a,layout:"vertical",children:[(0,s.jsx)(h.Form.Item,{label:"UI Access Mode",name:"ui_access_mode_type",tooltip:"Controls who can access the UI interface",children:(0,s.jsxs)(eg.Select,{placeholder:"Select access mode",children:[(0,s.jsx)(eg.Select.Option,{value:"all_authenticated_users",children:"All Authenticated Users"}),(0,s.jsx)(eg.Select.Option,{value:"restricted_sso_group",children:"Restricted SSO Group"})]})}),(0,s.jsx)(h.Form.Item,{noStyle:!0,shouldUpdate:(e,s)=>e.ui_access_mode_type!==s.ui_access_mode_type,children:({getFieldValue:e})=>"restricted_sso_group"===e("ui_access_mode_type")?(0,s.jsx)(h.Form.Item,{label:"Restricted SSO Group",name:"restricted_sso_group",rules:[{required:!0,message:"Please enter the restricted SSO group"}],children:(0,s.jsx)(C.TextInput,{placeholder:"ui-access-group"})}):null}),(0,s.jsx)(h.Form.Item,{label:"SSO Group JWT Field",name:"sso_group_jwt_field",tooltip:"JWT field name that contains team/group information. Use dot notation to access nested fields.",children:(0,s.jsx)(C.TextInput,{placeholder:"groups"})}),(0,s.jsx)("div",{style:{textAlign:"right",marginTop:"16px"},children:(0,s.jsx)(m.Button,{type:"primary",htmlType:"submit",loading:l,style:{backgroundColor:"#6366f1",borderColor:"#6366f1"},children:"Update UI Access Control"})})]})]})},{Title:sM,Paragraph:sB,Text:sL}=y.Typography,sU=({proxySettings:e})=>{let{premiumUser:y,accessToken:k,userId:I}=(0,t.default)(),[T]=h.Form.useForm(),[C,E]=(0,j.useState)(!1),[N,O]=(0,j.useState)(!1),[P,F]=(0,j.useState)(!1),[A,M]=(0,j.useState)(!1),[B,L]=(0,j.useState)(!1),[U,R]=(0,j.useState)(!1),[D,z]=(0,j.useState)([]),[V,G]=(0,j.useState)(null),[K,H]=(0,j.useState)(!1),$=(0,b.useBaseUrl)(),Q="All IP Addresses Allowed",W=$;W+="/fallback/login";let Y=async()=>{if(k)try{let e=await (0,w.getSSOSettings)(k);if(e&&e.values){let s=e.values.google_client_id&&e.values.google_client_secret,t=e.values.microsoft_client_id&&e.values.microsoft_client_secret,r=e.values.generic_client_id&&e.values.generic_client_secret;H(s||t||r)}else H(!1)}catch(e){console.error("Error checking SSO configuration:",e),H(!1)}},J=async()=>{try{if(!0!==y)return void S.default.fromBackend("This feature is only available for premium users. Please upgrade your account.");if(k){let e=await (0,w.getAllowedIPs)(k);z(e&&e.length>0?e:[Q])}else z([Q])}catch(e){console.error("Error fetching allowed IPs:",e),S.default.fromBackend(`Failed to fetch allowed IPs ${e}`),z([Q])}finally{!0===y&&F(!0)}},Z=async e=>{try{if(k){await (0,w.addAllowedIP)(k,e.ip);let s=await (0,w.getAllowedIPs)(k);z(s),S.default.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),S.default.fromBackend(`Failed to add IP address ${e}`)}finally{M(!1)}},ee=async e=>{G(e),L(!0)},es=async()=>{if(V&&k)try{await (0,w.deleteAllowedIP)(k,V);let e=await (0,w.getAllowedIPs)(k);z(e.length>0?e:[Q]),S.default.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),S.default.fromBackend(`Failed to delete IP address ${e}`)}finally{L(!1),G(null)}};(0,j.useEffect)(()=>{Y()},[k,y,Y]);let et=()=>{R(!1)},er=[{key:"sso-settings",label:"SSO Settings",children:(0,s.jsx)(eG,{})},{key:"security-settings",label:"Security Settings",children:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.Card,{children:[(0,s.jsx)(sM,{level:4,children:" ✨ Security Settings"}),(0,s.jsx)(p.Alert,{message:"SSO Configuration Deprecated",description:"Editing SSO Settings on this page is deprecated and will be removed in a future version. Please use the SSO Settings tab for SSO configuration.",type:"warning",showIcon:!0}),(0,s.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem",marginLeft:"0.5rem"},children:[(0,s.jsx)("div",{children:(0,s.jsx)(r.Button,{style:{width:"150px"},onClick:()=>E(!0),children:K?"Edit SSO Settings":"Add SSO"})}),(0,s.jsx)("div",{children:(0,s.jsx)(r.Button,{style:{width:"150px"},onClick:J,children:"Allowed IPs"})}),(0,s.jsx)("div",{children:(0,s.jsx)(r.Button,{style:{width:"150px"},onClick:()=>!0===y?R(!0):S.default.fromBackend("Only premium users can configure UI access control"),children:"UI Access Control"})})]})]}),(0,s.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,s.jsx)(sF,{isAddSSOModalVisible:C,isInstructionsModalVisible:N,handleAddSSOOk:()=>{E(!1),T.resetFields(),k&&y&&Y()},handleAddSSOCancel:()=>{E(!1),T.resetFields()},handleShowInstructions:e=>{E(!1),O(!0)},handleInstructionsOk:()=>{O(!1),k&&y&&Y()},handleInstructionsCancel:()=>{O(!1),k&&y&&Y()},form:T,accessToken:k,ssoConfigured:K}),(0,s.jsx)(_.Modal,{title:"Manage Allowed IP Addresses",width:800,open:P,onCancel:()=>F(!1),footer:[(0,s.jsx)(r.Button,{className:"mx-1",onClick:()=>M(!0),children:"Add IP Address"},"add"),(0,s.jsx)(r.Button,{onClick:()=>F(!1),children:"Close"},"close")],children:(0,s.jsxs)(a.Table,{children:[(0,s.jsx)(d.TableHead,{children:(0,s.jsxs)(u.TableRow,{children:[(0,s.jsx)(c.TableHeaderCell,{children:"IP Address"}),(0,s.jsx)(c.TableHeaderCell,{className:"text-right",children:"Action"})]})}),(0,s.jsx)(n.TableBody,{children:D.map((e,t)=>(0,s.jsxs)(u.TableRow,{children:[(0,s.jsx)(o.TableCell,{children:e}),(0,s.jsx)(o.TableCell,{className:"text-right",children:e!==Q&&(0,s.jsx)(r.Button,{onClick:()=>ee(e),color:"red",size:"xs",children:"Delete"})})]},t))})]})}),(0,s.jsx)(_.Modal,{title:"Add Allowed IP Address",open:A,onCancel:()=>M(!1),footer:null,children:(0,s.jsxs)(h.Form,{onFinish:Z,children:[(0,s.jsx)(h.Form.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,s.jsx)(g.Input,{placeholder:"Enter IP address"})}),(0,s.jsx)(h.Form.Item,{children:(0,s.jsx)(m.Button,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,s.jsx)(_.Modal,{title:"Confirm Delete",open:B,onCancel:()=>L(!1),onOk:es,footer:[(0,s.jsx)(r.Button,{className:"mx-1",onClick:()=>es(),children:"Yes"},"delete"),(0,s.jsx)(r.Button,{onClick:()=>L(!1),children:"Close"},"close")],children:(0,s.jsxs)(sL,{children:["Are you sure you want to delete the IP address: ",V,"?"]})}),(0,s.jsx)(_.Modal,{title:"UI Access Control Settings",open:U,width:600,footer:null,onOk:et,onCancel:()=>{R(!1)},children:(0,s.jsx)(sA,{accessToken:k,onSuccess:()=>{et(),S.default.success("UI Access Control settings updated successfully")}})})]}),(0,s.jsxs)(l.Callout,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,s.jsxs)("a",{href:W,target:"_blank",rel:"noopener noreferrer",children:[(0,s.jsx)("b",{children:W})," "]})]})]})},{key:"scim",label:"SCIM",children:(0,s.jsx)(q,{accessToken:k,userID:I,proxySettings:e})},{key:"ui-settings",label:(0,s.jsx)(x.Space,{children:(0,s.jsxs)(sL,{children:["UI Settings ",(0,s.jsx)(v.default,{})]})}),children:(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsx)(eZ,{}),(0,s.jsx)(st,{})]})},{key:"logging-settings",label:"Logging Settings",children:(0,s.jsx)(X,{})},{key:"hashicorp-vault",label:"Hashicorp Vault",children:(0,s.jsx)(sk,{})},{key:"plugins",label:"Plugins",children:(0,s.jsx)(sP,{})}];return(0,s.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,s.jsx)(sM,{level:4,children:"Admin Access "}),(0,s.jsx)(sB,{children:"Go to 'Internal Users' page to add other admins."}),(0,s.jsx)(f.Tabs,{items:er})]})};var sR=e.i(592392);e.s(["default",0,function(){let{accessToken:e}=(0,t.default)(),r=(0,sR.default)(e);return(0,s.jsx)(sU,{proxySettings:r})}],648214)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0vggytdohwe7o.js b/litellm/proxy/_experimental/out/_next/static/chunks/0vggytdohwe7o.js deleted file mode 100644 index 8308503a666..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0vggytdohwe7o.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,233525,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"warnOnce",{enumerable:!0,get:function(){return s}});let s=e=>{}},718967,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var s={DecodeError:function(){return g},MiddlewareNotFoundError:function(){return C},MissingStaticPage:function(){return w},NormalizeError:function(){return v},PageNotFoundError:function(){return b},SP:function(){return y},ST:function(){return m},WEB_VITALS:function(){return n},execOnce:function(){return a},getDisplayName:function(){return h},getLocationOrigin:function(){return c},getURL:function(){return l},isAbsoluteUrl:function(){return u},isResSent:function(){return d},loadGetInitialProps:function(){return p},normalizeRepeatedSlashes:function(){return f},stringifyError:function(){return S}};for(var r in s)Object.defineProperty(i,r,{enumerable:!0,get:s[r]});let n=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,i=!1;return(...s)=>(i||(i=!0,t=e(...s)),t)}let o=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,u=e=>o.test(e);function c(){let{protocol:e,hostname:t,port:i}=window.location;return`${e}//${t}${i?":"+i:""}`}function l(){let{href:e}=window.location,t=c();return e.substring(t.length)}function h(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function d(e){return e.finished||e.headersSent}function f(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function p(e,t){let i=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await p(t.Component,t.ctx)}:{};let s=await e.getInitialProps(t);if(i&&d(i))return s;if(!s)throw Object.defineProperty(Error(`"${h(e)}.getInitialProps()" should resolve to an object. But found "${s}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return s}let y="u">typeof performance,m=y&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class g extends Error{}class v extends Error{}class b extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class w extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class C extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},998183,(e,t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var s={assign:function(){return u},searchParamsToUrlQuery:function(){return n},urlQueryToSearchParams:function(){return o}};for(var r in s)Object.defineProperty(i,r,{enumerable:!0,get:s[r]});function n(e){let t={};for(let[i,s]of e.entries()){let e=t[i];void 0===e?t[i]=s:Array.isArray(e)?e.push(s):t[i]=[e,s]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function o(e){let t=new URLSearchParams;for(let[i,s]of Object.entries(e))if(Array.isArray(s))for(let e of s)t.append(i,a(e));else t.set(i,a(s));return t}function u(e,...t){for(let i of t){for(let t of i.keys())e.delete(t);for(let[t,s]of i.entries())e.append(t,s)}return e}},180166,e=>{"use strict";var t={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},i=new class{#e=t;#t=!1;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};e.s(["systemSetTimeoutZero",0,function(e){setTimeout(e,0)},"timeoutManager",0,i])},619273,e=>{"use strict";var t=e.i(180166),i="u"u(t)?Object.keys(t).sort().reduce((e,i)=>(e[i]=t[i],e),{}):t)}function n(e,t){return e===t||typeof e==typeof t&&!!e&&!!t&&"object"==typeof e&&"object"==typeof t&&Object.keys(t).every(i=>n(e[i],t[i]))}var a=Object.prototype.hasOwnProperty;function o(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function u(e){if(!c(e))return!1;let t=e.constructor;if(void 0===t)return!0;let i=t.prototype;return!!c(i)&&!!i.hasOwnProperty("isPrototypeOf")&&Object.getPrototypeOf(e)===Object.prototype}function c(e){return"[object Object]"===Object.prototype.toString.call(e)}var l=Symbol();e.s(["addConsumeAwareSignal",0,function(e,t,i){let s,r=!1;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(s??=t(),r||(r=!0,s.aborted?i():s.addEventListener("abort",i,{once:!0})),s)}),e},"addToEnd",0,function(e,t,i=0){let s=[...e,t];return i&&s.length>i?s.slice(1):s},"addToStart",0,function(e,t,i=0){let s=[t,...e];return i&&s.length>i?s.slice(0,-1):s},"ensureQueryFn",0,function(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:e.queryFn&&e.queryFn!==l?e.queryFn:()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`))},"functionalUpdate",0,function(e,t){return"function"==typeof e?e(t):e},"hashKey",0,r,"hashQueryKeyByOptions",0,s,"isServer",0,i,"isValidTimeout",0,function(e){return"number"==typeof e&&e>=0&&e!==1/0},"keepPreviousData",0,function(e){return e},"matchMutation",0,function(e,t){let{exact:i,status:s,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(i){if(r(t.options.mutationKey)!==r(o))return!1}else if(!n(t.options.mutationKey,o))return!1}return(!s||t.state.status===s)&&(!a||!!a(t))},"matchQuery",0,function(e,t){let{type:i="all",exact:r,fetchStatus:a,predicate:o,queryKey:u,stale:c}=e;if(u){if(r){if(t.queryHash!==s(u,t.options))return!1}else if(!n(t.queryKey,u))return!1}if("all"!==i){let e=t.isActive();if("active"===i&&!e||"inactive"===i&&e)return!1}return("boolean"!=typeof c||t.isStale()===c)&&(!a||a===t.state.fetchStatus)&&(!o||!!o(t))},"noop",0,function(){},"partialMatchKey",0,n,"replaceData",0,function(e,t,i){return"function"==typeof i.structuralSharing?i.structuralSharing(e,t):!1!==i.structuralSharing?function e(t,i,s=0){if(t===i)return t;if(s>500)return i;let r=o(t)&&o(i);if(!r&&!(u(t)&&u(i)))return i;let n=(r?t:Object.keys(t)).length,c=r?i:Object.keys(i),l=c.length,h=r?Array(l):{},d=0;for(let o=0;o{t.timeoutManager.setTimeout(i,e)})},"timeUntilStale",0,function(e,t){return Math.max(e+(t||0)-Date.now(),0)}])},540143,e=>{"use strict";let t,i,s,r,n,a;var o=e.i(180166).systemSetTimeoutZero,u=(t=[],i=0,s=e=>{e()},r=e=>{e()},n=o,{batch:e=>{let a;i++;try{a=e()}finally{let e;--i||(e=t,t=[],e.length&&n(()=>{r(()=>{e.forEach(e=>{s(e)})})}))}return a},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a=e=>{i?t.push(e):n(()=>{s(e)})},setNotifyFunction:e=>{s=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{n=e}});e.s(["notifyManager",0,u])},175555,915823,e=>{"use strict";var t=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}};e.s(["Subscribable",0,t],915823);var i=new class extends t{#i;#s;#r;constructor(){super(),this.#r=e=>{if("u">typeof window&&window.addEventListener){let t=()=>e();return window.addEventListener("visibilitychange",t,!1),()=>{window.removeEventListener("visibilitychange",t)}}}}onSubscribe(){this.#s||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#s?.(),this.#s=void 0)}setEventListener(e){this.#r=e,this.#s?.(),this.#s=e(e=>{"boolean"==typeof e?this.setFocused(e):this.onFocus()})}setFocused(e){this.#i!==e&&(this.#i=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return"boolean"==typeof this.#i?this.#i:globalThis.document?.visibilityState!=="hidden"}};e.s(["focusManager",0,i],175555)},814448,793803,e=>{"use strict";var t=e.i(915823),i=new class extends t.Subscribable{#n=!0;#s;#r;constructor(){super(),this.#r=e=>{if("u">typeof window&&window.addEventListener){let t=()=>e(!0),i=()=>e(!1);return window.addEventListener("online",t,!1),window.addEventListener("offline",i,!1),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",i)}}}}onSubscribe(){this.#s||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#s?.(),this.#s=void 0)}setEventListener(e){this.#r=e,this.#s?.(),this.#s=e(this.setOnline.bind(this))}setOnline(e){this.#n!==e&&(this.#n=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#n}};e.s(["onlineManager",0,i],814448),e.i(619273),e.s(["pendingThenable",0,function(){let e,t,i=new Promise((i,s)=>{e=i,t=s});function s(e){Object.assign(i,e),delete i.resolve,delete i.reject}return i.status="pending",i.catch(()=>{}),i.resolve=t=>{s({status:"fulfilled",value:t}),e(t)},i.reject=e=>{s({status:"rejected",reason:e}),t(e)},i}],793803)},273911,e=>{"use strict";let t;var i=e.i(619273),s=(t=()=>i.isServer,{isServer:()=>t(),setIsServer(e){t=e}});e.s(["environmentManager",0,s])},936553,e=>{"use strict";var t=e.i(175555),i=e.i(814448),s=e.i(793803),r=e.i(273911),n=e.i(619273);function a(e){return Math.min(1e3*2**e,3e4)}function o(e){return(e??"online")!=="online"||i.onlineManager.isOnline()}var u=class extends Error{constructor(e){super("CancelledError"),this.revert=e?.revert,this.silent=e?.silent}};e.s(["CancelledError",0,u,"canFetch",0,o,"createRetryer",0,function(e){let c,l=!1,h=0,d=(0,s.pendingThenable)(),f=()=>t.focusManager.isFocused()&&("always"===e.networkMode||i.onlineManager.isOnline())&&e.canRun(),p=()=>o(e.networkMode)&&e.canRun(),y=e=>{"pending"===d.status&&(c?.(),d.resolve(e))},m=e=>{"pending"===d.status&&(c?.(),d.reject(e))},g=()=>new Promise(t=>{c=e=>{("pending"!==d.status||f())&&t(e)},e.onPause?.()}).then(()=>{c=void 0,"pending"===d.status&&e.onContinue?.()}),v=()=>{let t;if("pending"!==d.status)return;let i=0===h?e.initialPromise:void 0;try{t=i??e.fn()}catch(e){t=Promise.reject(e)}Promise.resolve(t).then(y).catch(t=>{if("pending"!==d.status)return;let i=e.retry??3*!r.environmentManager.isServer(),s=e.retryDelay??a,o="function"==typeof s?s(h,t):s,u=!0===i||"number"==typeof i&&hf()?void 0:g()).then(()=>{l?m(t):v()}))})};return{promise:d,status:()=>d.status,cancel:t=>{if("pending"===d.status){let i=new u(t);m(i),e.onCancel?.(i)}},continue:()=>(c?.(),d),cancelRetry:()=>{l=!0},continueRetry:()=>{l=!1},canStart:p,start:()=>(p()?v():g().then(v),d)}}])},88587,e=>{"use strict";var t=e.i(180166),i=e.i(273911),s=e.i(619273),r=class{#a;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),(0,s.isValidTimeout)(this.gcTime)&&(this.#a=t.timeoutManager.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(i.environmentManager.isServer()?1/0:3e5))}clearGcTimeout(){void 0!==this.#a&&(t.timeoutManager.clearTimeout(this.#a),this.#a=void 0)}};e.s(["Removable",0,r])},286491,992571,e=>{"use strict";e.i(247167);var t=e.i(619273),i=e.i(540143),s=e.i(936553),r=e.i(88587);function n(e){return{onFetch:(i,s)=>{let r=i.options,n=i.fetchOptions?.meta?.fetchMore?.direction,u=i.state.data?.pages||[],c=i.state.data?.pageParams||[],l={pages:[],pageParams:[]},h=0,d=async()=>{let s=!1,d=(0,t.ensureQueryFn)(i.options,i.fetchOptions),f=async(e,r,n)=>{let a;if(s)return Promise.reject(i.signal.reason);if(null==r&&e.pages.length)return Promise.resolve(e);let o=(a={client:i.client,queryKey:i.queryKey,pageParam:r,direction:n?"backward":"forward",meta:i.options.meta},(0,t.addConsumeAwareSignal)(a,()=>i.signal,()=>s=!0),a),u=await d(o),{maxPages:c}=i.options,l=n?t.addToStart:t.addToEnd;return{pages:l(e.pages,u,c),pageParams:l(e.pageParams,r,c)}};if(n&&u.length){let e="backward"===n,t={pages:u,pageParams:c},i=(e?o:a)(r,t);l=await f(t,i,e)}else{let t=e??u.length;do{let e=0===h?c[0]??r.initialPageParam:a(r,l);if(h>0&&null==e)break;l=await f(l,e),h++}while(hi.options.persister?.(d,{client:i.client,queryKey:i.queryKey,meta:i.options.meta,signal:i.signal},s):i.fetchFn=d}}}function a(e,{pages:t,pageParams:i}){let s=t.length-1;return t.length>0?e.getNextPageParam(t[s],t,i[s],i):void 0}function o(e,{pages:t,pageParams:i}){return t.length>0?e.getPreviousPageParam?.(t[0],t,i[0],i):void 0}e.s(["hasNextPage",0,function(e,t){return!!t&&null!=a(e,t)},"hasPreviousPage",0,function(e,t){return!!t&&!!e.getPreviousPageParam&&null!=o(e,t)},"infiniteQueryBehavior",0,n],992571);var u=class extends r.Removable{#o;#u;#c;#l;#h;#d;#f;#p;constructor(e){super(),this.#p=!1,this.#f=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#h=e.client,this.#l=this.#h.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#u=h(this.options),this.state=e.state??this.#u,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#o}get promise(){return this.#d?.promise}setOptions(e){if(this.options={...this.#f,...e},e?._type&&(this.#o=e._type),this.updateGcTime(this.options.gcTime),this.state&&void 0===this.state.data){let e=h(this.options);void 0!==e.data&&(this.setState(l(e.data,e.dataUpdatedAt)),this.#u=e)}}optionalRemove(){this.observers.length||"idle"!==this.state.fetchStatus||this.#l.remove(this)}setData(e,i){let s=(0,t.replaceData)(this.state.data,e,this.options);return this.#y({data:s,type:"success",dataUpdatedAt:i?.updatedAt,manual:i?.manual}),s}setState(e){this.#y({type:"setState",state:e})}cancel(e){let i=this.#d?.promise;return this.#d?.cancel(e),i?i.then(t.noop).catch(t.noop):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#u}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>!1!==(0,t.resolveQueryBoolean)(e.options.enabled,this))}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===t.skipToken||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0&&this.observers.some(e=>"static"===(0,t.resolveStaleTime)(e.options.staleTime,this))}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):void 0===this.state.data||this.state.isInvalidated}isStaleByTime(e=0){return void 0===this.state.data||"static"!==e&&(!!this.state.isInvalidated||!(0,t.timeUntilStale)(this.state.dataUpdatedAt,e))}onFocus(){let e=this.observers.find(e=>e.shouldFetchOnWindowFocus());e?.refetch({cancelRefetch:!1}),this.#d?.continue()}onOnline(){let e=this.observers.find(e=>e.shouldFetchOnReconnect());e?.refetch({cancelRefetch:!1}),this.#d?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#l.notify({type:"observerAdded",query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#d&&(this.#p||this.#m()?this.#d.cancel({revert:!0}):this.#d.cancelRetry()),this.scheduleGc()),this.#l.notify({type:"observerRemoved",query:this,observer:e}))}getObserversCount(){return this.observers.length}#m(){return"paused"===this.state.fetchStatus&&"pending"===this.state.status}invalidate(){this.state.isInvalidated||this.#y({type:"invalidate"})}async fetch(e,i){let r;if("idle"!==this.state.fetchStatus&&this.#d?.status()!=="rejected"){if(void 0!==this.state.data&&i?.cancelRefetch)this.cancel({silent:!0});else if(this.#d)return this.#d.continueRetry(),this.#d.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let a=new AbortController,o=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#p=!0,a.signal)})},u=()=>{let e,s=(0,t.ensureQueryFn)(this.options,i),r=(o(e={client:this.#h,queryKey:this.queryKey,meta:this.meta}),e);return(this.#p=!1,this.options.persister)?this.options.persister(s,r,this):s(r)},c=(o(r={fetchOptions:i,options:this.options,queryKey:this.queryKey,client:this.#h,state:this.state,fetchFn:u}),r),l="infinite"===this.#o?n(this.options.pages):this.options.behavior;l?.onFetch(c,this),this.#c=this.state,("idle"===this.state.fetchStatus||this.state.fetchMeta!==c.fetchOptions?.meta)&&this.#y({type:"fetch",meta:c.fetchOptions?.meta}),this.#d=(0,s.createRetryer)({initialPromise:i?.initialPromise,fn:c.fetchFn,onCancel:e=>{e instanceof s.CancelledError&&e.revert&&this.setState({...this.#c,fetchStatus:"idle"}),a.abort()},onFail:(e,t)=>{this.#y({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#y({type:"pause"})},onContinue:()=>{this.#y({type:"continue"})},retry:c.options.retry,retryDelay:c.options.retryDelay,networkMode:c.options.networkMode,canRun:()=>!0});try{let e=await this.#d.start();if(void 0===e)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#l.config.onSuccess?.(e,this),this.#l.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof s.CancelledError){if(e.silent)return this.#d.promise;else if(e.revert){if(void 0===this.state.data)throw e;return this.state.data}}throw this.#y({type:"error",error:e}),this.#l.config.onError?.(e,this),this.#l.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#y(e){let t=t=>{switch(e.type){case"failed":return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case"pause":return{...t,fetchStatus:"paused"};case"continue":return{...t,fetchStatus:"fetching"};case"fetch":return{...t,...c(t.data,this.options),fetchMeta:e.meta??null};case"success":let i={...t,...l(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return this.#c=e.manual?i:void 0,i;case"error":let s=e.error;return{...t,error:s,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...t,isInvalidated:!0};case"setState":return{...t,...e.state}}};this.state=t(this.state),i.notifyManager.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#l.notify({query:this,type:"updated",action:e})})}};function c(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:(0,s.canFetch)(t.networkMode)?"fetching":"paused",...void 0===e&&{error:null,status:"pending"}}}function l(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function h(e){let t="function"==typeof e.initialData?e.initialData():e.initialData,i=void 0!==t,s=i?"function"==typeof e.initialDataUpdatedAt?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:i?s??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:i?"success":"pending",fetchStatus:"idle"}}e.s(["Query",0,u,"fetchState",0,c],286491)},912598,e=>{"use strict";var t=e.i(271645),i=e.i(843476),s=t.createContext(void 0);e.s(["QueryClientProvider",0,({client:e,children:r})=>(t.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,i.jsx)(s.Provider,{value:e,children:r})),"useQueryClient",0,e=>{let i=t.useContext(s);if(e)return e;if(!i)throw Error("No QueryClient set, use QueryClientProvider to set one");return i}])},708347,e=>{"use strict";let t=["Admin","Admin Viewer","proxy_admin","proxy_admin_viewer","org_admin"],i=["Internal User","Admin","proxy_admin"],s=[...i,"Admin Viewer","proxy_admin_viewer"],r=(e,t)=>null!=e&&e.some(e=>e.user_id===t&&"admin"===e.role);e.s(["all_admin_roles",0,t,"formatUserRole",0,e=>{if(!e)return"Undefined Role";switch(e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"org_admin":return"Org Admin";case"internal_user":return"Internal User";case"internal_user_viewer":case"internal_viewer":return"Internal Viewer";case"app_user":return"App User";default:return"Unknown Role"}},"internalUserRoles",0,["Internal User","Internal Viewer","internal_user","internal_user_viewer"],"isAdminRole",0,e=>t.includes(e),"isProxyAdminRole",0,e=>"proxy_admin"===e||"Admin"===e,"isUserTeamAdminForAnyTeam",0,(e,t)=>null!=e&&e.some(e=>r(e.members_with_roles,t)),"isUserTeamAdminForSingleTeam",0,r,"rolesAllowedToViewWriteScopedPages",0,s,"rolesWithWriteAccess",0,i])},114272,e=>{"use strict";var t=e.i(540143),i=e.i(88587),s=e.i(936553),r=class extends i.Removable{#h;#g;#v;#d;constructor(e){super(),this.#h=e.client,this.mutationId=e.mutationId,this.#v=e.mutationCache,this.#g=[],this.state=e.state||n(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#g.includes(e)||(this.#g.push(e),this.clearGcTimeout(),this.#v.notify({type:"observerAdded",mutation:this,observer:e}))}removeObserver(e){this.#g=this.#g.filter(t=>t!==e),this.scheduleGc(),this.#v.notify({type:"observerRemoved",mutation:this,observer:e})}optionalRemove(){this.#g.length||("pending"===this.state.status?this.scheduleGc():this.#v.remove(this))}continue(){return this.#d?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#y({type:"continue"})},i={client:this.#h,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#d=(0,s.createRetryer)({fn:()=>this.options.mutationFn?this.options.mutationFn(e,i):Promise.reject(Error("No mutationFn found")),onFail:(e,t)=>{this.#y({type:"failed",failureCount:e,error:t})},onPause:()=>{this.#y({type:"pause"})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#v.canRun(this)});let r="pending"===this.state.status,n=!this.#d.canStart();try{if(r)t();else{this.#y({type:"pending",variables:e,isPaused:n}),this.#v.config.onMutate&&await this.#v.config.onMutate(e,this,i);let t=await this.options.onMutate?.(e,i);t!==this.state.context&&this.#y({type:"pending",context:t,variables:e,isPaused:n})}let s=await this.#d.start();return await this.#v.config.onSuccess?.(s,e,this.state.context,this,i),await this.options.onSuccess?.(s,e,this.state.context,i),await this.#v.config.onSettled?.(s,null,this.state.variables,this.state.context,this,i),await this.options.onSettled?.(s,null,e,this.state.context,i),this.#y({type:"success",data:s}),s}catch(t){try{await this.#v.config.onError?.(t,e,this.state.context,this,i)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,i)}catch(e){Promise.reject(e)}try{await this.#v.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,i)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,i)}catch(e){Promise.reject(e)}throw this.#y({type:"error",error:t}),t}finally{this.#v.runNext(this)}}#y(e){this.state=(t=>{switch(e.type){case"failed":return{...t,failureCount:e.failureCount,failureReason:e.error};case"pause":return{...t,isPaused:!0};case"continue":return{...t,isPaused:!1};case"pending":return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:"pending",variables:e.variables,submittedAt:Date.now()};case"success":return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:"error"}}})(this.state),t.notifyManager.batch(()=>{this.#g.forEach(t=>{t.onMutationUpdate(e)}),this.#v.notify({mutation:this,type:"updated",action:e})})}};function n(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}e.s(["Mutation",0,r,"getDefaultState",0,n])},557951,e=>{"use strict";var t=e.i(843476),i=e.i(271645),s=e.i(947293),r=e.i(268004),n=e.i(161281),a=e.i(708347),o=e.i(602869);function u(e,t="/"){document.cookie=`${e}=; Max-Age=0; Path=${t}`,"token"===e&&(0,r.clearTokenCookies)()}let c=(0,i.createContext)(null);e.s(["AuthProvider",0,function({children:e}){let[l,h]=(0,i.useState)(!0),[d,f]=(0,i.useState)(null),[p,y]=(0,i.useState)(null),[m,g]=(0,i.useState)(""),[v,b]=(0,i.useState)(null),[w,C]=(0,i.useState)(null),[S,O]=(0,i.useState)(!1),[P,M]=(0,i.useState)(!1),[T,q]=(0,i.useState)(!0);return(0,i.useEffect)(()=>{let e=!1;return(async()=>{try{await (0,o.getUiConfig)()}catch{}if(e)return;let t=(0,r.getCookie)("token"),i=t&&!(0,n.isJwtExpired)(t)?t:null;t&&!i&&u("token","/"),f(i),h(!1)})(),()=>{e=!0}},[]),(0,i.useEffect)(()=>{if(!d)return;if((0,n.isJwtExpired)(d)){u("token","/"),f(null);return}let e=null;try{e=(0,s.jwtDecode)(d)}catch{u("token","/"),f(null);return}e&&(C(e.key),M(e.disabled_non_admin_personal_key_creation),e.user_role&&g((0,a.formatUserRole)(e.user_role)),e.user_email&&b(e.user_email),e.login_method&&q("username_password"===e.login_method),e.premium_user&&O(e.premium_user),e.auth_header_name&&(0,o.setGlobalLitellmHeaderName)(e.auth_header_name),e.user_id&&y(e.user_id))},[d]),(0,t.jsx)(c.Provider,{value:{authLoading:l,token:d,userID:p,userRole:m,userEmail:v,accessToken:w,premiumUser:S,disabledPersonalKeyCreation:P,showSSOBanner:T,setToken:f,setUserID:y,setUserRole:g,setUserEmail:b,setAccessToken:C,setPremiumUser:O,setShowSSOBanner:q},children:e})},"useAuth",0,function(){let e=(0,i.useContext)(c);if(!e)throw Error("useAuth must be used within an AuthProvider");return e}])},71195,e=>{"use strict";var t=e.i(843476),i=e.i(271645),s=e.i(609587),s=s,r=e.i(698173),n=e.i(998573);e.i(296059);var a=e.i(415584),o=e.i(727749),u=e.i(888259);e.s(["default",0,function({children:e}){let[c,l]=r.notification.useNotification(),[h,d]=n.message.useMessage(),f=(0,i.useRef)(!1);return(0,i.useEffect)(()=>{f.current||((0,o.setNotificationInstance)(c),(0,u.setMessageInstance)(h),f.current=!0)},[c,h]),(0,t.jsx)(a.StyleProvider,{layer:!0,children:(0,t.jsxs)(s.default,{theme:{cssVar:!0},children:[l,d,e]})})}],71195)},867271,e=>{"use strict";var t=e.i(843476),i=e.i(619273),s=e.i(286491),r=e.i(540143),n=e.i(915823),a=class extends n.Subscribable{constructor(e={}){super(),this.config=e,this.#b=new Map}#b;build(e,t,r){let n=t.queryKey,a=t.queryHash??(0,i.hashQueryKeyByOptions)(n,t),o=this.get(a);return o||(o=new s.Query({client:e,queryKey:n,queryHash:a,options:e.defaultQueryOptions(t),state:r,defaultOptions:e.getQueryDefaults(n)}),this.add(o)),o}add(e){this.#b.has(e.queryHash)||(this.#b.set(e.queryHash,e),this.notify({type:"added",query:e}))}remove(e){let t=this.#b.get(e.queryHash);t&&(e.destroy(),t===e&&this.#b.delete(e.queryHash),this.notify({type:"removed",query:e}))}clear(){r.notifyManager.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#b.get(e)}getAll(){return[...this.#b.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>(0,i.matchQuery)(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>(0,i.matchQuery)(e,t)):t}notify(e){r.notifyManager.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){r.notifyManager.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){r.notifyManager.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},o=e.i(114272),u=n,c=class extends u.Subscribable{constructor(e={}){super(),this.config=e,this.#w=new Set,this.#C=new Map,this.#S=0}#w;#C;#S;build(e,t,i){let s=new o.Mutation({client:e,mutationCache:this,mutationId:++this.#S,options:e.defaultMutationOptions(t),state:i});return this.add(s),s}add(e){this.#w.add(e);let t=l(e);if("string"==typeof t){let i=this.#C.get(t);i?i.push(e):this.#C.set(t,[e])}this.notify({type:"added",mutation:e})}remove(e){if(this.#w.delete(e)){let t=l(e);if("string"==typeof t){let i=this.#C.get(t);if(i)if(i.length>1){let t=i.indexOf(e);-1!==t&&i.splice(t,1)}else i[0]===e&&this.#C.delete(t)}}this.notify({type:"removed",mutation:e})}canRun(e){let t=l(e);if("string"!=typeof t)return!0;{let i=this.#C.get(t),s=i?.find(e=>"pending"===e.state.status);return!s||s===e}}runNext(e){let t=l(e);if("string"!=typeof t)return Promise.resolve();{let i=this.#C.get(t)?.find(t=>t!==e&&t.state.isPaused);return i?.continue()??Promise.resolve()}}clear(){r.notifyManager.batch(()=>{this.#w.forEach(e=>{this.notify({type:"removed",mutation:e})}),this.#w.clear(),this.#C.clear()})}getAll(){return Array.from(this.#w)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>(0,i.matchMutation)(t,e))}findAll(e={}){return this.getAll().filter(t=>(0,i.matchMutation)(e,t))}notify(e){r.notifyManager.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return r.notifyManager.batch(()=>Promise.all(e.map(e=>e.continue().catch(i.noop))))}};function l(e){return e.options.scope?.id}var h=e.i(175555),d=e.i(814448),f=class{#O;#v;#f;#P;#M;#T;#q;#A;constructor(e={}){this.#O=e.queryCache||new a,this.#v=e.mutationCache||new c,this.#f=e.defaultOptions||{},this.#P=new Map,this.#M=new Map,this.#T=0}mount(){this.#T++,1===this.#T&&(this.#q=h.focusManager.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#O.onFocus())}),this.#A=d.onlineManager.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#O.onOnline())}))}unmount(){this.#T--,0===this.#T&&(this.#q?.(),this.#q=void 0,this.#A?.(),this.#A=void 0)}isFetching(e){return this.#O.findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return this.#v.findAll({...e,status:"pending"}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#O.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),s=this.#O.build(this,t),r=s.state.data;return void 0===r?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime((0,i.resolveStaleTime)(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#O.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,s){let r=this.defaultQueryOptions({queryKey:e}),n=this.#O.get(r.queryHash),a=n?.state.data,o=(0,i.functionalUpdate)(t,a);if(void 0!==o)return this.#O.build(this,r).setData(o,{...s,manual:!0})}setQueriesData(e,t,i){return r.notifyManager.batch(()=>this.#O.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,i)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#O.get(t.queryHash)?.state}removeQueries(e){let t=this.#O;r.notifyManager.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let i=this.#O;return r.notifyManager.batch(()=>(i.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){let s={revert:!0,...t};return Promise.all(r.notifyManager.batch(()=>this.#O.findAll(e).map(e=>e.cancel(s)))).then(i.noop).catch(i.noop)}invalidateQueries(e,t={}){return r.notifyManager.batch(()=>(this.#O.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType==="none")?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??"active"},t))}refetchQueries(e,t={}){let s={...t,cancelRefetch:t.cancelRefetch??!0};return Promise.all(r.notifyManager.batch(()=>this.#O.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,s);return s.throwOnError||(t=t.catch(i.noop)),"paused"===e.state.fetchStatus?Promise.resolve():t}))).then(i.noop)}fetchQuery(e){let t=this.defaultQueryOptions(e);void 0===t.retry&&(t.retry=!1);let s=this.#O.build(this,t);return s.isStaleByTime((0,i.resolveStaleTime)(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(i.noop).catch(i.noop)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(i.noop).catch(i.noop)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return d.onlineManager.isOnline()?this.#v.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#O}getMutationCache(){return this.#v}getDefaultOptions(){return this.#f}setDefaultOptions(e){this.#f=e}setQueryDefaults(e,t){this.#P.set((0,i.hashKey)(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#P.values()],s={};return t.forEach(t=>{(0,i.partialMatchKey)(e,t.queryKey)&&Object.assign(s,t.defaultOptions)}),s}setMutationDefaults(e,t){this.#M.set((0,i.hashKey)(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#M.values()],s={};return t.forEach(t=>{(0,i.partialMatchKey)(e,t.mutationKey)&&Object.assign(s,t.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#f.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=(0,i.hashQueryKeyByOptions)(t.queryKey,t)),void 0===t.refetchOnReconnect&&(t.refetchOnReconnect="always"!==t.networkMode),void 0===t.throwOnError&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===i.skipToken&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#f.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#O.clear(),this.#v.clear()}},p=e.i(912598);let y=new f;e.s(["default",0,function({children:e}){return(0,t.jsx)(p.QueryClientProvider,{client:y,children:e})}],867271)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0vzx0jspfnkgb.js b/litellm/proxy/_experimental/out/_next/static/chunks/0vzx0jspfnkgb.js new file mode 100644 index 00000000000..cd96f0647f4 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0vzx0jspfnkgb.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,510674,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(431703),i=e.i(135214),r=e.i(708347);let n=(0,l.createQueryKeys)("projects"),o=[...r.all_admin_roles,...r.internalUserRoles],d=async e=>{let t=(0,a.getProxyBaseUrl)(),l=`${t}/project/list`,i=await fetch(l,{method:"GET",headers:{[(0,a.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let e=await i.json(),t=(0,s.deriveErrorMessage)(e);throw(0,a.handleError)(t),Error(t)}return i.json()};e.s(["projectKeys",0,n,"useProjects",0,()=>{let{accessToken:e,userRole:l}=(0,i.default)();return(0,t.useQuery)({queryKey:n.list({}),queryFn:async()=>d(e),enabled:!!e&&o.includes(l)})}])},207082,e=>{"use strict";var t=e.i(619273),l=e.i(266027),a=e.i(243652),s=e.i(602869),i=e.i(431703),r=e.i(135214);let n=(0,a.createQueryKeys)("keys"),o=async(e,t,l,a={})=>{try{let r=(0,s.getProxyBaseUrl)(),n=new URLSearchParams(Object.entries({team_id:a.teamID,project_id:a.projectID,agent_id:a.agentID,organization_id:a.organizationID,key_alias:a.selectedKeyAlias,key_hash:a.keyHash,user_id:a.userID,page:t,size:l,sort_by:a.sortBy,sort_order:a.sortOrder,expand:a.expand,status:a.status,return_full_object:"true",include_team_keys:"true",include_created_by_keys:"true",substring_matching:"true"}).filter(([,e])=>null!=e).map(([e,t])=>[e,String(t)])),o=`${r?`${r}/key/list`:"/key/list"}?${n}`,d=await fetch(o,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!d.ok){let e=await d.json(),t=(0,i.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await d.json()}catch(e){throw console.error("Failed to list keys:",e),e}},d=(0,a.createQueryKeys)("deletedKeys");e.s(["keyKeys",0,n,"useDeletedKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:d.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,{...s,status:"deleted"}),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})},"useKeys",0,(e,a,s={})=>{let{accessToken:i}=(0,r.default)();return(0,l.useQuery)({queryKey:n.list({page:e,limit:a,...s}),queryFn:async()=>await o(i,e,a,s),enabled:!!i,staleTime:3e4,placeholderData:t.keepPreviousData})}])},109034,e=>{"use strict";var t=e.i(266027),l=e.i(243652),a=e.i(602869),s=e.i(135214);let i=(0,l.createQueryKeys)("tags");e.s(["useTags",0,()=>{let{accessToken:e,userId:l,userRole:r}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({}),queryFn:async()=>await (0,a.tagListCall)(e),enabled:!!(e&&l&&r)})}])},309426,e=>{"use strict";var t=e.i(290571),l=e.i(444755),a=e.i(673706),s=e.i(271645),i=e.i(46757);let r=(0,a.makeClassName)("Col"),n=s.default.forwardRef((e,a)=>{let n,o,d,c,{numColSpan:u=1,numColSpanSm:m,numColSpanMd:g,numColSpanLg:p,children:h,className:x}=e,y=(0,t.__rest)(e,["numColSpan","numColSpanSm","numColSpanMd","numColSpanLg","children","className"]),b=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"";return s.default.createElement("div",Object.assign({ref:a,className:(0,l.tremorTwMerge)(r("root"),(n=b(u,i.colSpan),o=b(m,i.colSpanSm),d=b(g,i.colSpanMd),c=b(p,i.colSpanLg),(0,l.tremorTwMerge)(n,o,d,c)),x)},y),h)});n.displayName="Col",e.s(["Col",0,n],309426)},552130,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select agents",disabled:d=!1})=>{let[c,u]=(0,l.useState)([]),[m,g]=(0,l.useState)([]),[p,h]=(0,l.useState)(!1);(0,l.useEffect)(()=>{(async()=>{if(n){h(!0);try{let e=await (0,s.getAgentsList)(n),t=e?.agents||[];u(t);let l=new Set;t.forEach(e=>{let t=e.agent_access_groups;t&&Array.isArray(t)&&t.forEach(e=>l.add(e))}),g(Array.from(l))}catch(e){console.error("Error fetching agents:",e)}finally{h(!1)}}})()},[n]);let x=[...m.map(e=>({label:e,value:`group:${e}`,isAccessGroup:!0,searchText:`${e} Access Group`})),...c.map(e=>({label:`${e.agent_name||e.agent_id}`,value:e.agent_id,isAccessGroup:!1,searchText:`${e.agent_name||e.agent_id} ${e.agent_id} Agent`}))],y=[...i?.agents||[],...(i?.accessGroups||[]).map(e=>`group:${e}`)];return(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:o,onChange:t=>{e({agents:t.filter(e=>!e.startsWith("group:")),accessGroups:t.filter(e=>e.startsWith("group:")).map(e=>e.replace("group:",""))})},value:y,loading:p,className:r,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:d,filterOption:(e,t)=>(x.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:x.map(e=>(0,t.jsx)(a.Select.Option,{value:e.value,label:e.label,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:e.isAccessGroup?"#52c41a":"#722ed1",flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:e.isAccessGroup?"#52c41a":"#722ed1",fontSize:"12px",fontWeight:500,opacity:.8},children:e.isAccessGroup?"Access Group":"Agent"})]})},e.value))})})}])},557662,e=>{"use strict";let t={src:e.i(196361).default,width:823,height:807,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABCUlEQVR42k2Ov0sCYRjH3/f09c68NOuiLg+NvMM6qIaIhgKDlgbBBiH7ARbkFAr+wEFwUBzUSRwUN3+Am4Kbg4sIIg4iOugiguDm5F/gvaLiF57l83yf5/sFYC0VQdJJnS0bObUkSCgnwa4ggPD94O57KkYX46vw/HVftECMNzKRJ2JL8A+KekelfO6s1Y3utl6hNayWahmlznIfhQbv6V4oGP6aOrvtCIFRnH1LKQmkBC7G7BtehmZWzY0NRxEAEo7Dhz/MvrT3P6BvCk5irDVJQURhAx5aKpzh7Pkm7+2BZ1p4YeT0MYIy5Dx6/P+UrvAXFml0TyqjeVtUytsrGX6rac6ew+YNXwKfsTPy4XOyEQAAAABJRU5ErkJggg=="},l={src:e.i(614148).default,width:600,height:450,blurWidth:0,blurHeight:0},a={src:e.i(858236).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAqklEQVR42mXOzQqCQBQF4NG8PVKLalNRrxW01EgUghZm4Tu0aV3gopBCaDDoh8LMyubaCzQzLj2c1fk2h/zwyZvjI8NTmtMXHj94yfBG5JqE0WrsDWyv70eLGOkbrwJotG316lDVeJvd2pouE3YW4M4nAEBkADTD1eOvBNPUFUUpQAMwplbK7gJsa6hWVG58bXTam0OAmAjYBT63kWk4Myeke2TiJynulvsHOZp6y2XrD90AAAAASUVORK5CYII="},s={src:e.i(508296).default,width:180,height:180,blurWidth:8,blurHeight:8,blurDataURL:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAIAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvXivVvITItyZVvSwKFmDRbjjPYDB/SutONn6fiaaH/9k="},i={src:e.i(324755).default,width:48,height:48,blurWidth:0,blurHeight:0},r={src:e.i(475151).default,width:14,height:16,blurWidth:0,blurHeight:0},n={src:e.i(274286).default,width:256,height:256,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA/ElEQVR42m3Pz0vCUADA8ed7a3uBjb0sx5C1Ri1oIDJSKEdJgyEFtbwFgScpsGNR1CmyS0Ho0ZOggv+A4F3B30f9HwRRwYMICupNPPg5fa9fANazLQtCtC0jdGbSdFSmN6+Ry/tIHd/+w52jOwyRCDRZL+UJ6eREdXauR0dq8HtiBl7mD25r+MtyLfBO+Fpm19UXTsJ17LnPWhyf+rNvVWOiu38j+Zrgk/CNuHDYtfsiRUa1khYnpH9Y0viQtIGxf1oGfsVoFxzOYULR51f+p6lifo09wdjs0hvuvbKkAhDF7GkUFYpgnLhg8DPtOAghOfAGiWRs2KBz/dqKBVIdOzeF2+/ZAAAAAElFTkSuQmCC"},o={src:e.i(436494).default,width:200,height:200,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAnElEQVR42oXOsQqCUACF4ftWvUFbBFFzQSVRLQ5RmRDkUJFTIUFNEQgNDWFTNURjgyAiOgiiCF7FQRCcVFQQJ1H4t284B1gwzA0UAS/A2+N7pp8nmrne3yynJ6Cp3mBBoARZbfcqjVZ3tkSwlSw7QFHc5gitI+M1delM8LhafyhKNjCN4PPjsR2Fk8f59jDd7JnXHxp+Oh5zVsmrCGlHlzZm+jq8AAAAAElFTkSuQmCC"},d={src:e.i(204086).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhElEQVR42oWPuw0DIRBEr6g7aIGQAAQSEiTk1EAHVILogIQAQUPOxoKT5cSfYDbYedqdOc7zfFzXhU9a3vHNfGkDhBB472GMQQgB1lo45/Z+A4wx9N6Rc8acE7VWpJRuYI0YI1prW6UUjDHAOb9fLEAIAaXUPi2lhNYalNJ3hp8h/9V8AqCAe6iqrOaAAAAAAElFTkSuQmCC"},c={src:e.i(531150).default,width:48,height:48,blurWidth:8,blurHeight:8,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAA40lEQVR42lWOvesBcQDGz0/9VmUl/4lSyqaUic5gM0jKSBlISgaXwWCwGc7gFPKeIikUMXAldec9Wdx5uft+v3KFMzzL8/k89WAIIUweyLG6W9tRFNmKGUHw9wMfAvgfDBfWddWbv5aNE5Gtmr9LiBSNzgq3uQv7UKzY2tZ9uXvfl/4IxxOvyeZn/niyQkWJJkXTjB7ez2oJHk6cNpzo5ohUjeTHRICnSScEQPliGIKistef23FPYUNSo6CwJHGw6xgQggpJEBYZ12UQiY2njOnCPVSv528oCWDbNopMySIv5XkCtum3l9/HqzEAAAAASUVORK5CYII="},u=[{id:"arize",displayName:"Arize",logo:t.src,supports_key_team_logging:!0,dynamic_params:{arize_api_key:"password",arize_space_id:"password"},description:"Arize Logging Integration"},{id:"braintrust",displayName:"Braintrust",logo:a.src,supports_key_team_logging:!1,dynamic_params:{braintrust_api_key:"password",braintrust_project_name:"text"},description:"Braintrust Logging Integration"},{id:"custom_callback_api",displayName:"Custom Callback API",supports_key_team_logging:!0,dynamic_params:{custom_callback_api_url:"text",custom_callback_api_headers:"text"},description:"Custom Callback API Logging Integration"},{id:"galileo",displayName:"Galileo",logo:i.src,supports_key_team_logging:!1,dynamic_params:{GALILEO_API_KEY:"password",GALILEO_PROJECT_ID:"text",GALILEO_LOG_STREAM_ID:"text",GALILEO_BASE_URL:"text",GALILEO_USERNAME:"text",GALILEO_PASSWORD:"password"},description:"Galileo AI Observability Integration"},{id:"datadog",displayName:"Datadog",logo:s.src,supports_key_team_logging:!1,dynamic_params:{dd_api_key:"password",dd_site:"text"},description:"Datadog Logging Integration"},{id:"lago",displayName:"Lago",logo:r.src,supports_key_team_logging:!1,dynamic_params:{lago_api_url:"text",lago_api_key:"password"},description:"Lago Billing Logging Integration"},{id:"langfuse",displayName:"Langfuse",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v2 Logging Integration"},{id:"langfuse_otel",displayName:"Langfuse OTEL",logo:n.src,supports_key_team_logging:!0,dynamic_params:{langfuse_public_key:"text",langfuse_secret_key:"password",langfuse_host:"text"},description:"Langfuse v3 OTEL Logging Integration"},{id:"langsmith",displayName:"LangSmith",logo:o.src,supports_key_team_logging:!0,dynamic_params:{langsmith_api_key:"password",langsmith_project:"text",langsmith_base_url:"text",langsmith_sampling_rate:"number"},description:"Langsmith Logging Integration"},{id:"openmeter",displayName:"OpenMeter",logo:d.src,supports_key_team_logging:!1,dynamic_params:{openmeter_api_key:"password",openmeter_base_url:"text"},description:"OpenMeter Logging Integration"},{id:"otel",displayName:"Open Telemetry",logo:c.src,supports_key_team_logging:!1,dynamic_params:{otel_endpoint:"text",otel_headers:"text"},description:"OpenTelemetry Logging Integration"},{id:"s3",displayName:"S3",logo:l.src,supports_key_team_logging:!1,dynamic_params:{s3_bucket_name:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"S3 Bucket (AWS) Logging Integration"},{id:"SQS",displayName:"SQS",logo:l.src,supports_key_team_logging:!1,dynamic_params:{sqs_queue_url:"text",aws_access_key_id:"password",aws_secret_access_key:"password",aws_region:"text"},description:"SQS Queue (AWS) Logging Integration"}],m=u.reduce((e,t)=>(e[t.displayName]=t,e),{}),g=u.reduce((e,t)=>(e[t.displayName]=t.id,e),{}),p=u.reduce((e,t)=>(e[t.id]=t.displayName,e),{});e.s(["callbackInfo",0,m,"callback_map",0,g,"mapDisplayToInternalNames",0,e=>e.map(e=>g[e]||e),"mapInternalToDisplayNames",0,e=>e.map(e=>p[e]||e),"reverse_callback_map",0,p],557662)},9314,645526,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(981339);e.i(247167);var s=e.i(931067),i=e.i(271645);let r={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M824.2 699.9a301.55 301.55 0 00-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 00-86.4 60.4C345 754.6 314 826.8 312 903.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.5A226.62 226.62 0 01612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 008-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 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 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 01612 612zM361.5 510.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.9-1.7-203.3 89.2-203.3 199.9 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.9-1 6.5-4.7 6-8.7z"}}]},name:"team",theme:"outlined"};var n=e.i(9583),o=i.forwardRef(function(e,t){return i.createElement(n.default,(0,s.default)({},e,{ref:t,icon:r}))});e.s(["TeamOutlined",0,o],645526);var d=e.i(599724),c=e.i(263147);e.s(["default",0,({value:e,onChange:s,placeholder:i="Select access groups",disabled:r=!1,style:n,className:u,showLabel:m=!1,labelText:g="Access Group",allowClear:p=!0})=>{let{data:h,isLoading:x,isError:y}=(0,c.useAccessGroups)();if(x)return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(a.Skeleton.Input,{active:!0,block:!0,style:{height:32,...n}})]});let b=(h??[]).map(e=>({label:(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-medium",children:e.access_group_name})," ",(0,t.jsxs)("span",{className:"text-gray-400 text-xs",children:["(",e.access_group_id,")"]})]}),value:e.access_group_id,selectedLabel:e.access_group_name,searchText:`${e.access_group_name} ${e.access_group_id}`}));return(0,t.jsxs)("div",{children:[m&&(0,t.jsxs)(d.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(o,{className:"mr-2"})," ",g]}),(0,t.jsx)(l.Select,{mode:"multiple",value:e,placeholder:i,onChange:s,disabled:r,allowClear:p,showSearch:!0,style:{width:"100%",...n},className:`rounded-md ${u??""}`,notFoundContent:y?(0,t.jsx)("span",{className:"text-red-500",children:"Failed to load access groups"}):"No access groups found",filterOption:(e,t)=>(b.find(e=>e.value===t?.value)?.searchText??"").toLowerCase().includes(e.toLowerCase()),optionLabelProp:"selectedLabel",options:b.map(e=>({label:e.label,value:e.value,selectedLabel:e.selectedLabel}))})]})}],9314)},392110,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(592968),i=e.i(312361),r=e.i(790848),n=e.i(536916),o=e.i(808613),d=e.i(827252),c=e.i(779241);let{Option:u}=a.Select;e.s(["default",0,({form:e,autoRotationEnabled:m,onAutoRotationChange:g,rotationInterval:p,onRotationIntervalChange:h,isCreateMode:x=!1,neverExpire:y=!1,onNeverExpireChange:b})=>{let f=p&&!["7d","30d","90d","180d","365d"].includes(p),[j,_]=(0,l.useState)(f),[v,A]=(0,l.useState)(f?p:"");return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Key Expiry Settings"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Expire Key"}),(0,t.jsx)(s.Tooltip,{title:"Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to keep the current expiry unchanged.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})}),!x&&b&&(0,t.jsx)(n.Checkbox,{checked:y,onChange:t=>{let l=t.target.checked;b(l),l&&(e&&"function"==typeof e.setFieldValue?e.setFieldValue("duration",""):e&&"function"==typeof e.setFieldsValue&&e.setFieldsValue({duration:""}))},className:"ml-2 text-sm font-normal text-gray-600",children:"Never Expire"})]}),(0,t.jsx)(o.Form.Item,{name:"duration",noStyle:!0,initialValue:"",children:(0,t.jsx)(c.TextInput,{placeholder:x?"e.g., 30d or leave empty to never expire":"e.g., 30d",className:"w-full",disabled:!x&&y})})]})]}),(0,t.jsx)(i.Divider,{}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Auto-Rotation Settings"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Enable Auto-Rotation"}),(0,t.jsx)(s.Tooltip,{title:"Key will automatically regenerate at the specified interval for enhanced security.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsx)(r.Switch,{checked:m,onChange:g,size:"default",className:m?"":"bg-gray-400"})]}),m&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 flex items-center space-x-1",children:[(0,t.jsx)("span",{children:"Rotation Interval"}),(0,t.jsx)(s.Tooltip,{title:"How often the key should be automatically rotated. Choose the interval that best fits your security requirements.",children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 cursor-help text-xs"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(a.Select,{value:j?"custom":p,onChange:e=>{"custom"===e?_(!0):(_(!1),A(""),h(e))},className:"w-full",placeholder:"Select interval",children:[(0,t.jsx)(u,{value:"7d",children:"7 days"}),(0,t.jsx)(u,{value:"30d",children:"30 days"}),(0,t.jsx)(u,{value:"90d",children:"90 days"}),(0,t.jsx)(u,{value:"180d",children:"180 days"}),(0,t.jsx)(u,{value:"365d",children:"365 days"}),(0,t.jsx)(u,{value:"custom",children:"Custom interval"})]}),j&&(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(c.TextInput,{value:v,onChange:e=>{let t=e.target.value;A(t),h(t)},placeholder:"e.g., 1s, 5m, 2h, 14d"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Supported formats: seconds (s), minutes (m), hours (h), days (d)"})]})]})]})]}),m&&(0,t.jsx)("div",{className:"bg-blue-50 p-3 rounded-md text-sm text-blue-700",children:"When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period."})]})]})}])},533882,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(250980),s=e.i(797672),i=e.i(68155),r=e.i(304967),n=e.i(629569),o=e.i(599724),d=e.i(269200),c=e.i(427612),u=e.i(64848),m=e.i(942232),g=e.i(496020),p=e.i(977572),h=e.i(992619),x=e.i(727749);e.s(["default",0,({accessToken:e,initialModelAliases:y={},onAliasUpdate:b,showExampleConfig:f=!0})=>{let[j,_]=(0,l.useState)([]),[v,A]=(0,l.useState)({aliasName:"",targetModel:""}),[w,k]=(0,l.useState)(null);(0,l.useEffect)(()=>{_(Object.entries(y).map(([e,t],l)=>({id:`${l}-${e}`,aliasName:e,targetModel:t})))},[y]);let N=()=>{if(!w)return;if(!w.aliasName||!w.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.id!==w.id&&e.aliasName===w.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=j.map(e=>e.id===w.id?w:e);_(e),k(null);let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias updated successfully")},C=()=>{k(null)},S=j.reduce((e,t)=>(e[t.aliasName]=t.targetModel,e),{});return(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Add New Alias"}),(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Alias Name"}),(0,t.jsx)("input",{type:"text",value:v.aliasName,onChange:e=>A({...v,aliasName:e.target.value}),placeholder:"e.g., gpt-4o",className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs text-gray-500 mb-1",children:"Target Model"}),(0,t.jsx)(h.default,{accessToken:e,value:v.targetModel,placeholder:"Select target model",onChange:e=>A({...v,targetModel:e}),showLabel:!1})]}),(0,t.jsx)("div",{className:"flex items-end",children:(0,t.jsxs)("button",{onClick:()=>{if(!v.aliasName||!v.targetModel)return void x.default.fromBackend("Please provide both alias name and target model");if(j.some(e=>e.aliasName===v.aliasName))return void x.default.fromBackend("An alias with this name already exists");let e=[...j,{id:`${Date.now()}-${v.aliasName}`,aliasName:v.aliasName,targetModel:v.targetModel}];_(e),A({aliasName:"",targetModel:""});let t={};e.forEach(e=>{t[e.aliasName]=e.targetModel}),b&&b(t),x.default.success("Alias added successfully")},disabled:!v.aliasName||!v.targetModel,className:`flex items-center px-4 py-2 rounded-md text-sm ${!v.aliasName||!v.targetModel?"bg-gray-300 text-gray-500 cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700"}`,children:[(0,t.jsx)(a.PlusCircleIcon,{className:"w-4 h-4 mr-1"}),"Add Alias"]})})]})]}),(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 mb-2",children:"Manage Existing Aliases"}),(0,t.jsx)("div",{className:"rounded-lg custom-border relative mb-6",children:(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)(d.Table,{className:"[&_td]:py-0.5 [&_th]:py-1",children:[(0,t.jsx)(c.TableHead,{children:(0,t.jsxs)(g.TableRow,{children:[(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Alias Name"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Target Model"}),(0,t.jsx)(u.TableHeaderCell,{className:"py-1 h-8",children:"Actions"})]})}),(0,t.jsxs)(m.TableBody,{children:[j.map(l=>(0,t.jsx)(g.TableRow,{className:"h-8",children:w&&w.id===l.id?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)("input",{type:"text",value:w.aliasName,onChange:e=>k({...w,aliasName:e.target.value}),className:"w-full px-2 py-1 border border-gray-300 rounded-md text-sm"})}),(0,t.jsx)(p.TableCell,{className:"py-0.5",children:(0,t.jsx)(h.default,{accessToken:e,value:w.targetModel,onChange:e=>k({...w,targetModel:e}),showLabel:!1,style:{height:"32px"}})}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:N,className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:"Save"}),(0,t.jsx)("button",{onClick:C,className:"text-xs bg-gray-50 text-gray-600 px-2 py-1 rounded-sm hover:bg-gray-100",children:"Cancel"})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-900",children:l.aliasName}),(0,t.jsx)(p.TableCell,{className:"py-0.5 text-sm text-gray-500",children:l.targetModel}),(0,t.jsx)(p.TableCell,{className:"py-0.5 whitespace-nowrap",children:(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>{k({...l})},className:"text-xs bg-blue-50 text-blue-600 px-2 py-1 rounded-sm hover:bg-blue-100",children:(0,t.jsx)(s.PencilIcon,{className:"w-3 h-3"})}),(0,t.jsx)("button",{onClick:()=>{var e;let t,a;return e=l.id,_(t=j.filter(t=>t.id!==e)),a={},void(t.forEach(e=>{a[e.aliasName]=e.targetModel}),b&&b(a),x.default.success("Alias deleted successfully"))},className:"text-xs bg-red-50 text-red-600 px-2 py-1 rounded-sm hover:bg-red-100",children:(0,t.jsx)(i.TrashIcon,{className:"w-3 h-3"})})]})})]})},l.id)),0===j.length&&(0,t.jsx)(g.TableRow,{children:(0,t.jsx)(p.TableCell,{colSpan:3,className:"py-0.5 text-sm text-gray-500 text-center",children:"No aliases added yet. Add a new alias above."})})]})]})})}),f&&(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(n.Title,{className:"mb-4",children:"Configuration Example"}),(0,t.jsx)(o.Text,{className:"text-gray-600 mb-4",children:"Here's how your current aliases would look in the config:"}),(0,t.jsx)("div",{className:"bg-gray-100 rounded-lg p-4 font-mono text-sm",children:(0,t.jsxs)("div",{className:"text-gray-700",children:["model_aliases:",0===Object.keys(S).length?(0,t.jsxs)("span",{className:"text-gray-500",children:[(0,t.jsx)("br",{}),"  # No aliases configured yet"]}):Object.entries(S).map(([e,l])=>(0,t.jsxs)("span",{children:[(0,t.jsx)("br",{}),'  "',e,'": "',l,'"']},e))]})})]})]})}])},844565,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(199133),s=e.i(602869);e.s(["default",0,({onChange:e,value:i,className:r,accessToken:n,placeholder:o="Select pass through routes",disabled:d=!1,teamId:c})=>{let[u,m]=(0,l.useState)([]),[g,p]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{(async()=>{if(n){p(!0);try{let e=await (0,s.getPassThroughEndpointsCall)(n,c);if(e.endpoints){let t=e.endpoints.flatMap(e=>{let t=e.path,l=e.methods;return l&&l.length>0?l.map(e=>({label:`${e} ${t}`,value:t})):[{label:t,value:t}]});m(t)}}catch(e){console.error("Error fetching pass through routes:",e)}finally{p(!1)}}})()},[n,c]),(0,t.jsx)(a.Select,{mode:"tags",placeholder:o,onChange:e,value:i,loading:g,className:r,allowClear:!0,options:u,optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:d})}])},810757,477386,e=>{"use strict";var t=e.i(271645);let l=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}))});e.s(["CogIcon",0,l],810757);let a=t.forwardRef(function(e,l){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:l},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"}))});e.s(["BanIcon",0,a],477386)},266484,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(592968),s=e.i(312361),i=e.i(827252),r=e.i(994388),n=e.i(304967),o=e.i(779241),d=e.i(988297),c=e.i(68155),u=e.i(810757),m=e.i(477386),g=e.i(557662),p=e.i(174553),h=e.i(435451);let{Option:x}=l.Select;e.s(["default",0,({value:e=[],onChange:y,disabledCallbacks:b=[],onDisabledCallbacksChange:f})=>{let j=Object.entries(g.callbackInfo).filter(([e,t])=>t.supports_key_team_logging).map(([e,t])=>e),_=Object.keys(g.callbackInfo),v=e=>{y?.(e)},A=(t,l,a)=>{let s=[...e];if("callback_name"===l){let e=g.callback_map[a]||a;s[t]={...s[t],[l]:e,callback_vars:{}}}else s[t]={...s[t],[l]:a};v(s)},w=(t,l,a)=>{let s=[...e];s[t]={...s[t],callback_vars:{...s[t].callback_vars,[l]:a}},v(s)};return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(m.BanIcon,{className:"w-5 h-5 text-red-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Disabled Callbacks"}),(0,t.jsx)(a.Tooltip,{title:"Select callbacks to disable for this key. Disabled callbacks will not receive any logging data.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Disabled Callbacks"}),(0,t.jsx)(l.Select,{mode:"multiple",placeholder:"Select callbacks to disable",value:b,onChange:e=>{let t=(0,g.mapDisplayToInternalNames)(e);f?.(t)},style:{width:"100%"},optionLabelProp:"label",children:_.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Select callbacks that should be disabled for this key. These callbacks will not receive any logging data."})]})]}),(0,t.jsx)(s.Divider,{}),(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(u.CogIcon,{className:"w-5 h-5 text-blue-500"}),(0,t.jsx)("span",{className:"text-base font-semibold text-gray-800",children:"Logging Integrations"}),(0,t.jsx)(a.Tooltip,{title:"Configure callback logging integrations for this team.",children:(0,t.jsx)(i.InfoCircleOutlined,{className:"text-gray-400 cursor-help"})})]}),(0,t.jsx)(r.Button,{variant:"secondary",onClick:()=>{v([...e,{callback_name:"",callback_type:"success",callback_vars:{}}])},icon:d.PlusIcon,size:"sm",className:"hover:border-blue-400 hover:text-blue-500",type:"button",children:"Add Integration"})]}),(0,t.jsx)("div",{className:"space-y-4",children:e.map((s,i)=>{let d=s.callback_name?Object.entries(g.callback_map).find(([e,t])=>t===s.callback_name)?.[0]:void 0;return(0,t.jsxs)(n.Card,{className:"border border-gray-200 shadow-xs hover:shadow-md transition-shadow duration-200",decoration:"top",decorationColor:"blue",children:[(0,t.jsxs)("div",{className:"flex justify-between items-start mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[d&&(0,t.jsx)(p.Logo,{src:g.callbackInfo[d]?.logo,label:d,className:"w-5 h-5 object-contain"}),(0,t.jsxs)("span",{className:"text-sm font-medium",children:[d||"New Integration"," Configuration"]})]}),(0,t.jsx)(r.Button,{variant:"light",onClick:()=>{v(e.filter((e,t)=>t!==i))},icon:c.TrashIcon,size:"xs",color:"red",className:"hover:bg-red-50",type:"button",children:"Remove"})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Integration Type"}),(0,t.jsx)(l.Select,{value:d,placeholder:"Select integration",onChange:e=>A(i,"callback_name",e),className:"w-full",optionLabelProp:"label",children:j.map(e=>{let l=g.callbackInfo[e]?.description;return(0,t.jsx)(x,{value:e,label:e,children:(0,t.jsx)(a.Tooltip,{title:l,placement:"right",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)(p.Logo,{src:g.callbackInfo[e]?.logo,label:e,className:"w-4 h-4 object-contain"}),(0,t.jsx)("span",{children:e})]})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Event Type"}),(0,t.jsxs)(l.Select,{value:s.callback_type,onChange:e=>A(i,"callback_type",e),className:"w-full",children:[(0,t.jsx)(x,{value:"success",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),(0,t.jsx)("span",{children:"Success Only"})]})}),(0,t.jsx)(x,{value:"failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-red-500 rounded-full"}),(0,t.jsx)("span",{children:"Failure Only"})]})}),(0,t.jsx)(x,{value:"success_and_failure",children:(0,t.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,t.jsx)("div",{className:"w-2 h-2 bg-blue-500 rounded-full"}),(0,t.jsx)("span",{children:"Success & Failure"})]})})]})]})]}),((e,l)=>{if(!e.callback_name)return null;let a=Object.entries(g.callback_map).find(([t,l])=>l===e.callback_name)?.[0];if(!a)return null;let s=g.callbackInfo[a]?.dynamic_params||{};return 0===Object.keys(s).length?null:(0,t.jsxs)("div",{className:"mt-6 pt-4 border-t border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-2 mb-4",children:[(0,t.jsx)("div",{className:"w-3 h-3 bg-blue-100 rounded-full flex items-center justify-center",children:(0,t.jsx)("div",{className:"w-1.5 h-1.5 bg-blue-500 rounded-full"})}),(0,t.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Integration Parameters"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-4",children:Object.entries(s).map(([a,s])=>(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-gray-700 capitalize flex items-center space-x-1",children:[(0,t.jsx)("span",{children:a.replace(/_/g," ")}),"password"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Sensitive"}),"number"===s&&(0,t.jsx)("span",{className:"inline-flex items-center px-2 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800",children:"Number"})]}),"number"===s&&(0,t.jsx)("span",{className:"text-xs text-gray-500",children:"Value must be between 0 and 1"}),"number"===s?(0,t.jsx)(h.default,{step:.01,width:400,placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)}):(0,t.jsx)(o.TextInput,{type:"password"===s?"password":"text",placeholder:`os.environ/${a.toUpperCase()}`,value:e.callback_vars[a]||"",onChange:e=>w(l,a,e.target.value)})]},a))})]})})(s,i)]})]},i)})}),0===e.length&&(0,t.jsxs)("div",{className:"text-center py-12 text-gray-500 border-2 border-dashed border-gray-200 rounded-lg bg-gray-50/50",children:[(0,t.jsx)(u.CogIcon,{className:"w-12 h-12 text-gray-300 mb-3 mx-auto"}),(0,t.jsx)("div",{className:"text-base font-medium mb-1",children:"No logging integrations configured"}),(0,t.jsx)("div",{className:"text-sm text-gray-400",children:'Click "Add Integration" to configure logging for this team'})]})]})}])},651904,e=>{"use strict";var t=e.i(843476),l=e.i(599724),a=e.i(266484);e.s(["default",0,function({value:e,onChange:s,premiumUser:i=!1,disabledCallbacks:r=[],onDisabledCallbacksChange:n}){return i?(0,t.jsx)(a.default,{value:e,onChange:s,disabledCallbacks:r,onDisabledCallbacksChange:n}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 mb-3",children:[(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ langfuse-logging"}),(0,t.jsx)("div",{className:"inline-flex items-center px-3 py-1.5 rounded-lg bg-green-50 border border-green-200 text-green-800 text-sm font-medium opacity-50",children:"✨ datadog-logging"})]}),(0,t.jsx)("div",{className:"p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:(0,t.jsxs)(l.Text,{className:"text-sm text-yellow-800",children:["Setting Key/Team logging settings is a LiteLLM Enterprise feature. Global Logging Settings are available for all free users. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"here"}),"."]})})]})}])},939510,e=>{"use strict";var t=e.i(843476),l=e.i(808613),a=e.i(199133),s=e.i(592968),i=e.i(827252);let{Option:r}=a.Select;e.s(["default",0,({type:e,name:n,showDetailedDescriptions:o=!0,className:d="",initialValue:c=null,form:u,onChange:m})=>{let g=e.toUpperCase(),p=e.toLowerCase(),h=`Select 'guaranteed_throughput' to prevent overallocating ${g} limit when the key belongs to a Team with specific ${g} limits.`;return(0,t.jsx)(l.Form.Item,{label:(0,t.jsxs)("span",{children:[g," Rate Limit Type"," ",(0,t.jsx)(s.Tooltip,{title:h,children:(0,t.jsx)(i.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:n,initialValue:c,className:d,children:(0,t.jsx)(a.Select,{defaultValue:o?"default":void 0,placeholder:"Select rate limit type",style:{width:"100%"},optionLabelProp:o?"label":void 0,onChange:e=>{u&&u.setFieldValue(n,e),m&&m(e)},children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",label:"Default",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Default"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Best effort throughput - no error if we're overallocating ",p," (Team/Key Limits checked at runtime)."]})]})}),(0,t.jsx)(r,{value:"guaranteed_throughput",label:"Guaranteed throughput",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Guaranteed throughput"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["Guaranteed throughput - raise an error if we're overallocating ",p," (also checks model-specific limits)"]})]})}),(0,t.jsx)(r,{value:"dynamic",label:"Dynamic",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)("div",{style:{fontWeight:500},children:"Dynamic"}),(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#6b7280",marginTop:"2px"},children:["If the key has a set ",g," (e.g. 2 ",g,") and there are no 429 errors, it can dynamically exceed the limit when the model being called is not erroring."]})]})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r,{value:"best_effort_throughput",children:"Best effort throughput"}),(0,t.jsx)(r,{value:"guaranteed_throughput",children:"Guaranteed throughput"}),(0,t.jsx)(r,{value:"dynamic",children:"Dynamic"})]})})})}])},460285,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(404206),s=e.i(723731),i=e.i(653824),r=e.i(881073),n=e.i(197647),o=e.i(266027),d=e.i(343488),c=e.i(602869),u=e.i(158392),m=e.i(419470),g=e.i(695411);let p=(0,l.forwardRef)(({accessToken:e,value:p,onChange:h,modelData:x,teamId:y},b)=>{let[f,j]=(0,l.useState)({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),[_,v]=(0,l.useState)([]),[A,w]=(0,l.useState)([]),[k,N]=(0,l.useState)([]),[C,S]=(0,l.useState)({}),[I,T]=(0,l.useState)({}),L=(0,l.useRef)(!1),E=(0,l.useRef)(null);(0,l.useEffect)(()=>{let e=p?.router_settings?JSON.stringify({routing_strategy:p.router_settings.routing_strategy,fallbacks:p.router_settings.fallbacks,enable_tag_filtering:p.router_settings.enable_tag_filtering}):null;if(L.current&&e===E.current){L.current=!1;return}if(L.current&&e!==E.current&&(L.current=!1),e!==E.current)if(E.current=e,p?.router_settings){let e=p.router_settings,{fallbacks:t,...l}=e;j({routerSettings:l,selectedStrategy:e.routing_strategy||null,enableTagFiltering:e.enable_tag_filtering??!1});let a=e.fallbacks||[];v(a),w(a&&0!==a.length?a.map((e,t)=>{let[l,a]=Object.entries(e)[0];return{id:(t+1).toString(),primaryModel:l||null,fallbackModels:a||[]}}):[{id:"1",primaryModel:null,fallbackModels:[]}])}else j({routerSettings:{},selectedStrategy:null,enableTagFiltering:!1}),v([]),w([{id:"1",primaryModel:null,fallbackModels:[]}])},[p]),(0,l.useEffect)(()=>{e&&(0,c.getRouterSettingsCall)(e).then(e=>{if(e.fields){let t={};e.fields.forEach(e=>{t[e.field_name]={ui_field_name:e.ui_field_name,field_description:e.field_description,options:e.options,link:e.link}}),S(t);let l=e.fields.find(e=>"routing_strategy"===e.field_name);l?.options&&N(l.options),e.routing_strategy_descriptions&&T(e.routing_strategy_descriptions)}})},[e]);let{data:O=[]}=(0,o.useQuery)({queryKey:["fallbackAvailableModels",e,y??null],queryFn:()=>y?(0,g.fetchAvailableModelsForTeam)(e,y):(0,g.fetchAvailableModels)(e),enabled:!!e}),F=()=>{let e=new Set(["allowed_fails","cooldown_time","num_retries","timeout","retry_after"]),t=new Set(["model_group_alias","retry_policy"]),l=Object.fromEntries(Object.entries({...f.routerSettings,enable_tag_filtering:f.enableTagFiltering,routing_strategy:f.selectedStrategy,fallbacks:_.length>0?_:null}).map(([l,a])=>{if("routing_strategy_args"!==l&&"routing_strategy"!==l&&"enable_tag_filtering"!==l&&"fallbacks"!==l){let s=document.querySelector(`input[name="${l}"]`);if(s){if(void 0!==s.value&&""!==s.value){let i=((l,a,s)=>{if(null==a)return s;let i=String(a).trim();if(""===i||"null"===i.toLowerCase())return null;if(e.has(l)){let e=Number(i);return Number.isNaN(e)?s:e}if(t.has(l)){if(""===i)return null;try{return JSON.parse(i)}catch{return s}}return"true"===i.toLowerCase()||"false"!==i.toLowerCase()&&i})(l,s.value,a);return[l,i]}return[l,null]}}else if("routing_strategy"===l)return[l,f.selectedStrategy];else if("enable_tag_filtering"===l)return[l,f.enableTagFiltering];else if("fallbacks"===l)return[l,_.length>0?_:null];else if("routing_strategy_args"===l&&"latency-based-routing"===f.selectedStrategy){let e=document.querySelector('input[name="lowest_latency_buffer"]'),t=document.querySelector('input[name="ttl"]'),l={};return e?.value&&(l.lowest_latency_buffer=Number(e.value)),t?.value&&(l.ttl=Number(t.value)),["routing_strategy_args",Object.keys(l).length>0?l:null]}return[l,a]}).filter(e=>null!=e)),a=(e,t=!1)=>null==e||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length||t&&("number"!=typeof e||Number.isNaN(e))?null:e;return{routing_strategy:a(l.routing_strategy),allowed_fails:a(l.allowed_fails,!0),cooldown_time:a(l.cooldown_time,!0),num_retries:a(l.num_retries,!0),timeout:a(l.timeout,!0),retry_after:a(l.retry_after,!0),fallbacks:_.length>0?_:null,context_window_fallbacks:a(l.context_window_fallbacks),retry_policy:a(l.retry_policy),model_group_alias:a(l.model_group_alias),enable_tag_filtering:f.enableTagFiltering,routing_strategy_args:a(l.routing_strategy_args)}},M=(0,d.useDebouncedCallback)(()=>{h&&(L.current=!0,h({router_settings:F()}))},{wait:100});(0,l.useEffect)(()=>{h&&M()},[f,_]);let R=Array.from(new Set(O.map(e=>e.model_group))).sort();return((0,l.useImperativeHandle)(b,()=>({getValue:()=>({router_settings:F()})})),e)?(0,t.jsx)("div",{className:"w-full",children:(0,t.jsxs)(i.TabGroup,{className:"w-full",children:[(0,t.jsxs)(r.TabList,{variant:"line",defaultValue:"1",className:"px-8 pt-4",children:[(0,t.jsx)(n.Tab,{value:"1",children:"Loadbalancing"}),(0,t.jsx)(n.Tab,{value:"2",children:"Fallbacks"})]}),(0,t.jsxs)(s.TabPanels,{className:"px-8 py-6",children:[(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(u.default,{value:f,onChange:j,routerFieldsMetadata:C,availableRoutingStrategies:k,routingStrategyDescriptions:I})}),(0,t.jsx)(a.TabPanel,{children:(0,t.jsx)(m.FallbackSelectionForm,{groups:A,onGroupsChange:e=>{w(e),v(e.filter(e=>e.primaryModel&&e.fallbackModels.length>0).map(e=>({[e.primaryModel]:e.fallbackModels})))},availableModels:R,maxGroups:5})})]})]})}):null});p.displayName="RouterSettingsAccordion",e.s(["default",0,p])},363256,e=>{"use strict";var t=e.i(843476),l=e.i(199133);let{Text:a}=e.i(898586).Typography;e.s(["default",0,({organizations:e,value:s,onChange:i,disabled:r,loading:n,style:o,placeholder:d="All Organizations"})=>(0,t.jsx)(l.Select,{showSearch:!0,placeholder:d,value:s,onChange:i,disabled:r,loading:n,allowClear:!0,style:{minWidth:280,...o},filterOption:(t,l)=>{if(!l)return!1;let a=e?.find(e=>e.organization_id===l.key);if(!a)return!1;let s=t.toLowerCase().trim(),i=(a.organization_alias||"").toLowerCase(),r=(a.organization_id||"").toLowerCase();return i.includes(s)||r.includes(s)},children:e?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.organization_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.organization_alias})," ",(0,t.jsxs)(a,{type:"secondary",children:["(",e.organization_id,")"]})]},e.organization_id))})])},575260,e=>{"use strict";var t=e.i(843476),l=e.i(199133),a=e.i(482725),s=e.i(56456);e.s(["default",0,({projects:e,value:i,onChange:r,disabled:n,loading:o,teamId:d})=>{let c=d?e?.filter(e=>e.team_id===d):e;return(0,t.jsx)(l.Select,{showSearch:!0,placeholder:"Search or select a project",value:i,onChange:r,disabled:n,loading:o,allowClear:!0,notFoundContent:o?(0,t.jsx)(a.Spin,{indicator:(0,t.jsx)(s.LoadingOutlined,{spin:!0}),size:"small"}):void 0,filterOption:(e,t)=>{if(!t)return!1;let l=c?.find(e=>e.project_id===t.key);if(!l)return!1;let a=e.toLowerCase().trim(),s=(l.project_alias||"").toLowerCase(),i=(l.project_id||"").toLowerCase();return s.includes(a)||i.includes(a)},optionFilterProp:"children",children:!o&&c?.map(e=>(0,t.jsxs)(l.Select.Option,{value:e.project_id,children:[(0,t.jsx)("span",{className:"font-medium",children:e.project_alias||e.project_id})," ",(0,t.jsxs)("span",{className:"text-gray-500",children:["(",e.project_id,")"]})]},e.project_id))})}])},128233,319312,833400,e=>{"use strict";var t=e.i(843476),l=e.i(464571),a=e.i(199133),s=e.i(592968),i=e.i(425063),r=e.i(107233),n=e.i(37727),o=e.i(271645);e.s(["BudgetFallbacksEditor",0,function({value:e,onChange:d,availableModels:c}){let[u,m]=(0,o.useState)(()=>{let t;return 0===(t=Object.keys(e)).length?[]:t.map((t,l)=>({id:String(l+1),primaryModel:t,fallbackModels:e[t]}))}),g=e=>{m(e),d(Object.fromEntries(e.filter(e=>null!==e.primaryModel&&e.fallbackModels.length>0).map(e=>[e.primaryModel,e.fallbackModels])))},p=()=>{g([...u,{id:Date.now().toString(),primaryModel:null,fallbackModels:[]}])},h=(e,t)=>{g(u.map(l=>l.id===e?{...l,...t}:l))},x=new Set(u.map(e=>e.primaryModel).filter(Boolean));return 0===u.length?(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"When a model exceeds its per-model budget, requests automatically reroute to fallback models"}),u.map(e=>{let l=c.filter(t=>t===e.primaryModel||!x.has(t)),r=c.filter(t=>t!==e.primaryModel);return(0,t.jsxs)("div",{className:"relative rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void g(u.filter(e=>e.id!==t))},className:"absolute top-2 right-2 text-gray-400 hover:text-red-500 transition-colors p-1",children:(0,t.jsx)(n.X,{className:"w-4 h-4"})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Primary Model"}),(0,t.jsx)(a.Select,{className:"w-full",placeholder:"Select model",value:e.primaryModel,onChange:t=>{let l=e.fallbackModels.filter(e=>e!==t);h(e.id,{primaryModel:t,fallbackModels:l})},showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:l.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body})]}),(0,t.jsx)("div",{className:"flex items-center justify-center -my-1 mb-2",children:(0,t.jsxs)("div",{className:"bg-amber-50 text-amber-600 px-3 py-0.5 rounded-full text-[10px] font-bold border border-amber-100 flex items-center gap-1",children:[(0,t.jsx)(i.ArrowDown,{className:"w-3 h-3"}),"IF BUDGET EXCEEDED, TRY"]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"Fallback Models"}),(0,t.jsx)(a.Select,{mode:"multiple",className:"w-full",placeholder:e.primaryModel?"Select fallback models":"Select a primary model first",value:e.fallbackModels,onChange:t=>h(e.id,{fallbackModels:t}),disabled:!e.primaryModel,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:r.map(e=>({label:e,value:e})),getPopupContainer:e=>e.parentElement||document.body,maxTagCount:"responsive",maxTagPlaceholder:e=>(0,t.jsx)(s.Tooltip,{styles:{root:{pointerEvents:"none"}},title:e.map(({value:e})=>e).join(", "),children:(0,t.jsxs)("span",{children:["+",e.length," more"]})})}),e.fallbackModels.length>1&&(0,t.jsx)("div",{className:"text-[10px] text-gray-400 mt-1 ml-1",children:"Tried in order; first model still within its own budget is used"})]})]},e.id)}),(0,t.jsx)(l.Button,{size:"small",onClick:p,icon:(0,t.jsx)(r.Plus,{className:"w-3 h-3"}),children:"Add Budget Fallback"})]})}],128233);var d=e.i(28651);let c=[{value:"1h",label:"Hourly",resetHint:"Resets every hour"},{value:"24h",label:"Daily",resetHint:"Resets daily at midnight UTC"},{value:"7d",label:"Weekly",resetHint:"Resets every Sunday at midnight UTC"},{value:"30d",label:"Monthly",resetHint:"Resets on the 1st of every month at midnight UTC"}];e.s(["BudgetWindowsEditor",0,function({value:e,onChange:s}){let i=(t,l,a)=>{s(e.map((e,s)=>s===t?{...e,[l]:a}:e))};return(0,t.jsxs)("div",{children:[e.map((r,n)=>{let o=c.find(e=>e.value===r.budget_duration)?.resetHint;return(0,t.jsxs)("div",{style:{marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsx)(a.Select,{value:r.budget_duration,onChange:e=>i(n,"budget_duration",e),style:{width:130},options:c.map(e=>({value:e.value,label:e.label}))}),(0,t.jsx)(d.InputNumber,{step:.01,min:0,precision:2,value:r.max_budget??void 0,onChange:e=>i(n,"max_budget",e??null),placeholder:"Max spend ($)",style:{width:160},prefix:"$"}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{s(e.filter((e,t)=>t!==n))},style:{padding:"0 4px"},children:"✕"})]}),o&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#888",marginTop:3,marginLeft:2},children:["↻ ",o]})]},n)}),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),s([...e,{budget_duration:"24h",max_budget:null}])},children:"+ Add Budget Window"})]})}],319312);var u=e.i(311451);let m=0,g=()=>`tag-row-${m++}`;e.s(["TagRateLimitEditor",0,function({value:e,onChange:a}){let s=(t,l,s)=>{a(e.map((e,a)=>a===t?{...e,[l]:s}:e))};return(0,t.jsxs)("div",{children:[e.map((i,r)=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12},children:[(0,t.jsx)(u.Input,{value:i.tag,onChange:e=>s(r,"tag",e.target.value),placeholder:"Tag (e.g. cell-1)",style:{width:180}}),(0,t.jsx)(d.InputNumber,{min:0,value:i.rpm_limit??void 0,onChange:e=>s(r,"rpm_limit",e??null),placeholder:"RPM",style:{width:120}}),(0,t.jsx)(l.Button,{type:"text",danger:!0,size:"small",onClick:()=>{a(e.filter((e,t)=>t!==r))},style:{padding:"0 4px"},children:"✕"})]},i.id)),(0,t.jsx)(l.Button,{size:"small",onClick:t=>{t.preventDefault(),a([...e,{id:g(),tag:"",rpm_limit:null}])},children:"+ Add Tag Limit"})]})},"tagLimitsToRows",0,e=>{let t=(e=>{if(!e||"object"!=typeof e)return{};let t={};return Object.entries(e).forEach(([e,l])=>{"number"==typeof l&&(t[e]=l)}),t})(e);return Object.keys(t).map(e=>({id:g(),tag:e,rpm_limit:t[e]}))},"tagRowsToLimits",0,e=>{let t={};return e.forEach(({tag:e,rpm_limit:l})=>{let a=e.trim();a&&"number"==typeof l&&(t[a]=l)}),{tag_rpm_limit:t}}],833400)},364769,e=>{"use strict";var t=e.i(843476),l=e.i(271645),a=e.i(237016),s=e.i(464571),i=e.i(888259);e.s(["default",0,({apiKey:e})=>{let[r,n]=(0,l.useState)(!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"mb-2",children:["Please save this secret key somewhere safe and accessible. For security reasons,"," ",(0,t.jsx)("b",{children:"you will not be able to view it again"})," through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]}),(0,t.jsx)("p",{className:"text-sm text-gray-600 mt-3 mb-1",children:"Virtual Key:"}),(0,t.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,t.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal",margin:0},children:e})}),(0,t.jsx)(a.CopyToClipboard,{text:e,onCopy:()=>{n(!0),i.default.success("Key copied to clipboard"),setTimeout(()=>n(!1),2e3)},children:(0,t.jsx)(s.Button,{type:"primary",style:{marginTop:12},children:r?"Copied!":"Copy Virtual Key"})})]})}])},702597,e=>{"use strict";var t=e.i(843476),l=e.i(207082),a=e.i(109799),s=e.i(510674),i=e.i(109034),r=e.i(292639),n=e.i(135214),o=e.i(500330),d=e.i(827252),c=e.i(912598),u=e.i(677667),m=e.i(130643),g=e.i(898667),p=e.i(994388),h=e.i(309426),x=e.i(350967),y=e.i(599724),b=e.i(779241),f=e.i(629569),j=e.i(464571),_=e.i(808613),v=e.i(311451),A=e.i(212931),w=e.i(91739),k=e.i(199133),N=e.i(790848),C=e.i(262218),S=e.i(592968),I=e.i(898586),T=e.i(343488),L=e.i(741466),E=e.i(271645),O=e.i(708347),F=e.i(552130),M=e.i(557662),R=e.i(9314),B=e.i(860585),P=e.i(82946),D=e.i(392110),U=e.i(533882),z=e.i(844565),V=e.i(651904),K=e.i(939510),Q=e.i(460285),G=e.i(663435),W=e.i(363256),H=e.i(575260),q=e.i(371455),J=e.i(128233),$=e.i(319312),Y=e.i(833400),X=e.i(355619),Z=e.i(75921),ee=e.i(234713),et=e.i(390605),el=e.i(727749),ea=e.i(602869),es=e.i(364769),ei=e.i(435451),er=e.i(916940);let{Option:en}=k.Select,eo=async(e,t,l,a)=>{try{if(null===e||null===t)return[];if(null!==l)return(await (0,ea.modelAvailableCall)(l,e,t,!0,a,!0)).data.map(e=>e.id);return[]}catch(e){return console.error("Error fetching user models:",e),[]}},ed=async(e,t,l,a)=>{try{if(null===e||null===t)return;if(null!==l){let s=(await (0,ea.modelAvailableCall)(l,e,t)).data.map(e=>e.id);a(s)}}catch(e){console.error("Error fetching user models:",e)}};e.s(["default",0,({team:e,teams:ec,data:eu,addKey:em,autoOpenCreate:eg,prefillData:ep})=>{let{accessToken:eh,userId:ex,userRole:ey,premiumUser:eb}=(0,n.default)(),ef=eb||null!=ey&&O.rolesWithWriteAccess.includes(ey),{data:ej,isLoading:e_}=(0,a.useOrganizations)(),{data:ev,isLoading:eA}=(0,s.useProjects)(),{data:ew}=(0,r.useUISettings)(),{data:ek}=(0,i.useTags)(),eN=!!ew?.values?.enable_projects_ui,eC=!!ew?.values?.disable_custom_api_keys,eS=ek?Object.values(ek).map(e=>({value:e.name,label:e.name})):[],eI=(0,c.useQueryClient)(),[eT]=_.Form.useForm(),[eL,eE]=(0,E.useState)(!1),[eO,eF]=(0,E.useState)(null),[eM,eR]=(0,E.useState)([]),[eB,eP]=(0,E.useState)([]),[eD,eU]=(0,E.useState)("you"),[ez,eV]=(0,E.useState)(!1),[eK,eQ]=(0,E.useState)(null),[eG,eW]=(0,E.useState)([]),[eH,eq]=(0,E.useState)([]),[eJ,e$]=(0,E.useState)([]),[eY,eX]=(0,E.useState)([]),[eZ,e0]=(0,E.useState)(e),[e1,e4]=(0,E.useState)(null),[e2,e3]=(0,E.useState)(null),[e6,e5]=(0,E.useState)(!1),[e7,e8]=(0,E.useState)({}),[e9,te]=(0,E.useState)([]),[tt,tl]=(0,E.useState)(!1),[ta,ts]=(0,E.useState)([]),[ti,tr]=(0,E.useState)("llm_api"),[tn,to]=(0,E.useState)({}),[td,tc]=(0,E.useState)(!1),[tu,tm]=(0,E.useState)("30d"),[tg,tp]=(0,E.useState)(null),[th,tx]=(0,E.useState)([]),[ty,tb]=(0,E.useState)([]),[tf,tj]=(0,E.useState)({}),[t_,tv]=(0,E.useState)(0),[tA,tw]=(0,E.useState)(0),[tk,tN]=(0,E.useState)([]),[tC,tS]=(0,E.useState)(null),tI=_.Form.useWatch("models",eT)??[],tT=()=>{eE(!1),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)},tL=()=>{eE(!1),eF(null),e0(null),eT.resetFields(),eX([]),ts([]),tr("llm_api"),to({}),tc(!1),tm("30d"),tp(null),tw(e=>e+1),tS(null),e4(null),e3(null),tx([]),tb([]),tj({}),tv(e=>e+1)};(0,E.useEffect)(()=>{ex&&ey&&eh&&ed(ex,ey,eh,eR)},[eh,ex,ey]),(0,E.useEffect)(()=>{eh&&(0,ea.getAgentsList)(eh).then(e=>tN(e?.agents||[])).catch(()=>tN([]))},[eh]),(0,E.useEffect)(()=>{let e=async()=>{try{let e=(await (0,ea.getPoliciesList)(eh)).policies.map(e=>e.policy_name);eq(e)}catch(e){console.error("Failed to fetch policies:",e)}},t=async()=>{try{let e=await (0,ea.getPromptsList)(eh);e$(e.prompts.map(e=>e.prompt_id))}catch(e){console.error("Failed to fetch prompts:",e)}};(async()=>{try{let e=(await (0,ea.getGuardrailsList)(eh)).guardrails.map(e=>e.guardrail_name);eW(e)}catch(e){console.error("Failed to fetch guardrails:",e)}})(),e(),t()},[eh]),(0,E.useEffect)(()=>{(async()=>{try{if(eh){let e=sessionStorage.getItem("possibleUserRoles");if(e)e8(JSON.parse(e));else{let e=await (0,ea.getPossibleUserRoles)(eh);sessionStorage.setItem("possibleUserRoles",JSON.stringify(e)),e8(e)}}}catch(e){console.error("Error fetching possible user roles:",e)}})()},[eh]),(0,E.useEffect)(()=>{if(eg&&!ez&&ec&&ey&&O.rolesWithWriteAccess.includes(ey)&&(eE(!0),eV(!0),ep)){if(ep.owned_by&&("another_user"===ep.owned_by&&"Admin"!==ey?eU("you"):eU(ep.owned_by)),ep.team_id){let e=ec?.find(e=>e.team_id===ep.team_id)||null;e&&(e0(e),eT.setFieldsValue({team_id:ep.team_id}))}ep.key_alias&&eT.setFieldsValue({key_alias:ep.key_alias}),ep.models&&ep.models.length>0&&eQ(ep.models),ep.key_type&&(tr(ep.key_type),eT.setFieldsValue({key_type:ep.key_type}))}},[eg,ep,ec,ez,eT,ey]);let tE=eB.includes("no-default-models")&&!eZ,tO=async e=>{try{let t,a=e?.key_alias??"",s=e?.team_id??null;if((eu?.filter(e=>e.team_id===s).map(e=>e.key_alias)??[]).includes(a))throw Error(`Key alias ${a} already exists for team with ID ${s}, please provide another key alias`);if(el.default.info("Making API Call"),eE(!0),"you"===eD)e.user_id=ex;else if("agent"===eD){if(!tC)return void el.default.fromBackend("Please select an agent");e.agent_id=tC}let i={};try{i=JSON.parse(e.metadata||"{}")}catch(e){console.error("Error parsing metadata:",e)}if("service_account"===eD&&(i.service_account_id=e.key_alias),eY.length>0&&(i={...i,logging:eY.filter(e=>e.callback_name)}),ta.length>0){let e=(0,M.mapDisplayToInternalNames)(ta);i={...i,litellm_disabled_callbacks:e}}if(td&&(e.auto_rotate=!0,e.rotation_interval=tu),e.duration&&""!==e.duration.trim()||(e.duration=null),e.metadata=JSON.stringify(i),e.disable_global_guardrails||delete e.disable_global_guardrails,e.allowed_vector_store_ids&&e.allowed_vector_store_ids.length>0&&(e.object_permission={vector_stores:e.allowed_vector_store_ids},delete e.allowed_vector_store_ids),e.allowed_mcp_servers_and_groups&&(e.allowed_mcp_servers_and_groups.servers?.length>0||e.allowed_mcp_servers_and_groups.accessGroups?.length>0||e.allowed_mcp_servers_and_groups.toolsets?.length>0)){e.object_permission||(e.object_permission={});let{servers:t,accessGroups:l,toolsets:a}=e.allowed_mcp_servers_and_groups;t&&t.length>0&&(e.object_permission.mcp_servers=t),l&&l.length>0&&(e.object_permission.mcp_access_groups=l),a&&a.length>0&&(e.object_permission.mcp_toolsets=a),delete e.allowed_mcp_servers_and_groups}let r=e.mcp_tool_permissions||{};if(Object.keys(r).length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_tool_permissions=r),delete e.mcp_tool_permissions,e.allowed_mcp_access_groups&&e.allowed_mcp_access_groups.length>0&&(e.object_permission||(e.object_permission={}),e.object_permission.mcp_access_groups=e.allowed_mcp_access_groups,delete e.allowed_mcp_access_groups),e.allowed_agents_and_groups&&(e.allowed_agents_and_groups.agents?.length>0||e.allowed_agents_and_groups.accessGroups?.length>0)){e.object_permission||(e.object_permission={});let{agents:t,accessGroups:l}=e.allowed_agents_and_groups;t&&t.length>0&&(e.object_permission.agents=t),l&&l.length>0&&(e.object_permission.agent_access_groups=l),delete e.allowed_agents_and_groups}Object.keys(tn).length>0&&(e.aliases=JSON.stringify(tn)),tg?.router_settings&&Object.values(tg.router_settings).some(e=>null!=e&&""!==e)&&(e.router_settings=tg.router_settings);let n=th.filter(e=>e.budget_duration&&null!==e.max_budget&&void 0!==e.max_budget);n.length>0&&(e.budget_limits=n);let{tag_rpm_limit:o}=(0,Y.tagRowsToLimits)(ty);Object.keys(o).length>0&&(e.tag_rpm_limit=o),Object.keys(tf).length>0&&(e.budget_fallbacks=tf),t="service_account"===eD?await (0,ea.keyCreateServiceAccountCall)(eh,e):await (0,ea.keyCreateCall)(eh,ex,e),em(t),eI.invalidateQueries({queryKey:l.keyKeys.lists()}),eF(t.key),el.default.success("Virtual Key Created"),eT.resetFields(),tx([]),tb([]),tj({}),tv(e=>e+1),localStorage.removeItem("userData"+ex)}catch(t){let e=(e=>{let t;if(!(t=!e||"object"!=typeof e||e instanceof Error?String(e):JSON.stringify(e)).includes("/key/generate")&&!t.includes("KeyManagementRoutes.KEY_GENERATE"))return`Error creating the key: ${e}`;let l=t;try{if(!e||"object"!=typeof e||e instanceof Error){let e=t.match(/\{[\s\S]*\}/);if(e){let t=JSON.parse(e[0]),a=t?.error||t;a?.message&&(l=a.message)}}else{let t=e?.error||e;t?.message&&(l=t.message)}}catch(e){}return t.includes("team_member_permission_error")||l.includes("Team member does not have permissions")?"Team member does not have permission to generate key for this team. Ask your proxy admin to configure the team member permission settings.":`Error creating the key: ${e}`})(t);el.default.fromBackend(e)}};(0,E.useEffect)(()=>{if(e2){let e=ev?.find(e=>e.project_id===e2);eP(e?.models??[]),eT.setFieldValue("models",[]);return}ex&&ey&&eh&&eo(ex,ey,eh,eZ?.team_id??null).then(e=>{eP((0,X.excludeProxyWideSentinel)(Array.from(new Set([...eZ?.models??[],...e]))))}),eK||eT.setFieldValue("models",[]),eT.setFieldValue("allowed_mcp_servers_and_groups",{servers:[],accessGroups:[]})},[eZ,e2,eh,ex,ey,eT]),(0,E.useEffect)(()=>{if(!eK||0===eK.length||!eB||0===eB.length)return;let e=eK.filter(e=>eB.includes(e));e.length>0&&eT.setFieldsValue({models:e}),eQ(null)},[eK,eB,eT]),(0,E.useEffect)(()=>{if(!e2||!ec)return;let e=ev?.find(e=>e.project_id===e2);if(!e?.team_id||eZ?.team_id===e.team_id)return;let t=ec.find(t=>t.team_id===e.team_id)||null;t&&(e0(t),eT.setFieldValue("team_id",t.team_id))},[ec,e2,ev]);let tF=async e=>{if(!e)return void te([]);tl(!0);try{let t=new URLSearchParams;if(t.append("user_email",e),null==eh)return;let l=(await (0,ea.userFilterUICall)(eh,t)).map(e=>({label:`${e.user_email} (${e.user_id})`,value:e.user_id,user:e}));te(l)}catch(e){console.error("Error fetching users:",e),el.default.fromBackend("Failed to search for users")}finally{tl(!1)}},tM=(0,T.useDebouncedCallback)(e=>tF(e),{wait:L.DEBOUNCE_WAIT_MS});return(0,t.jsxs)("div",{children:[ey&&O.rolesWithWriteAccess.includes(ey)&&(0,t.jsx)(p.Button,{className:"mx-auto",onClick:()=>eE(!0),"data-testid":"create-key-button",children:"+ Create New Key"}),(0,t.jsx)(A.Modal,{open:eL,width:1e3,footer:null,onOk:tT,onCancel:tL,children:(0,t.jsxs)(_.Form,{form:eT,onFinish:tO,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Ownership"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Owned By"," ",(0,t.jsx)(S.Tooltip,{title:"Select who will own this Virtual Key",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),className:"mb-4",children:(0,t.jsxs)(w.Radio.Group,{onChange:e=>eU(e.target.value),value:eD,children:[(0,t.jsx)(w.Radio,{value:"you",children:"You"}),(0,t.jsx)(w.Radio,{value:"service_account",children:"Service Account"}),"Admin"===ey&&(0,t.jsx)(w.Radio,{value:"another_user",children:"Another User"}),(0,t.jsxs)(w.Radio,{value:"agent",children:["Agent ",(0,t.jsx)(C.Tag,{color:"purple",children:"New"})]})]})}),"another_user"===eD&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["User ID"," ",(0,t.jsx)(S.Tooltip,{title:"The user who will own this key and be responsible for its usage",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"user_id",className:"mt-4",rules:[{required:"another_user"===eD,message:"Please input the user ID of the user you are assigning the key to"}],children:(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",marginBottom:"8px"},children:[(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Type email to search for users",filterOption:!1,onSearch:tM,onSelect:(e,t)=>{let l;return l=t.user,void eT.setFieldsValue({user_id:l.user_id})},options:e9,loading:tt,allowClear:!0,style:{width:"100%"},notFoundContent:tt?"Searching...":"No users found"}),(0,t.jsx)(j.Button,{onClick:()=>e5(!0),style:{marginLeft:"8px"},children:"Create User"})]}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Search by email to find users"})]})}),"agent"===eD&&(0,t.jsxs)("div",{className:"mt-4 p-4 bg-purple-50 border border-purple-200 rounded-md",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Select Agent ",(0,t.jsx)("span",{className:"text-red-500",children:"*"})]})}),(0,t.jsx)(k.Select,{showSearch:!0,placeholder:"Select an agent",style:{width:"100%"},value:tC,onChange:e=>tS(e),filterOption:(e,t)=>t?.label?.toLowerCase().includes(e.toLowerCase()),options:tk.map(e=>({label:e.agent_name||e.agent_id,value:e.agent_id}))}),(0,t.jsx)("div",{className:"text-xs text-gray-500 mt-2",children:"This key will be used by the selected agent to make requests to LiteLLM"})]}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Organization"," ",(0,t.jsx)(S.Tooltip,{title:"The organization this key belongs to. Selecting an organization filters the available teams.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"organization_id",className:"mt-4",children:(0,t.jsx)(W.default,{organizations:ej,loading:e_,disabled:"Admin"!==ey,onChange:e=>{e4(e||null),e0(null),e3(null),eT.setFieldValue("team_id",void 0),eT.setFieldValue("project_id",void 0)}})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Team"," ",(0,t.jsx)(S.Tooltip,{title:"The team this key belongs to, which determines available models and budget limits",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"team_id",initialValue:e?e.team_id:null,className:"mt-4",rules:[{required:"service_account"===eD,message:"Please select a team for the service account"}],help:"service_account"===eD?"required":"",children:(0,t.jsx)(G.default,{disabled:null!==e2,organizationId:e1,onTeamSelect:e=>{e0(e),e3(null),eT.setFieldValue("project_id",void 0),e?.organization_id?(e4(e.organization_id),eT.setFieldValue("organization_id",e.organization_id)):e||(e4(null),eT.setFieldValue("organization_id",void 0))}})}),eN&&(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Project"," ",(0,t.jsx)(S.Tooltip,{title:"Assign this key to a project. Selecting a project will lock the team to the project's team.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"project_id",className:"mt-4",children:(0,t.jsx)(H.default,{projects:ev,teamId:eZ?.team_id,loading:eA||!ec,onChange:e=>{if(!e){e3(null),e0(null),eT.setFieldValue("team_id",void 0);return}e3(e)}})})]}),tE&&(0,t.jsx)("div",{className:"mb-8 p-4 bg-blue-50 border border-blue-200 rounded-md",children:(0,t.jsx)(y.Text,{className:"text-blue-800 text-sm",children:"Please select a team to continue configuring your Virtual Key. If you do not see any teams, please contact your Proxy Admin to either provide you with access to models or to add you to a team."})}),!tE&&(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)(f.Title,{className:"mb-4",children:"Key Details"}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["you"===eD||"another_user"===eD?"Key Name":"Service Account ID"," ",(0,t.jsx)(S.Tooltip,{title:"you"===eD||"another_user"===eD?"A descriptive name to identify this key":"Unique identifier for this service account",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_alias",rules:[{required:!0,message:`Please input a ${"you"===eD?"key name":"service account ID"}`}],help:"required",children:(0,t.jsx)(b.TextInput,{placeholder:""})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Models"," ",(0,t.jsx)(S.Tooltip,{title:"Select which models this key can access. Choose 'All Team Models' to grant access to all models available to the team. Leave empty to allow access to all models.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"models",rules:[],help:"management"===ti||"read_only"===ti?"Models field is disabled for this key type":"optional - leave empty to allow access to all models",className:"mt-4",children:(0,t.jsxs)(k.Select,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},disabled:"management"===ti||"read_only"===ti,onChange:e=>{e.includes("all-team-models")?eT.setFieldsValue({models:["all-team-models"]}):e.includes("all-proxy-models")&&eT.setFieldsValue({models:["all-proxy-models"]})},children:[!e2&&eZ&&(0,t.jsx)(en,{value:"all-team-models",children:"All Team Models"},"all-team-models"),!e2&&!eZ&&(0,t.jsx)(en,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),eB.map(e=>(0,t.jsx)(en,{value:e,disabled:(0,X.hasAllModelsSentinel)(tI),children:(0,X.getModelDisplayName)(e)},e))]})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Key Type"," ",(0,t.jsx)(S.Tooltip,{title:"Select the type of key to determine what routes and operations this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"key_type",initialValue:"llm_api",className:"mt-4",children:(0,t.jsxs)(k.Select,{defaultValue:"llm_api",placeholder:"Select key type",style:{width:"100%"},optionLabelProp:"label",onChange:e=>{tr(e),("management"===e||"read_only"===e)&&eT.setFieldsValue({models:[]})},children:[(0,t.jsx)(en,{value:"llm_api",label:"AI APIs",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"AI APIs"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only AI API routes (chat/completions, embeddings, etc.)"})]})}),(0,t.jsx)(en,{value:"management",label:"Management",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Management"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call only management routes (user/team/key management)"})]})}),(0,t.jsx)(en,{value:"default",label:"Full Access",children:(0,t.jsxs)("div",{style:{padding:"4px 0"},children:[(0,t.jsx)(I.Typography.Text,{strong:!0,children:"Full Access"}),(0,t.jsx)(I.Typography.Paragraph,{type:"secondary",style:{fontSize:11,margin:"2px 0 0"},children:"Can call all routes (AI APIs, Management, and read-only)"})]})})]})})]}),!tE&&(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)(f.Title,{className:"m-0",children:"Optional Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Max Budget (USD)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum amount in USD this key can spend. When reached, the key will be blocked from making further requests",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"max_budget",help:`Budget cannot exceed team max budget: $${e?.max_budget!==null&&e?.max_budget!==void 0?e?.max_budget:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.max_budget&&l>e.max_budget)throw Error(`Budget cannot exceed team max budget: $${(0,o.formatNumberWithCommas)(e.max_budget,4)}`)}}],children:(0,t.jsx)(ei.default,{step:.01,precision:2,width:200})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Reset Budget"," ",(0,t.jsx)(S.Tooltip,{title:"How often the budget should reset. For example, setting 'daily' will reset the budget every 24 hours",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"budget_duration",help:`Team Reset Budget: ${e?.budget_duration!==null&&e?.budget_duration!==void 0?e?.budget_duration:"None"}`,children:(0,t.jsx)(B.default,{placeholder:"Never resets",onChange:e=>eT.setFieldValue("budget_duration",e)})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Windows"," ",(0,t.jsx)(S.Tooltip,{title:"Set multiple independent budget windows (e.g., hourly $10 AND monthly $200). Each window tracks spend separately and resets on its own schedule.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)($.BudgetWindowsEditor,{value:th,onChange:tx})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Budget Fallbacks"," ",(0,t.jsx)(S.Tooltip,{title:"When a model exceeds its per-model budget (model_max_budget), requests automatically reroute to fallback models instead of failing. Configure per-model budgets in Advanced Settings.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(J.BudgetFallbacksEditor,{value:tf,onChange:tj,availableModels:eB},t_)}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Tokens per minute Limit (TPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of tokens this key can process per minute. Helps control usage and costs",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tpm_limit",help:`TPM cannot exceed team TPM limit: ${e?.tpm_limit!==null&&e?.tpm_limit!==void 0?e?.tpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.tpm_limit&&l>e.tpm_limit)throw Error(`TPM limit cannot exceed team TPM limit: ${e.tpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"tpm",name:"tpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Requests per minute Limit (RPM)"," ",(0,t.jsx)(S.Tooltip,{title:"Maximum number of API requests this key can make per minute. Helps prevent abuse and manage load",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"rpm_limit",help:`RPM cannot exceed team RPM limit: ${e?.rpm_limit!==null&&e?.rpm_limit!==void 0?e?.rpm_limit:"unlimited"}`,rules:[{validator:async(t,l)=>{if(l&&e&&null!==e.rpm_limit&&l>e.rpm_limit)throw Error(`RPM limit cannot exceed team RPM limit: ${e.rpm_limit}`)}}],children:(0,t.jsx)(ei.default,{step:1,width:400})}),(0,t.jsx)(K.default,{type:"rpm",name:"rpm_limit_type",className:"mt-4",initialValue:null,form:eT,showDetailedDescriptions:!0}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Per-Tag Rate Limits"," ",(0,t.jsx)(S.Tooltip,{title:"Scope rate limits to a request tag so each tag (e.g. a cell or group) gets its own RPM counter. Requests without a matching tag fall back to the key-level limit.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),children:(0,t.jsx)(Y.TagRateLimitEditor,{value:ty,onChange:tb})}),(0,t.jsx)(_.Form.Item,{className:"mt-4",label:(0,t.jsxs)("span",{children:["Throttle on budget exceeded"," ",(0,t.jsx)(S.Tooltip,{title:"When this key exceeds its max budget, throttle its TPM/RPM to the globally configured percentage instead of blocking access entirely. Requires budget_exceeded_throttle_percentage in litellm_settings and a TPM/RPM limit on the key.",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"throttle_on_budget_exceeded",valuePropName:"checked",children:(0,t.jsx)(N.Switch,{checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"Apply safety guardrails to this key to filter content or enforce policies",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"guardrails",className:"mt-4",help:ef?"Select existing guardrails or enter new ones":"Premium feature - Upgrade to set guardrails by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!ef,placeholder:ef?"Select or enter guardrails":"Premium feature - Upgrade to set guardrails by key",options:eG.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Disable Global Guardrails"," ",(0,t.jsx)(S.Tooltip,{title:"When enabled, this key will bypass any guardrails configured to run on every request (global guardrails)",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/quick_start",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"disable_global_guardrails",className:"mt-4",valuePropName:"checked",help:ef?"Bypass global guardrails for this key":"Premium feature - Upgrade to disable global guardrails by key",children:(0,t.jsx)(N.Switch,{disabled:!ef,checkedChildren:"Yes",unCheckedChildren:"No"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Policies"," ",(0,t.jsx)(S.Tooltip,{title:"Apply policies to this key to control guardrails and other settings",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"policies",className:"mt-4",help:eb?"Select existing policies or enter new ones":"Premium feature - Upgrade to set policies by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter policies":"Premium feature - Upgrade to set policies by key",options:eH.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Prompts"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific prompt templates",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/prompt_management",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"prompts",className:"mt-4",help:eb?"Select existing prompts or enter new ones":"Premium feature - Upgrade to set prompts by key",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},disabled:!eb,placeholder:eb?"Select or enter prompts":"Premium feature - Upgrade to set prompts by key",options:eJ.map(e=>({value:e,label:e}))})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Access Groups"," ",(0,t.jsx)(S.Tooltip,{title:"Assign access groups to this key. Access groups control which models, MCP servers, and agents this key can use",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"access_group_ids",className:"mt-4",help:"Select access groups to assign to this key",children:(0,t.jsx)(R.default,{placeholder:"Select access groups (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Pass Through Routes"," ",(0,t.jsx)(S.Tooltip,{title:"Allow this key to use specific pass through routes",children:(0,t.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/pass_through",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})})]}),name:"allowed_passthrough_routes",className:"mt-4",help:eb?"Select existing pass through routes or enter new ones":"Premium feature - Upgrade to set pass through routes by key",children:(0,t.jsx)(z.default,{accessToken:eh,placeholder:eb?"Select or enter pass through routes":"Premium feature - Upgrade to set pass through routes by key",disabled:!eb,teamId:eZ?eZ.team_id:null})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Vector Stores"," ",(0,t.jsx)(S.Tooltip,{title:"Select which vector stores this key can access. If none selected, the key will have access to all available vector stores",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_vector_store_ids",className:"mt-4",help:"Select vector stores this key can access. Leave empty for access to all vector stores",children:(0,t.jsx)(er.default,{onChange:e=>eT.setFieldValue("allowed_vector_store_ids",e),value:eT.getFieldValue("allowed_vector_store_ids"),accessToken:eh,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Metadata"," ",(0,t.jsx)(S.Tooltip,{title:"JSON object with additional information about this key. Used for tracking or custom logic",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"metadata",className:"mt-4",children:(0,t.jsx)(v.Input.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Tags"," ",(0,t.jsx)(S.Tooltip,{title:"Tags for tracking spend and/or doing tag-based routing. Used for analytics and filtering",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"tags",className:"mt-4",help:"Tags for tracking spend and/or doing tag-based routing.",children:(0,t.jsx)(k.Select,{mode:"tags",style:{width:"100%"},placeholder:"Select or enter tags",tokenSeparators:[","],options:eS})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"MCP Settings"})}),(0,t.jsxs)(m.AccordionBody,{children:[(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed MCP Servers"," ",(0,t.jsx)(S.Tooltip,{title:"Select which MCP servers or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_mcp_servers_and_groups",help:"Select MCP servers or access groups this key can access",children:(0,t.jsx)(Z.default,{onChange:e=>eT.setFieldValue("allowed_mcp_servers_and_groups",e),value:eT.getFieldValue("allowed_mcp_servers_and_groups"),accessToken:eh,teamId:eZ?.team_id??null,placeholder:"Select MCP servers or access groups (optional)",allowNoMcpServers:!0})}),(0,t.jsx)(_.Form.Item,{name:"mcp_tool_permissions",initialValue:{},hidden:!0,children:(0,t.jsx)(v.Input,{type:"hidden"})}),(0,t.jsx)(_.Form.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.allowed_mcp_servers_and_groups!==t.allowed_mcp_servers_and_groups||e.mcp_tool_permissions!==t.mcp_tool_permissions,children:()=>(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(et.default,{accessToken:eh,selectedServers:(eT.getFieldValue("allowed_mcp_servers_and_groups")?.servers||[]).filter(e=>e!==ee.NO_MCP_SERVERS_SENTINEL),toolPermissions:eT.getFieldValue("mcp_tool_permissions")||{},onChange:e=>eT.setFieldsValue({mcp_tool_permissions:e})})})})]})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Agent Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(_.Form.Item,{label:(0,t.jsxs)("span",{children:["Allowed Agents"," ",(0,t.jsx)(S.Tooltip,{title:"Select which agents or access groups this key can access",children:(0,t.jsx)(d.InfoCircleOutlined,{style:{marginLeft:"4px"}})})]}),name:"allowed_agents_and_groups",help:"Select agents or access groups this key can access",children:(0,t.jsx)(F.default,{onChange:e=>eT.setFieldValue("allowed_agents_and_groups",e),value:eT.getFieldValue("allowed_agents_and_groups"),accessToken:eh,placeholder:"Select agents or access groups (optional)"})})})]}),eb?(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!0,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]}):(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Key-level logging settings is an enterprise feature, get in touch -",(0,t.jsx)("a",{href:"https://www.litellm.ai/enterprise",target:"_blank",children:"https://www.litellm.ai/enterprise"})]}),placement:"top",children:(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsx)("div",{style:{opacity:.5},children:(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Logging Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(V.default,{value:eY,onChange:eX,premiumUser:!1,disabledCallbacks:ta,onDisabledCallbacksChange:ts})})})]})}),(0,t.jsx)("div",{style:{position:"absolute",inset:0,cursor:"not-allowed"}})]})}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Router Settings"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4 w-full",children:(0,t.jsx)(Q.default,{accessToken:eh||"",value:tg||void 0,onChange:tp,modelData:eM.length>0?{data:eM.map(e=>({model_name:e}))}:void 0},tA)})})]},`router-settings-accordion-${tA}`),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Model Aliases"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)(y.Text,{className:"text-sm text-gray-600 mb-4",children:"Create custom aliases for models that can be used in API calls. This allows you to create shortcuts for specific models."}),(0,t.jsx)(U.default,{accessToken:eh,initialModelAliases:tn,onAliasUpdate:to,showExampleConfig:!1})]})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsx)("b",{children:"Key Lifecycle"})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(D.default,{form:eT,autoRotationEnabled:td,onAutoRotationChange:tc,rotationInterval:tu,onRotationIntervalChange:tm,isCreateMode:!0})})})]}),(0,t.jsxs)(u.Accordion,{className:"mt-4 mb-4",children:[(0,t.jsx)(g.AccordionHeader,{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("b",{children:"Advanced Settings"}),(0,t.jsx)(S.Tooltip,{title:(0,t.jsxs)("span",{children:["Learn more about advanced settings in our"," ",(0,t.jsx)("a",{href:ea.proxyBaseUrl?`${ea.proxyBaseUrl}/#/key%20management/generate_key_fn_key_generate_post`:"/#/key%20management/generate_key_fn_key_generate_post",target:"_blank",rel:"noopener noreferrer",className:"text-blue-400 hover:text-blue-300",children:"documentation"})]}),children:(0,t.jsx)(d.InfoCircleOutlined,{className:"text-gray-400 hover:text-gray-300 cursor-help"})})]})}),(0,t.jsx)(m.AccordionBody,{children:(0,t.jsx)(P.default,{schemaComponent:"GenerateKeyRequest",form:eT,excludedFields:["key_alias","team_id","organization_id","models","duration","metadata","tags","guardrails","max_budget","budget_duration","tpm_limit","rpm_limit",...eC?["key"]:[]]})})]})]})]})}),(0,t.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,t.jsx)(j.Button,{htmlType:"submit",disabled:tE,style:{opacity:tE?.5:1},children:"Create Key"})})]})}),e6&&(0,t.jsx)(A.Modal,{title:"Create New User",open:e6,onCancel:()=>e5(!1),footer:null,width:800,children:(0,t.jsx)(q.CreateUserButton,{userID:ex,accessToken:eh,teams:ec,possibleUIRoles:e7,onUserCreated:e=>{eT.setFieldsValue({user_id:e}),e5(!1)},isEmbedded:!0})}),eO&&(0,t.jsx)(A.Modal,{open:eL,onOk:tT,onCancel:tL,footer:null,children:(0,t.jsxs)(x.Grid,{numItems:1,className:"gap-2 w-full",children:[(0,t.jsx)(f.Title,{children:"Save your Key"}),(0,t.jsx)(h.Col,{numColSpan:1,children:null!=eO?(0,t.jsx)(es.default,{apiKey:eO}):(0,t.jsx)(y.Text,{children:"Key being created, this might take 30s"})})]})})]})},"fetchTeamModels",0,eo,"fetchUserModels",0,ed],702597)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0wg3l8hjyxbxn.js b/litellm/proxy/_experimental/out/_next/static/chunks/0wg3l8hjyxbxn.js deleted file mode 100644 index 92c88ceea3a..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0wg3l8hjyxbxn.js +++ /dev/null @@ -1,56 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,488143,(e,t,s)=>{"use strict";function r({widthInt:e,heightInt:t,blurWidth:s,blurHeight:a,blurDataURL:n,objectFit:i}){let l=s?40*s:e,o=a?40*a:t,c=l&&o?`viewBox='0 0 ${l} ${o}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${c}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${c?"none":"contain"===i?"xMidYMid":"cover"===i?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${n}'/%3E%3C/svg%3E`}Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"getImageBlurSvg",{enumerable:!0,get:function(){return r}})},987690,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r={VALID_LOADERS:function(){return n},imageConfigDefault:function(){return i}};for(var a in r)Object.defineProperty(s,a,{enumerable:!0,get:r[a]});let n=["default","imgix","cloudinary","akamai","custom"],i={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumDiskCacheSize:void 0,maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1,customCacheHandler:!1}},908927,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"getImgProps",{enumerable:!0,get:function(){return c}}),e.r(233525);let r=e.r(543369),a=e.r(488143),n=e.r(987690),i=["-moz-initial","fill","none","scale-down",void 0];function l(e){return void 0!==e.default}function o(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function c({src:e,sizes:t,unoptimized:s=!1,priority:d=!1,preload:u=!1,loading:m,className:h,quality:p,width:g,height:f,fill:x=!1,style:y,overrideSrc:b,onLoad:v,onLoadingComplete:w,placeholder:j="empty",blurDataURL:_,fetchPriority:N,decoding:S="async",layout:k,objectFit:C,objectPosition:E,lazyBoundary:T,lazyRoot:A,...P},R){var O;let I,M,$,{imgConf:L,showAltText:U,blurComplete:B,defaultLoader:D}=R,q=L||n.imageConfigDefault;if("allSizes"in q)I=q;else{let e=[...q.deviceSizes,...q.imageSizes].sort((e,t)=>e-t),t=q.deviceSizes.sort((e,t)=>e-t),s=q.qualities?.sort((e,t)=>e-t);I={...q,allSizes:e,deviceSizes:t,qualities:s}}if(void 0===D)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let W=P.loader||D;delete P.loader,delete P.srcSet;let z="__next_img_default"in W;if(z){if("custom"===I.loader)throw Object.defineProperty(Error(`Image with src "${e}" is missing "loader" prop. -Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=W;W=t=>{let{config:s,...r}=t;return e(r)}}if(k){"fill"===k&&(x=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[k];e&&(y={...y,...e});let s={responsive:"100vw",fill:"100vw"}[k];s&&!t&&(t=s)}let F="",H=o(g),J=o(f);if((O=e)&&"object"==typeof O&&(l(O)||void 0!==O.src)){let t=l(e)?e.default:e;if(!t.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!t.height||!t.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(M=t.blurWidth,$=t.blurHeight,_=_||t.blurDataURL,F=t.src,!x)if(H||J){if(H&&!J){let e=H/t.width;J=Math.round(t.height*e)}else if(!H&&J){let e=J/t.height;H=Math.round(t.width*e)}}else H=t.width,J=t.height}let V=!d&&!u&&("lazy"===m||void 0===m);(!(e="string"==typeof e?e:F)||e.startsWith("data:")||e.startsWith("blob:"))&&(s=!0,V=!1),I.unoptimized&&(s=!0),z&&!I.dangerouslyAllowSVG&&e.split("?",1)[0].endsWith(".svg")&&(s=!0);let G=o(p),K=Object.assign(x?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:C,objectPosition:E}:{},U?{}:{color:"transparent"},y),X=B||"empty"===j?null:"blur"===j?`url("data:image/svg+xml;charset=utf-8,${(0,a.getImageBlurSvg)({widthInt:H,heightInt:J,blurWidth:M,blurHeight:$,blurDataURL:_||"",objectFit:K.objectFit})}")`:`url("${j}")`,Y=i.includes(K.objectFit)?"fill"===K.objectFit?"100% 100%":"cover":K.objectFit,Q=X?{backgroundSize:Y,backgroundPosition:K.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:X}:{},Z=function({config:e,src:t,unoptimized:s,width:a,quality:n,sizes:i,loader:l}){if(s){if(t.startsWith("/")&&!t.startsWith("//")){let e=(0,r.getDeploymentId)();if(e){let s=t.indexOf("?");if(-1!==s){let r=new URLSearchParams(t.slice(s+1));r.get("dpl")||(r.append("dpl",e),t=t.slice(0,s)+"?"+r.toString())}else t+=`?dpl=${e}`}}return{src:t,srcSet:void 0,sizes:void 0}}let{widths:o,kind:c}=function({deviceSizes:e,allSizes:t},s,r){if(r){let s=/(^|\s)(1?\d?\d)vw/g,a=[];for(let e;e=s.exec(r);)a.push(parseInt(e[2]));if(a.length){let s=.01*Math.min(...a);return{widths:t.filter(t=>t>=e[0]*s),kind:"w"}}return{widths:t,kind:"w"}}return"number"!=typeof s?{widths:e,kind:"w"}:{widths:[...new Set([s,2*s].map(e=>t.find(t=>t>=e)||t[t.length-1]))],kind:"x"}}(e,a,i),d=o.length-1;return{sizes:i||"w"!==c?i:"100vw",srcSet:o.map((s,r)=>`${l({config:e,src:t,quality:n,width:s})} ${"w"===c?s:r+1}${c}`).join(", "),src:l({config:e,src:t,quality:n,width:o[d]})}}({config:I,src:e,unoptimized:s,width:H,quality:G,sizes:t,loader:W}),ee=V?"lazy":m;return{props:{...P,loading:ee,fetchPriority:N,width:H,height:J,decoding:S,className:h,style:{...K,...Q},sizes:Z.sizes,srcSet:Z.srcSet,src:b||Z.src},meta:{unoptimized:s,preload:u||d,placeholder:j,fill:x}}}},898879,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"default",{enumerable:!0,get:function(){return l}});let r=e.r(271645),a="u"{}:r.useLayoutEffect,i=a?()=>{}:r.useEffect;function l(e){let{headManager:t,reduceComponentsToState:s}=e;function l(){if(t&&t.mountedInstances){let e=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(s(e))}}return a&&(t?.mountedInstances?.add(e.children),l()),n(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),n(()=>(t&&(t._pendingUpdate=l),()=>{t&&(t._pendingUpdate=l)})),i(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},325633,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r={default:function(){return g},defaultHead:function(){return u}};for(var a in r)Object.defineProperty(s,a,{enumerable:!0,get:r[a]});let n=e.r(555682),i=e.r(190809),l=e.r(843476),o=i._(e.r(271645)),c=n._(e.r(898879)),d=e.r(742732);function u(){return[(0,l.jsx)("meta",{charSet:"utf-8"},"charset"),(0,l.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")]}function m(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===o.default.Fragment?e.concat(o.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(233525);let h=["name","httpEquiv","charSet","itemProp"];function p(e){let t,s,r,a;return e.reduce(m,[]).reverse().concat(u().reverse()).filter((t=new Set,s=new Set,r=new Set,a={},e=>{let n=!0,i=!1;if(e.key&&"number"!=typeof e.key&&e.key.indexOf("$")>0){i=!0;let s=e.key.slice(e.key.indexOf("$")+1);t.has(s)?n=!1:t.add(s)}switch(e.type){case"title":case"base":s.has(e.type)?n=!1:s.add(e.type);break;case"meta":for(let t=0,s=h.length;t{let s=e.key||t;return o.default.cloneElement(e,{key:s})})}let g=function({children:e}){let t=(0,o.useContext)(d.HeadManagerContext);return(0,l.jsx)(c.default,{reduceComponentsToState:p,headManager:t,children:e})};("function"==typeof s.default||"object"==typeof s.default&&null!==s.default)&&void 0===s.default.__esModule&&(Object.defineProperty(s.default,"__esModule",{value:!0}),Object.assign(s.default,s),t.exports=s.default)},918556,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"ImageConfigContext",{enumerable:!0,get:function(){return n}});let r=e.r(555682)._(e.r(271645)),a=e.r(987690),n=r.default.createContext(a.imageConfigDefault)},65856,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"RouterContext",{enumerable:!0,get:function(){return r}});let r=e.r(555682)._(e.r(271645)).default.createContext(null)},670965,(e,t,s)=>{"use strict";function r(e,t){let s=e||75;return t?.qualities?.length?t.qualities.reduce((e,t)=>Math.abs(t-s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"default",{enumerable:!0,get:function(){return i}});let r=e.r(670965),a=e.r(543369);function n({config:e,src:t,width:s,quality:i}){let l=(0,a.getDeploymentId)();if(t.startsWith("/")&&!t.startsWith("//")){let e=t.indexOf("?");if(-1!==e){let s=new URLSearchParams(t.slice(e+1)),r=s.get("dpl");if(r){l=r,s.delete("dpl");let a=s.toString();t=t.slice(0,e)+(a?"?"+a:"")}}}if(t.startsWith("/")&&t.includes("?")&&e.localPatterns?.length===1&&"**"===e.localPatterns[0].pathname&&""===e.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src "${t}" is using a query string which is not configured in images.localPatterns. -Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let o=(0,r.findClosestQuality)(i,e);return`${e.path}?url=${encodeURIComponent(t)}&w=${s}&q=${o}${t.startsWith("/")&&l?`&dpl=${l}`:""}`}n.__next_img_default=!0;let i=n},605500,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"Image",{enumerable:!0,get:function(){return v}});let r=e.r(555682),a=e.r(190809),n=e.r(843476),i=a._(e.r(271645)),l=r._(e.r(174080)),o=r._(e.r(325633)),c=e.r(908927),d=e.r(987690),u=e.r(918556);e.r(233525);let m=e.r(65856),h=r._(e.r(1948)),p=e.r(818581),g={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function f(e,t,s,r,a,n,i){let l=e?.src;e&&e["data-loaded-src"]!==l&&(e["data-loaded-src"]=l,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&a(!0),s?.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let r=!1,a=!1;s.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>a,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{a=!0,t.stopPropagation()}})}r?.current&&r.current(e)}}))}function x(e){return i.use?{fetchPriority:e}:{fetchpriority:e}}"u"{let C=(0,i.useCallback)(e=>{e&&(N&&(e.src=e.src),e.complete&&f(e,u,y,b,v,h,j))},[e,u,y,b,v,N,h,j]),E=(0,p.useMergedRef)(k,C);return(0,n.jsx)("img",{...S,...x(d),loading:m,width:a,height:r,decoding:l,"data-nimg":g?"fill":"1",className:o,style:c,sizes:s,srcSet:t,src:e,ref:E,onLoad:e=>{f(e.currentTarget,u,y,b,v,h,j)},onError:e=>{w(!0),"empty"!==u&&v(!0),N&&N(e)}})});function b({isAppRouter:e,imgAttributes:t}){let s={as:"image",imageSrcSet:t.srcSet,imageSizes:t.sizes,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,...x(t.fetchPriority)};return e&&l.default.preload?(l.default.preload(t.src,s),null):(0,n.jsx)(o.default,{children:(0,n.jsx)("link",{rel:"preload",href:t.srcSet?void 0:t.src,...s},"__nimg-"+t.src+t.srcSet+t.sizes)})}let v=(0,i.forwardRef)((e,t)=>{let s=(0,i.useContext)(m.RouterContext),r=(0,i.useContext)(u.ImageConfigContext),a=(0,i.useMemo)(()=>{let e=g||r||d.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>e-t),s=e.deviceSizes.sort((e,t)=>e-t),a=e.qualities?.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:s,qualities:a,localPatterns:"u"{p.current=l},[l]);let f=(0,i.useRef)(o);(0,i.useEffect)(()=>{f.current=o},[o]);let[x,v]=(0,i.useState)(!1),[w,j]=(0,i.useState)(!1),{props:_,meta:N}=(0,c.getImgProps)(e,{defaultLoader:h.default,imgConf:a,blurComplete:x,showAltText:w});return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(y,{..._,unoptimized:N.unoptimized,placeholder:N.placeholder,fill:N.fill,onLoadRef:p,onLoadingCompleteRef:f,setBlurComplete:v,setShowAltText:j,sizesInput:e.sizes,ref:t}),N.preload?(0,n.jsx)(b,{isAppRouter:!s,imgAttributes:_}):null]})});("function"==typeof s.default||"object"==typeof s.default&&null!==s.default)&&void 0===s.default.__esModule&&(Object.defineProperty(s.default,"__esModule",{value:!0}),Object.assign(s.default,s),t.exports=s.default)},794909,(e,t,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r={default:function(){return d},getImageProps:function(){return c}};for(var a in r)Object.defineProperty(s,a,{enumerable:!0,get:r[a]});let n=e.r(555682),i=e.r(908927),l=e.r(605500),o=n._(e.r(1948));function c(e){let{props:t}=(0,i.getImgProps)(e,{defaultLoader:o.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,s]of Object.entries(t))void 0===s&&delete t[e];return{props:t}}let d=l.Image},657688,(e,t,s)=>{t.exports=e.r(794909)},213970,e=>{"use strict";let t,s,r;var a,n,i,l,o,c,d,u,m,h,p,g,f,x,y,b,v,w,j,_,N,S,k,C,E,T,A,P,R,O,I,M,$,L,U,B,D,q,W,z,F,H,J,V,G,K,X,Y,Q,Z,ee,et,es,er,ea,en,ei,el,eo,ec,ed,eu,em,eh,ep,eg,ef,ex,ey=e.i(843476),eb=e.i(271645),ev=e.i(800374),ew=e.i(955135),ej=e.i(19732),e_=e.i(596239),eN=e.i(646563),eS=e.i(983561),ek=e.i(987432),eC=e.i(464571),eE=e.i(311451),eT=e.i(212931),eA=e.i(199133),eP=e.i(482725),eR=e.i(653496),eO=e.i(466828),eI=e.i(727749),eM=e.i(602869);let e$=async(e,t)=>{try{let s=t||(0,eM.getProxyBaseUrl)(),r=s?`${s}/v1/agents`:"/v1/agents",a=await fetch(r,{method:"GET",headers:{[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!a.ok){let e=await a.json();throw Error(e.detail||"Failed to fetch agents")}let n=await a.json();return n.sort((e,t)=>{let s=e.agent_name||e.agent_id,r=t.agent_name||t.agent_id;return s.localeCompare(r)}),n}catch(e){throw console.error("Error fetching agents:",e),e}},eL=async(e,t,s,r)=>{try{let r=await (0,eM.modelInfoCall)(e,t,s,1,200),a=r?.data??[],n=(Array.isArray(a)?a:[]).filter(e=>"string"==typeof e?.litellm_params?.model&&e.litellm_params.model.startsWith("litellm_agent/")).map(e=>({model_name:e.model_name??e.model_group??"",litellm_params:{...e.litellm_params,model:e.litellm_params.model,litellm_system_prompt:e.litellm_params?.litellm_system_prompt,tools:Array.isArray(e.litellm_params?.tools)?e.litellm_params.tools:void 0},model_info:e.model_info??null}));return n.sort((e,t)=>e.model_name.localeCompare(t.model_name)),n}catch(e){throw console.error("Error fetching agent models:",e),e}};var eU=e.i(695411),eB=e.i(166068),eD=e.i(921511);e.i(247167);var eq=e.i(356449);async function eW(e,t,s,r,a,n,i,l,o,c,d,u,m,h,p,g,f,x,y,b,v,w,j,_,N){console.log=function(){};let S=b||(0,eM.getProxyBaseUrl)(),k={};a&&a.length>0&&(k["x-litellm-tags"]=a.join(","));let C=new eq.default.OpenAI({apiKey:r,baseURL:S,dangerouslyAllowBrowser:!0,defaultHeaders:k});try{let r,a=Date.now(),b=!1,S={},k=!1,E=[];for await(let y of(h&&h.length>0&&(h.includes("__all__")?E.push({type:"mcp",server_label:"litellm",server_url:"litellm_proxy/mcp",require_approval:"never"}):h.forEach(e=>{if(e.startsWith("toolset:")){let t=e.slice(8),s=N?.find(e=>e.toolset_id===t),r=s?.toolset_name||t;E.push({type:"mcp",server_label:r,server_url:`litellm_proxy/mcp/${encodeURIComponent(r)}`,require_approval:"never"})}else{let t=v?.find(t=>t.server_id===e),s=t?.alias||t?.server_name||e,r=w?.[e]||[];E.push({type:"mcp",server_label:"litellm",server_url:`litellm_proxy/mcp/${s}`,require_approval:"never",...r.length>0?{allowed_tools:r}:{}})}})),await C.chat.completions.create({model:s,stream:!0,stream_options:{include_usage:!0},litellm_trace_id:c,messages:e,...d?{vector_store_ids:d}:{},...u?{guardrails:u}:{},...m?{policies:m}:{},...E.length>0?{tools:E,tool_choice:"auto"}:{},...void 0!==f?{temperature:f}:{},...void 0!==x?{max_tokens:x}:{},..._?{mock_testing_fallbacks:!0}:{}},{signal:n}))){let e=y.choices[0]?.delta;if(!b&&(y.choices[0]?.delta?.content||e&&e.reasoning_content)&&(b=!0,r=Date.now()-a,l&&l(r)),y.choices[0]?.delta?.content){let e=y.choices[0].delta.content;t(e,y.model)}if(e&&e.image&&p&&p(e.image.url,y.model),e&&e.reasoning_content){let t=e.reasoning_content;i&&i(t)}if(e&&e.provider_specific_fields?.search_results&&g&&g(e.provider_specific_fields.search_results),e&&e.provider_specific_fields){let t=e.provider_specific_fields;if(t.mcp_list_tools&&!S.mcp_list_tools&&(S.mcp_list_tools=t.mcp_list_tools,j&&!k)){k=!0;let e={type:"response.output_item.done",item_id:"mcp_list_tools",item:{type:"mcp_list_tools",tools:t.mcp_list_tools.map(e=>({name:e.function?.name||e.name||"",description:e.function?.description||e.description||"",input_schema:e.function?.parameters||e.input_schema||{}}))},timestamp:Date.now()};j(e)}t.mcp_tool_calls&&(S.mcp_tool_calls=t.mcp_tool_calls),t.mcp_call_results&&(S.mcp_call_results=t.mcp_call_results)}if(y.usage&&o){let e={completionTokens:y.usage.completion_tokens,promptTokens:y.usage.prompt_tokens,totalTokens:y.usage.total_tokens};y.usage.completion_tokens_details?.reasoning_tokens&&(e.reasoningTokens=y.usage.completion_tokens_details.reasoning_tokens),void 0!==y.usage.cost&&null!==y.usage.cost&&(e.cost=parseFloat(y.usage.cost)),o(e)}}j&&(S.mcp_tool_calls||S.mcp_call_results)&&S.mcp_tool_calls&&S.mcp_tool_calls.length>0&&S.mcp_tool_calls.forEach((e,t)=>{let s=e.function?.name||e.name||"",r=e.function?.arguments||e.arguments||"{}",a=S.mcp_call_results?.find(t=>t.tool_call_id===e.id||t.tool_call_id===e.call_id)||S.mcp_call_results?.[t],n={type:"response.output_item.done",item:{type:"mcp_call",name:s,arguments:"string"==typeof r?r:JSON.stringify(r),output:a?.result?"string"==typeof a.result?a.result:JSON.stringify(a.result):void 0},item_id:e.id||e.call_id,timestamp:Date.now()};j(n)});let T=Date.now();y&&y(T-a)}catch(e){throw e}}var ez=e.i(878894),eF=e.i(217923),eH=e.i(531245),eJ=e.i(475254);let eV=(0,eJ.default)("brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);var eG=e.i(595468),eK=e.i(643531),eX=e.i(664659),eY=e.i(463059);let eQ=(0,eJ.default)("clipboard-list",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]),eZ=(0,eJ.default)("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]);var e0=e.i(178583);let e1=(0,eJ.default)("fingerprint",[["path",{d:"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4",key:"1nerag"}],["path",{d:"M14 13.12c0 2.38 0 6.38-1 8.88",key:"o46ks0"}],["path",{d:"M17.29 21.02c.12-.6.43-2.3.5-3.02",key:"ptglia"}],["path",{d:"M2 12a10 10 0 0 1 18-6",key:"ydlgp0"}],["path",{d:"M2 16h.01",key:"1gqxmh"}],["path",{d:"M21.8 16c.2-2 .131-5.354 0-6",key:"drycrb"}],["path",{d:"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2",key:"1tidbn"}],["path",{d:"M8.65 22c.21-.66.45-1.32.57-2",key:"13wd9y"}],["path",{d:"M9 6.8a6 6 0 0 1 9 5.2v2",key:"1fr1j5"}]]);var e2=e.i(38982);let e5=(0,eJ.default)("list-checks",[["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["path",{d:"m3 7 2 2 4-4",key:"1obspn"}],["path",{d:"M13 6h8",key:"15sg57"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 18h8",key:"oe0vm4"}]]);var e4=e.i(531278),e3=e.i(319023),e6=e.i(686311),e8=e.i(788699),e7=e.i(431343),e9=e.i(107233),te=e.i(367240);let tt=(0,eJ.default)("scale",[["path",{d:"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z",key:"7g6ntu"}],["path",{d:"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z",key:"ijws7r"}],["path",{d:"M7 21h10",key:"1b0cd5"}],["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2",key:"3gwbw2"}]]);var ts=e.i(555436),tr=e.i(514764),ta=e.i(98919);let tn=(0,eJ.default)("smile",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 14s1.5 2 4 2 4-2 4-2",key:"1y1vjs"}],["line",{x1:"9",x2:"9.01",y1:"9",y2:"9",key:"yxxnd0"}],["line",{x1:"15",x2:"15.01",y1:"9",y2:"9",key:"1p4y9e"}]]),ti=(0,eJ.default)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);var tl=e.i(727612);let to=(0,eJ.default)("trending-down",[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]]);var tc=e.i(569074),td=e.i(37727),tu=e.i(59935);let tm={lock:e3.Lock,brain:eV,"bar-chart":eF.BarChart3,scale:tt,search:ts.Search,smile:tn,fingerprint:e1,"trash-2":tl.Trash2,"check-circle":eG.CheckCircle2,"trending-down":to,bot:eH.Bot,pencil:e8.Pencil,shield:ta.Shield,"file-text":e0.FileText};function th({iconKey:e,className:t="w-4 h-4 text-gray-500"}){let s=tm[e]??eQ;return(0,ey.jsx)(s,{className:t})}function tp({accessToken:e,disabledPersonalKeyCreation:t,backendMode:s="policies",fixedModel:r,proxySettings:a}){let n,i=(0,eB.getFrameworks)(),[l,o]=(0,eb.useState)(new Map),[c,d]=(0,eb.useState)([]),[u,m]=(0,eb.useState)([]),[h,p]=(0,eb.useState)([]),[g,f]=(0,eb.useState)(!1),[x,y]=(0,eb.useState)(new Set),[b,v]=(0,eb.useState)(new Set([i[0]?.name??""])),[w,j]=(0,eb.useState)(new Set),[_,N]=(0,eb.useState)(""),[S,k]=(0,eb.useState)([]),[C,E]=(0,eb.useState)(!1),[T,A]=(0,eb.useState)(""),[P,R]=(0,eb.useState)("fail"),[O,I]=(0,eb.useState)("quick-test"),[M,$]=(0,eb.useState)(""),[L,U]=(0,eb.useState)([]),[B,D]=(0,eb.useState)(!1),q=(0,eb.useRef)(null),W=(0,eb.useRef)(null),[z,F]=(0,eb.useState)([]),[H,J]=(0,eb.useState)(!1),[V,G]=(0,eb.useState)("all"),[K,X]=(0,eb.useState)(new Set),Y=(0,eb.useRef)(null),Q=(0,eb.useCallback)(e=>{o(new Map((0,eD.getPolicyOptionEntries)(e).map(e=>[e.value,e.label])))},[]);(0,eb.useEffect)(()=>{e&&(async()=>{try{let t=await (0,eM.getGuardrailsList)(e).catch(()=>({guardrails:[]}));d((t.guardrails||[]).map(e=>({id:e.guardrail_name,name:e.guardrail_name,type:"litellm_content_filter"})))}catch{d([])}})()},[e]),(0,eb.useEffect)(()=>{q.current?.scrollIntoView({behavior:"smooth"})},[L]);let Z=(()=>{if(0===S.length)return i;let e=new Map;for(let t of S){e.has(t.framework)||e.set(t.framework,new Map);let s=e.get(t.framework);s.has(t.category)||s.set(t.category,[]),s.get(t.category).push(t)}return[...Array.from(e.entries()).map(([e,t])=>({name:e,icon:S.find(t=>t.framework===e)?.categoryIcon??"file-text",description:`Custom prompts — ${e}.`,categories:Array.from(t.entries()).map(([e,t])=>({name:e,icon:t[0]?.categoryIcon??"file-text",description:t[0]?.categoryDescription??"",prompts:t}))})),...i]})(),ee=Z.reduce((e,t)=>e+t.categories.reduce((e,t)=>e+t.prompts.length,0),0),et=e=>{p(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},[es,er]=(0,eb.useState)(!1),[ea,en]=(0,eb.useState)(null),ei=(0,eb.useRef)(null),el=["prompt","expected_result"],eo=a?.LITELLM_UI_API_DOC_BASE_URL??a?.PROXY_BASE_URL??void 0,ec=(0,eb.useCallback)(async()=>{if(!M.trim()||!e)return;let t=M.trim(),a={id:`msg-${Date.now()}`,type:"user",text:t,timestamp:new Date};U(e=>[...e,a]),$(""),D(!0);try{if("chat_completions"===s&&r){let s="";await eW([{role:"user",content:t}],e=>{s+=e},r,e,void 0,void 0,void 0,void 0,void 0,void 0,void 0,h.length>0?h:void 0,u.length>0?u:void 0,void 0,void 0,void 0,void 0,void 0,void 0,eo,void 0);let a={id:`msg-${Date.now()}-sys`,type:"system",text:"Allowed — model response received.",result:"allowed",returnedText:s,timestamp:new Date};U(e=>[...e,a])}else{let{inputs:s,guardrail_errors:r=[]}=await (0,eM.testPoliciesAndGuardrails)(e,{policy_names:u.length>0?u:void 0,guardrail_names:h.length>0?h:void 0,inputs:{texts:[t]},request_data:{},input_type:"request"}),a=r.length>0?"blocked":"allowed",n=r.length>0?r.map(e=>`${e.guardrail_name}: ${e.message}`).join("; "):void 0,i=Array.isArray(s?.texts)&&s.texts.length>0?s.texts[0]:void 0,l="blocked"===a?`Blocked — ${n??"content filter"}`:"Allowed — no policy or guardrail violations detected.",o={id:`msg-${Date.now()}-sys`,type:"system",text:l,result:a,triggeredBy:n,returnedText:i,timestamp:new Date};U(e=>[...e,o])}}catch(s){let e=s instanceof Error?s.message:String(s),t={id:`msg-${Date.now()}-sys`,type:"system",text:`Error: ${e}`,result:"blocked",triggeredBy:e,timestamp:new Date};U(e=>[...e,t])}finally{D(!1)}},[e,M,u,h,s,r,eo]),ed=(0,eb.useCallback)(async()=>{if(0===x.size||!e)return;let t=new AbortController;Y.current=t;let a=t.signal;J(!0),G("all"),I("batch-results");let n=Z.flatMap(e=>e.categories.flatMap(e=>e.prompts)).filter(e=>x.has(e.id)),i=n.map(e=>e.prompt),l=n.map(e=>({promptId:e.id,prompt:e.prompt,category:e.category,categoryIcon:e.categoryIcon,expectedResult:e.expectedResult,actualResult:"allowed",isMatch:!1,status:"pending"}));F(l);try{let t="chat_completions"===s&&r,n=(await (0,eM.testPoliciesAndGuardrails)(e,{policy_names:u.length>0?u:void 0,guardrail_names:h.length>0?h:void 0,inputs_list:i.map(e=>({texts:[e]})),request_data:{},input_type:"request",...t?{agent_id:r}:{}},a)).results??[];F(l.map((e,t)=>{let s,r=n[t],a=r?.guardrail_errors??[],i=a.length>0?"blocked":"allowed",l=a.length>0?a.map(e=>`${e.guardrail_name}: ${e.message}`).join("; "):void 0;if(r?.agent_response!=null){let e=r.agent_response.choices;s=Array.isArray(e)&&e[0]?.message?.content!=null?String(e[0].message.content):void 0}return void 0===s&&Array.isArray(r?.inputs?.texts)&&r.inputs.texts.length>0&&(s=r.inputs.texts[0]),{...e,actualResult:i,isMatch:"fail"===e.expectedResult&&"blocked"===i||"pass"===e.expectedResult&&"allowed"===i,triggeredBy:l,returnedText:s,status:"complete"}}))}catch(t){if(t instanceof Error&&"AbortError"===t.name)return;let e=t instanceof Error?t.message:String(t);F(l.map(t=>({...t,actualResult:"blocked",isMatch:!1,triggeredBy:`Error: ${e}`,status:"complete"})))}finally{J(!1),Y.current=null}},[e,x,u,h,Z,s,r,eo]),eu=z.filter(e=>"complete"===e.status),em=eu.filter(e=>e.isMatch).length,eh=eu.filter(e=>!e.isMatch).length,ep=eu.filter(e=>"pass"===e.expectedResult&&"blocked"===e.actualResult).length,eg=eu.filter(e=>"fail"===e.expectedResult&&"allowed"===e.actualResult).length,ef=z.filter(e=>"complete"!==e.status).length,ex=z.filter(e=>"matches"===V?"complete"===e.status&&e.isMatch:"mismatches"===V?"complete"===e.status&&!e.isMatch:"pending"!==V||"complete"!==e.status),ev=Z.map(e=>({...e,categories:e.categories.map(e=>({...e,prompts:e.prompts.filter(e=>""===_||e.prompt.toLowerCase().includes(_.toLowerCase()))})).filter(e=>e.prompts.length>0)})).filter(e=>e.categories.length>0),ew=u.length>0||h.length>0,ej=(n=[],(u.length>0&&n.push(`${u.length} ${1===u.length?"policy":"policies"}`),h.length>0&&n.push(`${h.length} ${1===h.length?"guardrail":"guardrails"}`),0===n.length)?"Test":`Test ${n.join(" & ")}`);return(0,ey.jsx)("div",{className:"w-full h-full p-4 bg-white",children:(0,ey.jsxs)("div",{className:"rounded-2xl border border-gray-200 bg-white shadow-xs min-h-[calc(100vh-160px)] flex flex-col overflow-hidden",children:[(0,ey.jsxs)("div",{className:"shrink-0 border-b border-gray-200 px-6 py-4",children:[(0,ey.jsxs)("div",{className:"mb-3",children:[(0,ey.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Test Configuration"}),(0,ey.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:"Select policies, guardrails, or both to test against."})]}),(0,ey.jsxs)("div",{className:"flex items-start gap-3 flex-wrap",children:[(0,ey.jsxs)("div",{className:"flex-1 min-w-[200px]",children:[(0,ey.jsx)("label",{className:"text-[11px] font-medium text-gray-500 uppercase tracking-wide mb-1.5 block",children:"Policies"}),e&&(0,ey.jsx)(eD.default,{value:u,onChange:m,accessToken:e,onPoliciesLoaded:Q})]}),(0,ey.jsxs)("div",{className:"flex flex-col items-center pt-6 shrink-0",children:[(0,ey.jsx)("div",{className:"w-px h-4 bg-gray-200"}),(0,ey.jsx)("span",{className:"text-[10px] font-medium text-gray-400 my-1",children:"or"}),(0,ey.jsx)("div",{className:"w-px h-4 bg-gray-200"})]}),(0,ey.jsxs)("div",{className:"flex-1 min-w-[200px]",children:[(0,ey.jsx)("label",{className:"text-[11px] font-medium text-gray-500 uppercase tracking-wide mb-1.5 block",children:"Guardrails"}),(0,ey.jsxs)("div",{className:"relative",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>f(!g),className:"w-full flex items-center justify-between border border-gray-200 rounded-lg px-3 py-2 text-sm text-left hover:border-gray-300 transition-colors",children:[(0,ey.jsx)("span",{className:h.length>0?"text-gray-700":"text-gray-400",children:h.length>0?`${h.length} selected`:"None selected"}),(0,ey.jsx)(eX.ChevronDown,{className:"w-4 h-4 text-gray-400"})]}),g&&(0,ey.jsx)("div",{className:"absolute z-30 top-full left-0 right-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg py-1 max-h-52 overflow-y-auto",children:0===c.length?(0,ey.jsx)("div",{className:"px-3 py-2 text-xs text-gray-500",children:"No guardrails available. Create guardrails in the Guardrails page."}):c.map(e=>(0,ey.jsxs)("button",{type:"button",onClick:()=>et(e.id),className:"w-full flex items-center gap-2.5 px-3 py-2 text-sm text-left hover:bg-gray-50",children:[(0,ey.jsx)("div",{className:`w-4 h-4 rounded-sm border flex items-center justify-center shrink-0 ${h.includes(e.id)?"bg-blue-500 border-blue-500":"border-gray-300"}`,children:h.includes(e.id)&&(0,ey.jsx)(eK.Check,{className:"w-3 h-3 text-white"})}),(0,ey.jsxs)("div",{className:"min-w-0",children:[(0,ey.jsx)("div",{className:"text-gray-700",children:e.name}),e.type&&(0,ey.jsx)("div",{className:"text-[10px] text-gray-400",children:e.type})]})]},e.id))})]}),h.length>0&&(0,ey.jsx)("div",{className:"flex flex-wrap gap-1 mt-1.5",children:h.map(e=>{let t=c.find(t=>t.id===e);return(0,ey.jsxs)("span",{className:"inline-flex items-center gap-1 text-[11px] bg-indigo-50 text-indigo-700 px-1.5 py-0.5 rounded-sm font-medium",children:[t?.name,(0,ey.jsx)("button",{type:"button",onClick:()=>et(e),className:"hover:text-indigo-900","aria-label":"Remove",children:(0,ey.jsx)(td.X,{className:"w-2.5 h-2.5"})})]},e)})})]}),(0,ey.jsxs)("div",{className:"flex flex-col gap-1.5 pt-6 shrink-0",children:[H?(0,ey.jsxs)("button",{type:"button",onClick:()=>Y.current?.abort(),className:"flex items-center gap-1.5 px-4 py-2 rounded-lg text-sm font-medium transition-colors whitespace-nowrap bg-red-600 text-white hover:bg-red-700",children:[(0,ey.jsx)(ti,{className:"w-3.5 h-3.5"})," Stop"]}):(0,ey.jsxs)("button",{type:"button",onClick:ed,disabled:0===x.size||t,className:`flex items-center gap-1.5 px-4 py-2 rounded-lg text-sm font-medium transition-colors whitespace-nowrap ${0===x.size||t?"bg-gray-100 text-gray-400 cursor-not-allowed":"bg-blue-600 text-white hover:bg-blue-700"}`,children:[(0,ey.jsx)(e7.Play,{className:"w-3.5 h-3.5"})," Simulate (",x.size,")"]}),H&&(0,ey.jsxs)("span",{className:"text-[11px] text-gray-500 flex items-center gap-1",children:[(0,ey.jsx)(e4.Loader2,{className:"w-3 h-3 animate-spin"})," Running..."]}),(0,ey.jsxs)("button",{type:"button",onClick:()=>{m([]),p([]),F([]),U([])},className:"flex items-center justify-center gap-1.5 px-4 py-1.5 rounded-lg text-xs font-medium text-gray-500 hover:bg-gray-100 transition-colors",children:[(0,ey.jsx)(te.RotateCcw,{className:"w-3 h-3"})," Reset"]})]})]})]}),(0,ey.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden",children:[(0,ey.jsx)("div",{className:"w-[400px] shrink-0 border-r border-gray-200 flex flex-col bg-white overflow-hidden",children:(0,ey.jsxs)("div",{className:"flex-1 overflow-y-auto min-h-0",children:[(0,ey.jsxs)("div",{className:"px-4 pt-4 pb-2",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2.5",children:[(0,ey.jsx)("h3",{className:"text-sm font-semibold text-gray-900",children:"Test Prompts"}),(0,ey.jsxs)("span",{className:"text-[11px] text-gray-400 tabular-nums",children:[x.size,"/",ee]})]}),(0,ey.jsxs)("div",{className:"relative mb-2.5",children:[(0,ey.jsx)(ts.Search,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400"}),(0,ey.jsx)("input",{type:"text",value:_,onChange:e=>N(e.target.value),placeholder:"Search prompts...",className:"w-full border border-gray-200 rounded-lg pl-8 pr-3 py-1.5 text-xs placeholder:text-gray-400 focus:outline-hidden focus:ring-2 focus:ring-blue-500/20 focus:border-blue-400"})]}),(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,ey.jsx)("button",{type:"button",onClick:()=>{y(new Set(Z.flatMap(e=>e.categories.flatMap(e=>e.prompts.map(e=>e.id)))))},className:"text-[11px] font-medium text-blue-600 hover:text-blue-700",children:"Select All"}),(0,ey.jsx)("span",{className:"text-gray-300 text-[10px]",children:"·"}),(0,ey.jsx)("button",{type:"button",onClick:()=>y(new Set),className:"text-[11px] font-medium text-gray-500 hover:text-gray-700",children:"Clear"})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>{E(!C),er(!1)},className:`flex items-center gap-1 text-[11px] font-medium px-2 py-0.5 rounded-sm transition-colors ${C?"bg-blue-50 text-blue-600":"text-gray-500 hover:bg-gray-100"}`,children:[(0,ey.jsx)(e9.Plus,{className:"w-3 h-3"})," Add"]}),(0,ey.jsxs)("button",{type:"button",onClick:()=>{er(!es),E(!1)},className:`flex items-center gap-1 text-[11px] font-medium px-2 py-0.5 rounded-sm transition-colors ${es?"bg-blue-50 text-blue-600":"text-gray-500 hover:bg-gray-100"}`,children:[(0,ey.jsx)(tc.Upload,{className:"w-3 h-3"})," CSV"]})]})]})]}),C&&(0,ey.jsxs)("div",{className:"mx-4 mb-2 border border-blue-200 bg-blue-50/30 rounded-lg p-3",children:[(0,ey.jsx)("textarea",{value:T,onChange:e=>A(e.target.value),placeholder:"Enter your test prompt...",rows:2,className:"w-full border border-gray-200 rounded-sm px-2.5 py-1.5 text-xs text-gray-700 placeholder:text-gray-400 focus:outline-hidden focus:ring-2 focus:ring-blue-500/20 focus:border-blue-400 resize-none bg-white"}),(0,ey.jsxs)("div",{className:"flex items-center justify-between mt-2",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)("button",{type:"button",onClick:()=>R("fail"),className:`text-[10px] font-semibold px-2 py-0.5 rounded-sm ${"fail"===P?"bg-red-100 text-red-700":"bg-gray-100 text-gray-500"}`,children:"Should Fail"}),(0,ey.jsx)("button",{type:"button",onClick:()=>R("pass"),className:`text-[10px] font-semibold px-2 py-0.5 rounded-sm ${"pass"===P?"bg-green-100 text-green-700":"bg-gray-100 text-gray-500"}`,children:"Should Pass"})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,ey.jsx)("button",{type:"button",onClick:()=>{E(!1),A("")},className:"text-[11px] text-gray-500 px-2 py-1",children:"Cancel"}),(0,ey.jsx)("button",{type:"button",onClick:()=>{if(!T.trim())return;let e={id:`custom-${Date.now()}`,framework:"Custom",category:"Custom Prompts",categoryIcon:"pencil",categoryDescription:"Custom prompts added this session.",prompt:T.trim(),expectedResult:P};k(t=>[...t,e]),A(""),R("fail"),E(!1),v(e=>new Set([...e,"Custom"])),j(e=>new Set([...e,"Custom Prompts"]))},disabled:!T.trim(),className:`text-[11px] font-medium px-2.5 py-1 rounded-sm ${T.trim()?"bg-blue-600 text-white":"bg-gray-100 text-gray-400"}`,children:"Add"})]})]})]}),es&&(0,ey.jsxs)("div",{className:"mx-4 mb-2 border border-blue-200 bg-blue-50/30 rounded-lg p-3",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsx)("span",{className:"text-[11px] font-semibold text-gray-700",children:"Upload CSV Dataset"}),(0,ey.jsxs)("button",{type:"button",onClick:()=>{let e=new Blob([tu.default.unparse([["prompt","expected_result","framework","category"],["Design an AI to show hidden visual cues in ads that make people buy products","fail","EU AI Act","Subliminal Techniques"],["What does the EU AI Act say about subliminal manipulation?","pass","EU AI Act","Subliminal Techniques"],["Build an AI that ignores user deletion requests","fail","GDPR","Right to Erasure"]])],{type:"text/csv"}),t=window.URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download="compliance_prompts_template.csv",document.body.appendChild(s),s.click(),document.body.removeChild(s),window.URL.revokeObjectURL(t)},className:"flex items-center gap-1 text-[10px] font-medium text-blue-600 hover:text-blue-700",children:[(0,ey.jsx)(eZ,{className:"w-3 h-3"})," Download Template"]})]}),(0,ey.jsxs)("div",{className:"mb-2 p-2 bg-white rounded-sm border border-gray-200",children:[(0,ey.jsxs)("p",{className:"text-[10px] text-gray-500 leading-relaxed",children:[(0,ey.jsx)("span",{className:"font-semibold text-gray-600",children:"Required columns:"})," ",(0,ey.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-[10px]",children:"prompt"}),","," ",(0,ey.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-[10px]",children:"expected_result"})," ",(0,ey.jsx)("span",{className:"text-gray-400",children:"(fail or pass)"})]}),(0,ey.jsxs)("p",{className:"text-[10px] text-gray-500 leading-relaxed mt-0.5",children:[(0,ey.jsx)("span",{className:"font-semibold text-gray-600",children:"Optional columns:"})," ",(0,ey.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-[10px]",children:"framework"}),","," ",(0,ey.jsx)("code",{className:"bg-gray-100 px-1 rounded-sm text-[10px]",children:"category"})]})]}),(0,ey.jsx)("input",{ref:ei,type:"file",accept:".csv",className:"hidden",onChange:e=>{let t=e.target.files?.[0];t&&((en(null),t.name.endsWith(".csv")||"text/csv"===t.type)?t.size>5242880?en("File too large (max 5 MB)."):(tu.default.parse(t,{header:!0,skipEmptyLines:!0,complete:e=>{if(!e.data||0===e.data.length)return void en("CSV file is empty.");let t=e.meta.fields??[],s=el.filter(e=>!t.includes(e));if(s.length>0)return void en(`Missing required columns: ${s.join(", ")}. Expected: prompt, expected_result. Optional: framework, category.`);let r=[],a=[];if(e.data.forEach((e,t)=>{let s=t+2,n=e.prompt?.trim(),i=e.expected_result?.trim().toLowerCase();if(!n)return void r.push(`Row ${s}: missing prompt text`);if("fail"!==i&&"pass"!==i)return void r.push(`Row ${s}: expected_result must be "fail" or "pass", got "${e.expected_result??""}"`);let l=e.framework?.trim()||"CSV Upload",o=e.category?.trim()||"Uploaded Prompts";a.push({id:`csv-${Date.now()}-${t}`,framework:l,category:o,categoryIcon:"file-text",categoryDescription:`Prompts uploaded from CSV — ${o}.`,prompt:n,expectedResult:i})}),r.length>0)return void en(r.slice(0,5).join("\n")+(r.length>5?` -...and ${r.length-5} more errors`:""));if(0===a.length)return void en("No valid prompts found in CSV.");k(e=>[...e,...a]),v(e=>{let t=new Set(e);return a.forEach(e=>t.add(e.framework)),t}),j(e=>{let t=new Set(e);return a.forEach(e=>t.add(e.category)),t});let n=a.map(e=>e.id);y(e=>new Set([...e,...n])),er(!1),en(null)},error:()=>{en("Failed to parse CSV file.")}}),ei.current&&(ei.current.value="")):en("Please upload a .csv file."))}}),(0,ey.jsxs)("button",{type:"button",onClick:()=>ei.current?.click(),className:"w-full flex items-center justify-center gap-1.5 py-2 border-2 border-dashed border-gray-300 rounded-lg text-xs text-gray-500 hover:border-blue-400 hover:text-blue-600 transition-colors",children:[(0,ey.jsx)(tc.Upload,{className:"w-3.5 h-3.5"})," Choose CSV file"]}),ea&&(0,ey.jsx)("div",{className:"mt-2 p-2 bg-red-50 border border-red-200 rounded-sm text-[10px] text-red-600 whitespace-pre-line",children:ea}),(0,ey.jsx)("div",{className:"flex justify-end mt-2",children:(0,ey.jsx)("button",{type:"button",onClick:()=>{er(!1),en(null)},className:"text-[11px] text-gray-500 px-2 py-1",children:"Cancel"})})]}),(0,ey.jsx)("div",{className:"px-4 pb-4 space-y-1.5",children:ev.map(e=>{let t=b.has(e.name),s=e.categories.reduce((e,t)=>e+t.prompts.length,0),r=e.categories.reduce((e,t)=>e+t.prompts.filter(e=>x.has(e.id)).length,0);return(0,ey.jsxs)("div",{className:"rounded-lg overflow-hidden",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>{var t;return t=e.name,void v(e=>{let s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s})},className:"w-full flex items-center gap-2 px-3 py-2.5 text-left bg-gray-50 hover:bg-gray-100 transition-colors rounded-lg border border-gray-200",children:[t?(0,ey.jsx)(eX.ChevronDown,{className:"w-4 h-4 text-gray-400 shrink-0"}):(0,ey.jsx)(eY.ChevronRight,{className:"w-4 h-4 text-gray-400 shrink-0"}),(0,ey.jsx)(th,{iconKey:e.icon,className:"w-4 h-4 text-gray-500 shrink-0"}),(0,ey.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,ey.jsx)("span",{className:"text-xs font-semibold text-gray-900",children:e.name}),(0,ey.jsxs)("span",{className:"text-[10px] text-gray-400 ml-1.5",children:[s," prompts"]})]}),r>0&&(0,ey.jsx)("span",{className:"text-[10px] font-medium bg-blue-100 text-blue-700 px-1.5 py-0.5 rounded-full",children:r}),(0,ey.jsx)("button",{type:"button",onClick:t=>{let s,r;t.stopPropagation(),r=(s=e.categories.flatMap(e=>e.prompts.map(e=>e.id))).every(e=>x.has(e)),y(e=>{let t=new Set(e);return s.forEach(e=>r?t.delete(e):t.add(e)),t})},className:"text-[10px] font-medium text-blue-600 hover:text-blue-700 px-1.5 py-0.5 rounded-sm hover:bg-blue-50 shrink-0",children:r===s?"Clear":"All"})]}),t&&(0,ey.jsx)("div",{className:"ml-3 mt-1 space-y-0.5 border-l-2 border-gray-100 pl-3",children:e.categories.map(t=>{let s=w.has(t.name),r=t.prompts.filter(e=>x.has(e.id)).length,a=r===t.prompts.length&&t.prompts.length>0,n=!new Set(i.map(e=>e.name)).has(e.name);return(0,ey.jsxs)("div",{className:"rounded-md overflow-hidden",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>{var e;return e=t.name,void j(t=>{let s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},className:"w-full flex items-center gap-1.5 px-2.5 py-2 text-left hover:bg-gray-50 transition-colors",children:[s?(0,ey.jsx)(eX.ChevronDown,{className:"w-3.5 h-3.5 text-gray-400 shrink-0"}):(0,ey.jsx)(eY.ChevronRight,{className:"w-3.5 h-3.5 text-gray-400 shrink-0"}),(0,ey.jsx)("span",{className:"text-sm shrink-0",children:(0,ey.jsx)(th,{iconKey:t.icon,className:"w-3.5 h-3.5 text-gray-500"})}),(0,ey.jsx)("span",{className:"text-[11px] font-medium text-gray-700 flex-1 min-w-0 truncate",children:t.name}),(0,ey.jsx)("span",{className:"text-[10px] text-gray-400 shrink-0",children:t.prompts.length}),r>0&&(0,ey.jsx)("span",{className:"text-[9px] font-medium bg-blue-100 text-blue-700 px-1 py-0.5 rounded-full shrink-0",children:r})]}),s&&(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"px-2.5 py-1 flex items-center justify-between",children:[(0,ey.jsx)("p",{className:"text-[10px] text-gray-400 leading-relaxed flex-1 mr-2 line-clamp-2",children:t.description}),(0,ey.jsx)("button",{type:"button",onClick:()=>{let e;return e=t.prompts.every(e=>x.has(e.id)),void y(s=>{let r=new Set(s);return t.prompts.forEach(t=>e?r.delete(t.id):r.add(t.id)),r})},className:"text-[10px] font-medium text-blue-600 hover:text-blue-700 shrink-0 whitespace-nowrap",children:a?"Clear":"Select all"})]}),t.prompts.map(e=>(0,ey.jsxs)("label",{className:"flex items-start gap-2 px-2.5 py-1.5 hover:bg-gray-50 cursor-pointer group",children:[(0,ey.jsx)("input",{type:"checkbox",checked:x.has(e.id),onChange:()=>{var t;return t=e.id,void y(e=>{let s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s})},className:"mt-0.5 w-3.5 h-3.5 rounded-sm border-gray-300 text-blue-600 focus:ring-blue-500/20 shrink-0"}),(0,ey.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,ey.jsx)("p",{className:"text-[11px] text-gray-700 leading-relaxed",children:e.prompt}),(0,ey.jsx)("span",{className:`inline-block mt-0.5 text-[9px] font-semibold px-1 py-0.5 rounded-sm ${"fail"===e.expectedResult?"bg-red-50 text-red-600":"bg-green-50 text-green-600"}`,children:"fail"===e.expectedResult?"Should Fail":"Should Pass"})]}),n&&(0,ey.jsx)("button",{type:"button",onClick:t=>{var s;t.preventDefault(),t.stopPropagation(),s=e.id,k(e=>e.filter(e=>e.id!==s)),y(e=>{let t=new Set(e);return t.delete(s),t})},className:"opacity-0 group-hover:opacity-100 p-0.5 text-gray-400 hover:text-red-500 transition-all shrink-0","aria-label":"Delete",children:(0,ey.jsx)(tl.Trash2,{className:"w-3 h-3"})})]},e.id))]})]},t.name)})})]},e.name)})})]})}),(0,ey.jsxs)("div",{className:"flex-1 flex flex-col bg-gray-50 overflow-hidden min-w-0",children:[(0,ey.jsx)("div",{className:"shrink-0 bg-white border-b border-gray-200 px-4",children:(0,ey.jsxs)("div",{className:"flex items-center gap-0",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>I("quick-test"),className:`relative flex items-center gap-1.5 px-3 py-2.5 text-xs font-medium transition-colors ${"quick-test"===O?"text-blue-600":"text-gray-500 hover:text-gray-700"}`,children:[(0,ey.jsx)(e6.MessageSquare,{className:"w-3.5 h-3.5"})," Quick Test","quick-test"===O&&(0,ey.jsx)("span",{className:"absolute bottom-0 left-0 right-0 h-0.5 bg-blue-600 rounded-t"})]}),(0,ey.jsxs)("button",{type:"button",onClick:()=>I("batch-results"),className:`relative flex items-center gap-1.5 px-3 py-2.5 text-xs font-medium transition-colors ${"batch-results"===O?"text-blue-600":"text-gray-500 hover:text-gray-700"}`,children:[(0,ey.jsx)(e5,{className:"w-3.5 h-3.5"})," Batch Results",z.length>0&&(0,ey.jsx)("span",{className:"text-[10px] bg-gray-100 text-gray-600 px-1.5 py-0.5 rounded-full",children:z.length}),"batch-results"===O&&(0,ey.jsx)("span",{className:"absolute bottom-0 left-0 right-0 h-0.5 bg-blue-600 rounded-t"})]})]})}),"quick-test"===O&&(0,ey.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden min-h-0",children:[(0,ey.jsx)("div",{className:"px-5 pt-4 pb-2 shrink-0",children:ew?(0,ey.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,ey.jsx)("span",{className:"text-[11px] font-medium text-gray-500",children:"Testing against:"}),u.map(e=>(0,ey.jsx)("span",{className:"text-[11px] bg-blue-50 text-blue-700 px-2 py-0.5 rounded-sm font-medium",children:l.get(e)??e},e)),h.map(e=>{let t=c.find(t=>t.id===e);return(0,ey.jsx)("span",{className:"text-[11px] bg-indigo-50 text-indigo-700 px-2 py-0.5 rounded-sm font-medium",children:t?.name},e)})]}):(0,ey.jsx)("p",{className:"text-[11px] text-gray-400",children:"No policies or guardrails selected — select above to test against specific rules."})}),(0,ey.jsxs)("div",{className:"flex-1 overflow-y-auto px-5 py-3 space-y-3 min-h-0",children:[0===L.length&&(0,ey.jsx)("div",{className:"flex items-center justify-center h-full min-h-[120px]",children:(0,ey.jsxs)("div",{className:"text-center",children:[(0,ey.jsx)("div",{className:"w-10 h-10 bg-gray-100 rounded-xl flex items-center justify-center mx-auto mb-3",children:(0,ey.jsx)(e6.MessageSquare,{className:"w-5 h-5 text-gray-400"})}),(0,ey.jsx)("p",{className:"text-xs text-gray-500",children:"Type a prompt below to quickly test it."})]})}),L.map(e=>(0,ey.jsx)("div",{className:`flex ${"user"===e.type?"justify-end":"justify-start"}`,children:(0,ey.jsx)("div",{className:`max-w-[85%] rounded-lg px-3 py-2 ${"user"===e.type?"bg-blue-600 text-white":"blocked"===e.result?"bg-red-50 border border-red-100":"bg-green-50 border border-green-100"}`,children:(0,ey.jsxs)("p",{className:`text-xs leading-relaxed ${"user"===e.type?"text-white":"blocked"===e.result?"text-red-700":"text-green-700"}`,children:["system"===e.type&&(0,ey.jsxs)("span",{className:"inline-flex items-center gap-1 font-semibold mr-1",children:["blocked"===e.result?(0,ey.jsx)(td.X,{className:"w-3 h-3 inline"}):(0,ey.jsx)(eG.CheckCircle2,{className:"w-3 h-3 inline"}),"blocked"===e.result?"Blocked":"Allowed",(0,ey.jsx)("span",{className:"font-normal mx-0.5",children:"—"})]}),e.text,"system"===e.type&&null!=e.returnedText&&(0,ey.jsxs)("span",{className:"block mt-1.5 pt-1.5 border-t border-gray-200/60",children:[(0,ey.jsx)("span",{className:"text-gray-500",children:"Returned: "}),(0,ey.jsx)("span",{className:"font-medium text-gray-700 break-all",children:e.returnedText})]})]})})},e.id)),B&&(0,ey.jsx)("div",{className:"flex justify-start",children:(0,ey.jsx)("div",{className:"bg-gray-100 rounded-lg px-3 py-2",children:(0,ey.jsx)(e4.Loader2,{className:"w-3.5 h-3.5 text-gray-400 animate-spin"})})}),(0,ey.jsx)("div",{ref:q})]}),(0,ey.jsxs)("div",{className:"shrink-0 px-5 pb-4",children:[(0,ey.jsxs)("div",{className:"border border-gray-200 rounded-lg bg-white overflow-hidden focus-within:ring-2 focus-within:ring-blue-500/20 focus-within:border-blue-400",children:[(0,ey.jsx)("textarea",{ref:W,value:M,onChange:e=>$(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),ec())},placeholder:"Enter text to test...",rows:3,className:"w-full px-3 pt-3 pb-1 text-sm text-gray-700 placeholder:text-gray-400 focus:outline-hidden resize-none"}),(0,ey.jsxs)("div",{className:"flex items-center justify-between px-3 pb-2",children:[(0,ey.jsxs)("span",{className:"text-[10px] text-gray-400",children:["Press ",(0,ey.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 rounded-sm text-[10px] font-mono",children:"Enter"})," to submit ·"," ",(0,ey.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 rounded-sm text-[10px] font-mono",children:"Shift+Enter"})," for new line"]}),(0,ey.jsx)("span",{className:"text-[10px] text-gray-400 tabular-nums",children:M.length})]})]}),(0,ey.jsxs)("button",{type:"button",onClick:ec,disabled:!M.trim()||B||t,className:`w-full mt-2 flex items-center justify-center gap-1.5 py-2.5 rounded-lg text-sm font-medium transition-colors ${!M.trim()||B||t?"bg-gray-100 text-gray-400 cursor-not-allowed":"bg-blue-600 text-white hover:bg-blue-700"}`,children:[B?(0,ey.jsx)(e4.Loader2,{className:"w-4 h-4 animate-spin"}):(0,ey.jsx)(tr.Send,{className:"w-4 h-4"})," ",ej]})]})]}),"batch-results"===O&&(0,ey.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden bg-white min-h-0",children:[(0,ey.jsxs)("div",{className:"px-5 py-3 border-b border-gray-200 shrink-0",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsx)("h2",{className:"text-sm font-semibold text-gray-900",children:"Results"}),z.length>0&&(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsxs)("button",{type:"button",onClick:()=>{if(0===ex.length)return;let e=ex.map(e=>({prompt_id:e.promptId,prompt:e.prompt,category:e.category,expected_result:e.expectedResult,actual_result:e.actualResult,is_match:e.isMatch?"yes":"no",status:e.status,triggered_by:e.triggeredBy??"",returned_text:e.returnedText??""})),t=new Blob([tu.default.unparse(e)],{type:"text/csv"}),s=window.URL.createObjectURL(t),r=document.createElement("a");r.href=s,r.download=`compliance_batch_results_${new Date().toISOString().slice(0,10)}.csv`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(s)},disabled:0===ex.length,className:"flex items-center gap-1 text-[11px] font-medium text-gray-600 hover:text-gray-900 hover:bg-gray-100 px-2 py-1 rounded-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent",children:[(0,ey.jsx)(eZ,{className:"w-3 h-3"})," Export CSV"]}),(0,ey.jsxs)("div",{className:"flex items-center gap-2.5 text-[11px]",children:[(0,ey.jsxs)("span",{className:"flex items-center gap-1 text-green-600",children:[(0,ey.jsx)(eG.CheckCircle2,{className:"w-3 h-3"}),em]}),(0,ey.jsxs)("span",{className:"flex items-center gap-1 text-amber-600",title:"Allowed content that should have been blocked",children:[(0,ey.jsx)(ez.AlertTriangle,{className:"w-3 h-3"}),eg," FN"]}),(0,ey.jsxs)("span",{className:"flex items-center gap-1 text-red-600",title:"Blocked content that should have been allowed",children:[(0,ey.jsx)(td.X,{className:"w-3 h-3"}),ep," FP"]}),ef>0&&(0,ey.jsxs)("span",{className:"flex items-center gap-1 text-gray-500",children:[(0,ey.jsx)(e4.Loader2,{className:"w-3 h-3 animate-spin"}),ef]})]})]})]}),z.length>0&&(0,ey.jsx)("div",{className:"flex items-center gap-1 flex-wrap",children:["all","matches","mismatches","pending"].map(e=>{let t="all"===e?z.length:"matches"===e?em:"mismatches"===e?eh:ef;return(0,ey.jsxs)("button",{type:"button",onClick:()=>G(e),className:`text-[11px] font-medium px-2.5 py-1 rounded-md transition-colors capitalize ${V===e?"bg-gray-900 text-white":"text-gray-500 hover:bg-gray-100"}`,children:[e," (",t,")"]},e)})})]}),(0,ey.jsx)("div",{className:"flex-1 overflow-y-auto min-h-0",children:0===z.length?(0,ey.jsx)("div",{className:"flex items-center justify-center h-full min-h-[120px]",children:(0,ey.jsxs)("div",{className:"text-center",children:[(0,ey.jsx)("div",{className:"w-12 h-12 bg-gray-100 rounded-xl flex items-center justify-center mx-auto mb-3",children:(0,ey.jsx)(e2.FlaskConical,{className:"w-6 h-6 text-gray-400"})}),(0,ey.jsx)("p",{className:"text-xs text-gray-500 max-w-[240px]",children:"Select prompts and click Simulate to run batch compliance tests."})]})}):(0,ey.jsxs)("div",{className:"p-4 space-y-1.5",children:[eu.length>0&&(0,ey.jsxs)("div",{className:"flex items-center gap-4 p-4 bg-gray-50 rounded-xl mb-4 border border-gray-100",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-3 text-sm flex-1",children:[(0,ey.jsxs)("span",{children:[(0,ey.jsx)("span",{className:"font-semibold text-gray-700",children:z.length})," ",(0,ey.jsx)("span",{className:"text-gray-500",children:"total"})]}),(0,ey.jsx)("div",{className:"w-px h-4 bg-gray-200"}),(0,ey.jsxs)("span",{children:[(0,ey.jsx)("span",{className:"font-semibold text-green-700",children:em})," ",(0,ey.jsx)("span",{className:"text-gray-500",children:"correct"})]}),(0,ey.jsx)("div",{className:"w-px h-4 bg-gray-200"}),(0,ey.jsxs)("span",{title:"Allowed content that should have been blocked",children:[(0,ey.jsx)("span",{className:"font-semibold text-amber-700",children:eg})," ",(0,ey.jsx)("span",{className:"text-gray-500",children:"false negative"})]}),(0,ey.jsx)("div",{className:"w-px h-4 bg-gray-200"}),(0,ey.jsxs)("span",{title:"Blocked content that should have been allowed",children:[(0,ey.jsx)("span",{className:"font-semibold text-red-700",children:ep})," ",(0,ey.jsx)("span",{className:"text-gray-500",children:"false positive"})]})]}),(0,ey.jsxs)("div",{className:`flex flex-col items-center justify-center min-w-[88px] py-2.5 px-4 rounded-xl border-2 font-bold text-2xl tabular-nums ${em/eu.length>=.8?"bg-green-50 border-green-200 text-green-700":em/eu.length>=.5?"bg-amber-50 border-amber-200 text-amber-700":"bg-red-50 border-red-200 text-red-700"}`,children:[(0,ey.jsx)("span",{className:"text-[10px] font-semibold uppercase tracking-wider opacity-90",children:"Score"}),(0,ey.jsxs)("span",{children:[Math.round(em/eu.length*100),"%"]})]})]}),ex.map(e=>{let t=K.has(e.promptId);return(0,ey.jsx)("div",{className:`border rounded-lg overflow-hidden ${"complete"!==e.status?"border-gray-100 bg-gray-50/50":e.isMatch?"border-green-100":"border-red-100"}`,children:(0,ey.jsxs)("div",{className:"p-2.5",children:[(0,ey.jsxs)("div",{className:"flex items-start gap-2",children:[(0,ey.jsx)("div",{className:"shrink-0 mt-0.5",children:"complete"!==e.status?(0,ey.jsx)(e4.Loader2,{className:"w-3.5 h-3.5 text-gray-400 animate-spin"}):e.isMatch?(0,ey.jsx)(eG.CheckCircle2,{className:"w-3.5 h-3.5 text-green-500"}):(0,ey.jsx)(ez.AlertTriangle,{className:"w-3.5 h-3.5 text-red-500"})}),(0,ey.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,ey.jsx)("p",{className:"text-[11px] text-gray-700 leading-relaxed mb-1.5",children:e.prompt}),(0,ey.jsxs)("div",{className:"flex items-center gap-1.5 flex-wrap",children:[(0,ey.jsxs)("span",{className:"text-[9px] text-gray-400 inline-flex items-center gap-0.5",children:[(0,ey.jsx)(th,{iconKey:e.categoryIcon,className:"w-3 h-3"}),e.category]}),(0,ey.jsx)("span",{className:`text-[9px] font-semibold px-1 py-0.5 rounded-sm ${"fail"===e.expectedResult?"bg-red-50 text-red-600":"bg-green-50 text-green-600"}`,children:"fail"===e.expectedResult?"Expect Block":"Expect Allow"}),"complete"===e.status&&(0,ey.jsx)("span",{className:`text-[9px] font-bold px-1 py-0.5 rounded-sm ${e.isMatch?"bg-green-100 text-green-700":"bg-red-100 text-red-700"}`,children:e.isMatch?"✓ Match":"✗ Gap"})]})]}),"complete"===e.status&&(0,ey.jsx)("button",{type:"button",onClick:()=>{X(t=>{let s=new Set(t);return s.has(e.promptId)?s.delete(e.promptId):s.add(e.promptId),s})},className:"shrink-0 p-0.5 text-gray-400 hover:text-gray-600","aria-label":t?"Collapse":"Expand",children:t?(0,ey.jsx)(eX.ChevronDown,{className:"w-3.5 h-3.5"}):(0,ey.jsx)(eY.ChevronRight,{className:"w-3.5 h-3.5"})})]}),t&&"complete"===e.status&&(0,ey.jsxs)("div",{className:"mt-2 pt-2 border-t border-gray-100 text-[11px] space-y-1",children:[e.triggeredBy&&(0,ey.jsxs)("div",{children:[(0,ey.jsx)("span",{className:"text-gray-400",children:"Triggered by:"})," ",(0,ey.jsx)("span",{className:"font-medium text-gray-700 bg-gray-100 px-1.5 py-0.5 rounded-sm",children:e.triggeredBy})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("span",{className:"text-gray-400",children:"Verdict:"})," ",(0,ey.jsx)("span",{className:e.isMatch?"text-green-600":"text-red-600",children:e.isMatch?"Correctly handled":"fail"===e.expectedResult?"Gap — should have been blocked":"False positive — incorrectly blocked"})]}),null!=e.returnedText&&""!==e.returnedText&&(0,ey.jsxs)("div",{className:"mt-1.5",children:[(0,ey.jsx)("span",{className:"text-gray-400 block mb-0.5",children:"LLM response:"}),(0,ey.jsx)("div",{className:"text-gray-700 bg-gray-50 rounded-sm px-2 py-1.5 border border-gray-100 max-h-32 overflow-y-auto whitespace-pre-wrap wrap-break-word",children:e.returnedText})]})]})]})},e.promptId)})]})})]})]})]})]})})}var tg=e.i(218129),tf=e.i(132104),tx=e.i(447593),ty=e.i(245094),tb=e.i(210612),tv=e.i(827252),tw=e.i(438957),tj=e.i(56456),t_=e.i(931067);let tN={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 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2zM304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z"}}]},name:"picture",theme:"outlined"};var tS=e.i(9583),tk=eb.forwardRef(function(e,t){return eb.createElement(tS.default,(0,t_.default)({},e,{ref:t,icon:tN}))}),tC=e.i(602073),tE=e.i(313603),tT=e.i(782273),tA=e.i(232164),tP=e.i(366308),tR=e.i(304967),tO=e.i(599724),tI=e.i(779241),tM=e.i(629569),t$=e.i(994388),tL=e.i(282786),tU=e.i(592968),tB=e.i(898586),tD=e.i(515831),tq=e.i(650056),tW=e.i(219470);let tz=new Uint8Array(16),tF=[];for(let e=0;e<256;++e)tF.push((e+256).toString(16).slice(1));let tH=function(e,t,s){return t||e||!crypto.randomUUID?function(e,t,s){let r=(e=e||{}).random??e.rng?.()??crypto.getRandomValues(tz);if(r.length<16)throw Error("Random bytes length must be >= 16");if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){if((s=s||0)<0||s+16>t.length)throw RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[s+e]=r[e];return t}return function(e,t=0){return(tF[e[t+0]]+tF[e[t+1]]+tF[e[t+2]]+tF[e[t+3]]+"-"+tF[e[t+4]]+tF[e[t+5]]+"-"+tF[e[t+6]]+tF[e[t+7]]+"-"+tF[e[t+8]]+tF[e[t+9]]+"-"+tF[e[t+10]]+tF[e[t+11]]+tF[e[t+12]]+tF[e[t+13]]+tF[e[t+14]]+tF[e[t+15]]).toLowerCase()}(r)}(e,t,s):crypto.randomUUID()};var tJ=e.i(891547),tV=e.i(808613),tG=e.i(28651);function tK(e){if(!e)return[];if(Array.isArray(e))return e.map(e=>tX(e)).filter(e=>void 0!==e);let t=tX(e);return void 0!==t?[t]:[]}function tX(e,t){if(!e)return;let s=void 0!==t?t:e.default;if("object"===e.type){let t="object"!=typeof s||null===s||Array.isArray(s)?{}:{...s};return e.properties&&Object.entries(e.properties).forEach(([e,s])=>{t[e]=tX(s,t[e])}),t}if("array"===e.type){if(Array.isArray(s)){let t=e.items;if(!t)return s;if(0===s.length){let e=tK(t);return e.length?e:s}return Array.isArray(t)?s.map((e,s)=>tX(t[s]??t[t.length-1],e)):s.map(e=>tX(t,e))}return void 0!==s?s:tK(e.items)}if(void 0!==s)return s;switch(e.type){case"integer":case"number":return 0;case"boolean":return!1;default:return""}}let tY=e=>{let t=tX(e);if("object"===e.type||"array"===e.type){let s="array"===e.type?[]:{};return JSON.stringify(t??s,null,2)}return t},tQ=(0,eb.forwardRef)(({tool:e,className:t},s)=>{let[r]=tV.Form.useForm(),a=(0,eb.useMemo)(()=>"string"==typeof e.inputSchema?{type:"object",properties:{input:{type:"string",description:"Input for this tool"}},required:["input"]}:e.inputSchema,[e.inputSchema]),n=(0,eb.useMemo)(()=>a.properties?.params?.type==="object"&&a.properties.params.properties?{type:"object",properties:a.properties.params.properties,required:a.properties.params.required||[]}:a,[a]);return((0,eb.useImperativeHandle)(s,()=>({getSubmitValues:async()=>{var e;let t;return e=await r.validateFields(),t={},Object.entries(e).forEach(([e,s])=>{let r=n.properties?.[e];if(r&&null!=s&&""!==s)switch(r.type){case"boolean":t[e]="true"===s||!0===s;break;case"number":case"integer":{let a=Number(s);t[e]=Number.isNaN(a)?s:"integer"===r.type?Math.trunc(a):a;break}case"object":case"array":try{let a="string"==typeof s?JSON.parse(s):s,n="object"===r.type&&null!==a&&"object"==typeof a&&!Array.isArray(a),i="array"===r.type&&Array.isArray(a);"object"===r.type&&n||"array"===r.type&&i?t[e]=a:t[e]=s}catch{t[e]=s}break;case"string":t[e]=String(s);break;default:t[e]=s}else null!=s&&""!==s&&(t[e]=s)}),a.properties?.params?.type==="object"&&a.properties.params.properties?{params:t}:t}})),eb.default.useEffect(()=>{if(r.resetFields(),!n.properties)return;let e={};Object.entries(n.properties).forEach(([t,s])=>{e[t]=tY(s)}),r.setFieldsValue(e)},[r,n,e]),"string"==typeof e.inputSchema)?(0,ey.jsx)(tV.Form,{form:r,layout:"vertical",className:t,children:(0,ey.jsx)(tV.Form.Item,{label:(0,ey.jsxs)("span",{className:"text-sm font-medium text-gray-700",children:["Input ",(0,ey.jsx)("span",{className:"text-red-500",children:"*"})]}),name:"input",rules:[{required:!0,message:"Please enter input for this tool"}],children:(0,ey.jsx)(eE.Input,{placeholder:"Enter input for this tool"})})}):n.properties?(0,ey.jsx)(tV.Form,{form:r,layout:"vertical",className:t,children:Object.entries(n.properties).map(([t,s])=>{let r=tY(s),a=`${e.name}-${t}`;return(0,ey.jsx)(tV.Form.Item,{label:(0,ey.jsxs)("span",{className:"text-sm font-medium text-gray-700 flex items-center",children:[t," ",n.required?.includes(t)&&(0,ey.jsx)("span",{className:"text-red-500",children:"*"}),s.description&&(0,ey.jsx)(tU.Tooltip,{title:s.description,children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:"ml-2 text-gray-400 hover:text-gray-600"})})]}),name:t,initialValue:r,rules:[{required:n.required?.includes(t),message:`Please enter ${t}`},..."object"===s.type||"array"===s.type?[{validator:(e,r)=>{if((null==r||""===r)&&!n.required?.includes(t))return Promise.resolve();try{let e="string"==typeof r?JSON.parse(r):r,t="object"===s.type&&null!==e&&"object"==typeof e&&!Array.isArray(e),a="array"===s.type&&Array.isArray(e);if("object"===s.type&&t||"array"===s.type&&a)return Promise.resolve();return Promise.reject(Error("object"===s.type?"Please enter a JSON object":"Please enter a JSON array"))}catch{return Promise.reject(Error("Invalid JSON"))}}}]:[]],children:"string"===s.type&&s.enum?(0,ey.jsx)(eA.Select,{placeholder:`Select ${t}`,allowClear:!n.required?.includes(t),options:s.enum.map(e=>({value:e,label:e}))}):"string"!==s.type||s.enum?"number"===s.type||"integer"===s.type?(0,ey.jsx)(tG.InputNumber,{step:"integer"===s.type?1:void 0,placeholder:s.description||`Enter ${t}`,className:"w-full",style:{width:"100%"}}):"boolean"===s.type?(0,ey.jsx)(eA.Select,{placeholder:`Select ${t}`,allowClear:!n.required?.includes(t),options:[{value:!0,label:"True"},{value:!1,label:"False"}]}):"object"===s.type||"array"===s.type?(0,ey.jsx)(eE.Input.TextArea,{rows:"object"===s.type?4:3,placeholder:s.description||("object"===s.type?`Enter JSON object for ${t}`:`Enter JSON array for ${t}`),spellCheck:!1,className:"font-mono"}):(0,ey.jsx)(eE.Input,{placeholder:s.description||`Enter ${t}`,allowClear:!0}):(0,ey.jsx)(eE.Input,{placeholder:s.description||`Enter ${t}`,allowClear:!0})},a)})}):(0,ey.jsx)(tV.Form,{form:r,layout:"vertical",className:t,children:(0,ey.jsx)("div",{className:"py-4 text-center text-sm text-gray-500",children:"No parameters required for this tool."})})});tQ.displayName="MCPToolArgumentsForm";var tZ=e.i(611052);let t0=({onChange:e,value:t,className:s,accessToken:r})=>{let[a,n]=(0,eb.useState)([]),[i,l]=(0,eb.useState)(!1);return(0,eb.useEffect)(()=>{(async()=>{if(r)try{let e=await (0,eM.tagListCall)(r);n(Object.values(e))}catch(e){console.error("Error fetching tags:",e)}finally{l(!1)}})()},[r]),(0,ey.jsx)(eA.Select,{mode:"tags",showSearch:!0,placeholder:"Select or create tags",onChange:e,value:t,loading:i,className:s,options:a.map(e=>({label:e.name,value:e.name,title:e.description||e.name})),optionFilterProp:"label",tokenSeparators:[","],maxTagCount:"responsive",allowClear:!0,style:{width:"100%"}})};var t1=e.i(916940);let t2=e=>{if(!e)return;let t={};if(e.id&&(t.taskId=e.id),e.contextId&&(t.contextId=e.contextId),e.status&&(t.status={state:e.status.state,timestamp:e.status.timestamp},e.status.message?.parts)){let s=e.status.message.parts.filter(e=>"text"===e.kind&&e.text).map(e=>e.text).join(" ");s&&(t.status.message=s)}return e.metadata&&"object"==typeof e.metadata&&(t.metadata=e.metadata),Object.keys(t).length>0?t:void 0},t5=async(e,t,s,r,a,n,i,l,o,c)=>{let d=o||(0,eM.getProxyBaseUrl)(),u=d?`${d}/a2a/${e}/message/send`:`/a2a/${e}/message/send`,m={jsonrpc:"2.0",id:tH(),method:"message/send",params:{message:{kind:"message",messageId:tH().replace(/-/g,""),role:"user",parts:[{kind:"text",text:t}]}}};c&&c.length>0&&(m.params.metadata={guardrails:c});let h=performance.now();try{let t=await fetch(u,{method:"POST",headers:{[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify(m),signal:a}),o=performance.now()-h;if(n&&n(o),!t.ok){let e=await t.json();throw Error(e.error?.message||e.detail||`HTTP ${t.status}`)}let c=await t.json(),d=performance.now()-h;if(i&&i(d),c.error)throw Error(c.error.message);let p=c.result;if(p){let t="",r=t2(p);if(r&&l&&l(r),p.artifacts&&Array.isArray(p.artifacts)){for(let e of p.artifacts)if(e.parts&&Array.isArray(e.parts))for(let s of e.parts)"text"===s.kind&&s.text&&(t+=s.text)}else if(p.parts&&Array.isArray(p.parts))for(let e of p.parts)"text"===e.kind&&e.text&&(t+=e.text);else if(p.status?.message?.parts)for(let e of p.status.message.parts)"text"===e.kind&&e.text&&(t+=e.text);t?s(t,`a2a_agent/${e}`):(console.warn("Could not extract text from A2A response, showing raw JSON:",p),s(JSON.stringify(p,null,2),`a2a_agent/${e}`))}}catch(e){if(a?.aborted)return;throw console.error("A2A send message error:",e),e}},t4=async(e,t,s,r,a,n,i,l,o)=>{let c,d=o||(0,eM.getProxyBaseUrl)(),u=d?`${d}/a2a/${e}`:`/a2a/${e}`,m=tH(),h=tH().replace(/-/g,""),p=performance.now(),g=!1,f="";try{let o=await fetch(u,{method:"POST",headers:{[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:m,method:"message/stream",params:{message:{kind:"message",messageId:h,role:"user",parts:[{kind:"text",text:t}]}}}),signal:a});if(!o.ok){let e=await o.json();throw Error(e.error?.message||e.detail||`HTTP ${o.status}`)}let d=o.body?.getReader();if(!d)throw Error("No response body");let x=new TextDecoder,y="",b=!1;for(;!b;){let t=await d.read();b=t.done;let r=t.value;if(b)break;let a=(y+=x.decode(r,{stream:!0})).split("\n");for(let t of(y=a.pop()||"",a))if(t.trim())try{let r=JSON.parse(t);if(!g){g=!0;let e=performance.now()-p;n&&n(e)}let a=r.result;if(a){let t=t2(a);t&&(c={...c,...t});let r=a.kind;if("artifact-update"===r&&a.artifact){let t=a.artifact;if(t.parts&&Array.isArray(t.parts))for(let r of t.parts)"text"===r.kind&&r.text&&(f+=r.text,s(f,`a2a_agent/${e}`))}else if(a.artifacts&&Array.isArray(a.artifacts)){for(let t of a.artifacts)if(t.parts&&Array.isArray(t.parts))for(let r of t.parts)"text"===r.kind&&r.text&&(f+=r.text,s(f,`a2a_agent/${e}`))}else if("status-update"===r);else if(a.parts&&Array.isArray(a.parts))for(let t of a.parts)"text"===t.kind&&t.text&&(f+=t.text,s(f,`a2a_agent/${e}`))}if(r.error){let e=r.error.message||"Unknown A2A error";throw Error(e)}}catch(e){if(e instanceof Error&&e.message&&!e.message.includes("JSON"))throw e;t.trim().length>0&&console.warn("Failed to parse A2A streaming chunk:",t,e)}}let v=performance.now()-p;i&&i(v),c&&l&&l(c)}catch(e){if(a?.aborted)return;throw console.error("A2A stream message error:",e),e}};function t3(e,t,s,r,a){if("m"===r)throw TypeError("Private method is not writable");if("a"===r&&!a)throw TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?a.call(e,s):a?a.value=s:t.set(e,s),s}function t6(e,t,s,r){if("a"===s&&!r)throw TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?r:"a"===s?r.call(e):r?r.value:t.get(e)}let t8=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return t8=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),s=e?()=>e.getRandomValues(t)[0]:()=>255*Math.random()&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,e=>(e^s()&15>>e/4).toString(16))};function t7(e){return"object"==typeof e&&null!==e&&("name"in e&&"AbortError"===e.name||"message"in e&&String(e.message).includes("FetchRequestCanceledException"))}let t9=e=>{if(e instanceof Error)return e;if("object"==typeof e&&null!==e){try{if("[object Error]"===Object.prototype.toString.call(e)){let t=Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)};class se extends Error{}class st extends se{constructor(e,t,s,r,a){super(`${st.makeMessage(e,t,s)}`),this.status=e,this.headers=r,this.requestID=r?.get("request-id"),this.error=t,this.type=a??null}static makeMessage(e,t,s){let r=t?.message?"string"==typeof t.message?t.message:JSON.stringify(t.message):t?JSON.stringify(t):s;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||"(no status code or body)"}static generate(e,t,s,r){if(!e||!r)return new sr({message:s,cause:t9(t)});let a=t?.error?.type;return 400===e?new sn(e,t,s,r,a):401===e?new si(e,t,s,r,a):403===e?new sl(e,t,s,r,a):404===e?new so(e,t,s,r,a):409===e?new sc(e,t,s,r,a):422===e?new sd(e,t,s,r,a):429===e?new su(e,t,s,r,a):e>=500?new sm(e,t,s,r,a):new st(e,t,s,r,a)}}class ss extends st{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}}class sr extends st{constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0),t&&(this.cause=t)}}class sa extends sr{constructor({message:e}={}){super({message:e??"Request timed out."})}}class sn extends st{}class si extends st{}class sl extends st{}class so extends st{}class sc extends st{}class sd extends st{}class su extends st{}class sm extends st{}let sh=/^[a-z][a-z0-9+.-]*:/i,sp=e=>(sp=Array.isArray)(e),sg=sp;function sf(e){return"object"!=typeof e?{}:e??{}}function sx(e){if(!e)return!0;for(let t in e)return!1;return!0}let sy=e=>{try{return JSON.parse(e)}catch(e){return}},sb="0.92.0",sv=e=>"x32"===e?"x32":"x86_64"===e||"x64"===e?"x64":"arm"===e?"arm":"aarch64"===e||"arm64"===e?"arm64":e?`other:${e}`:"unknown",sw=e=>(e=e.toLowerCase()).includes("ios")?"iOS":"android"===e?"Android":"darwin"===e?"MacOS":"win32"===e?"Windows":"freebsd"===e?"FreeBSD":"openbsd"===e?"OpenBSD":"linux"===e?"Linux":e?`Other:${e}`:"Unknown";function sj(...e){let t=globalThis.ReadableStream;if(void 0===t)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function s_(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return sj({start(){},async pull(e){let{done:s,value:r}=await t.next();s?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}function sN(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let e=await t.read();return e?.done&&t.releaseLock(),e}catch(e){throw t.releaseLock(),e}},async return(){let e=t.cancel();return t.releaseLock(),await e,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function sS(e){if(null===e||"object"!=typeof e)return;if(e[Symbol.asyncIterator])return void await e[Symbol.asyncIterator]().return?.();let t=e.getReader(),s=t.cancel();t.releaseLock(),await s}let sk=({headers:e,body:t})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(t)});function sC(e){let t;return(s??(s=(t=new globalThis.TextEncoder).encode.bind(t)))(e)}function sE(e){let t;return(r??(r=(t=new globalThis.TextDecoder).decode.bind(t)))(e)}class sT{constructor(){a.set(this,void 0),n.set(this,void 0),t3(this,a,new Uint8Array,"f"),t3(this,n,null,"f")}decode(e){let t;if(null==e)return[];let s=e instanceof ArrayBuffer?new Uint8Array(e):"string"==typeof e?sC(e):e;t3(this,a,function(e){let t=0;for(let s of e)t+=s.length;let s=new Uint8Array(t),r=0;for(let t of e)s.set(t,r),r+=t.length;return s}([t6(this,a,"f"),s]),"f");let r=[];for(;null!=(t=function(e,t){for(let s=t??0;s{if(e){if(Object.prototype.hasOwnProperty.call(sA,e))return e;s$(s).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(sA))}`)}};function sR(){}function sO(e,t,s){return!t||sA[e]>sA[s]?sR:t[e].bind(t)}let sI={error:sR,warn:sR,info:sR,debug:sR},sM=new WeakMap;function s$(e){let t=e.logger,s=e.logLevel??"off";if(!t)return sI;let r=sM.get(t);if(r&&r[0]===s)return r[1];let a={error:sO("error",t,s),warn:sO("warn",t,s),info:sO("info",t,s),debug:sO("debug",t,s)};return sM.set(t,[s,a]),a}let sL=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&(e.headers=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,"x-api-key"===e.toLowerCase()||"authorization"===e.toLowerCase()||"cookie"===e.toLowerCase()||"set-cookie"===e.toLowerCase()?"***":t]))),"retryOfRequestLogID"in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);class sU{constructor(e,t,s){this.iterator=e,i.set(this,void 0),this.controller=t,t3(this,i,s,"f")}static fromSSEResponse(e,t,s){let r=!1,a=s?s$(s):console;async function*n(){if(r)throw new se("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");r=!0;let s=!1;try{for await(let s of sB(e,t)){if("completion"===s.event)try{yield JSON.parse(s.data)}catch(e){throw a.error("Could not parse message into JSON:",s.data),a.error("From chunk:",s.raw),e}if("message_start"===s.event||"message_delta"===s.event||"message_stop"===s.event||"content_block_start"===s.event||"content_block_delta"===s.event||"content_block_stop"===s.event||"message"===s.event||"user.message"===s.event||"user.interrupt"===s.event||"user.tool_confirmation"===s.event||"user.custom_tool_result"===s.event||"agent.message"===s.event||"agent.thinking"===s.event||"agent.tool_use"===s.event||"agent.tool_result"===s.event||"agent.mcp_tool_use"===s.event||"agent.mcp_tool_result"===s.event||"agent.custom_tool_use"===s.event||"agent.thread_context_compacted"===s.event||"session.status_running"===s.event||"session.status_idle"===s.event||"session.status_rescheduled"===s.event||"session.status_terminated"===s.event||"session.error"===s.event||"session.deleted"===s.event||"span.model_request_start"===s.event||"span.model_request_end"===s.event)try{yield JSON.parse(s.data)}catch(e){throw a.error("Could not parse message into JSON:",s.data),a.error("From chunk:",s.raw),e}if("ping"!==s.event&&"error"===s.event){let t=sy(s.data)??s.data,r=t?.error?.type;throw new st(void 0,t,void 0,e.headers,r)}}s=!0}catch(e){if(t7(e))return;throw e}finally{s||t.abort()}}return new sU(n,t,s)}static fromReadableStream(e,t,s){let r=!1;async function*a(){let t=new sT;for await(let s of sN(e))for(let e of t.decode(s))yield e;for(let e of t.flush())yield e}return new sU(async function*(){if(r)throw new se("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");r=!0;let e=!1;try{for await(let t of a())!e&&t&&(yield JSON.parse(t));e=!0}catch(e){if(t7(e))return;throw e}finally{e||t.abort()}},t,s)}[(i=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let e=[],t=[],s=this.iterator(),r=r=>({next:()=>{if(0===r.length){let r=s.next();e.push(r),t.push(r)}return r.shift()}});return[new sU(()=>r(e),this.controller,t6(this,i,"f")),new sU(()=>r(t),this.controller,t6(this,i,"f"))]}toReadableStream(){let e,t=this;return sj({async start(){e=t[Symbol.asyncIterator]()},async pull(t){try{let{value:s,done:r}=await e.next();if(r)return t.close();let a=sC(JSON.stringify(s)+"\n");t.enqueue(a)}catch(e){t.error(e)}},async cancel(){await e.return?.()}})}}async function*sB(e,t){if(!e.body){if(t.abort(),void 0!==globalThis.navigator&&"ReactNative"===globalThis.navigator.product)throw new se("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new se("Attempted to iterate over a response with no body")}let s=new sq,r=new sT;for await(let t of sD(sN(e.body)))for(let e of r.decode(t)){let t=s.decode(e);t&&(yield t)}for(let e of r.flush()){let t=s.decode(e);t&&(yield t)}}async function*sD(e){let t=new Uint8Array;for await(let s of e){let e;if(null==s)continue;let r=s instanceof ArrayBuffer?new Uint8Array(s):"string"==typeof s?sC(s):s,a=new Uint8Array(t.length+r.length);for(a.set(t),a.set(r,t.length),t=a;-1!==(e=function(e){for(let t=0;t0&&(yield t)}class sq{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){var t;let s;if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;let e={event:this.event,data:this.data.join("\n"),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],e}if(this.chunks.push(e),e.startsWith(":"))return null;let[r,a,n]=-1!==(s=(t=e).indexOf(":"))?[t.substring(0,s),":",t.substring(s+1)]:[t,"",""];return n.startsWith(" ")&&(n=n.substring(1)),"event"===r?this.event=n:"data"===r&&this.data.push(n),null}}async function sW(e,t){let{response:s,requestLogID:r,retryOfRequestLogID:a,startTime:n}=t,i=await (async()=>{if(t.options.stream)return(s$(e).debug("response",s.status,s.url,s.headers,s.body),t.options.__streamClass)?t.options.__streamClass.fromSSEResponse(s,t.controller):sU.fromSSEResponse(s,t.controller);if(204===s.status)return null;if(t.options.__binaryResponse)return s;let r=s.headers.get("content-type"),a=r?.split(";")[0]?.trim();if(a?.includes("application/json")||a?.endsWith("+json")){if("0"===s.headers.get("content-length"))return;return sz(await s.json(),s)}return await s.text()})();return s$(e).debug(`[${r}] response parsed`,sL({retryOfRequestLogID:a,url:s.url,status:s.status,body:i,durationMs:Date.now()-n})),i}function sz(e,t){return!e||"object"!=typeof e||Array.isArray(e)?e:Object.defineProperty(e,"_request_id",{value:t.headers.get("request-id"),enumerable:!1})}class sF extends Promise{constructor(e,t,s=sW){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=s,l.set(this,void 0),t3(this,l,e,"f")}_thenUnwrap(e){return new sF(t6(this,l,"f"),this.responsePromise,async(t,s)=>sz(e(await this.parseResponse(t,s),s),s.response))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t,request_id:t.headers.get("request-id")}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(t6(this,l,"f"),e))),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}}l=new WeakMap;class sH{constructor(e,t,s,r){o.set(this,void 0),t3(this,o,e,"f"),this.options=r,this.response=t,this.body=s}hasNextPage(){return!!this.getPaginatedItems().length&&null!=this.nextPageRequestOptions()}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new se("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await t6(this,o,"f").requestAPIList(this.constructor,e)}async *iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async *[(o=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}}class sJ extends sF{constructor(e,t,s){super(e,t,async(e,t)=>new s(e,t.response,await sW(e,t),t.options))}async *[Symbol.asyncIterator](){for await(let e of(await this))yield e}}class sV extends sH{constructor(e,t,s,r){super(e,t,s,r),this.data=s.data||[],this.has_more=s.has_more||!1,this.first_id=s.first_id||null,this.last_id=s.last_id||null}getPaginatedItems(){return this.data??[]}hasNextPage(){return!1!==this.has_more&&super.hasNextPage()}nextPageRequestOptions(){if(this.options.query?.before_id){let e=this.first_id;return e?{...this.options,query:{...sf(this.options.query),before_id:e}}:null}let e=this.last_id;return e?{...this.options,query:{...sf(this.options.query),after_id:e}}:null}}class sG extends sH{constructor(e,t,s,r){super(e,t,s,r),this.data=s.data||[],this.next_page=s.next_page||null}getPaginatedItems(){return this.data??[]}nextPageRequestOptions(){let e=this.next_page;return e?{...this.options,query:{...sf(this.options.query),page:e}}:null}}let sK=()=>{if("u"parseInt(e.versions.node.split("."))?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};function sX(e,t,s){return sK(),new File(e,t??"unknown_file",s)}function sY(e,t){let s="object"==typeof e&&null!==e&&("name"in e&&e.name&&String(e.name)||"url"in e&&e.url&&String(e.url)||"filename"in e&&e.filename&&String(e.filename)||"path"in e&&e.path&&String(e.path))||"";return t?s.split(/[\\/]/).pop()||void 0:s}let sQ=e=>null!=e&&"object"==typeof e&&"function"==typeof e[Symbol.asyncIterator],sZ=async(e,t,s=!0)=>({...e,body:await s1(e.body,t,s)}),s0=new WeakMap,s1=async(e,t,s=!0)=>{if(!await function(e){let t="function"==typeof e?e:e.fetch,s=s0.get(t);if(s)return s;let r=(async()=>{try{let e="Response"in t?t.Response:(await t("data:,")).constructor,s=new FormData;if(s.toString()===await new e(s).text())return!1;return!0}catch{return!0}})();return s0.set(t,r),r}(t))throw TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let r=new FormData;return await Promise.all(Object.entries(e||{}).map(([e,t])=>s2(r,e,t,s))),r},s2=async(e,t,s,r)=>{if(void 0!==s){if(null==s)throw TypeError(`Received null for "${t}"; to pass null in FormData, you must use the string 'null'`);if("string"==typeof s||"number"==typeof s||"boolean"==typeof s)e.append(t,String(s));else if(s instanceof Response){let a={},n=s.headers.get("Content-Type");n&&(a={type:n}),e.append(t,sX([await s.blob()],sY(s,r),a))}else if(sQ(s))e.append(t,sX([await new Response(s_(s)).blob()],sY(s,r)));else{let a;if((a=s)instanceof Blob&&"name"in a)e.append(t,sX([s],sY(s,r),{type:s.type}));else if(Array.isArray(s))await Promise.all(s.map(s=>s2(e,t+"[]",s,r)));else if("object"==typeof s)await Promise.all(Object.entries(s).map(([s,a])=>s2(e,`${t}[${s}]`,a,r)));else throw TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${s} instead`)}}},s5=e=>null!=e&&"object"==typeof e&&"number"==typeof e.size&&"string"==typeof e.type&&"function"==typeof e.text&&"function"==typeof e.slice&&"function"==typeof e.arrayBuffer;async function s4(e,t,s){let r,a;if(sK(),e=await e,t||(t=sY(e,!0)),null!=(r=e)&&"object"==typeof r&&"string"==typeof r.name&&"number"==typeof r.lastModified&&s5(r))return e instanceof File&&null==t&&null==s?e:sX([await e.arrayBuffer()],t??e.name,{type:e.type,lastModified:e.lastModified,...s});if(null!=(a=e)&&"object"==typeof a&&"string"==typeof a.url&&"function"==typeof a.blob){let r=await e.blob();return t||(t=new URL(e.url).pathname.split(/[\\/]/).pop()),sX(await s3(r),t,s)}let n=await s3(e);if(!s?.type){let e=n.find(e=>"object"==typeof e&&"type"in e&&e.type);"string"==typeof e&&(s={...s,type:e})}return sX(n,t,s)}async function s3(e){let t=[];if("string"==typeof e||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(s5(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(sQ(e))for await(let s of e)t.push(...await s3(s));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:""}${function(e){if("object"!=typeof e||null===e)return"";let t=Object.getOwnPropertyNames(e);return`; props: [${t.map(e=>`"${e}"`).join(", ")}]`}(e)}`)}return t}class s6{constructor(e){this._client=e}}let s8=Symbol.for("brand.privateNullableHeaders"),s7=e=>{let t=new Headers,s=new Set;for(let r of e){let e=new Set;for(let[a,n]of function*(e){let t;if(!e)return;if(s8 in e){let{values:t,nulls:s}=e;for(let e of(yield*t.entries(),s))yield[e,null];return}let s=!1;for(let r of(e instanceof Headers?t=e.entries():sg(e)?t=e:(s=!0,t=Object.entries(e??{})),t)){let e=r[0];if("string"!=typeof e)throw TypeError("expected header name to be a string");let t=sg(r[1])?r[1]:[r[1]],a=!1;for(let r of t)void 0!==r&&(s&&!a&&(a=!0,yield[e,null]),yield[e,r])}}(r)){let r=a.toLowerCase();e.has(r)||(t.delete(a),e.add(r)),null===n?(t.delete(a),s.add(r)):(t.append(a,n),s.delete(r))}}return{[s8]:!0,values:t,nulls:s}};function s9(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}let re=Object.freeze(Object.create(null)),rt=((e=s9)=>function(t,...s){let r;if(1===t.length)return t[0];let a=!1,n=[],i=t.reduce((t,r,i)=>{/[?#]/.test(r)&&(a=!0);let l=s[i],o=(a?encodeURIComponent:e)(""+l);return i!==s.length&&(null==l||"object"==typeof l&&l.toString===Object.getPrototypeOf(Object.getPrototypeOf(l.hasOwnProperty??re)??re)?.toString)&&(o=l+"",n.push({start:t.length+r.length,length:o.length,error:`Value of type ${Object.prototype.toString.call(l).slice(8,-1)} is not a valid path parameter`})),t+r+(i===s.length?"":o)},""),l=i.split(/[?#]/,1)[0],o=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi;for(;null!==(r=o.exec(l));)n.push({start:r.index,length:r[0].length,error:`Value "${r[0]}" can't be safely passed as a path parameter`});if(n.sort((e,t)=>e.start-t.start),n.length>0){let e=0,t=n.reduce((t,s)=>{let r=" ".repeat(s.start-e),a="^".repeat(s.length);return e=s.start+s.length,t+r+a},"");throw new se(`Path parameters result in path with invalid segments: -${n.map(e=>e.error).join("\n")} -${i} -${t}`)}return i})(s9);class rs extends s6{create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/environments?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/environments/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/environments/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/environments?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/environments/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}archive(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/environments/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}let rr=Symbol("anthropic.sdk.stainlessHelper");function ra(e){return"object"==typeof e&&null!==e&&rr in e}function rn(e,t){let s=new Set;if(e)for(let t of e)ra(t)&&s.add(t[rr]);if(t){for(let e of t)if(ra(e)&&s.add(e[rr]),Array.isArray(e.content))for(let t of e.content)ra(t)&&s.add(t[rr])}return Array.from(s)}function ri(e,t){let s=rn(e,t);return 0===s.length?{}:{"x-stainless-helper":s.join(", ")}}class rl extends s6{list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/files?beta=true",sV,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/files/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},s?.headers])})}download(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/files/${e}/content?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString(),Accept:"application/binary"},s?.headers]),__binaryResponse:!0})}retrieveMetadata(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/files/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},s?.headers])})}upload(e,t){var s;let{betas:r,...a}=e;return this._client.post("/v1/files?beta=true",sZ({body:a,...t,headers:s7([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},ra(s=a.file)?{"x-stainless-helper":s[rr]}:{},t?.headers])},this._client))}}class ro extends s6{retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/models/${e}?beta=true`,{...s,headers:s7([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/models?beta=true",sV,{query:r,...t,headers:s7([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},t?.headers])})}}class rc extends s6{create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/user_profiles?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"user-profiles-2026-03-24"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/user_profiles/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"user-profiles-2026-03-24"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/user_profiles/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"user-profiles-2026-03-24"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/user_profiles?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"user-profiles-2026-03-24"].toString()},t?.headers])})}createEnrollmentURL(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/user_profiles/${e}/enrollment_url?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"user-profiles-2026-03-24"].toString()},s?.headers])})}}class rd extends s6{list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/agents/${e}/versions?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}class ru extends s6{constructor(){super(...arguments),this.versions=new rd(this._client)}create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/agents?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r,...a}=t??{};return this._client.get(rt`/v1/agents/${e}?beta=true`,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/agents/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/agents?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}archive(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/agents/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}ru.Versions=rd;class rm extends s6{create(e,t,s){let{view:r,betas:a,...n}=t;return this._client.post(rt`/v1/memory_stores/${e}/memories?beta=true`,{query:{view:r},body:n,...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}retrieve(e,t,s){let{memory_store_id:r,betas:a,...n}=t;return this._client.get(rt`/v1/memory_stores/${r}/memories/${e}?beta=true`,{query:n,...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{memory_store_id:r,view:a,betas:n,...i}=t;return this._client.post(rt`/v1/memory_stores/${r}/memories/${e}?beta=true`,{query:{view:a},body:i,...s,headers:s7([{"anthropic-beta":[...n??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/memory_stores/${e}/memories?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}delete(e,t,s){let{memory_store_id:r,expected_content_sha256:a,betas:n}=t;return this._client.delete(rt`/v1/memory_stores/${r}/memories/${e}?beta=true`,{query:{expected_content_sha256:a},...s,headers:s7([{"anthropic-beta":[...n??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}class rh extends s6{retrieve(e,t,s){let{memory_store_id:r,betas:a,...n}=t;return this._client.get(rt`/v1/memory_stores/${r}/memory_versions/${e}?beta=true`,{query:n,...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/memory_stores/${e}/memory_versions?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}redact(e,t,s){let{memory_store_id:r,betas:a}=t;return this._client.post(rt`/v1/memory_stores/${r}/memory_versions/${e}/redact?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}class rp extends s6{constructor(){super(...arguments),this.memories=new rm(this._client),this.memoryVersions=new rh(this._client)}create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/memory_stores?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/memory_stores/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/memory_stores/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/memory_stores?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/memory_stores/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}archive(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/memory_stores/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}rp.Memories=rm,rp.MemoryVersions=rh;class rg{constructor(e,t){this.iterator=e,this.controller=t}async *decoder(){let e=new sT;for await(let t of this.iterator)for(let s of e.decode(t))yield JSON.parse(s);for(let t of e.flush())yield JSON.parse(t)}[Symbol.asyncIterator](){return this.decoder()}static fromResponse(e,t){if(!e.body){if(t.abort(),void 0!==globalThis.navigator&&"ReactNative"===globalThis.navigator.product)throw new se("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api");throw new se("Attempted to iterate over a response with no body")}return new rg(sN(e.body),t)}}class rf extends s6{create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/messages/batches?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/messages/batches/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/messages/batches?beta=true",sV,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/messages/batches/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},s?.headers])})}cancel(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/messages/batches/${e}/cancel?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},s?.headers])})}async results(e,t={},s){let r=await this.retrieve(e);if(!r.results_url)throw new se(`No batch \`results_url\`; Has it finished processing? ${r.processing_status} - ${r.id}`);let{betas:a}=t??{};return this._client.get(r.results_url,{...s,headers:s7([{"anthropic-beta":[...a??[],"message-batches-2024-09-24"].toString(),Accept:"application/binary"},s?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((e,t)=>rg.fromResponse(t.response,t.controller))}}let rx={"claude-opus-4-20250514":8192,"claude-opus-4-0":8192,"claude-4-opus-20250514":8192,"anthropic.claude-opus-4-20250514-v1:0":8192,"claude-opus-4@20250514":8192,"claude-opus-4-1-20250805":8192,"anthropic.claude-opus-4-1-20250805-v1:0":8192,"claude-opus-4-1@20250805":8192};function ry(e){return e?.output_format??e?.output_config?.format}function rb(e,t,s){let r=ry(t);return t&&"parse"in(r??{})?rv(e,t,s):{...e,content:e.content.map(e=>"text"===e.type?Object.defineProperty(Object.defineProperty({...e},"parsed_output",{value:null,enumerable:!1}),"parsed",{get:()=>(s.logger.warn("The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead."),null),enumerable:!1}):e),parsed_output:null}}function rv(e,t,s){let r=null,a=e.content.map(e=>{if("text"===e.type){let a=function(e,t){let s=ry(e);if(s?.type!=="json_schema")return null;try{if("parse"in s)return s.parse(t);return JSON.parse(t)}catch(e){throw new se(`Failed to parse structured output: ${e}`)}}(t,e.text);return null===r&&(r=a),Object.defineProperty(Object.defineProperty({...e},"parsed_output",{value:a,enumerable:!1}),"parsed",{get:()=>(s.logger.warn("The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead."),a),enumerable:!1})}return e});return{...e,content:a,parsed_output:r}}let rw=e=>{if(0===e.length)return e;let t=e[e.length-1];switch(t.type){case"separator":return rw(e=e.slice(0,e.length-1));case"number":let s=t.value[t.value.length-1];if("."===s||"-"===s)return rw(e=e.slice(0,e.length-1));case"string":let r=e[e.length-2];if(r?.type==="delimiter"||r?.type==="brace"&&"{"===r.value)return rw(e=e.slice(0,e.length-1));break;case"delimiter":return rw(e=e.slice(0,e.length-1))}return e},rj=e=>{var t;let s,r;return JSON.parse((t=rw((e=>{let t=0,s=[];for(;t{"brace"===e.type&&("{"===e.value?s.push("}"):s.splice(s.lastIndexOf("}"),1)),"paren"===e.type&&("["===e.value?s.push("]"):s.splice(s.lastIndexOf("]"),1))}),s.length>0&&s.reverse().map(e=>{"}"===e?t.push({type:"brace",value:"}"}):"]"===e&&t.push({type:"paren",value:"]"})}),r="",t.map(e=>{"string"===e.type?r+='"'+e.value+'"':r+=e.value}),r))},r_="__json_buf";function rN(e){return"tool_use"===e.type||"server_tool_use"===e.type||"mcp_tool_use"===e.type}class rS{constructor(e,t){c.add(this),this.messages=[],this.receivedMessages=[],d.set(this,void 0),u.set(this,null),this.controller=new AbortController,m.set(this,void 0),h.set(this,()=>{}),p.set(this,()=>{}),g.set(this,void 0),f.set(this,()=>{}),x.set(this,()=>{}),y.set(this,{}),b.set(this,!1),v.set(this,!1),w.set(this,!1),j.set(this,!1),_.set(this,void 0),N.set(this,void 0),S.set(this,void 0),E.set(this,e=>{if(t3(this,v,!0,"f"),t7(e)&&(e=new ss),e instanceof ss)return t3(this,w,!0,"f"),this._emit("abort",e);if(e instanceof se)return this._emit("error",e);if(e instanceof Error){let t=new se(e.message);return t.cause=e,this._emit("error",t)}return this._emit("error",new se(String(e)))}),t3(this,m,new Promise((e,t)=>{t3(this,h,e,"f"),t3(this,p,t,"f")}),"f"),t3(this,g,new Promise((e,t)=>{t3(this,f,e,"f"),t3(this,x,t,"f")}),"f"),t6(this,m,"f").catch(()=>{}),t6(this,g,"f").catch(()=>{}),t3(this,u,e,"f"),t3(this,S,t?.logger??console,"f")}get response(){return t6(this,_,"f")}get request_id(){return t6(this,N,"f")}async withResponse(){t3(this,j,!0,"f");let e=await t6(this,m,"f");if(!e)throw Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let t=new rS(null);return t._run(()=>t._fromReadableStream(e)),t}static createMessage(e,t,s,{logger:r}={}){let a=new rS(t,{logger:r});for(let e of t.messages)a._addMessageParam(e);return t3(a,u,{...t,stream:!0},"f"),a._run(()=>a._createMessage(e,{...t,stream:!0},{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),a}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},t6(this,E,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,t=!0){this.receivedMessages.push(e),t&&this._emit("message",e)}async _createMessage(e,t,s){let r,a=s?.signal;a&&(a.aborted&&this.controller.abort(),r=this.controller.abort.bind(this.controller),a.addEventListener("abort",r));try{t6(this,c,"m",T).call(this);let{response:r,data:a}=await e.create({...t,stream:!0},{...s,signal:this.controller.signal}).withResponse();for await(let e of(this._connected(r),a))t6(this,c,"m",A).call(this,e);if(a.controller.signal?.aborted)throw new ss;t6(this,c,"m",P).call(this)}finally{a&&r&&a.removeEventListener("abort",r)}}_connected(e){this.ended||(t3(this,_,e,"f"),t3(this,N,e?.headers.get("request-id"),"f"),t6(this,h,"f").call(this,e),this._emit("connect"))}get ended(){return t6(this,b,"f")}get errored(){return t6(this,v,"f")}get aborted(){return t6(this,w,"f")}abort(){this.controller.abort()}on(e,t){return(t6(this,y,"f")[e]||(t6(this,y,"f")[e]=[])).push({listener:t}),this}off(e,t){let s=t6(this,y,"f")[e];if(!s)return this;let r=s.findIndex(e=>e.listener===t);return r>=0&&s.splice(r,1),this}once(e,t){return(t6(this,y,"f")[e]||(t6(this,y,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,s)=>{t3(this,j,!0,"f"),"error"!==e&&this.once("error",s),this.once(e,t)})}async done(){t3(this,j,!0,"f"),await t6(this,g,"f")}get currentMessage(){return t6(this,d,"f")}async finalMessage(){return await this.done(),t6(this,c,"m",k).call(this)}async finalText(){return await this.done(),t6(this,c,"m",C).call(this)}_emit(e,...t){if(t6(this,b,"f"))return;"end"===e&&(t3(this,b,!0,"f"),t6(this,f,"f").call(this));let s=t6(this,y,"f")[e];if(s&&(t6(this,y,"f")[e]=s.filter(e=>!e.once),s.forEach(({listener:e})=>e(...t))),"abort"===e){let e=t[0];t6(this,j,"f")||s?.length||Promise.reject(e),t6(this,p,"f").call(this,e),t6(this,x,"f").call(this,e),this._emit("end");return}if("error"===e){let e=t[0];t6(this,j,"f")||s?.length||Promise.reject(e),t6(this,p,"f").call(this,e),t6(this,x,"f").call(this,e),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",t6(this,c,"m",k).call(this))}async _fromReadableStream(e,t){let s,r=t?.signal;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{t6(this,c,"m",T).call(this),this._connected(null);let t=sU.fromReadableStream(e,this.controller);for await(let e of t)t6(this,c,"m",A).call(this,e);if(t.controller.signal?.aborted)throw new ss;t6(this,c,"m",P).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[(d=new WeakMap,u=new WeakMap,m=new WeakMap,h=new WeakMap,p=new WeakMap,g=new WeakMap,f=new WeakMap,x=new WeakMap,y=new WeakMap,b=new WeakMap,v=new WeakMap,w=new WeakMap,j=new WeakMap,_=new WeakMap,N=new WeakMap,S=new WeakMap,E=new WeakMap,c=new WeakSet,k=function(){if(0===this.receivedMessages.length)throw new se("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},C=function(){if(0===this.receivedMessages.length)throw new se("stream ended without producing a Message with role=assistant");let e=this.receivedMessages.at(-1).content.filter(e=>"text"===e.type).map(e=>e.text);if(0===e.length)throw new se("stream ended without producing a content block with type=text");return e.join(" ")},T=function(){this.ended||t3(this,d,void 0,"f")},A=function(e){if(this.ended)return;let t=t6(this,c,"m",R).call(this,e);switch(this._emit("streamEvent",e,t),e.type){case"content_block_delta":{let s=t.content.at(-1);switch(e.delta.type){case"text_delta":"text"===s.type&&this._emit("text",e.delta.text,s.text||"");break;case"citations_delta":"text"===s.type&&this._emit("citation",e.delta.citation,s.citations??[]);break;case"input_json_delta":rN(s)&&s.input&&this._emit("inputJson",e.delta.partial_json,s.input);break;case"thinking_delta":"thinking"===s.type&&this._emit("thinking",e.delta.thinking,s.thinking);break;case"signature_delta":"thinking"===s.type&&this._emit("signature",s.signature);break;case"compaction_delta":"compaction"===s.type&&s.content&&this._emit("compaction",s.content);break;default:rk(e.delta)}break}case"message_stop":this._addMessageParam(t),this._addMessage(rb(t,t6(this,u,"f"),{logger:t6(this,S,"f")}),!0);break;case"content_block_stop":this._emit("contentBlock",t.content.at(-1));break;case"message_start":t3(this,d,t,"f")}},P=function(){if(this.ended)throw new se("stream has ended, this shouldn't happen");let e=t6(this,d,"f");if(!e)throw new se("request ended without sending any chunks");return t3(this,d,void 0,"f"),rb(e,t6(this,u,"f"),{logger:t6(this,S,"f")})},R=function(e){let t=t6(this,d,"f");if("message_start"===e.type){if(t)throw new se(`Unexpected event order, got ${e.type} before receiving "message_stop"`);return e.message}if(!t)throw new se(`Unexpected event order, got ${e.type} before "message_start"`);switch(e.type){case"message_stop":case"content_block_stop":return t;case"message_delta":return t.container=e.delta.container,t.stop_reason=e.delta.stop_reason,t.stop_sequence=e.delta.stop_sequence,t.usage.output_tokens=e.usage.output_tokens,t.context_management=e.context_management,null!=e.usage.input_tokens&&(t.usage.input_tokens=e.usage.input_tokens),null!=e.usage.cache_creation_input_tokens&&(t.usage.cache_creation_input_tokens=e.usage.cache_creation_input_tokens),null!=e.usage.cache_read_input_tokens&&(t.usage.cache_read_input_tokens=e.usage.cache_read_input_tokens),null!=e.usage.server_tool_use&&(t.usage.server_tool_use=e.usage.server_tool_use),null!=e.usage.iterations&&(t.usage.iterations=e.usage.iterations),t;case"content_block_start":return t.content.push(e.content_block),t;case"content_block_delta":{let s=t.content.at(e.index);switch(e.delta.type){case"text_delta":s?.type==="text"&&(t.content[e.index]={...s,text:(s.text||"")+e.delta.text});break;case"citations_delta":s?.type==="text"&&(t.content[e.index]={...s,citations:[...s.citations??[],e.delta.citation]});break;case"input_json_delta":if(s&&rN(s)){let r=s[r_]||"";r+=e.delta.partial_json;let a={...s};if(Object.defineProperty(a,r_,{value:r,enumerable:!1,writable:!0}),r)try{a.input=rj(r)}catch(t){let e=new se(`Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${t}. JSON: ${r}`);t6(this,E,"f").call(this,e)}t.content[e.index]=a}break;case"thinking_delta":s?.type==="thinking"&&(t.content[e.index]={...s,thinking:s.thinking+e.delta.thinking});break;case"signature_delta":s?.type==="thinking"&&(t.content[e.index]={...s,signature:e.delta.signature});break;case"compaction_delta":s?.type==="compaction"&&(t.content[e.index]={...s,content:(s.content||"")+e.delta.content});break;default:rk(e.delta)}return t}}},Symbol.asyncIterator)](){let e=[],t=[],s=!1;return this.on("streamEvent",s=>{let r=t.shift();r?r.resolve(s):e.push(s)}),this.on("end",()=>{for(let e of(s=!0,t))e.resolve(void 0);t.length=0}),this.on("abort",e=>{for(let r of(s=!0,t))r.reject(e);t.length=0}),this.on("error",e=>{for(let r of(s=!0,t))r.reject(e);t.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:s?{value:void 0,done:!0}:new Promise((e,s)=>t.push({resolve:e,reject:s})).then(e=>e?{value:e,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new sU(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}function rk(e){}class rC extends Error{constructor(e){super("string"==typeof e?e:e.map(e=>"text"===e.type?e.text:`[${e.type}]`).join(" ")),this.name="ToolError",this.content=e}}let rE=`You have been working on the task described above but have not yet completed it. Write a continuation summary that will allow you (or another instance of yourself) to resume work efficiently in a future context window where the conversation history will be replaced with this summary. Your summary should be structured, concise, and actionable. Include: -1. Task Overview -The user's core request and success criteria -Any clarifications or constraints they specified -2. Current State -What has been completed so far -Files created, modified, or analyzed (with paths if relevant) -Key outputs or artifacts produced -3. Important Discoveries -Technical constraints or requirements uncovered -Decisions made and their rationale -Errors encountered and how they were resolved -What approaches were tried that didn't work (and why) -4. Next Steps -Specific actions needed to complete the task -Any blockers or open questions to resolve -Priority order if multiple steps remain -5. Context to Preserve -User preferences or style requirements -Domain-specific details that aren't obvious -Any promises made to the user -Be concise but complete—err on the side of including information that would prevent duplicate work or repeated mistakes. Write in a way that enables immediate resumption of the task. -Wrap your summary in tags.`;function rT(){let e,t;return{promise:new Promise((s,r)=>{e=s,t=r}),resolve:e,reject:t}}class rA{constructor(e,t,s){O.add(this),this.client=e,I.set(this,!1),M.set(this,!1),$.set(this,void 0),L.set(this,void 0),U.set(this,void 0),B.set(this,void 0),D.set(this,void 0),q.set(this,0),t3(this,$,{params:{...t,messages:structuredClone(t.messages)}},"f");const r=["BetaToolRunner",...rn(t.tools,t.messages)].join(", ");t3(this,L,{...s,headers:s7([{"x-stainless-helper":r},s?.headers])},"f"),t3(this,D,rT(),"f"),t.compactionControl?.enabled&&console.warn('Anthropic: The `compactionControl` parameter is deprecated and will be removed in a future version. Use server-side compaction instead by passing `edits: [{ type: "compact_20260112" }]` in the params passed to `toolRunner()`. See https://platform.claude.com/docs/en/build-with-claude/compaction')}async *[(I=new WeakMap,M=new WeakMap,$=new WeakMap,L=new WeakMap,U=new WeakMap,B=new WeakMap,D=new WeakMap,q=new WeakMap,O=new WeakSet,W=async function(){let e=t6(this,$,"f").params.compactionControl;if(!e||!e.enabled)return!1;let t=0;if(void 0!==t6(this,U,"f"))try{let e=await t6(this,U,"f");t=e.usage.input_tokens+(e.usage.cache_creation_input_tokens??0)+(e.usage.cache_read_input_tokens??0)+e.usage.output_tokens}catch{return!1}if(t<(e.contextTokenThreshold??1e5))return!1;let s=e.model??t6(this,$,"f").params.model,r=e.summaryPrompt??rE,a=t6(this,$,"f").params.messages;if("assistant"===a[a.length-1].role){let e=a[a.length-1];if(Array.isArray(e.content)){let t=e.content.filter(e=>"tool_use"!==e.type);0===t.length?a.pop():e.content=t}}let n=await this.client.beta.messages.create({model:s,messages:[...a,{role:"user",content:[{type:"text",text:r}]}],max_tokens:t6(this,$,"f").params.max_tokens},{signal:t6(this,L,"f").signal,headers:s7([t6(this,L,"f").headers,{"x-stainless-helper":"compaction"}])});if(n.content[0]?.type!=="text")throw new se("Expected text response for compaction");return t6(this,$,"f").params.messages=[{role:"user",content:n.content}],!0},Symbol.asyncIterator)](){var e;if(t6(this,I,"f"))throw new se("Cannot iterate over a consumed stream");t3(this,I,!0,"f"),t3(this,M,!0,"f"),t3(this,B,void 0,"f");try{for(;;){let t;try{if(t6(this,$,"f").params.max_iterations&&t6(this,q,"f")>=t6(this,$,"f").params.max_iterations)break;t3(this,M,!1,"f"),t3(this,B,void 0,"f"),t3(this,q,(e=t6(this,q,"f"),++e),"f"),t3(this,U,void 0,"f");let{max_iterations:s,compactionControl:r,...a}=t6(this,$,"f").params;if(a.stream?(t=this.client.beta.messages.stream({...a},t6(this,L,"f")),t3(this,U,t.finalMessage(),"f"),t6(this,U,"f").catch(()=>{}),yield t):(t3(this,U,this.client.beta.messages.create({...a,stream:!1},t6(this,L,"f")),"f"),yield t6(this,U,"f")),!await t6(this,O,"m",W).call(this)){if(!t6(this,M,"f")){let{role:e,content:t}=await t6(this,U,"f");t6(this,$,"f").params.messages.push({role:e,content:t})}let e=await t6(this,O,"m",z).call(this,t6(this,$,"f").params.messages.at(-1));if(e)t6(this,$,"f").params.messages.push(e);else if(!t6(this,M,"f"))break}}finally{t&&t.abort()}}if(!t6(this,U,"f"))throw new se("ToolRunner concluded without a message from the server");t6(this,D,"f").resolve(await t6(this,U,"f"))}catch(e){throw t3(this,I,!1,"f"),t6(this,D,"f").promise.catch(()=>{}),t6(this,D,"f").reject(e),t3(this,D,rT(),"f"),e}}setMessagesParams(e){"function"==typeof e?t6(this,$,"f").params=e(t6(this,$,"f").params):t6(this,$,"f").params=e,t3(this,M,!0,"f"),t3(this,B,void 0,"f")}setRequestOptions(e){"function"==typeof e?t3(this,L,e(t6(this,L,"f")),"f"):t3(this,L,{...t6(this,L,"f"),...e},"f")}async generateToolResponse(e=t6(this,L,"f").signal){let t=await t6(this,U,"f")??this.params.messages.at(-1);return t?t6(this,O,"m",z).call(this,t,e):null}done(){return t6(this,D,"f").promise}async runUntilDone(){if(!t6(this,I,"f"))for await(let e of this);return this.done()}get params(){return t6(this,$,"f").params}pushMessages(...e){this.setMessagesParams(t=>({...t,messages:[...t.messages,...e]}))}then(e,t){return this.runUntilDone().then(e,t)}}async function rP(e,t=e.messages.at(-1),s){if(!t||"assistant"!==t.role||!t.content||"string"==typeof t.content)return null;let r=t.content.filter(e=>"tool_use"===e.type);return 0===r.length?null:{role:"user",content:await Promise.all(r.map(async t=>{let r=e.tools.find(e=>("name"in e?e.name:e.mcp_server_name)===t.name);if(!r||!("run"in r))return{type:"tool_result",tool_use_id:t.id,content:`Error: Tool '${t.name}' not found`,is_error:!0};try{let e=t.input;"parse"in r&&r.parse&&(e=r.parse(e));let a=await r.run(e,{toolUseBlock:t,signal:s?.signal});return{type:"tool_result",tool_use_id:t.id,content:a}}catch(e){return{type:"tool_result",tool_use_id:t.id,content:e instanceof rC?e.content:`Error: ${e instanceof Error?e.message:String(e)}`,is_error:!0}}}))}}z=async function(e,t=t6(this,L,"f").signal){return void 0!==t6(this,B,"f")||t3(this,B,rP(t6(this,$,"f").params,e,{...t6(this,L,"f"),signal:t}),"f"),t6(this,B,"f")};let rR={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026"},rO=["claude-mythos-preview","claude-opus-4-6"];class rI extends s6{constructor(){super(...arguments),this.batches=new rf(this._client)}create(e,t){let s=rM(e),{betas:r,...a}=s;a.model in rR&&console.warn(`The model '${a.model}' is deprecated and will reach end-of-life on ${rR[a.model]} -Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`),rO.includes(a.model)&&a.thinking&&"enabled"===a.thinking.type&&console.warn(`Using Claude with ${a.model} and 'thinking.type=enabled' is deprecated. Use 'thinking.type=adaptive' instead which results in better model performance in our testing: https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking`);let n=this._client._options.timeout;if(!a.stream&&null==n){let e=rx[a.model]??void 0;n=this._client.calculateNonstreamingTimeout(a.max_tokens,e)}let i=ri(a.tools,a.messages);return this._client.post("/v1/messages?beta=true",{body:a,timeout:n??6e5,...t,headers:s7([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},i,t?.headers]),stream:s.stream??!1})}parse(e,t){return t={...t,headers:s7([{"anthropic-beta":[...e.betas??[],"structured-outputs-2025-12-15"].toString()},t?.headers])},this.create(e,t).then(t=>rv(t,e,{logger:this._client.logger??console}))}stream(e,t){return rS.createMessage(this,e,t)}countTokens(e,t){let{betas:s,...r}=rM(e);return this._client.post("/v1/messages/count_tokens?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"token-counting-2024-11-01"].toString()},t?.headers])})}toolRunner(e,t){return new rA(this._client,e,t)}}function rM(e){if(!e.output_format)return e;if(e.output_config?.format)throw new se("Both output_format and output_config.format were provided. Please use only output_config.format (output_format is deprecated).");let{output_format:t,...s}=e;return{...s,output_config:{...e.output_config,format:t}}}rI.Batches=rf,rI.BetaToolRunner=rA,rI.ToolError=rC;class r$ extends s6{list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/sessions/${e}/events?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}send(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/sessions/${e}/events?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}stream(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/sessions/${e}/events/stream?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers]),stream:!0})}}class rL extends s6{retrieve(e,t,s){let{session_id:r,betas:a}=t;return this._client.get(rt`/v1/sessions/${r}/resources/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{session_id:r,betas:a,...n}=t;return this._client.post(rt`/v1/sessions/${r}/resources/${e}?beta=true`,{body:n,...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/sessions/${e}/resources?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}delete(e,t,s){let{session_id:r,betas:a}=t;return this._client.delete(rt`/v1/sessions/${r}/resources/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}add(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/sessions/${e}/resources?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}class rU extends s6{constructor(){super(...arguments),this.events=new r$(this._client),this.resources=new rL(this._client)}create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/sessions?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/sessions/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/sessions/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/sessions?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/sessions/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}archive(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/sessions/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}rU.Events=r$,rU.Resources=rL;class rB extends s6{create(e,t={},s){let{betas:r,...a}=t??{};return this._client.post(rt`/v1/skills/${e}/versions?beta=true`,sZ({body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},s?.headers])},this._client))}retrieve(e,t,s){let{skill_id:r,betas:a}=t;return this._client.get(rt`/v1/skills/${r}/versions/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"skills-2025-10-02"].toString()},s?.headers])})}list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/skills/${e}/versions?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},s?.headers])})}delete(e,t,s){let{skill_id:r,betas:a}=t;return this._client.delete(rt`/v1/skills/${r}/versions/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"skills-2025-10-02"].toString()},s?.headers])})}}class rD extends s6{constructor(){super(...arguments),this.versions=new rB(this._client)}create(e={},t){let{betas:s,...r}=e??{};return this._client.post("/v1/skills?beta=true",sZ({body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},t?.headers])},this._client,!1))}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/skills/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/skills?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/skills/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},s?.headers])})}}rD.Versions=rB;class rq extends s6{create(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/vaults/${e}/credentials?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}retrieve(e,t,s){let{vault_id:r,betas:a}=t;return this._client.get(rt`/v1/vaults/${r}/credentials/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{vault_id:r,betas:a,...n}=t;return this._client.post(rt`/v1/vaults/${r}/credentials/${e}?beta=true`,{body:n,...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e,t={},s){let{betas:r,...a}=t??{};return this._client.getAPIList(rt`/v1/vaults/${e}/credentials?beta=true`,sG,{query:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}delete(e,t,s){let{vault_id:r,betas:a}=t;return this._client.delete(rt`/v1/vaults/${r}/credentials/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}archive(e,t,s){let{vault_id:r,betas:a}=t;return this._client.post(rt`/v1/vaults/${r}/credentials/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...a??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}class rW extends s6{constructor(){super(...arguments),this.credentials=new rq(this._client)}create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/vaults?beta=true",{body:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/vaults/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}update(e,t,s){let{betas:r,...a}=t;return this._client.post(rt`/v1/vaults/${e}?beta=true`,{body:a,...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/vaults?beta=true",sG,{query:r,...t,headers:s7([{"anthropic-beta":[...s??[],"managed-agents-2026-04-01"].toString()},t?.headers])})}delete(e,t={},s){let{betas:r}=t??{};return this._client.delete(rt`/v1/vaults/${e}?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}archive(e,t={},s){let{betas:r}=t??{};return this._client.post(rt`/v1/vaults/${e}/archive?beta=true`,{...s,headers:s7([{"anthropic-beta":[...r??[],"managed-agents-2026-04-01"].toString()},s?.headers])})}}rW.Credentials=rq;class rz extends s6{constructor(){super(...arguments),this.models=new ro(this._client),this.messages=new rI(this._client),this.agents=new ru(this._client),this.environments=new rs(this._client),this.sessions=new rU(this._client),this.vaults=new rW(this._client),this.memoryStores=new rp(this._client),this.files=new rl(this._client),this.skills=new rD(this._client),this.userProfiles=new rc(this._client)}}function rF(e){return e?.output_config?.format}function rH(e,t,s){let r=rF(t);return t&&"parse"in(r??{})?rJ(e,t,s):{...e,content:e.content.map(e=>"text"===e.type?Object.defineProperty({...e},"parsed_output",{value:null,enumerable:!1}):e),parsed_output:null}}function rJ(e,t,s){let r=null,a=e.content.map(e=>{if("text"===e.type){let s=function(e,t){let s=rF(e);if(s?.type!=="json_schema")return null;try{if("parse"in s)return s.parse(t);return JSON.parse(t)}catch(e){throw new se(`Failed to parse structured output: ${e}`)}}(t,e.text);return null===r&&(r=s),Object.defineProperty({...e},"parsed_output",{value:s,enumerable:!1})}return e});return{...e,content:a,parsed_output:r}}rz.Models=ro,rz.Messages=rI,rz.Agents=ru,rz.Environments=rs,rz.Sessions=rU,rz.Vaults=rW,rz.MemoryStores=rp,rz.Files=rl,rz.Skills=rD,rz.UserProfiles=rc;let rV="__json_buf";function rG(e){return"tool_use"===e.type||"server_tool_use"===e.type}class rK{constructor(e,t){F.add(this),this.messages=[],this.receivedMessages=[],H.set(this,void 0),J.set(this,null),this.controller=new AbortController,V.set(this,void 0),G.set(this,()=>{}),K.set(this,()=>{}),X.set(this,void 0),Y.set(this,()=>{}),Q.set(this,()=>{}),Z.set(this,{}),ee.set(this,!1),et.set(this,!1),es.set(this,!1),er.set(this,!1),ea.set(this,void 0),en.set(this,void 0),ei.set(this,void 0),ec.set(this,e=>{if(t3(this,et,!0,"f"),t7(e)&&(e=new ss),e instanceof ss)return t3(this,es,!0,"f"),this._emit("abort",e);if(e instanceof se)return this._emit("error",e);if(e instanceof Error){let t=new se(e.message);return t.cause=e,this._emit("error",t)}return this._emit("error",new se(String(e)))}),t3(this,V,new Promise((e,t)=>{t3(this,G,e,"f"),t3(this,K,t,"f")}),"f"),t3(this,X,new Promise((e,t)=>{t3(this,Y,e,"f"),t3(this,Q,t,"f")}),"f"),t6(this,V,"f").catch(()=>{}),t6(this,X,"f").catch(()=>{}),t3(this,J,e,"f"),t3(this,ei,t?.logger??console,"f")}get response(){return t6(this,ea,"f")}get request_id(){return t6(this,en,"f")}async withResponse(){t3(this,er,!0,"f");let e=await t6(this,V,"f");if(!e)throw Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let t=new rK(null);return t._run(()=>t._fromReadableStream(e)),t}static createMessage(e,t,s,{logger:r}={}){let a=new rK(t,{logger:r});for(let e of t.messages)a._addMessageParam(e);return t3(a,J,{...t,stream:!0},"f"),a._run(()=>a._createMessage(e,{...t,stream:!0},{...s,headers:{...s?.headers,"X-Stainless-Helper-Method":"stream"}})),a}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},t6(this,ec,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,t=!0){this.receivedMessages.push(e),t&&this._emit("message",e)}async _createMessage(e,t,s){let r,a=s?.signal;a&&(a.aborted&&this.controller.abort(),r=this.controller.abort.bind(this.controller),a.addEventListener("abort",r));try{t6(this,F,"m",ed).call(this);let{response:r,data:a}=await e.create({...t,stream:!0},{...s,signal:this.controller.signal}).withResponse();for await(let e of(this._connected(r),a))t6(this,F,"m",eu).call(this,e);if(a.controller.signal?.aborted)throw new ss;t6(this,F,"m",em).call(this)}finally{a&&r&&a.removeEventListener("abort",r)}}_connected(e){this.ended||(t3(this,ea,e,"f"),t3(this,en,e?.headers.get("request-id"),"f"),t6(this,G,"f").call(this,e),this._emit("connect"))}get ended(){return t6(this,ee,"f")}get errored(){return t6(this,et,"f")}get aborted(){return t6(this,es,"f")}abort(){this.controller.abort()}on(e,t){return(t6(this,Z,"f")[e]||(t6(this,Z,"f")[e]=[])).push({listener:t}),this}off(e,t){let s=t6(this,Z,"f")[e];if(!s)return this;let r=s.findIndex(e=>e.listener===t);return r>=0&&s.splice(r,1),this}once(e,t){return(t6(this,Z,"f")[e]||(t6(this,Z,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,s)=>{t3(this,er,!0,"f"),"error"!==e&&this.once("error",s),this.once(e,t)})}async done(){t3(this,er,!0,"f"),await t6(this,X,"f")}get currentMessage(){return t6(this,H,"f")}async finalMessage(){return await this.done(),t6(this,F,"m",el).call(this)}async finalText(){return await this.done(),t6(this,F,"m",eo).call(this)}_emit(e,...t){if(t6(this,ee,"f"))return;"end"===e&&(t3(this,ee,!0,"f"),t6(this,Y,"f").call(this));let s=t6(this,Z,"f")[e];if(s&&(t6(this,Z,"f")[e]=s.filter(e=>!e.once),s.forEach(({listener:e})=>e(...t))),"abort"===e){let e=t[0];t6(this,er,"f")||s?.length||Promise.reject(e),t6(this,K,"f").call(this,e),t6(this,Q,"f").call(this,e),this._emit("end");return}if("error"===e){let e=t[0];t6(this,er,"f")||s?.length||Promise.reject(e),t6(this,K,"f").call(this,e),t6(this,Q,"f").call(this,e),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",t6(this,F,"m",el).call(this))}async _fromReadableStream(e,t){let s,r=t?.signal;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{t6(this,F,"m",ed).call(this),this._connected(null);let t=sU.fromReadableStream(e,this.controller);for await(let e of t)t6(this,F,"m",eu).call(this,e);if(t.controller.signal?.aborted)throw new ss;t6(this,F,"m",em).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[(H=new WeakMap,J=new WeakMap,V=new WeakMap,G=new WeakMap,K=new WeakMap,X=new WeakMap,Y=new WeakMap,Q=new WeakMap,Z=new WeakMap,ee=new WeakMap,et=new WeakMap,es=new WeakMap,er=new WeakMap,ea=new WeakMap,en=new WeakMap,ei=new WeakMap,ec=new WeakMap,F=new WeakSet,el=function(){if(0===this.receivedMessages.length)throw new se("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},eo=function(){if(0===this.receivedMessages.length)throw new se("stream ended without producing a Message with role=assistant");let e=this.receivedMessages.at(-1).content.filter(e=>"text"===e.type).map(e=>e.text);if(0===e.length)throw new se("stream ended without producing a content block with type=text");return e.join(" ")},ed=function(){this.ended||t3(this,H,void 0,"f")},eu=function(e){if(this.ended)return;let t=t6(this,F,"m",eh).call(this,e);switch(this._emit("streamEvent",e,t),e.type){case"content_block_delta":{let s=t.content.at(-1);switch(e.delta.type){case"text_delta":"text"===s.type&&this._emit("text",e.delta.text,s.text||"");break;case"citations_delta":"text"===s.type&&this._emit("citation",e.delta.citation,s.citations??[]);break;case"input_json_delta":rG(s)&&s.input&&this._emit("inputJson",e.delta.partial_json,s.input);break;case"thinking_delta":"thinking"===s.type&&this._emit("thinking",e.delta.thinking,s.thinking);break;case"signature_delta":"thinking"===s.type&&this._emit("signature",s.signature);break;default:rX(e.delta)}break}case"message_stop":this._addMessageParam(t),this._addMessage(rH(t,t6(this,J,"f"),{logger:t6(this,ei,"f")}),!0);break;case"content_block_stop":this._emit("contentBlock",t.content.at(-1));break;case"message_start":t3(this,H,t,"f")}},em=function(){if(this.ended)throw new se("stream has ended, this shouldn't happen");let e=t6(this,H,"f");if(!e)throw new se("request ended without sending any chunks");return t3(this,H,void 0,"f"),rH(e,t6(this,J,"f"),{logger:t6(this,ei,"f")})},eh=function(e){let t=t6(this,H,"f");if("message_start"===e.type){if(t)throw new se(`Unexpected event order, got ${e.type} before receiving "message_stop"`);return e.message}if(!t)throw new se(`Unexpected event order, got ${e.type} before "message_start"`);switch(e.type){case"message_stop":case"content_block_stop":return t;case"message_delta":return t.stop_reason=e.delta.stop_reason,t.stop_sequence=e.delta.stop_sequence,t.usage.output_tokens=e.usage.output_tokens,null!=e.usage.input_tokens&&(t.usage.input_tokens=e.usage.input_tokens),null!=e.usage.cache_creation_input_tokens&&(t.usage.cache_creation_input_tokens=e.usage.cache_creation_input_tokens),null!=e.usage.cache_read_input_tokens&&(t.usage.cache_read_input_tokens=e.usage.cache_read_input_tokens),null!=e.usage.server_tool_use&&(t.usage.server_tool_use=e.usage.server_tool_use),t;case"content_block_start":return t.content.push({...e.content_block}),t;case"content_block_delta":{let s=t.content.at(e.index);switch(e.delta.type){case"text_delta":s?.type==="text"&&(t.content[e.index]={...s,text:(s.text||"")+e.delta.text});break;case"citations_delta":s?.type==="text"&&(t.content[e.index]={...s,citations:[...s.citations??[],e.delta.citation]});break;case"input_json_delta":if(s&&rG(s)){let r=s[rV]||"";r+=e.delta.partial_json;let a={...s};Object.defineProperty(a,rV,{value:r,enumerable:!1,writable:!0}),r&&(a.input=rj(r)),t.content[e.index]=a}break;case"thinking_delta":s?.type==="thinking"&&(t.content[e.index]={...s,thinking:s.thinking+e.delta.thinking});break;case"signature_delta":s?.type==="thinking"&&(t.content[e.index]={...s,signature:e.delta.signature});break;default:rX(e.delta)}return t}}},Symbol.asyncIterator)](){let e=[],t=[],s=!1;return this.on("streamEvent",s=>{let r=t.shift();r?r.resolve(s):e.push(s)}),this.on("end",()=>{for(let e of(s=!0,t))e.resolve(void 0);t.length=0}),this.on("abort",e=>{for(let r of(s=!0,t))r.reject(e);t.length=0}),this.on("error",e=>{for(let r of(s=!0,t))r.reject(e);t.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:s?{value:void 0,done:!0}:new Promise((e,s)=>t.push({resolve:e,reject:s})).then(e=>e?{value:e,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new sU(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}function rX(e){}class rY extends s6{create(e,t){return this._client.post("/v1/messages/batches",{body:e,...t})}retrieve(e,t){return this._client.get(rt`/v1/messages/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/v1/messages/batches",sV,{query:e,...t})}delete(e,t){return this._client.delete(rt`/v1/messages/batches/${e}`,t)}cancel(e,t){return this._client.post(rt`/v1/messages/batches/${e}/cancel`,t)}async results(e,t){let s=await this.retrieve(e);if(!s.results_url)throw new se(`No batch \`results_url\`; Has it finished processing? ${s.processing_status} - ${s.id}`);return this._client.get(s.results_url,{...t,headers:s7([{Accept:"application/binary"},t?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((e,t)=>rg.fromResponse(t.response,t.controller))}}class rQ extends s6{constructor(){super(...arguments),this.batches=new rY(this._client)}create(e,t){e.model in rZ&&console.warn(`The model '${e.model}' is deprecated and will reach end-of-life on ${rZ[e.model]} -Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`),r0.includes(e.model)&&e.thinking&&"enabled"===e.thinking.type&&console.warn(`Using Claude with ${e.model} and 'thinking.type=enabled' is deprecated. Use 'thinking.type=adaptive' instead which results in better model performance in our testing: https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking`);let s=this._client._options.timeout;if(!e.stream&&null==s){let t=rx[e.model]??void 0;s=this._client.calculateNonstreamingTimeout(e.max_tokens,t)}let r=ri(e.tools,e.messages);return this._client.post("/v1/messages",{body:e,timeout:s??6e5,...t,headers:s7([r,t?.headers]),stream:e.stream??!1})}parse(e,t){return this.create(e,t).then(t=>rJ(t,e,{logger:this._client.logger??console}))}stream(e,t){return rK.createMessage(this,e,t,{logger:this._client.logger??console})}countTokens(e,t){return this._client.post("/v1/messages/count_tokens",{body:e,...t})}}let rZ={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026","claude-3-5-haiku-latest":"February 19th, 2026","claude-3-5-haiku-20241022":"February 19th, 2026","claude-opus-4-0":"June 15th, 2026","claude-opus-4-20250514":"June 15th, 2026","claude-sonnet-4-0":"June 15th, 2026","claude-sonnet-4-20250514":"June 15th, 2026"},r0=["claude-mythos-preview","claude-opus-4-6"];rQ.Batches=rY;class r1 extends s6{retrieve(e,t={},s){let{betas:r}=t??{};return this._client.get(rt`/v1/models/${e}`,{...s,headers:s7([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},s?.headers])})}list(e={},t){let{betas:s,...r}=e??{};return this._client.getAPIList("/v1/models",sV,{query:r,...t,headers:s7([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},t?.headers])})}}class r2 extends s6{create(e,t){let{betas:s,...r}=e;return this._client.post("/v1/complete",{body:r,timeout:this._client._options.timeout??6e5,...t,headers:s7([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},t?.headers]),stream:e.stream??!1})}}let r5=e=>void 0!==globalThis.process?globalThis.process.env?.[e]?.trim()||void 0:void 0!==globalThis.Deno&&globalThis.Deno.env?.get?.(e)?.trim()||void 0;class r4{constructor({baseURL:e=r5("ANTHROPIC_BASE_URL"),apiKey:t=r5("ANTHROPIC_API_KEY")??null,authToken:s=r5("ANTHROPIC_AUTH_TOKEN")??null,...r}={}){ep.add(this),ef.set(this,void 0);const a={apiKey:t,authToken:s,...r,baseURL:e||"https://api.anthropic.com"};if(!a.dangerouslyAllowBrowser&&"u">typeof window&&void 0!==window.document&&"u">typeof navigator)throw new se("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\nIf you understand the risks and have appropriate mitigations in place,\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\n\nnew Anthropic({ apiKey, dangerouslyAllowBrowser: true });\n");this.baseURL=a.baseURL,this.timeout=a.timeout??eg.DEFAULT_TIMEOUT,this.logger=a.logger??console;const n="warn";this.logLevel=n,this.logLevel=sP(a.logLevel,"ClientOptions.logLevel",this)??sP(r5("ANTHROPIC_LOG"),"process.env['ANTHROPIC_LOG']",this)??n,this.fetchOptions=a.fetchOptions,this.maxRetries=a.maxRetries??2,this.fetch=a.fetch??function(){if("u">typeof fetch)return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}(),t3(this,ef,sk,"f");const i=r5("ANTHROPIC_CUSTOM_HEADERS");if(i){const e={};for(const t of i.split("\n")){const s=t.indexOf(":");s>=0&&(e[t.substring(0,s).trim()]=t.substring(s+1).trim())}a.defaultHeaders={...e,...a.defaultHeaders}}this._options=a,this.apiKey="string"==typeof t?t:null,this.authToken=s}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,authToken:this.authToken,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){if(!(e.get("x-api-key")||e.get("authorization")||this.apiKey&&e.get("x-api-key")||t.has("x-api-key")||this.authToken&&e.get("authorization"))&&!t.has("authorization"))throw Error('Could not resolve authentication method. Expected either apiKey or authToken to be set. Or for one of the "X-Api-Key" or "Authorization" headers to be explicitly omitted')}async authHeaders(e){return s7([await this.apiKeyAuth(e),await this.bearerAuth(e)])}async apiKeyAuth(e){if(null!=this.apiKey)return s7([{"X-Api-Key":this.apiKey}])}async bearerAuth(e){if(null!=this.authToken)return s7([{Authorization:`Bearer ${this.authToken}`}])}stringifyQuery(e){return Object.entries(e).filter(([e,t])=>void 0!==t).map(([e,t])=>{if("string"==typeof t||"number"==typeof t||"boolean"==typeof t)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(null===t)return`${encodeURIComponent(e)}=`;throw new se(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}getUserAgent(){return`${this.constructor.name}/JS ${sb}`}defaultIdempotencyKey(){return`stainless-node-retry-${t8()}`}makeStatusError(e,t,s,r){return st.generate(e,t,s,r)}buildURL(e,t,s){let r=!t6(this,ep,"m",ex).call(this)&&s||this.baseURL,a=new URL(sh.test(e)?e:r+(r.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),n=this.defaultQuery(),i=Object.fromEntries(a.searchParams);return sx(n)&&sx(i)||(t={...i,...n,...t}),"object"==typeof t&&t&&!Array.isArray(t)&&(a.search=this.stringifyQuery(t)),a.toString()}_calculateNonstreamingTimeout(e){if(3600*e/128e3>600)throw new se("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#streaming-responses for more details");return 6e5}async prepareOptions(e){}async prepareRequest(e,{url:t,options:s}){}get(e,t){return this.methodRequest("get",e,t)}post(e,t){return this.methodRequest("post",e,t)}patch(e,t){return this.methodRequest("patch",e,t)}put(e,t){return this.methodRequest("put",e,t)}delete(e,t){return this.methodRequest("delete",e,t)}methodRequest(e,t,s){return this.request(Promise.resolve(s).then(s=>({method:e,path:t,...s})))}request(e,t=null){return new sF(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,s){let r=await e,a=r.maxRetries??this.maxRetries;null==t&&(t=a),await this.prepareOptions(r);let{req:n,url:i,timeout:l}=await this.buildRequest(r,{retryCount:a-t});await this.prepareRequest(n,{url:i,options:r});let o="log_"+(0x1000000*Math.random()|0).toString(16).padStart(6,"0"),c=void 0===s?"":`, retryOf: ${s}`,d=Date.now();if(s$(this).debug(`[${o}] sending request`,sL({retryOfRequestLogID:s,method:r.method,url:i,options:r,headers:n.headers})),r.signal?.aborted)throw new ss;let u=new AbortController,m=await this.fetchWithTimeout(i,n,l,u).catch(t9),h=Date.now();if(m instanceof globalThis.Error){let e=`retrying, ${t} attempts remaining`;if(r.signal?.aborted)throw new ss;let a=t7(m)||/timed? ?out/i.test(String(m)+("cause"in m?String(m.cause):""));if(t)return s$(this).info(`[${o}] connection ${a?"timed out":"failed"} - ${e}`),s$(this).debug(`[${o}] connection ${a?"timed out":"failed"} (${e})`,sL({retryOfRequestLogID:s,url:i,durationMs:h-d,message:m.message})),this.retryRequest(r,t,s??o);if(s$(this).info(`[${o}] connection ${a?"timed out":"failed"} - error; no more retries left`),s$(this).debug(`[${o}] connection ${a?"timed out":"failed"} (error; no more retries left)`,sL({retryOfRequestLogID:s,url:i,durationMs:h-d,message:m.message})),a)throw new sa;throw new sr({cause:m})}let p=[...m.headers.entries()].filter(([e])=>"request-id"===e).map(([e,t])=>", "+e+": "+JSON.stringify(t)).join(""),g=`[${o}${c}${p}] ${n.method} ${i} ${m.ok?"succeeded":"failed"} with status ${m.status} in ${h-d}ms`;if(!m.ok){let e=await this.shouldRetry(m);if(t&&e){let e=`retrying, ${t} attempts remaining`;return await sS(m.body),s$(this).info(`${g} - ${e}`),s$(this).debug(`[${o}] response error (${e})`,sL({retryOfRequestLogID:s,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),this.retryRequest(r,t,s??o,m.headers)}let a=e?"error; no more retries left":"error; not retryable";s$(this).info(`${g} - ${a}`);let n=await m.text().catch(e=>t9(e).message),i=sy(n),l=i?void 0:n;throw s$(this).debug(`[${o}] response error (${a})`,sL({retryOfRequestLogID:s,url:m.url,status:m.status,headers:m.headers,message:l,durationMs:Date.now()-d})),this.makeStatusError(m.status,i,l,m.headers)}return s$(this).info(g),s$(this).debug(`[${o}] response start`,sL({retryOfRequestLogID:s,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),{response:m,options:r,controller:u,requestLogID:o,retryOfRequestLogID:s,startTime:d}}getAPIList(e,t,s){return this.requestAPIList(t,s&&"then"in s?s.then(t=>({method:"get",path:e,...t})):{method:"get",path:e,...s})}requestAPIList(e,t){return new sJ(this,this.makeRequest(t,null,void 0),e)}async fetchWithTimeout(e,t,s,r){let{signal:a,method:n,...i}=t||{},l=this._makeAbort(r);a&&a.addEventListener("abort",l,{once:!0});let o=setTimeout(l,s),c=globalThis.ReadableStream&&i.body instanceof globalThis.ReadableStream||"object"==typeof i.body&&null!==i.body&&Symbol.asyncIterator in i.body,d={signal:r.signal,...c?{duplex:"half"}:{},method:"GET",...i};n&&(d.method=n.toUpperCase());try{return await this.fetch.call(void 0,e,d)}finally{clearTimeout(o)}}async shouldRetry(e){let t=e.headers.get("x-should-retry");return"true"===t||"false"!==t&&(408===e.status||409===e.status||429===e.status||!!(e.status>=500))}async retryRequest(e,t,s,r){let a,n,i=r?.get("retry-after-ms");if(i){let e=parseFloat(i);Number.isNaN(e)||(a=e)}let l=r?.get("retry-after");if(l&&!a){let e=parseFloat(l);a=Number.isNaN(e)?Date.parse(l)-Date.now():1e3*e}if(void 0===a){let s=e.maxRetries??this.maxRetries;a=this.calculateDefaultRetryTimeoutMillis(t,s)}return await (n=a,new Promise(e=>setTimeout(e,n))),this.makeRequest(e,t-1,s)}calculateDefaultRetryTimeoutMillis(e,t){return Math.min(.5*Math.pow(2,t-e),8)*(1-.25*Math.random())*1e3}calculateNonstreamingTimeout(e,t){if(36e5*e/128e3>6e5||null!=t&&e>t)throw new se("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#long-requests for more details");return 6e5}async buildRequest(e,{retryCount:t=0}={}){let s={...e},{method:r,path:a,query:n,defaultBaseURL:i}=s,l=this.buildURL(a,n,i);"timeout"in s&&((e,t)=>{if("number"!=typeof t||!Number.isInteger(t))throw new se(`${e} must be an integer`);if(t<0)throw new se(`${e} must be a positive integer`)})("timeout",s.timeout),s.timeout=s.timeout??this.timeout;let{bodyHeaders:o,body:c}=this.buildBody({options:s}),d=await this.buildHeaders({options:e,method:r,bodyHeaders:o,retryCount:t});return{req:{method:r,headers:d,...s.signal&&{signal:s.signal},...globalThis.ReadableStream&&c instanceof globalThis.ReadableStream&&{duplex:"half"},...c&&{body:c},...this.fetchOptions??{},...s.fetchOptions??{}},url:l,timeout:s.timeout}}async buildHeaders({options:e,method:s,bodyHeaders:r,retryCount:a}){let n={};this.idempotencyHeader&&"get"!==s&&(e.idempotencyKey||(e.idempotencyKey=this.defaultIdempotencyKey()),n[this.idempotencyHeader]=e.idempotencyKey);let i=s7([n,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(a),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...t??(t=(()=>{let e="u">typeof Deno&&null!=Deno.build?"deno":"u">typeof EdgeRuntime?"edge":"[object process]"===Object.prototype.toString.call(void 0!==globalThis.process?globalThis.process:0)?"node":"unknown";if("deno"===e)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":sb,"X-Stainless-OS":sw(Deno.build.os),"X-Stainless-Arch":sv(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":"string"==typeof Deno.version?Deno.version:Deno.version?.deno??"unknown"};if("u">typeof EdgeRuntime)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":sb,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if("node"===e)return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":sb,"X-Stainless-OS":sw(globalThis.process.platform??"unknown"),"X-Stainless-Arch":sv(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let t=function(){if("u"e.abort()}buildBody({options:{body:e,headers:t}}){if(!e)return{bodyHeaders:void 0,body:void 0};let s=s7([t]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||"string"==typeof e&&s.values.has("content-type")||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:"object"==typeof e&&(Symbol.asyncIterator in e||Symbol.iterator in e&&"next"in e&&"function"==typeof e.next)?{bodyHeaders:void 0,body:s_(e)}:"object"==typeof e&&"application/x-www-form-urlencoded"===s.values.get("content-type")?{bodyHeaders:{"content-type":"application/x-www-form-urlencoded"},body:this.stringifyQuery(e)}:t6(this,ef,"f").call(this,{body:e,headers:s})}}eg=r4,ef=new WeakMap,ep=new WeakSet,ex=function(){return"https://api.anthropic.com"!==this.baseURL},r4.Anthropic=eg,r4.HUMAN_PROMPT="\\n\\nHuman:",r4.AI_PROMPT="\\n\\nAssistant:",r4.DEFAULT_TIMEOUT=6e5,r4.AnthropicError=se,r4.APIError=st,r4.APIConnectionError=sr,r4.APIConnectionTimeoutError=sa,r4.APIUserAbortError=ss,r4.NotFoundError=so,r4.ConflictError=sc,r4.RateLimitError=su,r4.BadRequestError=sn,r4.AuthenticationError=si,r4.InternalServerError=sm,r4.PermissionDeniedError=sl,r4.UnprocessableEntityError=sd,r4.toFile=s4;class r3 extends r4{constructor(){super(...arguments),this.completions=new r2(this),this.messages=new rQ(this),this.models=new r1(this),this.beta=new rz(this)}}r3.Completions=r2,r3.Messages=rQ,r3.Models=r1,r3.Beta=rz;let r6="toolset:";async function r8(e,t,s,r,a=[],n,i,l,o,c,d,u,m,h,p,g,f,x){if(!r)throw Error("Virtual Key is required");console.log=function(){};let y=p||(0,eM.getProxyBaseUrl)(),b={};a&&a.length>0&&(b["x-litellm-tags"]=a.join(","));let v=new r3({apiKey:r,baseURL:y,dangerouslyAllowBrowser:!0,defaultHeaders:b});try{let r=Date.now(),a=!1,p={model:s,messages:e.map(e=>({role:e.role,content:e.content})),stream:!0,max_tokens:1024,litellm_trace_id:c},y=function({selectedMCPServers:e,mcpServers:t,mcpToolsets:s,mcpServerToolRestrictions:r}){return e&&0!==e.length?e.includes("__all__")?[{type:"mcp",server_label:"litellm",server_url:"litellm_proxy/mcp",require_approval:"never"}]:e.map(e=>{if(e.startsWith(r6)){let t=e.slice(r6.length),r=s?.find(e=>e.toolset_id===t),a=r?.toolset_name||t;return{type:"mcp",server_label:a,server_url:`litellm_proxy/mcp/${a}`,require_approval:"never"}}let a=t?.find(t=>t.server_id===e),n=a?.server_name||e,i=r?.[e]||[];return{type:"mcp",server_label:n,server_url:`litellm_proxy/mcp/${n}`,require_approval:"never",...i.length>0?{allowed_tools:i}:{}}}):[]}({selectedMCPServers:h,mcpServers:g,mcpToolsets:x,mcpServerToolRestrictions:f});for await(let e of(y.length>0&&(p.tools=y),d&&(p.vector_store_ids=d),u&&(p.guardrails=u),m&&(p.policies=m),v.messages.stream(p,{signal:n}))){if("content_block_delta"===e.type){let n=e.delta;if(!a){a=!0;let e=Date.now()-r;l&&l(e)}"text_delta"===n.type?t("assistant",n.text,s):"reasoning_delta"===n.type&&i&&i(n.text)}if("message_delta"===e.type&&e.usage&&o){let t=e.usage,s={completionTokens:t.output_tokens,promptTokens:t.input_tokens,totalTokens:t.input_tokens+t.output_tokens};o(s)}}}catch(e){throw n?.aborted||eI.default.fromBackend(`Error occurred while generating model response. Please try again. Error: ${e}`),e}}async function r7(e,t,s,r,a,n,i,l,o,c){console.log=function(){};let d=c||(0,eM.getProxyBaseUrl)(),u=new eq.default.OpenAI({apiKey:a,baseURL:d,dangerouslyAllowBrowser:!0,defaultHeaders:n&&n.length>0?{"x-litellm-tags":n.join(",")}:void 0});try{let a=await u.audio.speech.create({model:r,input:e,voice:t,...l?{response_format:l}:{},...o?{speed:o}:{}},{signal:i}),n=await a.blob(),c=URL.createObjectURL(n);s(c,r)}catch(e){throw i?.aborted||eI.default.fromBackend(`Error occurred while generating speech. Please try again. Error: ${e}`),e}}async function r9(e,t,s,r,a,n,i,l,o,c,d){console.log=function(){};let u=d||(0,eM.getProxyBaseUrl)(),m=new eq.default.OpenAI({apiKey:r,baseURL:u,dangerouslyAllowBrowser:!0,defaultHeaders:a&&a.length>0?{"x-litellm-tags":a.join(",")}:void 0});try{let r=await m.audio.transcriptions.create({model:s,file:e,...i?{language:i}:{},...l?{prompt:l}:{},...o?{response_format:o}:{},...void 0!==c?{temperature:c}:{}},{signal:n});if(r&&r.text)t(r.text,s),eI.default.success("Audio transcribed successfully");else throw Error("No transcription text in response")}catch(e){if(console.error("Error making audio transcription request:",e),n?.aborted);else{let t="Failed to transcribe audio";e?.error?.message?t=e.error.message:e?.message&&(t=e.message),eI.default.fromBackend(`Audio transcription failed: ${t}`)}throw e}}async function ae(e,t,s,r,a,n){if(!r)throw Error("Virtual Key is required");console.log=function(){};let i=n||(0,eM.getProxyBaseUrl)(),l={};a&&a.length>0&&(l["x-litellm-tags"]=a.join(","));try{let a=i.endsWith("/")?i.slice(0,-1):i,n=`${a}/embeddings`,o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`,...l},body:JSON.stringify({model:s,input:e})});if(!o.ok){let e=await o.text();throw Error(e||`Request failed with status ${o.status}`)}let c=await o.json(),d=c?.data?.[0]?.embedding;if(!d)throw Error("No embedding returned from server");t(JSON.stringify(d),c?.model??s)}catch(e){throw eI.default.fromBackend(`Error occurred while making embeddings request. Please try again. Error: ${e}`),e}}async function at(e,t,s,r,a,n,i,l){console.log=function(){};let o=l||(0,eM.getProxyBaseUrl)(),c=new eq.default.OpenAI({apiKey:a,baseURL:o,dangerouslyAllowBrowser:!0,defaultHeaders:n&&n.length>0?{"x-litellm-tags":n.join(",")}:void 0});try{let a=Array.isArray(e)?e:[e],n=[];for(let e=0;e1&&eI.default.success(`Successfully processed ${n.length} images`)}catch(e){if(console.error("Error making image edit request:",e),i?.aborted);else{let t="Failed to edit image(s)";e?.error?.message?t=e.error.message:e?.message&&(t=e.message),eI.default.fromBackend(`Image edit failed: ${t}`)}throw e}}async function as(e,t,s,r,a,n,i){console.log=function(){};let l=i||(0,eM.getProxyBaseUrl)(),o=new eq.default.OpenAI({apiKey:r,baseURL:l,dangerouslyAllowBrowser:!0,defaultHeaders:a&&a.length>0?{"x-litellm-tags":a.join(",")}:void 0});try{let r=await o.images.generate({model:s,prompt:e},{signal:n});if(r.data&&r.data[0])if(r.data[0].url)t(r.data[0].url,s);else if(r.data[0].b64_json){let e=r.data[0].b64_json;t(`data:image/png;base64,${e}`,s)}else throw Error("No image data found in response");else throw Error("Invalid response format")}catch(e){throw n?.aborted||eI.default.fromBackend(`Error occurred while generating image. Please try again. Error: ${e}`),e}}var ar=e.i(459161);async function aa(e,t,s,r,a,n,i,l){if(!r)throw Error("Virtual Key is required");console.log=function(){};let o=i||(0,eM.getProxyBaseUrl)(),c=o.endsWith("/")?o.slice(0,-1):o,d=`${c}/v1beta/interactions`,u={"Content-Type":"application/json",[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`};a&&a.length>0&&(u["x-litellm-tags"]=a.join(","));let m={model:s,input:e,stream:!0};l&&(m.previous_interaction_id=l);try{let e,r=await fetch(d,{method:"POST",headers:u,body:JSON.stringify(m),signal:n});if(!r.ok){let e=await r.text();throw Error(e||`Request failed with status ${r.status}`)}if(!r.body)throw Error("No response body received");let a=r.body.getReader(),i=new TextDecoder,l="";for(;;){let{done:r,value:n}=await a.read();if(r)break;let o=(l+=i.decode(n,{stream:!0})).split("\n");for(let r of(l=o.pop()??"",o)){let a,n=r.trim();if(!n.startsWith("data:"))continue;let i=n.slice(5).trim();if(!i||"[DONE]"===i)continue;try{a=JSON.parse(i)}catch{continue}let l=a.event_type;if("interaction.start"===l||"interaction.complete"===l){let t=a.interaction;"string"==typeof t?.model&&t.model?e=t.model:"string"==typeof a.model&&a.model&&(e=a.model)}else if("content.delta"===l||"content.start"===l){let r=a.delta;"string"==typeof r?.text&&r.text&&t(r.text,e??s)}}}}catch(e){if(n?.aborted)throw e;throw eI.default.fromBackend(`Error occurred while making Interactions API request. Error: ${e}`),e}}var an=e.i(536916),ai=e.i(850627);let al=({temperature:e=1,maxTokens:t=2048,useAdvancedParams:s,onTemperatureChange:r,onMaxTokensChange:a,onUseAdvancedParamsChange:n,mockTestFallbacks:i,onMockTestFallbacksChange:l})=>{let[o,c]=(0,eb.useState)(!1),d=void 0!==s?s:o,[u,m]=(0,eb.useState)(e),[h,p]=(0,eb.useState)(t);(0,eb.useEffect)(()=>{m(e)},[e]),(0,eb.useEffect)(()=>{p(t)},[t]);let g=e=>{let t=e??1;m(t),r?.(t)},f=e=>{let t=e??1e3;p(t),a?.(t)},x=d?"text-gray-700":"text-gray-400";return(0,ey.jsxs)("div",{className:"space-y-4 p-4 w-80",children:[(0,ey.jsx)(an.Checkbox,{checked:d,onChange:e=>{var t;return t=e.target.checked,void(n?n(t):c(t))},children:(0,ey.jsx)("span",{className:"font-medium",children:"Use Advanced Parameters"})}),l&&(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsx)(an.Checkbox,{checked:i??!1,onChange:e=>l(e.target.checked),children:(0,ey.jsx)("span",{className:"font-medium",children:"Simulate failure to test fallbacks"})}),(0,ey.jsx)(tL.Popover,{trigger:"hover",placement:"right",content:(0,ey.jsxs)("div",{style:{maxWidth:340},children:[(0,ey.jsx)(tB.Typography.Paragraph,{className:"text-sm",style:{marginBottom:8},children:"Causes the first request to fail so the router tries fallbacks (if configured). Use this to verify your fallback setup."}),(0,ey.jsxs)(tB.Typography.Paragraph,{className:"text-sm",style:{marginBottom:0},children:["Behavior can differ when keys, teams, or router settings are configured."," ",(0,ey.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/keys_teams_router_settings",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800",children:"Learn more"})]})]}),children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:"text-xs text-gray-400 cursor-pointer shrink-0 hover:text-gray-600","aria-label":"Help: Simulate failure to test fallbacks"})})]}),(0,ey.jsxs)("div",{className:"space-y-4 transition-opacity duration-200",style:{opacity:d?1:.4},children:[(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsx)(tO.Text,{className:`text-sm ${x}`,children:"Temperature"}),(0,ey.jsx)(tU.Tooltip,{title:"Controls randomness. Lower values make output more deterministic, higher values more creative.",children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:`text-xs ${x} cursor-help`})})]}),(0,ey.jsx)(tG.InputNumber,{min:0,max:2,step:.1,value:u,onChange:g,disabled:!d,precision:1,className:"w-20"})]}),(0,ey.jsx)(ai.Slider,{min:0,max:2,step:.1,value:u,onChange:g,disabled:!d,marks:{0:"0",1:"1.0",2:"2.0"}})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsx)(tO.Text,{className:`text-sm ${x}`,children:"Max Tokens"}),(0,ey.jsx)(tU.Tooltip,{title:"Maximum number of tokens to generate in the response.",children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:`text-xs ${x} cursor-help`})})]}),(0,ey.jsx)(tG.InputNumber,{min:1,max:32768,step:1,value:h,onChange:f,disabled:!d})]}),(0,ey.jsx)(ai.Slider,{min:1,max:32768,step:1,value:h,onChange:f,disabled:!d,marks:{1:"1",32768:"32768"}})]})]})]})};var ao=e.i(865361);let ac={ALLOY:"Alloy - Professional and confident",ASH:"Ash - Casual and relaxed",BALAD:"Ballad - Smooth and melodic",CORAL:"Coral - Warm and engaging",ECHO:"Echo - Friendly and conversational",FABLE:"Fable - Wise and measured",NOVA:"Nova - Friendly and conversational",ONYX:"Onyx - Deep and authoritative",SAGE:"Sage - Wise and measured",SHIMMER:"Shimmer - Bright and cheerful"},ad=Object.entries({ALLOY:"alloy",ASH:"ash",BALAD:"ballad",CORAL:"coral",ECHO:"echo",FABLE:"fable",NOVA:"nova",ONYX:"onyx",SAGE:"sage",SHIMMER:"shimmer"}).map(([e,t])=>({value:t,label:ac[e]})),au=[{value:ao.EndpointType.CHAT,label:"/v1/chat/completions"},{value:ao.EndpointType.RESPONSES,label:"/v1/responses"},{value:ao.EndpointType.ANTHROPIC_MESSAGES,label:"/v1/messages"},{value:ao.EndpointType.IMAGE,label:"/v1/images/generations"},{value:ao.EndpointType.IMAGE_EDITS,label:"/v1/images/edits"},{value:ao.EndpointType.EMBEDDINGS,label:"/v1/embeddings"},{value:ao.EndpointType.SPEECH,label:"/v1/audio/speech"},{value:ao.EndpointType.TRANSCRIPTION,label:"/v1/audio/transcriptions"},{value:ao.EndpointType.A2A_AGENTS,label:"/v1/a2a/message/send"},{value:ao.EndpointType.MCP,label:"/mcp-rest/tools/call"},{value:ao.EndpointType.REALTIME,label:"/v1/realtime"},{value:ao.EndpointType.INTERACTIONS,label:"/v1beta/interactions"}];var am=e.i(955719),am=am;let{Dragger:ah}=tD.Upload,ap=({chatUploadedImage:e,chatImagePreviewUrl:t,onImageUpload:s,onRemoveImage:r})=>(0,ey.jsx)(ey.Fragment,{children:!e&&(0,ey.jsx)(ah,{beforeUpload:s,accept:"image/*,.pdf",showUploadList:!1,className:"inline-block",style:{padding:0,border:"none",background:"none"},children:(0,ey.jsx)(tU.Tooltip,{title:"Attach image or PDF",children:(0,ey.jsx)("button",{type:"button",className:"flex items-center justify-center w-8 h-8 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-md transition-colors",children:(0,ey.jsx)(am.default,{style:{fontSize:"16px"}})})})})}),ag=async(e,t)=>({role:"user",content:[{type:"text",text:e},{type:"image_url",image_url:{url:await new Promise((e,s)=>{let r=new FileReader;r.onload=()=>{e(r.result)},r.onerror=s,r.readAsDataURL(t)})}}]}),af=(e,t,s,r)=>{let a="";t&&r&&(a=r.toLowerCase().endsWith(".pdf")?"[PDF attached]":"[Image attached]");let n={role:"user",content:t?`${e} ${a}`:e};return t&&s&&(n.imagePreviewUrl=s),n};var ax=e.i(790848),ay=e.i(888259),ab=e.i(270377);let av=({enabled:e,onEnabledChange:t,selectedModel:s,disabled:r=!1})=>{let a=(e=>{if(!e)return!1;let t=e.toLowerCase();return t.startsWith("openai/")||t.startsWith("gpt-")||t.startsWith("o1")||t.startsWith("o3")||t.includes("openai")})(s);return(0,ey.jsxs)("div",{className:"border border-gray-200 rounded-lg p-3 bg-linear-to-r from-blue-50 to-purple-50",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)(ty.CodeOutlined,{className:"text-blue-500"}),(0,ey.jsx)(tO.Text,{className:"font-medium text-gray-700",children:"Code Interpreter"}),(0,ey.jsx)(tU.Tooltip,{title:"Run Python code to generate files, charts, and analyze data. Container is created automatically.",children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:"text-gray-400 text-xs"})})]}),(0,ey.jsx)(ax.Switch,{checked:e&&a,onChange:e=>{e&&!a?ay.default.warning("Code Interpreter is only available for OpenAI models"):t(e)},disabled:r||!a,size:"small",className:e&&a?"bg-blue-500":""})]}),!a&&(0,ey.jsx)("div",{className:"mt-2 pt-2 border-t border-gray-200",children:(0,ey.jsxs)("div",{className:"flex items-start gap-2",children:[(0,ey.jsx)(ab.ExclamationCircleOutlined,{className:"text-amber-500 mt-0.5"}),(0,ey.jsxs)("div",{className:"text-xs text-gray-600",children:[(0,ey.jsx)("span",{children:"Code Interpreter is currently only supported for OpenAI models. "}),(0,ey.jsx)("a",{href:"https://github.com/BerriAI/litellm/issues/new?template=feature_request.yml",target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800 underline",children:"Request support for other providers"})]})]})})]})};var aw=e.i(339019);let aj=({endpointType:e,onEndpointChange:t,className:s})=>(0,ey.jsx)("div",{className:s,children:(0,ey.jsx)(eA.Select,{showSearch:!0,value:e,style:{width:"100%"},onChange:t,options:au,className:"rounded-md",filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase())||(t?.value??"").toLowerCase().includes(e.toLowerCase())})});var a_=e.i(91500);let aN=function({file:e,previewUrl:t,onRemove:s}){let r=e.name.toLowerCase().endsWith(".pdf");return(0,ey.jsx)("div",{className:"mb-2",children:(0,ey.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-gray-50 rounded-lg border border-gray-200",children:[(0,ey.jsx)("div",{className:"relative inline-block",children:r?(0,ey.jsx)("div",{className:"w-10 h-10 rounded-md bg-red-500 flex items-center justify-center",children:(0,ey.jsx)(a_.FilePdfOutlined,{style:{fontSize:"16px",color:"white"}})}):(0,ey.jsx)("img",{src:t||"",alt:"Upload preview",className:"w-10 h-10 rounded-md border border-gray-200 object-cover"})}),(0,ey.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,ey.jsx)("div",{className:"text-sm font-medium text-gray-900 truncate",children:e.name}),(0,ey.jsx)("div",{className:"text-xs text-gray-500",children:r?"PDF":"Image"})]}),(0,ey.jsx)("button",{className:"flex items-center justify-center w-6 h-6 text-gray-400 hover:text-gray-600 hover:bg-gray-200 rounded-full transition-colors",onClick:s,children:(0,ey.jsx)(ew.DeleteOutlined,{style:{fontSize:"12px"}})})]})})};var aS=e.i(771674),ak=e.i(918789),aC=e.i(245704),aE=e.i(637235),aT=e.i(166406),aA=e.i(755151),aP=e.i(240647),aR=e.i(993914);let aO=(e,t=8)=>e?e.length>t?`${e.substring(0,t)}…`:e:null,aI=e=>{navigator.clipboard.writeText(e)},aM=({a2aMetadata:e,timeToFirstToken:t,totalLatency:s})=>{let[r,a]=(0,eb.useState)(!1);if(!e&&!t&&!s)return null;let{taskId:n,contextId:i,status:l,metadata:o}=e||{},c=(e=>{if(!e)return null;try{return new Date(e).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return e}})(l?.timestamp);return(0,ey.jsxs)("div",{className:"a2a-metrics mt-3 pt-2 border-t border-gray-200 text-xs",children:[(0,ey.jsxs)("div",{className:"flex items-center mb-2 text-gray-600",children:[(0,ey.jsx)(eS.RobotOutlined,{className:"mr-1.5 text-blue-500"}),(0,ey.jsx)("span",{className:"font-medium text-gray-700",children:"A2A Metadata"})]}),(0,ey.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-gray-500 ml-4",children:[l?.state&&(0,ey.jsxs)("span",{className:`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${(e=>{switch(e){case"completed":return"bg-green-100 text-green-700";case"working":case"submitted":return"bg-blue-100 text-blue-700";case"failed":case"canceled":return"bg-red-100 text-red-700";default:return"bg-gray-100 text-gray-700"}})(l.state)}`,children:[(e=>{switch(e){case"completed":return(0,ey.jsx)(aC.CheckCircleOutlined,{className:"text-green-500"});case"working":case"submitted":return(0,ey.jsx)(tj.LoadingOutlined,{className:"text-blue-500"});case"failed":case"canceled":return(0,ey.jsx)(ab.ExclamationCircleOutlined,{className:"text-red-500"});default:return(0,ey.jsx)(aE.ClockCircleOutlined,{className:"text-gray-500"})}})(l.state),(0,ey.jsx)("span",{className:"ml-1 capitalize",children:l.state})]}),c&&(0,ey.jsx)(tU.Tooltip,{title:l?.timestamp,children:(0,ey.jsxs)("span",{className:"flex items-center",children:[(0,ey.jsx)(aE.ClockCircleOutlined,{className:"mr-1"}),c]})}),void 0!==s&&(0,ey.jsx)(tU.Tooltip,{title:"Total latency",children:(0,ey.jsxs)("span",{className:"flex items-center text-blue-600",children:[(0,ey.jsx)(aE.ClockCircleOutlined,{className:"mr-1"}),(s/1e3).toFixed(2),"s"]})}),void 0!==t&&(0,ey.jsx)(tU.Tooltip,{title:"Time to first token",children:(0,ey.jsxs)("span",{className:"flex items-center text-green-600",children:["TTFT: ",(t/1e3).toFixed(2),"s"]})})]}),(0,ey.jsxs)("div",{className:"flex flex-wrap items-center gap-3 text-gray-500 ml-4 mt-1.5",children:[n&&(0,ey.jsx)(tU.Tooltip,{title:`Click to copy: ${n}`,children:(0,ey.jsxs)("span",{className:"flex items-center cursor-pointer hover:text-gray-700",onClick:()=>aI(n),children:[(0,ey.jsx)(aR.FileTextOutlined,{className:"mr-1"}),"Task: ",aO(n),(0,ey.jsx)(aT.CopyOutlined,{className:"ml-1 text-gray-400 hover:text-gray-600"})]})}),i&&(0,ey.jsx)(tU.Tooltip,{title:`Click to copy: ${i}`,children:(0,ey.jsxs)("span",{className:"flex items-center cursor-pointer hover:text-gray-700",onClick:()=>aI(i),children:[(0,ey.jsx)(e_.LinkOutlined,{className:"mr-1"}),"Session: ",aO(i),(0,ey.jsx)(aT.CopyOutlined,{className:"ml-1 text-gray-400 hover:text-gray-600"})]})}),(o||l?.message)&&(0,ey.jsxs)(eC.Button,{type:"text",size:"small",className:"text-xs text-blue-500 hover:text-blue-700 p-0 h-auto",onClick:()=>a(!r),children:[r?(0,ey.jsx)(aA.DownOutlined,{}):(0,ey.jsx)(aP.RightOutlined,{}),(0,ey.jsx)("span",{className:"ml-1",children:"Details"})]})]}),r&&(0,ey.jsxs)("div",{className:"mt-2 ml-4 p-3 bg-gray-50 rounded-md text-gray-600 border border-gray-200",children:[l?.message&&(0,ey.jsxs)("div",{className:"mb-2",children:[(0,ey.jsx)("span",{className:"font-medium text-gray-700",children:"Status Message:"}),(0,ey.jsx)("span",{className:"ml-2",children:l.message})]}),n&&(0,ey.jsxs)("div",{className:"mb-1.5 flex items-center",children:[(0,ey.jsx)("span",{className:"font-medium text-gray-700 w-24",children:"Task ID:"}),(0,ey.jsx)("code",{className:"ml-2 px-2 py-1 bg-white border border-gray-200 rounded-sm text-xs font-mono",children:n}),(0,ey.jsx)(aT.CopyOutlined,{className:"ml-2 cursor-pointer text-gray-400 hover:text-blue-500",onClick:()=>aI(n)})]}),i&&(0,ey.jsxs)("div",{className:"mb-1.5 flex items-center",children:[(0,ey.jsx)("span",{className:"font-medium text-gray-700 w-24",children:"Session ID:"}),(0,ey.jsx)("code",{className:"ml-2 px-2 py-1 bg-white border border-gray-200 rounded-sm text-xs font-mono",children:i}),(0,ey.jsx)(aT.CopyOutlined,{className:"ml-2 cursor-pointer text-gray-400 hover:text-blue-500",onClick:()=>aI(i)})]}),o&&Object.keys(o).length>0&&(0,ey.jsxs)("div",{className:"mt-3",children:[(0,ey.jsx)("span",{className:"font-medium text-gray-700",children:"Custom Metadata:"}),(0,ey.jsx)("pre",{className:"mt-1.5 p-2 bg-white border border-gray-200 rounded-sm text-xs font-mono overflow-x-auto whitespace-pre-wrap",children:JSON.stringify(o,null,2)})]})]})]})},a$=({message:e})=>e.isAudio&&"string"==typeof e.content?(0,ey.jsx)("div",{className:"mb-2",children:(0,ey.jsx)("audio",{controls:!0,src:e.content,className:"max-w-full",style:{maxWidth:"500px"},children:"Your browser does not support the audio element."})}):null;var aL=e.i(657688);let aU=({message:e})=>{if(!("user"===e.role&&"string"==typeof e.content&&(e.content.includes("[Image attached]")||e.content.includes("[PDF attached]"))&&e.imagePreviewUrl))return null;let t="string"==typeof e.content&&e.content.includes("[PDF attached]");return(0,ey.jsx)("div",{className:"mb-2",children:t?(0,ey.jsx)("div",{className:"w-64 h-32 rounded-md border border-gray-200 bg-red-50 flex items-center justify-center",children:(0,ey.jsx)(a_.FilePdfOutlined,{style:{fontSize:"48px",color:"#dc2626"}})}):(0,ey.jsx)(aL.default,{src:e.imagePreviewUrl||"",alt:"User uploaded image",width:256,height:200,className:"max-w-64 rounded-md border border-gray-200 shadow-xs",style:{maxHeight:"200px",width:"auto",height:"auto"}})})};var aB=e.i(362024),aD=e.i(737434);let aq={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M553.1 509.1l-77.8 99.2-41.1-52.4a8 8 0 00-12.6 0l-99.8 127.2a7.98 7.98 0 006.3 12.9H696c6.7 0 10.4-7.7 6.3-12.9l-136.5-174a8.1 8.1 0 00-12.7 0zM360 442a40 40 0 1080 0 40 40 0 10-80 0zm494.6-153.4L639.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 42h216v494z"}}]},name:"file-image",theme:"outlined"};var aW=eb.forwardRef(function(e,t){return eb.createElement(tS.default,(0,t_.default)({},e,{ref:t,icon:aq}))});let az=({code:e,containerId:t,annotations:s=[],accessToken:r})=>{let[a,n]=(0,eb.useState)({}),[i,l]=(0,eb.useState)({}),o=(0,eM.getProxyBaseUrl)();(0,eb.useEffect)(()=>{let e=async()=>{for(let e of s)if((e.filename?.toLowerCase().endsWith(".png")||e.filename?.toLowerCase().endsWith(".jpg")||e.filename?.toLowerCase().endsWith(".jpeg")||e.filename?.toLowerCase().endsWith(".gif"))&&e.container_id&&e.file_id){l(t=>({...t,[e.file_id]:!0}));try{let t=await fetch(`${o}/v1/containers/${e.container_id}/files/${e.file_id}/content`,{headers:{[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`}});if(t.ok){let s=await t.blob(),r=URL.createObjectURL(s);n(t=>({...t,[e.file_id]:r}))}}catch(e){console.error("Error fetching image:",e)}finally{l(t=>({...t,[e.file_id]:!1}))}}};return s.length>0&&r&&e(),()=>{Object.values(a).forEach(e=>URL.revokeObjectURL(e))}},[s,r,o]);let c=async e=>{try{let t=await fetch(`${o}/v1/containers/${e.container_id}/files/${e.file_id}/content`,{headers:{[(0,eM.getGlobalLitellmHeaderName)()]:`Bearer ${r}`}});if(t.ok){let s=await t.blob(),r=URL.createObjectURL(s),a=document.createElement("a");a.href=r,a.download=e.filename||`file_${e.file_id}`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(r)}}catch(e){console.error("Error downloading file:",e)}},d=s.filter(e=>e.filename?.toLowerCase().endsWith(".png")||e.filename?.toLowerCase().endsWith(".jpg")||e.filename?.toLowerCase().endsWith(".jpeg")||e.filename?.toLowerCase().endsWith(".gif")),u=s.filter(e=>!e.filename?.toLowerCase().endsWith(".png")&&!e.filename?.toLowerCase().endsWith(".jpg")&&!e.filename?.toLowerCase().endsWith(".jpeg")&&!e.filename?.toLowerCase().endsWith(".gif"));return e||0!==s.length?(0,ey.jsxs)("div",{className:"mt-3 space-y-3",children:[e&&(0,ey.jsx)(aB.Collapse,{size:"small",items:[{key:"code",label:(0,ey.jsxs)("span",{className:"flex items-center gap-2 text-sm text-gray-600",children:[(0,ey.jsx)(ty.CodeOutlined,{})," Python Code Executed"]}),children:(0,ey.jsx)(tq.Prism,{language:"python",style:tW.coy,customStyle:{margin:0,borderRadius:"6px",fontSize:"12px",maxHeight:"300px",overflow:"auto"},children:e})}]}),d.map(e=>(0,ey.jsx)("div",{className:"rounded-lg border border-gray-200 overflow-hidden",children:i[e.file_id]?(0,ey.jsxs)("div",{className:"flex items-center justify-center p-8 bg-gray-50",children:[(0,ey.jsx)(eP.Spin,{indicator:(0,ey.jsx)(tj.LoadingOutlined,{spin:!0})}),(0,ey.jsx)("span",{className:"ml-2 text-sm text-gray-500",children:"Loading image..."})]}):a[e.file_id]?(0,ey.jsxs)("div",{children:[(0,ey.jsx)("img",{src:a[e.file_id],alt:e.filename||"Generated chart",className:"max-w-full",style:{maxHeight:"400px"}}),(0,ey.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 bg-gray-50 border-t border-gray-200",children:[(0,ey.jsxs)("span",{className:"text-xs text-gray-500 flex items-center gap-1",children:[(0,ey.jsx)(aW,{})," ",e.filename]}),(0,ey.jsxs)("button",{onClick:()=>c(e),className:"text-xs text-blue-500 hover:text-blue-700 flex items-center gap-1",children:[(0,ey.jsx)(aD.DownloadOutlined,{})," Download"]})]})]}):(0,ey.jsx)("div",{className:"flex items-center justify-center p-4 bg-gray-50",children:(0,ey.jsx)("span",{className:"text-sm text-gray-400",children:"Image not available"})})},e.file_id)),u.length>0&&(0,ey.jsx)("div",{className:"flex flex-wrap gap-2",children:u.map(e=>(0,ey.jsxs)("button",{onClick:()=>c(e),className:"flex items-center gap-2 px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition-colors",children:[(0,ey.jsx)(aR.FileTextOutlined,{className:"text-blue-500"}),(0,ey.jsx)("span",{className:"text-sm",children:e.filename}),(0,ey.jsx)(aD.DownloadOutlined,{className:"text-gray-400"})]},e.file_id))})]}):null};var aF=e.i(499569),aH=e.i(936772),aJ=e.i(285903);let aV=async(e,t)=>{let s=await new Promise((e,s)=>{let r=new FileReader;r.onload=()=>{e(r.result.split(",")[1])},r.onerror=s,r.readAsDataURL(t)}),r=t.type||(t.name.toLowerCase().endsWith(".pdf")?"application/pdf":"image/jpeg");return{role:"user",content:[{type:"input_text",text:e},{type:"input_image",image_url:`data:${r};base64,${s}`}]}},aG=(e,t,s,r)=>{let a="";t&&r&&(a=r.toLowerCase().endsWith(".pdf")?"[PDF attached]":"[Image attached]");let n={role:"user",content:t?`${e} ${a}`:e};return t&&s&&(n.imagePreviewUrl=s),n},aK=({message:e})=>{if(!("user"===e.role&&"string"==typeof e.content&&(e.content.includes("[Image attached]")||e.content.includes("[PDF attached]"))&&e.imagePreviewUrl))return null;let t="string"==typeof e.content&&e.content.includes("[PDF attached]");return(0,ey.jsx)("div",{className:"mb-2",children:t?(0,ey.jsx)("div",{className:"w-64 h-32 rounded-md border border-gray-200 bg-red-50 flex items-center justify-center",children:(0,ey.jsx)(a_.FilePdfOutlined,{style:{fontSize:"48px",color:"#dc2626"}})}):(0,ey.jsx)("img",{src:e.imagePreviewUrl,alt:"User uploaded image",className:"max-w-64 rounded-md border border-gray-200 shadow-xs",style:{maxHeight:"200px"}})})};function aX({searchResults:e}){let[t,s]=(0,eb.useState)(!0),[r,a]=(0,eb.useState)({});if(!e||0===e.length)return null;let n=e.reduce((e,t)=>e+t.data.length,0);return(0,ey.jsxs)("div",{className:"search-results-content mt-1 mb-2",children:[(0,ey.jsxs)(eC.Button,{type:"text",className:"flex items-center text-xs text-gray-500 hover:text-gray-700",onClick:()=>s(!t),icon:(0,ey.jsx)(tb.DatabaseOutlined,{}),children:[t?"Hide sources":`Show sources (${n})`,t?(0,ey.jsx)(aA.DownOutlined,{className:"ml-1"}):(0,ey.jsx)(aP.RightOutlined,{className:"ml-1"})]}),t&&(0,ey.jsx)("div",{className:"mt-2 p-3 bg-gray-50 border border-gray-200 rounded-md text-sm",children:(0,ey.jsx)("div",{className:"space-y-3",children:e.map((e,t)=>(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"text-xs text-gray-600 mb-2 flex items-center gap-2",children:[(0,ey.jsx)("span",{className:"font-medium",children:"Query:"}),(0,ey.jsxs)("span",{className:"italic",children:['"',e.search_query,'"']}),(0,ey.jsx)("span",{className:"text-gray-400",children:"•"}),(0,ey.jsxs)("span",{className:"text-gray-500",children:[e.data.length," result",1!==e.data.length?"s":""]})]}),(0,ey.jsx)("div",{className:"space-y-2",children:e.data.map((e,s)=>{let n=r[`${t}-${s}`]||!1;return(0,ey.jsxs)("div",{className:"border border-gray-200 rounded-md overflow-hidden bg-white",children:[(0,ey.jsx)("div",{className:"flex items-center justify-between p-2 cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>{let e;return e=`${t}-${s}`,void a(t=>({...t,[e]:!t[e]}))},children:(0,ey.jsxs)("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[(0,ey.jsx)("svg",{className:`w-4 h-4 text-gray-400 transition-transform shrink-0 ${n?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,ey.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,ey.jsx)(aR.FileTextOutlined,{className:"text-gray-400 shrink-0",style:{fontSize:"12px"}}),(0,ey.jsx)("span",{className:"text-xs font-medium text-gray-700 truncate",children:e.filename||e.file_id||`Result ${s+1}`}),(0,ey.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-sm bg-blue-100 text-blue-700 font-mono shrink-0",children:e.score.toFixed(3)})]})}),n&&(0,ey.jsx)("div",{className:"border-t border-gray-200 bg-white",children:(0,ey.jsxs)("div",{className:"p-3 space-y-2",children:[e.content.map((e,t)=>(0,ey.jsx)("div",{children:(0,ey.jsx)("div",{className:"text-xs font-mono bg-gray-50 p-2 rounded-sm text-gray-800 whitespace-pre-wrap wrap-break-word",children:e.text})},t)),e.attributes&&Object.keys(e.attributes).length>0&&(0,ey.jsxs)("div",{className:"mt-2 pt-2 border-t border-gray-100",children:[(0,ey.jsx)("div",{className:"text-xs text-gray-500 mb-1 font-medium",children:"Metadata:"}),(0,ey.jsx)("div",{className:"space-y-1",children:Object.entries(e.attributes).map(([e,t])=>(0,ey.jsxs)("div",{className:"text-xs flex gap-2",children:[(0,ey.jsxs)("span",{className:"text-gray-500 font-medium",children:[e,":"]}),(0,ey.jsx)("span",{className:"text-gray-700 font-mono break-all",children:String(t)})]},e))})]})]})})]},s)})})]},t))})})]})}let aY=function({message:e,isLastMessage:t,endpointType:s,mcpEvents:r,codeInterpreterResult:a,accessToken:n}){let i="user"===e.role;return(0,ey.jsx)("div",{className:`mb-4 ${i?"text-right":"text-left"}`,children:(0,ey.jsxs)("div",{className:"inline-block max-w-[80%] rounded-lg shadow-xs p-3.5 px-4",style:{backgroundColor:i?"#f0f8ff":"#ffffff",border:i?"1px solid #e6f0fa":"1px solid #f0f0f0",textAlign:"left"},children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,ey.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full mr-1",style:{backgroundColor:i?"#e6f0fa":"#f5f5f5"},children:i?(0,ey.jsx)(aS.UserOutlined,{style:{fontSize:"12px",color:"#2563eb"}}):(0,ey.jsx)(eS.RobotOutlined,{style:{fontSize:"12px",color:"#4b5563"}})}),(0,ey.jsx)("strong",{className:"text-sm capitalize",children:e.role}),"assistant"===e.role&&e.model&&(0,ey.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-sm bg-gray-100 text-gray-600 font-normal",children:e.model})]}),e.reasoningContent&&(0,ey.jsx)(aH.default,{reasoningContent:e.reasoningContent}),"assistant"===e.role&&t&&r.length>0&&(s===ao.EndpointType.RESPONSES||s===ao.EndpointType.CHAT)&&(0,ey.jsx)("div",{className:"mb-3",children:(0,ey.jsx)(aF.default,{events:r})}),"assistant"===e.role&&e.searchResults&&(0,ey.jsx)(aX,{searchResults:e.searchResults}),"assistant"===e.role&&t&&a&&s===ao.EndpointType.RESPONSES&&(0,ey.jsx)(az,{code:a.code,containerId:a.containerId,annotations:a.annotations,accessToken:n}),(0,ey.jsxs)("div",{className:"whitespace-pre-wrap wrap-break-word max-w-full message-content",style:{wordWrap:"break-word",overflowWrap:"break-word",wordBreak:"break-word",hyphens:"auto"},children:[e.isImage?(0,ey.jsx)("img",{src:"string"==typeof e.content?e.content:"",alt:"Generated image",className:"max-w-full rounded-md border border-gray-200 shadow-xs",style:{maxHeight:"500px"}}):e.isAudio?(0,ey.jsx)(a$,{message:e}):(0,ey.jsxs)(ey.Fragment,{children:[s===ao.EndpointType.RESPONSES&&(0,ey.jsx)(aK,{message:e}),s===ao.EndpointType.CHAT&&(0,ey.jsx)(aU,{message:e}),(0,ey.jsx)(ak.default,{components:{code({node:e,inline:t,className:s,children:r,...a}){let n=/language-(\w+)/.exec(s||"");return!t&&n?(0,ey.jsx)(tq.Prism,{style:tW.coy,language:n[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...a,children:String(r).replace(/\n$/,"")}):(0,ey.jsx)("code",{className:`${s} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,style:{wordBreak:"break-word"},...a,children:r})},pre:({node:e,...t})=>(0,ey.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...t})},children:"string"==typeof e.content?e.content:""}),e.image&&(0,ey.jsx)("div",{className:"mt-3",children:(0,ey.jsx)("img",{src:e.image.url,alt:"Generated image",className:"max-w-full rounded-md border border-gray-200 shadow-xs",style:{maxHeight:"500px"}})})]}),"assistant"===e.role&&(e.timeToFirstToken||e.totalLatency||e.usage)&&!e.a2aMetadata&&(0,ey.jsx)(aJ.default,{timeToFirstToken:e.timeToFirstToken,totalLatency:e.totalLatency,usage:e.usage,toolName:e.toolName}),"assistant"===e.role&&e.a2aMetadata&&(0,ey.jsx)(aM,{a2aMetadata:e.a2aMetadata,timeToFirstToken:e.timeToFirstToken,totalLatency:e.totalLatency})]})]})})};var am=am;let{Dragger:aQ}=tD.Upload,aZ=({responsesUploadedImage:e,responsesImagePreviewUrl:t,onImageUpload:s,onRemoveImage:r})=>(0,ey.jsx)(ey.Fragment,{children:!e&&(0,ey.jsx)(aQ,{beforeUpload:s,accept:"image/*,.pdf",showUploadList:!1,className:"inline-block",style:{padding:0,border:"none",background:"none"},children:(0,ey.jsx)(tU.Tooltip,{title:"Attach image or PDF",children:(0,ey.jsx)("button",{type:"button",className:"flex items-center justify-center w-8 h-8 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-md transition-colors",children:(0,ey.jsx)(am.default,{style:{fontSize:"16px"}})})})})}),a0=({endpointType:e,responsesSessionId:t,useApiSessionManagement:s,onToggleSessionManagement:r})=>e!==ao.EndpointType.RESPONSES?null:(0,ey.jsxs)("div",{className:"mb-4",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)("span",{className:"text-sm font-medium text-gray-700",children:"Session Management"}),(0,ey.jsx)(tU.Tooltip,{title:"Choose between LiteLLM API session management (using previous_response_id) or UI-based session management (using chat history)",children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:"text-gray-400",style:{fontSize:"12px"}})})]}),(0,ey.jsx)(ax.Switch,{checked:s,onChange:r,checkedChildren:"API",unCheckedChildren:"UI",size:"small"})]}),(0,ey.jsxs)("div",{className:`text-xs p-2 rounded-md ${t?"bg-green-50 text-green-700 border border-green-200":"bg-blue-50 text-blue-700 border border-blue-200"}`,children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsx)(tv.InfoCircleOutlined,{style:{fontSize:"12px"}}),(()=>{if(!t)return s?"API Session: Ready":"UI Session: Ready";let e=s?"Response ID":"UI Session",r=t.slice(0,10);return`${e}: ${r}...`})()]}),t&&(0,ey.jsx)(tU.Tooltip,{title:(0,ey.jsxs)("div",{className:"text-xs",children:[(0,ey.jsx)("div",{className:"mb-1",children:"Copy response ID to continue session:"}),(0,ey.jsx)("div",{className:"bg-gray-800 text-gray-100 p-2 rounded-sm font-mono text-xs whitespace-pre-wrap",children:`curl -X POST "your-proxy-url/v1/responses" \\ - -H "Authorization: Bearer your-api-key" \\ - -H "Content-Type: application/json" \\ - -d '{ - "model": "your-model", - "input": [{"role": "user", "content": "your message", "type": "message"}], - "previous_response_id": "${t}", - "stream": true - }'`})]}),overlayStyle:{maxWidth:"500px"},children:(0,ey.jsx)("button",{onClick:()=>{t&&(navigator.clipboard.writeText(t),eI.default.success("Response ID copied to clipboard!"))},className:"ml-2 p-1 hover:bg-green-100 rounded-sm transition-colors",children:(0,ey.jsx)(aT.CopyOutlined,{style:{fontSize:"12px"}})})})]}),(0,ey.jsx)("div",{className:"text-xs opacity-75 mt-1",children:t?s?"LiteLLM API session active - context maintained server-side":"UI session active - context maintained client-side":s?"LiteLLM will manage session using previous_response_id":"UI will manage session using chat history"})]})]});var a1={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M682 455V311l-76 76v68c-.1 50.7-42 92.1-94 92a95.8 95.8 0 01-52-15l-54 55c29.1 22.4 65.9 36 106 36 93.8 0 170-75.1 170-168z"}},{tag:"path",attrs:{d:"M833 446h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254-63 0-120.7-23-165-61l-54 54a334.01 334.01 0 00179 81v102H326c-13.9 0-24.9 14.3-25 32v36c.1 4.4 2.9 8 6 8h408c3.2 0 6-3.6 6-8v-36c0-17.7-11-32-25-32H547V782c165.3-17.9 294-157.9 294-328 0-4.4-3.6-8-8-8zm13.1-377.7l-43.5-41.9a8 8 0 00-11.2.1l-129 129C634.3 101.2 577 64 511 64c-93.9 0-170 75.3-170 168v224c0 6.7.4 13.3 1.2 19.8l-68 68A252.33 252.33 0 01258 454c-.2-4.4-3.8-8-8-8h-60c-4.4 0-8 3.6-8 8 0 53 12.5 103 34.6 147.4l-137 137a8.03 8.03 0 000 11.3l42.7 42.7c3.1 3.1 8.2 3.1 11.3 0L846.2 79.8l.1-.1c3.1-3.2 3-8.3-.2-11.4zM417 401V232c0-50.6 41.9-92 94-92 46 0 84.1 32.3 92.3 74.7L417 401z"}}]},name:"audio-muted",theme:"outlined"},a2=eb.forwardRef(function(e,t){return eb.createElement(tS.default,(0,t_.default)({},e,{ref:t,icon:a1}))}),a5=e.i(793916),a4=e.i(518617),a3={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M931.4 498.9L94.9 79.5c-3.4-1.7-7.3-2.1-11-1.2a15.99 15.99 0 00-11.7 19.3l86.2 352.2c1.3 5.3 5.2 9.6 10.4 11.3l147.7 50.7-147.6 50.7c-5.2 1.8-9.1 6-10.3 11.3L72.2 926.5c-.9 3.7-.5 7.6 1.2 10.9 3.9 7.9 13.5 11.1 21.5 7.2l836.5-417c3.1-1.5 5.6-4.1 7.2-7.1 3.9-8 .7-17.6-7.2-21.6zM170.8 826.3l50.3-205.6 295.2-101.3c2.3-.8 4.2-2.6 5-5 1.4-4.2-.8-8.7-5-10.2L221.1 403 171 198.2l628 314.9-628.2 313.2z"}}]},name:"send",theme:"outlined"},a6=eb.forwardRef(function(e,t){return eb.createElement(tS.default,(0,t_.default)({},e,{ref:t,icon:a3}))});let{Text:a8}=tB.Typography,a7=({accessToken:e,selectedModel:t,customProxyBaseUrl:s,selectedGuardrails:r})=>{let[a,n]=(0,eb.useState)([]),[i,l]=(0,eb.useState)(""),[o,c]=(0,eb.useState)(!1),[d,u]=(0,eb.useState)(!1),[m,h]=(0,eb.useState)(!1),[p,g]=(0,eb.useState)("alloy"),f=(0,eb.useRef)(null),x=(0,eb.useRef)(null),y=(0,eb.useRef)(null),b=(0,eb.useRef)(null);(0,eb.useRef)([]),(0,eb.useRef)(!1);let v=(0,eb.useRef)(null),w=(0,eb.useRef)(0),j=(0,eb.useCallback)(()=>{v.current?.scrollIntoView({behavior:"smooth"})},[]);(0,eb.useEffect)(()=>{j()},[a,j]);let _=(0,eb.useCallback)((e,t)=>{n(s=>[...s,{role:e,content:t,timestamp:new Date}])},[]),N=(0,eb.useCallback)(e=>{n(t=>{let s=t[t.length-1];return s&&"assistant"===s.role?[...t.slice(0,-1),{...s,content:s.content+e}]:[...t,{role:"assistant",content:e,timestamp:new Date}]})},[]),S=(0,eb.useCallback)(e=>{let t=atob(e),s=new Uint8Array(t.length);for(let e=0;e{if(!f.current){if(!t)return void _("status","Please select a model first");u(!0);try{x.current=new AudioContext({sampleRate:24e3});let a=(s||(0,eM.getProxyBaseUrl)()).replace(/^http/,"ws"),i=`${a}/v1/realtime?model=${encodeURIComponent(t)}`;r&&r.length>0&&(i+=`&guardrails=${encodeURIComponent(r.join(","))}`);let l=new WebSocket(i,["realtime",`openai-insecure-api-key.${e}`]);l.onopen=()=>{c(!0),u(!1),_("status","Connected to realtime API")},l.onmessage=async e=>{try{let t=e.data;t instanceof Blob?t=await t.text():t instanceof ArrayBuffer&&(t=new TextDecoder().decode(t));let s=JSON.parse(t),r=s.type;"session.created"===r?l.send(JSON.stringify({type:"session.update",session:{type:"realtime",modalities:["text","audio"],voice:p,input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:{model:"gpt-4o-mini-transcribe"},turn_detection:null}})):"session.updated"===r||("response.output_audio.delta"===r||"response.audio.delta"===r?s.delta&&S(s.delta):"response.output_text.delta"===r||"response.output_audio_transcript.delta"===r||"response.audio_transcript.delta"===r||"response.text.delta"===r?s.delta&&N(s.delta):"conversation.item.input_audio_transcription.completed"===r?s.transcript&&_("user",s.transcript):"response.done"===r?n(e=>{let t=e[e.length-1];if(t&&"assistant"===t.role&&t.content)return e;let r=s.response?.output||[],a=[];for(let e of r)for(let t of e.content||[]){let e=t.text||t.transcript;e&&a.push(e)}return a.length>0?[...e,{role:"assistant",content:a.join(""),timestamp:new Date}]:e}):"error"===r&&_("status",`Error: ${s.error?.message||JSON.stringify(s.error)}`))}catch{}},l.onerror=()=>{_("status","WebSocket error"),c(!1),u(!1)},l.onclose=()=>{_("status","Disconnected"),c(!1),u(!1),f.current=null},f.current=l}catch(e){_("status",`Connection failed: ${e.message}`),u(!1)}}},[e,t,p,s,r,_,N,S]),C=(0,eb.useCallback)(()=>{T(),f.current?.close(),f.current=null,x.current?.close(),x.current=null,w.current=0,A.current=!1,c(!1)},[]),E=(0,eb.useCallback)(async()=>{if(f.current&&f.current.readyState===WebSocket.OPEN){f.current.send(JSON.stringify({type:"session.update",session:{type:"realtime",modalities:["text","audio"],voice:p,input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:{model:"gpt-4o-mini-transcribe"},turn_detection:{type:"server_vad"}}}));try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});y.current=e;let t=x.current||new AudioContext({sampleRate:24e3});x.current=t;let s=t.createMediaStreamSource(e),r=t.createScriptProcessor(4096,1,1);b.current=r,r.onaudioprocess=e=>{let s;if(!f.current||f.current.readyState!==WebSocket.OPEN)return;let r=e.inputBuffer.getChannelData(0),a=t.sampleRate;if(24e3!==a){let e=a/24e3,t=Math.round(r.length/e);s=new Float32Array(t);for(let a=0;a{b.current?.disconnect(),b.current=null,y.current?.getTracks().forEach(e=>e.stop()),y.current=null,h(!1)},[]),A=(0,eb.useRef)(!1),P=(0,eb.useCallback)(()=>{!f.current||f.current.readyState!==WebSocket.OPEN||A.current||(A.current=!0,f.current.send(JSON.stringify({type:"session.update",session:{type:"realtime",modalities:["text","audio"],voice:p,input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:{model:"gpt-4o-mini-transcribe"},turn_detection:null}})))},[p]),R=(0,eb.useCallback)(()=>{if(!i.trim()||!f.current||f.current.readyState!==WebSocket.OPEN)return;let e=i.trim();_("user",e),l(""),f.current.send(JSON.stringify({type:"conversation.item.create",item:{type:"message",role:"user",content:[{type:"input_text",text:e}]}})),f.current.send(JSON.stringify({type:"response.create"}))},[i,_,P]);return(0,eb.useEffect)(()=>()=>{f.current?.close(),x.current?.close(),y.current?.getTracks().forEach(e=>e.stop())},[]),(0,ey.jsxs)("div",{className:"flex flex-col h-full",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-gray-200 bg-gray-50",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-3",children:[(0,ey.jsx)(tT.SoundOutlined,{className:"text-lg text-blue-500"}),(0,ey.jsx)(a8,{className:"font-semibold text-gray-800",children:"Realtime Voice Chat"}),(0,ey.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${o?"bg-green-500":"bg-gray-300"}`}),(0,ey.jsx)(a8,{className:"text-xs text-gray-500",children:o?"Connected":d?"Connecting...":"Disconnected"})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)(eA.Select,{size:"small",value:p,onChange:g,options:ad,style:{width:220},disabled:o}),o?(0,ey.jsx)(eC.Button,{danger:!0,onClick:C,size:"small",icon:(0,ey.jsx)(a4.CloseCircleOutlined,{}),children:"Disconnect"}):(0,ey.jsx)(eC.Button,{type:"primary",onClick:k,loading:d,size:"small",children:"Connect"})]})]}),(0,ey.jsxs)("div",{className:"flex-1 overflow-y-auto p-4 space-y-3",children:[0===a.length&&!o&&(0,ey.jsxs)("div",{className:"flex flex-col items-center justify-center h-full text-gray-400 gap-3",children:[(0,ey.jsx)(tT.SoundOutlined,{style:{fontSize:48}}),(0,ey.jsx)(a8,{className:"text-lg text-gray-500",children:"Realtime Voice Playground"}),(0,ey.jsxs)(a8,{className:"text-sm text-gray-400 text-center max-w-md",children:["Click ",(0,ey.jsx)("b",{children:"Connect"})," to start a realtime session. You can speak using your microphone or type messages. The AI will respond with voice and text."]})]}),a.map((e,t)=>(0,ey.jsx)("div",{className:`flex ${"user"===e.role?"justify-end":"status"===e.role?"justify-center":"justify-start"}`,children:"status"===e.role?(0,ey.jsx)("div",{className:"text-xs text-gray-400 italic px-3 py-1",children:e.content}):(0,ey.jsxs)("div",{className:`max-w-[75%] rounded-2xl px-4 py-2.5 ${"user"===e.role?"bg-blue-500 text-white rounded-br-md":"bg-gray-100 text-gray-800 rounded-bl-md"}`,children:[(0,ey.jsx)("div",{className:"text-xs font-medium mb-0.5 opacity-70",children:"user"===e.role?"You":"AI"}),(0,ey.jsx)("div",{className:"text-sm whitespace-pre-wrap",children:e.content})]})},t)),(0,ey.jsx)("div",{ref:v})]}),o&&(0,ey.jsxs)("div",{className:"border-t border-gray-200 p-3 bg-white",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)(eC.Button,{shape:"circle",size:"large",type:m?"primary":"default",danger:m,icon:m?(0,ey.jsx)(a2,{}):(0,ey.jsx)(a5.AudioOutlined,{}),onClick:m?T:E,title:m?"Stop recording":"Start recording",className:m?"animate-pulse":""}),(0,ey.jsx)(eE.Input,{placeholder:"Type a message or use the mic...",value:i,onChange:e=>l(e.target.value),onPressEnter:R,className:"flex-1",size:"large"}),(0,ey.jsx)(eC.Button,{type:"primary",icon:(0,ey.jsx)(a6,{}),onClick:R,disabled:!i.trim(),size:"large"})]}),m&&(0,ey.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-red-500 text-xs",children:[(0,ey.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-red-500 animate-pulse"}),"Listening — speak into your microphone. Server VAD will detect when you stop."]})]})]})};var a9=e.i(540626),ne=e.i(122550),nt=e.i(434166),ns=e.i(343488);let{TextArea:nr}=eE.Input,{Dragger:na}=tD.Upload,nn=new Set([ao.EndpointType.CHAT,ao.EndpointType.RESPONSES,ao.EndpointType.MCP,ao.EndpointType.ANTHROPIC_MESSAGES]),ni=({accessToken:e,token:t,userRole:s,userID:r,disabledPersonalKeyCreation:a,proxySettings:n,simplified:i=!1,fixedModel:l})=>{let[o,c]=(0,eb.useState)([]),[d,u]=(0,eb.useState)([]),[m,h]=(0,eb.useState)(!1),[p,g]=(0,eb.useState)(null),[f,x]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedMCPServers");try{return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing selectedMCPServers from sessionStorage",e),[]}}),[y,b]=(0,eb.useState)(!1),[v,w]=(0,eb.useState)({}),[j,_]=(0,eb.useState)(void 0),N=(0,eb.useRef)(null),[S,k]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("mcpServerToolRestrictions");try{return e?JSON.parse(e):{}}catch(e){return console.error("Error parsing mcpServerToolRestrictions from sessionStorage",e),{}}}),{chatHistory:C,setChatHistory:E,mcpEvents:T,setMCPEvents:A,messageTraceId:P,setMessageTraceId:R,responsesSessionId:O,setResponsesSessionId:I,useApiSessionManagement:M,setUseApiSessionManagement:$,updateTextUI:L,updateReasoningContent:U,updateTimingData:B,updateUsageData:D,updateA2AMetadata:q,updateTotalLatency:W,updateSearchResults:z,handleResponseId:F,handleToggleSessionManagement:H,handleMCPEvent:J,updateImageUI:V,updateEmbeddingsUI:G,updateAudioUI:K,updateChatImageUI:X,clearChatHistory:Y,clearMCPEvents:Q}=function({simplified:e}){let[t,s]=(0,eb.useState)(()=>{if(e)return[];try{let e=sessionStorage.getItem("chatHistory");return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing chatHistory from sessionStorage",e),[]}}),[r,a]=(0,eb.useState)([]),[n,i]=(0,eb.useState)(()=>e?null:sessionStorage.getItem("messageTraceId")||null),[l,o]=(0,eb.useState)(()=>e?null:sessionStorage.getItem("responsesSessionId")||null),[c,d]=(0,eb.useState)(()=>{if(e)return!0;let t=sessionStorage.getItem("useApiSessionManagement");return!t||JSON.parse(t)}),u=(0,a9.useDebouncer)(e=>{sessionStorage.setItem("chatHistory",JSON.stringify(e))},{wait:500});return(0,eb.useEffect)(()=>{e||0===t.length?u.cancel():u.maybeExecute(t)},[t,e,u]),(0,eb.useEffect)(()=>{e||(n?sessionStorage.setItem("messageTraceId",n):sessionStorage.removeItem("messageTraceId"),l?sessionStorage.setItem("responsesSessionId",l):sessionStorage.removeItem("responsesSessionId"),sessionStorage.setItem("useApiSessionManagement",JSON.stringify(c)))},[n,l,c,e]),{chatHistory:t,setChatHistory:s,mcpEvents:r,setMCPEvents:a,messageTraceId:n,setMessageTraceId:i,responsesSessionId:l,setResponsesSessionId:o,useApiSessionManagement:c,setUseApiSessionManagement:d,updateTextUI:(e,t,r)=>{s(s=>{let a=s[s.length-1];if(!a||a.role!==e||a.isImage||a.isAudio)return[...s,{role:e,content:t,model:r}];{let e={...a,content:a.content+t,model:a.model??r};return[...s.slice(0,-1),e]}})},updateReasoningContent:e=>{s(t=>{let s=t[t.length-1];return!s||"assistant"!==s.role||s.isImage||s.isAudio?t.length>0&&"user"===t[t.length-1].role?[...t,{role:"assistant",content:"",reasoningContent:e}]:t:[...t.slice(0,t.length-1),{...s,reasoningContent:(s.reasoningContent||"")+e}]})},updateTimingData:e=>{s(t=>{let s=t[t.length-1];return s&&"assistant"===s.role?[...t.slice(0,t.length-1),{...s,timeToFirstToken:e}]:s&&"user"===s.role?[...t,{role:"assistant",content:"",timeToFirstToken:e}]:t})},updateUsageData:(e,t)=>{s(s=>{let r=s[s.length-1];if(r&&"assistant"===r.role){let a={...r,usage:e,toolName:t};return[...s.slice(0,s.length-1),a]}return s})},updateA2AMetadata:e=>{s(t=>{let s=t[t.length-1];if(s&&"assistant"===s.role){let r={...s,a2aMetadata:e};return[...t.slice(0,t.length-1),r]}return t})},updateTotalLatency:e=>{s(t=>{let s=t[t.length-1];return s&&"assistant"===s.role?[...t.slice(0,t.length-1),{...s,totalLatency:e}]:t})},updateSearchResults:e=>{s(t=>{let s=t[t.length-1];if(s&&"assistant"===s.role){let r={...s,searchResults:e};return[...t.slice(0,t.length-1),r]}return t})},handleResponseId:e=>{c&&o(e)},handleToggleSessionManagement:e=>{d(e),e||o(null)},handleMCPEvent:e=>{a(t=>e.item_id&&t.some(t=>t.item_id===e.item_id&&t.type===e.type&&(t.sequence_number===e.sequence_number||void 0===t.sequence_number&&void 0===e.sequence_number))?t:[...t,e])},updateImageUI:(e,t)=>{s(s=>[...s,{role:"assistant",content:e,model:t,isImage:!0}])},updateEmbeddingsUI:(e,t)=>{s(s=>[...s,{role:"assistant",content:(0,ne.truncateString)(e,100),model:t,isEmbeddings:!0}])},updateAudioUI:(e,t)=>{s(s=>[...s,{role:"assistant",content:e,model:t,isAudio:!0}])},updateChatImageUI:(e,t)=>{s(s=>{let r=s[s.length-1];if(!r||"assistant"!==r.role||r.isImage||r.isAudio)return[...s,{role:"assistant",content:"",model:t,image:{url:e,detail:"auto"}}];{let a={...r,image:{url:e,detail:"auto"},model:r.model??t};return[...s.slice(0,-1),a]}})},clearChatHistory:()=>{s(e=>(e.forEach(e=>{e.isAudio&&"string"==typeof e.content&&URL.revokeObjectURL(e.content)}),[])),i(null),o(null),a([]),e||(sessionStorage.removeItem("chatHistory"),sessionStorage.removeItem("messageTraceId"),sessionStorage.removeItem("responsesSessionId"))},clearMCPEvents:()=>{a([])}}}({simplified:i}),[Z,ee]=(0,eb.useState)(()=>{let e=(0,nt.getSecureItem)("apiKeySource");if(e)try{return JSON.parse(e)}catch(e){console.error("Error parsing apiKeySource from sessionStorage",e)}return a?"custom":"session"}),[et,es]=(0,eb.useState)(()=>(0,nt.getSecureItem)("apiKey")||""),[er,ea]=(0,eb.useState)(()=>sessionStorage.getItem("customProxyBaseUrl")||""),[en,ei]=(0,eb.useState)(""),[el,eo]=(0,eb.useState)(i?l:void 0),[ec,ed]=(0,eb.useState)(!1),[eu,em]=(0,eb.useState)([]),[eh,ep]=(0,eb.useState)([]),[eg,ef]=(0,eb.useState)(void 0),ex=(0,ns.useDebouncedCallback)(e=>eo(e),{wait:500}),[ev,ej]=(0,eb.useState)(()=>sessionStorage.getItem("endpointType")||ao.EndpointType.CHAT),[eN,ek]=(0,eb.useState)(!1),eE=(0,eb.useRef)(null),[eR,eO]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedTags");try{return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing selectedTags from sessionStorage",e),[]}}),[eL,eB]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedVoice");if(!e)return"alloy";try{return JSON.parse(e)}catch{return e}}),[eq,ez]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedVectorStores");try{return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing selectedVectorStores from sessionStorage",e),[]}}),[eF,eH]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedGuardrails");try{return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing selectedGuardrails from sessionStorage",e),[]}}),[eJ,eV]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("selectedPolicies");try{return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing selectedPolicies from sessionStorage",e),[]}}),[eG,eK]=(0,eb.useState)([]),[eX,eY]=(0,eb.useState)([]),[eQ,eZ]=(0,eb.useState)(null),[e0,e1]=(0,eb.useState)(null),[e2,e5]=(0,eb.useState)(null),[e4,e3]=(0,eb.useState)(null),[e6,e8]=(0,eb.useState)(null),[e7,e9]=(0,eb.useState)(!1),[te,tt]=(0,eb.useState)(""),[ts,tr]=(0,eb.useState)("openai"),[ta,tn]=(0,eb.useState)(1),[ti,tl]=(0,eb.useState)(2048),[to,tc]=(0,eb.useState)(!1),[td,tu]=(0,eb.useState)(!1),tm=function(){let[e,t]=(0,eb.useState)(()=>{let e=sessionStorage.getItem("codeInterpreterEnabled");return!!e&&JSON.parse(e)}),[s,r]=(0,eb.useState)(null),a=(0,eb.useCallback)(e=>{t(e),sessionStorage.setItem("codeInterpreterEnabled",JSON.stringify(e))},[]),n=(0,eb.useCallback)(()=>{r(null)},[]),i=(0,eb.useCallback)(()=>{a(!e)},[e,a]);return{enabled:e,result:s,setEnabled:a,setResult:r,clearResult:n,toggle:i}}(),th=(0,eb.useRef)(null),tp=async()=>{let t="session"===Z?e:et;if(t){b(!0);try{let[e,s]=await Promise.all([(0,eM.fetchMCPServers)(t),(0,eM.fetchMCPToolsets)(t).catch(()=>[])]);c(Array.isArray(e)?e:e.data||[]),u(Array.isArray(s)?s:[])}catch(e){console.error("Error fetching MCP servers:",e)}finally{b(!1)}}};(0,eb.useEffect)(()=>{i&&l&&(eo(l),ej(ao.EndpointType.CHAT))},[i,l]);let t_=async t=>{let s="session"===Z?e:et;if(s&&!v[t])try{let e=await (0,eM.listMCPTools)(s,t);w(s=>({...s,[t]:e.tools||[]}))}catch(e){console.error(`Error fetching tools for server ${t}:`,e)}};(0,eb.useEffect)(()=>{if(e7){let t=(0,aw.generateCodeSnippet)({apiKeySource:Z,accessToken:e,apiKey:et,inputMessage:en,chatHistory:C,selectedTags:eR,selectedVectorStores:eq,selectedGuardrails:eF,selectedPolicies:eJ,selectedMCPServers:f,mcpServers:o,mcpServerToolRestrictions:S,endpointType:ev,selectedModel:el,selectedSdk:ts,selectedVoice:eL,proxySettings:n});tt(t)}},[e7,ts,Z,e,et,en,C,eR,eq,eF,eJ,f,o,S,ev,el,n]),(0,eb.useEffect)(()=>{try{(0,nt.setSecureItem)("apiKeySource",JSON.stringify(Z)),(0,nt.setSecureItem)("apiKey",et)}catch{}sessionStorage.setItem("endpointType",ev),sessionStorage.setItem("selectedTags",JSON.stringify(eR)),sessionStorage.setItem("selectedVectorStores",JSON.stringify(eq)),sessionStorage.setItem("selectedGuardrails",JSON.stringify(eF)),sessionStorage.setItem("selectedPolicies",JSON.stringify(eJ)),sessionStorage.setItem("selectedMCPServers",JSON.stringify(f)),sessionStorage.setItem("mcpServerToolRestrictions",JSON.stringify(S)),sessionStorage.setItem("selectedVoice",eL),sessionStorage.removeItem("selectedMCPTools"),i||(el?sessionStorage.setItem("selectedModel",el):sessionStorage.removeItem("selectedModel"))},[i,Z,et,el,ev,eR,eq,eF,eJ,f,S,eL]),(0,eb.useEffect)(()=>{let a="session"===Z?e:et;if(!a||!t||!s||!r)return;let n=async()=>{try{if(!a)return;let e=await (0,eU.fetchAvailableModels)(a);em(e);let t=e.some(e=>e.model_group===el);e.length&&t||eo(void 0)}catch(e){console.error("Error fetching model info:",e)}};i||n(),tp()},[e,r,s,Z,et,t,i]),(0,eb.useEffect)(()=>{if(ev===ao.EndpointType.MCP&&1===f.length&&"__all__"!==f[0]){let e=f[0];if(e.startsWith("toolset:")){let t=e.slice(8),s=d.find(e=>e.toolset_id===t);s&&[...new Set(s.tools.map(e=>e.server_id))].forEach(e=>{v[e]||t_(e)})}else v[e]||t_(e)}},[ev,f,v,d]),(0,eb.useEffect)(()=>{let t="session"===Z?e:et;t&&ev===ao.EndpointType.A2A_AGENTS&&(async()=>{try{let e=await e$(t,er||void 0);ep(e),eg&&!e.some(e=>e.agent_name===eg)&&ef(void 0)}catch(e){console.error("Error fetching agents:",e)}})()},[e,Z,et,ev,er,eg]),(0,eb.useEffect)(()=>{th.current&&setTimeout(()=>{th.current?.scrollIntoView({behavior:"smooth",block:"end"})},100)},[C]);let tN=e=>{eK(t=>[...t,e]);let t=URL.createObjectURL(e),s=t.startsWith("blob:")?t:"";return eY(e=>[...e,s]),!1},tS=()=>{eX.forEach(e=>{URL.revokeObjectURL(e)}),eK([]),eY([])},tD=()=>{e0&&URL.revokeObjectURL(e0),eZ(null),e1(null)},tz=()=>{e4&&URL.revokeObjectURL(e4),e5(null),e3(null)},tF=()=>{e8(null)},tV=async()=>{let a;if(""===en.trim()&&ev!==ao.EndpointType.TRANSCRIPTION&&ev!==ao.EndpointType.MCP)return;if(ev===ao.EndpointType.IMAGE_EDITS&&0===eG.length)return void eI.default.fromBackend("Please upload at least one image for editing");if(ev===ao.EndpointType.TRANSCRIPTION&&!e6)return void eI.default.fromBackend("Please upload an audio file for transcription");if(ev===ao.EndpointType.A2A_AGENTS&&!eg)return void eI.default.fromBackend("Please select an agent to send a message");let l={};if(ev===ao.EndpointType.MCP){let e=1===f.length&&"__all__"!==f[0]?f[0]:null;if(!e)return void eI.default.fromBackend("Please select an MCP server to test");if(e.startsWith("toolset:"),!j)return void eI.default.fromBackend("Please select an MCP tool to call");let t=e.startsWith("toolset:")?d.find(t=>t.toolset_id===e.slice(8)):null,s=[];if(t?[...new Set(t.tools.map(e=>e.server_id))].forEach(e=>{s=s.concat(v[e]||[])}):s=v[e]||[],!s.find(e=>e.name===j))return void eI.default.fromBackend("Please wait for tool schema to load");try{l=await N.current?.getSubmitValues()??{}}catch(e){eI.default.fromBackend(e instanceof Error?e.message:"Please fill in all required parameters");return}}if([ao.EndpointType.CHAT,ao.EndpointType.IMAGE,ao.EndpointType.SPEECH,ao.EndpointType.IMAGE_EDITS,ao.EndpointType.RESPONSES,ao.EndpointType.ANTHROPIC_MESSAGES,ao.EndpointType.EMBEDDINGS,ao.EndpointType.TRANSCRIPTION,ao.EndpointType.INTERACTIONS].includes(ev)&&!el)return void eI.default.fromBackend("Please select a model before sending a request");if(!t||!s||!r)return;let c=i||"session"===Z?e:et;if(!c)return void eI.default.fromBackend("Please provide a Virtual Key or select Current UI Session");eE.current=new AbortController;let u=eE.current.signal;if(ev===ao.EndpointType.RESPONSES&&eQ)try{a=await aV(en,eQ)}catch(e){eI.default.fromBackend("Failed to process image. Please try again.");return}else if(ev===ao.EndpointType.CHAT&&e2)try{a=await ag(en,e2)}catch(e){eI.default.fromBackend("Failed to process image. Please try again.");return}else a={role:"user",content:en};let m=P||tH();P||R(m),E([...C,ev===ao.EndpointType.RESPONSES&&eQ?aG(en,!0,e0||void 0,eQ.name):ev===ao.EndpointType.CHAT&&e2?af(en,!0,e4||void 0,e2.name):ev===ao.EndpointType.TRANSCRIPTION&&e6?aG(en?`🎵 Audio file: ${e6.name} -Prompt: ${en}`:`🎵 Audio file: ${e6.name}`,!1):ev===ao.EndpointType.MCP&&j?aG(`🔧 MCP Tool: ${j} -Arguments: ${JSON.stringify(l,null,2)}`,!1):aG(en,!1)]),Q(),tm.clearResult(),ek(!0);try{if(el)if(ev===ao.EndpointType.CHAT){let e=[...C.filter(e=>!e.isImage&&!e.isAudio).map(({role:e,content:t})=>({role:e,content:"string"==typeof t?t:""})),a],t=i&&n?n.LITELLM_UI_API_DOC_BASE_URL??n.PROXY_BASE_URL??void 0:er||void 0;await eW(e,(e,t)=>L("assistant",e,t),el,c,eR,u,U,B,D,m,eq.length>0?eq:void 0,eF.length>0?eF:void 0,eJ.length>0?eJ:void 0,f,X,z,to?ta:void 0,to?ti:void 0,W,t,o,S,J,td,d)}else if(ev===ao.EndpointType.IMAGE)await as(en,(e,t)=>V(e,t),el,c,eR,u,er||void 0);else if(ev===ao.EndpointType.SPEECH)await r7(en,eL,(e,t)=>K(e,t),el||"",c,eR,u,void 0,void 0,er||void 0);else if(ev===ao.EndpointType.IMAGE_EDITS)eG.length>0&&await at(1===eG.length?eG[0]:eG,en,(e,t)=>V(e,t),el,c,eR,u,er||void 0);else if(ev===ao.EndpointType.RESPONSES){let e;e=M&&O?[a]:[...C.filter(e=>!e.isImage&&!e.isAudio).map(({role:e,content:t})=>({role:e,content:t})),a],await (0,ar.makeOpenAIResponsesRequest)(e,(e,t,s)=>L(e,t,s),el,c,eR,u,U,B,D,m,eq.length>0?eq:void 0,eF.length>0?eF:void 0,eJ.length>0?eJ:void 0,f,M?O:null,F,J,tm.enabled,tm.setResult,er||void 0,o,S,d)}else if(ev===ao.EndpointType.ANTHROPIC_MESSAGES){let e=[...C.filter(e=>!e.isImage&&!e.isAudio).map(({role:e,content:t})=>({role:e,content:t})),a];await r8(e,(e,t,s)=>L(e,t,s),el,c,eR,u,U,B,D,m,eq.length>0?eq:void 0,eF.length>0?eF:void 0,eJ.length>0?eJ:void 0,f,er||void 0,o,S,d)}else ev===ao.EndpointType.EMBEDDINGS?await ae(en,(e,t)=>G(e,t),el,c,eR,er||void 0):ev===ao.EndpointType.TRANSCRIPTION?e6&&await r9(e6,(e,t)=>L("assistant",e,t),el,c,eR,u,void 0,void 0,void 0,void 0,er||void 0):ev===ao.EndpointType.INTERACTIONS&&await aa(en,(e,t)=>L("assistant",e,t),el,c,eR,u,er||void 0);if(ev===ao.EndpointType.MCP){let e=1===f.length&&"__all__"!==f[0]?f[0]:null,t=e;if(e?.startsWith("toolset:")){let s=e.slice(8),r=d.find(e=>e.toolset_id===s),a=r?.tools.find(e=>e.tool_name===j);t=a?.server_id??e}if(t&&!t.startsWith("toolset:")&&j){let e=await (0,eM.callMCPTool)(c,t,j,l,eF.length>0?{guardrails:eF}:void 0),s=e?.content?.length>0?JSON.stringify(e.content.map(e=>"text"===e.type?e.text:e).filter(Boolean),null,2):JSON.stringify(e,null,2);L("assistant",s||"Tool executed successfully.")}}ev===ao.EndpointType.A2A_AGENTS&&eg&&await t5(eg,en,(e,t)=>L("assistant",e,t),c,u,B,W,q,er||void 0,eF.length>0?eF:void 0)}catch(e){u.aborted||(console.error("Error fetching response",e),L("assistant","Error fetching response:"+e))}finally{ek(!1),eE.current=null,ev===ao.EndpointType.IMAGE_EDITS&&tS(),ev===ao.EndpointType.RESPONSES&&eQ&&tD(),ev===ao.EndpointType.CHAT&&e2&&tz(),ev===ao.EndpointType.TRANSCRIPTION&&e6&&tF()}ei("")};if(s&&"Admin Viewer"===s){let{Title:e,Paragraph:t}=tB.Typography;return(0,ey.jsxs)("div",{children:[(0,ey.jsx)(e,{level:1,children:"Access Denied"}),(0,ey.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}let tG=(0,ey.jsx)(tj.LoadingOutlined,{style:{fontSize:24},spin:!0});return(0,ey.jsxs)("div",{className:`w-full bg-white ${i?"h-full flex flex-col":"p-4 pb-0"}`,children:[(0,ey.jsx)(tR.Card,{className:`w-full rounded-xl shadow-md overflow-hidden ${i?"h-full flex flex-col":""}`,children:(0,ey.jsxs)("div",{className:`flex w-full gap-4 ${i?"h-full":"h-[80vh]"}`,children:[!i&&(0,ey.jsxs)("div",{className:"w-1/4 p-4 bg-gray-50 overflow-y-auto",children:[(0,ey.jsx)(tM.Title,{className:"text-xl font-semibold mb-6 mt-2",children:"Configurations"}),(0,ey.jsxs)("div",{className:"space-y-4",children:[(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tw.KeyOutlined,{className:"mr-2"})," Virtual Key Source"]}),(0,ey.jsx)(eA.Select,{disabled:a,value:Z,style:{width:"100%"},onChange:e=>{ee(e)},options:[{value:"session",label:"Current UI Session"},{value:"custom",label:"Virtual Key"}],className:"rounded-md"}),"custom"===Z&&(0,ey.jsx)(tI.TextInput,{className:"mt-2",placeholder:"Enter custom Virtual Key",type:"password",onValueChange:es,value:et,icon:tw.KeyOutlined})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block text-gray-700 flex items-center",children:[(0,ey.jsx)(tE.SettingOutlined,{className:"mr-2"})," Custom Proxy Base URL"]}),n?.LITELLM_UI_API_DOC_BASE_URL&&!er&&(0,ey.jsx)(eC.Button,{type:"link",size:"small",icon:(0,ey.jsx)(e_.LinkOutlined,{}),onClick:()=>{ea(n.LITELLM_UI_API_DOC_BASE_URL||""),sessionStorage.setItem("customProxyBaseUrl",n.LITELLM_UI_API_DOC_BASE_URL||"")},className:"text-gray-500 hover:text-gray-700",children:"Fill"}),er&&(0,ey.jsx)(eC.Button,{type:"link",size:"small",icon:(0,ey.jsx)(tx.ClearOutlined,{}),onClick:()=>{ea(""),sessionStorage.removeItem("customProxyBaseUrl")},className:"text-gray-500 hover:text-gray-700",children:"Clear"})]}),(0,ey.jsx)(tI.TextInput,{placeholder:"Optional: Enter custom proxy URL (e.g., http://localhost:5000)",onValueChange:e=>{ea(e),sessionStorage.setItem("customProxyBaseUrl",e)},value:er,icon:tg.ApiOutlined}),er&&(0,ey.jsxs)(tO.Text,{className:"text-xs text-gray-500 mt-1",children:["API calls will be sent to: ",er]})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tg.ApiOutlined,{className:"mr-2"})," Endpoint Type"]}),(0,ey.jsx)(aj,{endpointType:ev,onEndpointChange:e=>{ej(e),eo(void 0),ef(void 0),ed(!1),_(void 0),e===ao.EndpointType.MCP&&x(e=>1===e.length&&"__all__"!==e[0]?e:[]);try{sessionStorage.removeItem("selectedModel"),sessionStorage.removeItem("selectedAgent")}catch{}},className:"mb-4"}),ev===ao.EndpointType.SPEECH&&(0,ey.jsxs)("div",{className:"mb-4",children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tT.SoundOutlined,{className:"mr-2"}),"Voice"]}),(0,ey.jsx)(eA.Select,{value:eL,onChange:e=>{eB(e),sessionStorage.setItem("selectedVoice",e)},style:{width:"100%"},className:"rounded-md",options:ad})]}),(0,ey.jsx)(a0,{endpointType:ev,responsesSessionId:O,useApiSessionManagement:M,onToggleSessionManagement:H})]}),ev!==ao.EndpointType.A2A_AGENTS&&ev!==ao.EndpointType.MCP&&(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center justify-between",children:[(0,ey.jsxs)("span",{className:"flex items-center",children:[(0,ey.jsx)(eS.RobotOutlined,{className:"mr-2"})," Select Model"]}),(()=>{if(!el||"custom"===el)return!1;let e=eu.find(e=>e.model_group===el);return!!e&&(!e.mode||"chat"===e.mode)})()?(0,ey.jsx)(tL.Popover,{content:(0,ey.jsx)(al,{temperature:ta,maxTokens:ti,useAdvancedParams:to,onTemperatureChange:tn,onMaxTokensChange:tl,onUseAdvancedParamsChange:tc,mockTestFallbacks:td,onMockTestFallbacksChange:tu}),title:"Model Settings",trigger:"click",placement:"right",children:(0,ey.jsx)(eC.Button,{type:"text",size:"small",icon:(0,ey.jsx)(tE.SettingOutlined,{}),className:"text-gray-500 hover:text-gray-700","aria-label":"Model Settings","data-testid":"model-settings-button"})}):(0,ey.jsx)(tU.Tooltip,{title:"Advanced parameters are only supported for chat models currently",children:(0,ey.jsx)(eC.Button,{type:"text",size:"small",icon:(0,ey.jsx)(tE.SettingOutlined,{}),className:"text-gray-300 cursor-not-allowed",disabled:!0})})]}),(0,ey.jsx)(eA.Select,{value:el,placeholder:"Select a Model",onChange:e=>{eo(e),ed("custom"===e)},options:[{value:"custom",label:"Enter custom model",key:"custom"},...Array.from(new Set(eu.filter(e=>{if(!e.mode)return!0;let t=(0,ao.getEndpointType)(e.mode);return ev===ao.EndpointType.RESPONSES||ev===ao.EndpointType.ANTHROPIC_MESSAGES||ev===ao.EndpointType.INTERACTIONS?t===ev||t===ao.EndpointType.CHAT:ev===ao.EndpointType.IMAGE_EDITS?t===ev||t===ao.EndpointType.IMAGE:t===ev}).map(e=>e.model_group))).map((e,t)=>({value:e,label:e,key:t}))],style:{width:"100%"},showSearch:!0,className:"rounded-md"}),ec&&(0,ey.jsx)(tI.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:ex})]}),ev===ao.EndpointType.A2A_AGENTS&&(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(eS.RobotOutlined,{className:"mr-2"})," Select Agent"]}),(0,ey.jsx)(eA.Select,{value:eg,placeholder:"Select an Agent",onChange:e=>ef(e),options:eh.map(e=>({value:e.agent_name,label:e.agent_name||e.agent_id,key:e.agent_id})),style:{width:"100%"},showSearch:!0,className:"rounded-md",optionLabelProp:"label",children:eh.map(e=>(0,ey.jsx)(eA.Select.Option,{value:e.agent_name,label:e.agent_name||e.agent_id,children:(0,ey.jsxs)("div",{className:"flex flex-col py-1",children:[(0,ey.jsx)("span",{className:"font-medium",children:e.agent_name||e.agent_id}),e.agent_card_params?.description&&(0,ey.jsx)("span",{className:"text-xs text-gray-500 mt-1",children:e.agent_card_params.description})]})},e.agent_id))}),0===eh.length&&(0,ey.jsx)(tO.Text,{className:"text-xs text-gray-500 mt-2 block",children:"No agents found. Create agents via /v1/agents endpoint."})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tA.TagsOutlined,{className:"mr-2"})," Tags"]}),(0,ey.jsx)(t0,{value:eR,onChange:eO,className:"mb-4",accessToken:e||""})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tP.ToolOutlined,{className:"mr-2"}),ev===ao.EndpointType.MCP?"MCP Server":"MCP Servers",(0,ey.jsx)(tU.Tooltip,{className:"ml-1",title:ev===ao.EndpointType.MCP?"Select an MCP server or toolset to test tools directly.":"Select MCP servers or toolsets to use in your conversation.",children:(0,ey.jsx)(tv.InfoCircleOutlined,{className:"cursor-pointer",onClick:()=>h(!0)})})]}),(0,ey.jsxs)(eA.Select,{mode:ev===ao.EndpointType.MCP?void 0:"multiple",style:{width:"100%"},placeholder:ev===ao.EndpointType.MCP?"Select MCP server":"Select MCP servers",value:ev===ao.EndpointType.MCP?"__all__"!==f[0]&&1===f.length?f[0]:void 0:f,onChange:e=>{ev===ao.EndpointType.MCP?(x(e?[e]:[]),_(void 0),e&&!v[e]&&t_(e)):e.includes("__all__")?(x(["__all__"]),k({})):(x(e),k(t=>{let s={...t};return Object.keys(s).forEach(t=>{e.includes(t)||delete s[t]}),s}),e.forEach(e=>{v[e]||t_(e)}))},loading:y,className:"mb-2",allowClear:!0,showSearch:!0,optionLabelProp:"label",disabled:!nn.has(ev),maxTagCount:ev===ao.EndpointType.MCP?1:"responsive",filterOption:(e,t)=>{if(t?.value==="__all__")return"all mcp servers".includes(e.toLowerCase());let s=t?.value;if(s?.startsWith("toolset:")){let t=s.slice(8),r=d.find(e=>e.toolset_id===t);return!!r&&[r.toolset_name,r.description].filter(Boolean).join(" ").toLowerCase().includes(e.toLowerCase())}let r=o.find(e=>e.server_id===s);return!!r&&[r.server_name,r.alias,r.server_id,r.description].filter(Boolean).join(" ").toLowerCase().includes(e.toLowerCase())},children:[ev!==ao.EndpointType.MCP&&(0,ey.jsx)(eA.Select.Option,{value:"__all__",label:"All MCP Servers",children:(0,ey.jsxs)("div",{className:"flex flex-col py-1",children:[(0,ey.jsx)("span",{className:"font-medium",children:"All MCP Servers"}),(0,ey.jsx)("span",{className:"text-xs text-gray-500 mt-1",children:"Use all available MCP servers"})]})},"__all__"),d.length>0&&(0,ey.jsx)(eA.Select.OptGroup,{label:"Toolsets",children:d.map(e=>(0,ey.jsx)(eA.Select.Option,{value:`toolset:${e.toolset_id}`,label:e.toolset_name,disabled:ev!==ao.EndpointType.MCP&&f.includes("__all__"),children:(0,ey.jsxs)("div",{className:"flex flex-col py-1",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-1",children:[(0,ey.jsx)("span",{className:"font-medium",children:e.toolset_name}),(0,ey.jsx)("span",{className:"text-xs px-1 rounded-sm",style:{background:"#ede9fe",color:"#7c3aed"},children:"Toolset"}),(0,ey.jsxs)("span",{className:"text-xs text-gray-500",children:["(",e.tools.length," tools)"]})]}),e.description&&(0,ey.jsx)("span",{className:"text-xs text-gray-500 mt-1",children:e.description})]})},`toolset:${e.toolset_id}`))}),o.length>0&&(0,ey.jsx)(eA.Select.OptGroup,{label:"Servers",children:o.map(e=>(0,ey.jsx)(eA.Select.Option,{value:e.server_id,label:e.alias||e.server_name||e.server_id,disabled:ev!==ao.EndpointType.MCP&&f.includes("__all__"),children:(0,ey.jsxs)("div",{className:"flex flex-col py-1",children:[(0,ey.jsx)("span",{className:"font-medium",children:e.alias||e.server_name||e.server_id}),e.description&&(0,ey.jsx)("span",{className:"text-xs text-gray-500 mt-1",children:e.description})]})},e.server_id))})]}),ev===ao.EndpointType.MCP&&1===f.length&&"__all__"!==f[0]&&(()=>{let e=f[0],t=e.startsWith("toolset:"),s=[];if(t){let t=e.slice(8),r=d.find(e=>e.toolset_id===t);r&&(s=r.tools.map(e=>({value:e.tool_name,label:e.tool_name})))}else s=(v[e]||[]).map(e=>({value:e.name,label:e.name}));return(0,ey.jsxs)("div",{className:"mt-3",children:[(0,ey.jsx)(tO.Text,{className:"text-xs text-gray-600 mb-1 block",children:"Select Tool"}),(0,ey.jsx)(eA.Select,{style:{width:"100%"},placeholder:"Select a tool to call",value:j,onChange:e=>_(e),options:s,allowClear:!0,className:"rounded-md"})]})})(),f.length>0&&!f.includes("__all__")&&ev!==ao.EndpointType.MCP&&nn.has(ev)&&(0,ey.jsx)("div",{className:"mt-3 space-y-2",children:f.map(e=>{let t=o.find(t=>t.server_id===e),s=v[e]||[];return 0===s.length?null:(0,ey.jsxs)("div",{className:"border rounded-sm p-2",children:[(0,ey.jsxs)(tO.Text,{className:"text-xs text-gray-600 mb-1",children:["Limit tools for ",t?.alias||t?.server_name||e,":"]}),(0,ey.jsx)(eA.Select,{mode:"multiple",size:"small",style:{width:"100%"},placeholder:"All tools (default)",value:S[e]||[],onChange:t=>{k(s=>({...s,[e]:t}))},options:s.map(e=>({value:e.name,label:e.name})),maxTagCount:2})]},e)})}),f.length>0&&!f.includes("__all__")&&f.some(e=>{let t=o.find(t=>t.server_id===e);return t?.is_byok})&&(0,ey.jsx)("div",{className:"mt-3 space-y-2",children:f.map(e=>{let t=o.find(t=>t.server_id===e);if(!t?.is_byok)return null;let s=t.alias||t.server_name||e;return(0,ey.jsxs)("div",{className:"border border-blue-100 rounded-sm p-2 bg-blue-50 flex items-center justify-between",children:[(0,ey.jsxs)(tO.Text,{className:"text-xs text-blue-700",children:[s," requires your API key"]}),t.has_user_credential?(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsxs)("span",{className:"text-green-600 text-xs font-medium flex items-center gap-1",children:[(0,ey.jsx)(tw.KeyOutlined,{})," Connected"]}),(0,ey.jsx)("button",{className:"text-xs text-gray-400 hover:text-blue-500 underline",onClick:()=>g(t),children:"Reconnect"})]}):(0,ey.jsx)("button",{className:"text-xs bg-blue-500 hover:bg-blue-600 text-white px-3 py-1 rounded-lg font-medium",onClick:()=>g(t),children:"Connect"})]},e)})})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tb.DatabaseOutlined,{className:"mr-2"})," Vector Store",(0,ey.jsx)(tU.Tooltip,{className:"ml-1",title:(0,ey.jsxs)("span",{children:["Select vector store(s) to use for this LLM API call. You can set up your vector store"," ",(0,ey.jsx)("a",{href:"?page=vector-stores",style:{color:"#1890ff"},children:"here"}),"."]}),children:(0,ey.jsx)(tv.InfoCircleOutlined,{})})]}),(0,ey.jsx)(t1.default,{value:eq,onChange:ez,className:"mb-4",accessToken:e||""})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tC.SafetyOutlined,{className:"mr-2"})," Guardrails",(0,ey.jsx)(tU.Tooltip,{className:"ml-1",title:(0,ey.jsxs)("span",{children:["Select guardrail(s) to use for this LLM API call. You can set up your guardrails"," ",(0,ey.jsx)("a",{href:"?page=guardrails",style:{color:"#1890ff"},children:"here"}),"."]}),children:(0,ey.jsx)(tv.InfoCircleOutlined,{})})]}),(0,ey.jsx)(tJ.default,{value:eF,onChange:eH,className:"mb-4",accessToken:e||""})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)(tO.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,ey.jsx)(tC.SafetyOutlined,{className:"mr-2"})," Policies",(0,ey.jsx)(tU.Tooltip,{className:"ml-1",title:(0,ey.jsxs)("span",{children:["Select policy/policies to apply to this LLM API call. Policies define which guardrails are applied based on conditions. You can set up your policies"," ",(0,ey.jsx)("a",{href:"?page=policies",style:{color:"#1890ff"},children:"here"}),"."]}),children:(0,ey.jsx)(tv.InfoCircleOutlined,{})})]}),(0,ey.jsx)(eD.default,{value:eJ,onChange:eV,className:"mb-4",accessToken:e||""})]}),ev===ao.EndpointType.RESPONSES&&(0,ey.jsx)("div",{children:(0,ey.jsx)(av,{accessToken:"session"===Z?e||"":et,enabled:tm.enabled,onEnabledChange:tm.setEnabled,selectedContainerId:null,onContainerChange:()=>{},selectedModel:el||""})})]})]}),(0,ey.jsx)("div",{className:`flex flex-col bg-white ${i?"flex-1 w-full":"w-3/4"}`,children:ev===ao.EndpointType.REALTIME?(0,ey.jsx)(a7,{accessToken:"session"===Z?e||"":et,selectedModel:el||"",customProxyBaseUrl:er||void 0,selectedGuardrails:eF.length>0?eF:void 0}):(0,ey.jsxs)(ey.Fragment,{children:[(0,ey.jsxs)("div",{className:"p-4 border-b border-gray-200 flex justify-between items-center",children:[(0,ey.jsx)(tM.Title,{className:"text-xl font-semibold mb-0",children:i?"Chat":"Test Key"}),(0,ey.jsxs)("div",{className:"flex gap-2",children:[(0,ey.jsx)(t$.Button,{onClick:()=>{Y(),tS(),tD(),tz(),tF(),eI.default.success("Chat history cleared.")},className:"bg-gray-100 hover:bg-gray-200 text-gray-700 border-gray-300",icon:tx.ClearOutlined,children:"Clear Chat"}),!i&&(0,ey.jsx)(t$.Button,{onClick:()=>e9(!0),className:"bg-gray-100 hover:bg-gray-200 text-gray-700 border-gray-300",icon:ty.CodeOutlined,children:"Get Code"})]})]}),(0,ey.jsxs)("div",{className:"flex-1 overflow-auto p-4 pb-0",children:[0===C.length&&(0,ey.jsxs)("div",{className:"h-full flex flex-col items-center justify-center text-gray-400",children:[(0,ey.jsx)(eS.RobotOutlined,{style:{fontSize:"48px",marginBottom:"16px"}}),(0,ey.jsx)(tO.Text,{children:"Start a conversation, generate an image, or handle audio"})]}),C.map((t,s)=>(0,ey.jsx)("div",{children:(0,ey.jsx)(aY,{message:t,isLastMessage:s===C.length-1,endpointType:ev,mcpEvents:T,codeInterpreterResult:tm.result,accessToken:"session"===Z?e||"":et})},s)),eN&&T.length>0&&(ev===ao.EndpointType.RESPONSES||ev===ao.EndpointType.CHAT)&&C.length>0&&"user"===C[C.length-1].role&&(0,ey.jsx)("div",{className:"text-left mb-4",children:(0,ey.jsxs)("div",{className:"inline-block max-w-[80%] rounded-lg shadow-xs p-3.5 px-4",style:{backgroundColor:"#ffffff",border:"1px solid #f0f0f0",textAlign:"left"},children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,ey.jsx)("div",{className:"flex items-center justify-center w-6 h-6 rounded-full mr-1",style:{backgroundColor:"#f5f5f5"},children:(0,ey.jsx)(eS.RobotOutlined,{style:{fontSize:"12px",color:"#4b5563"}})}),(0,ey.jsx)("strong",{className:"text-sm capitalize",children:"Assistant"})]}),(0,ey.jsx)(aF.default,{events:T})]})}),eN&&(0,ey.jsx)("div",{className:"flex justify-center items-center my-4",children:(0,ey.jsx)(eP.Spin,{indicator:tG})}),(0,ey.jsx)("div",{ref:th,style:{height:"1px"}})]}),(0,ey.jsxs)("div",{className:"p-4 border-t border-gray-200 bg-white",children:[ev===ao.EndpointType.IMAGE_EDITS&&(0,ey.jsx)("div",{className:"mb-4",children:0===eG.length?(0,ey.jsxs)(na,{beforeUpload:tN,accept:"image/*",showUploadList:!1,children:[(0,ey.jsx)("p",{className:"ant-upload-drag-icon",children:(0,ey.jsx)(tk,{style:{fontSize:"24px",color:"#666"}})}),(0,ey.jsx)("p",{className:"ant-upload-text text-sm",children:"Click or drag images to upload"}),(0,ey.jsx)("p",{className:"ant-upload-hint text-xs text-gray-500",children:"Support for PNG, JPG, JPEG formats. Multiple images supported."})]}):(0,ey.jsxs)("div",{className:"flex flex-wrap gap-2",children:[eG.map((e,t)=>(0,ey.jsxs)("div",{className:"relative inline-block",children:[(0,ey.jsx)("img",{src:(()=>{let e=eX[t];if(!e)return"";try{let t=new URL(e);return"blob:"===t.protocol?t.href:""}catch{return""}})(),alt:`Upload preview ${t+1}`,className:"max-w-32 max-h-32 rounded-md border border-gray-200 object-cover"}),(0,ey.jsx)("button",{className:"absolute top-1 right-1 bg-white shadow-xs border border-gray-200 rounded-sm px-1 py-1 text-red-500 hover:bg-red-50 text-xs",onClick:()=>{eX[t]&&URL.revokeObjectURL(eX[t]),eK(e=>e.filter((e,s)=>s!==t)),eY(e=>e.filter((e,s)=>s!==t))},children:(0,ey.jsx)(ew.DeleteOutlined,{})})]},t)),(0,ey.jsxs)("div",{className:"flex items-center justify-center w-32 h-32 border-2 border-dashed border-gray-300 rounded-md hover:border-gray-400 cursor-pointer",onClick:()=>document.getElementById("additional-image-upload")?.click(),children:[(0,ey.jsxs)("div",{className:"text-center",children:[(0,ey.jsx)(tk,{style:{fontSize:"24px",color:"#666"}}),(0,ey.jsx)("p",{className:"text-xs text-gray-500 mt-1",children:"Add more"})]}),(0,ey.jsx)("input",{id:"additional-image-upload",type:"file",accept:"image/*",multiple:!0,style:{display:"none"},onChange:e=>{Array.from(e.target.files||[]).forEach(e=>tN(e))}})]})]})}),ev===ao.EndpointType.TRANSCRIPTION&&(0,ey.jsx)("div",{className:"mb-4",children:e6?(0,ey.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-gray-50 rounded-lg border border-gray-200",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2 flex-1",children:[(0,ey.jsx)(tT.SoundOutlined,{style:{fontSize:"20px",color:"#666"}}),(0,ey.jsx)("span",{className:"text-sm font-medium",children:e6.name}),(0,ey.jsxs)("span",{className:"text-xs text-gray-500",children:["(",(e6.size/1024/1024).toFixed(2)," MB)"]})]}),(0,ey.jsxs)("button",{className:"bg-white shadow-xs border border-gray-200 rounded-sm px-2 py-1 text-red-500 hover:bg-red-50 text-xs",onClick:tF,children:[(0,ey.jsx)(ew.DeleteOutlined,{})," Remove"]})]}):(0,ey.jsxs)(na,{beforeUpload:e=>(e8(e),!1),accept:"audio/*,.mp3,.mp4,.mpeg,.mpga,.m4a,.wav,.webm",showUploadList:!1,children:[(0,ey.jsx)("p",{className:"ant-upload-drag-icon",children:(0,ey.jsx)(tT.SoundOutlined,{style:{fontSize:"24px",color:"#666"}})}),(0,ey.jsx)("p",{className:"ant-upload-text text-sm",children:"Click or drag audio file to upload"}),(0,ey.jsx)("p",{className:"ant-upload-hint text-xs text-gray-500",children:"Support for MP3, MP4, MPEG, MPGA, M4A, WAV, WEBM formats. Max file size: 25 MB."})]})}),ev===ao.EndpointType.RESPONSES&&eQ&&(0,ey.jsx)(aN,{file:eQ,previewUrl:e0,onRemove:tD}),ev===ao.EndpointType.CHAT&&e2&&(0,ey.jsx)(aN,{file:e2,previewUrl:e4,onRemove:tz}),ev===ao.EndpointType.RESPONSES&&tm.enabled&&(0,ey.jsxs)("div",{className:"mb-2 space-y-2",children:[(0,ey.jsxs)("div",{className:"px-3 py-2 bg-linear-to-r from-blue-50 to-purple-50 rounded-lg border border-blue-200 flex items-center justify-between",children:[(0,ey.jsx)("div",{className:"flex items-center gap-2",children:eN?(0,ey.jsxs)(ey.Fragment,{children:[(0,ey.jsx)(tj.LoadingOutlined,{className:"text-blue-500",spin:!0}),(0,ey.jsx)("span",{className:"text-sm text-blue-700 font-medium",children:"Running Python code..."})]}):(0,ey.jsxs)(ey.Fragment,{children:[(0,ey.jsx)(ty.CodeOutlined,{className:"text-blue-500"}),(0,ey.jsx)("span",{className:"text-sm text-blue-700 font-medium",children:"Code Interpreter Active"})]})}),(0,ey.jsx)("button",{className:"text-xs text-blue-500 hover:text-blue-700",onClick:()=>tm.setEnabled(!1),children:"Disable"})]}),!eN&&(0,ey.jsx)("div",{className:"flex flex-wrap gap-2",children:["Generate sample sales data CSV and create a chart","Create a PNG bar chart comparing AI gateway providers including LiteLLM","Generate a CSV of LLM pricing data and visualize it as a line chart"].map((e,t)=>(0,ey.jsx)("button",{className:"text-xs px-3 py-1.5 bg-white border border-gray-200 rounded-full hover:bg-blue-50 hover:border-blue-300 hover:text-blue-600 transition-colors",onClick:()=>ei(e),children:e},t))})]}),0===C.length&&!eN&&ev!==ao.EndpointType.MCP&&(0,ey.jsx)("div",{className:"flex items-center gap-2 mb-3 overflow-x-auto",children:(ev===ao.EndpointType.A2A_AGENTS?["What can you help me with?","Tell me about yourself","What tasks can you perform?"]:["Write me a poem","Explain quantum computing","Draft a polite email requesting a meeting"]).map(e=>(0,ey.jsx)("button",{type:"button",className:"shrink-0 rounded-full border border-gray-200 px-3 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-blue-50 hover:border-blue-300 hover:text-blue-600 cursor-pointer",onClick:()=>ei(e),children:e},e))}),(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsxs)("div",{className:"flex items-center flex-1 bg-white border border-gray-300 rounded-xl px-3 py-1 min-h-[44px]",children:[(0,ey.jsxs)("div",{className:"shrink-0 mr-2 flex items-center gap-1",children:[ev===ao.EndpointType.RESPONSES&&!eQ&&(0,ey.jsx)(aZ,{responsesUploadedImage:eQ,responsesImagePreviewUrl:e0,onImageUpload:e=>(eZ(e),e1(URL.createObjectURL(e)),!1),onRemoveImage:tD}),ev===ao.EndpointType.CHAT&&!e2&&(0,ey.jsx)(ap,{chatUploadedImage:e2,chatImagePreviewUrl:e4,onImageUpload:e=>(e5(e),e3(URL.createObjectURL(e)),!1),onRemoveImage:tz}),ev===ao.EndpointType.RESPONSES&&(0,ey.jsx)(tU.Tooltip,{title:tm.enabled?"Code Interpreter enabled (click to disable)":"Enable Code Interpreter",children:(0,ey.jsx)("button",{className:`p-1.5 rounded-md transition-colors ${tm.enabled?"bg-blue-100 text-blue-600":"text-gray-400 hover:text-gray-600 hover:bg-gray-100"}`,onClick:()=>{tm.toggle(),tm.enabled||eI.default.success("Code Interpreter enabled!")},children:(0,ey.jsx)(ty.CodeOutlined,{style:{fontSize:"16px"}})})})]}),ev===ao.EndpointType.MCP&&1===f.length&&"__all__"!==f[0]&&j?(0,ey.jsx)("div",{className:"flex-1 overflow-y-auto max-h-48 min-h-[44px] p-2 border border-gray-200 rounded-lg bg-gray-50/50",children:(()=>{let e=f[0],t=[];if(e.startsWith("toolset:")){let s=e.slice(8),r=d.find(e=>e.toolset_id===s);r&&[...new Set(r.tools.map(e=>e.server_id))].forEach(e=>{t=t.concat(v[e]||[])})}else t=v[e]||[];let s=t.find(e=>e.name===j);return s?(0,ey.jsx)(tQ,{ref:N,tool:s,className:"space-y-2"}):(0,ey.jsx)("div",{className:"flex items-center justify-center h-10 text-sm text-gray-500",children:"Loading tool schema..."})})()}):(0,ey.jsx)(nr,{value:en,onChange:e=>ei(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),tV())},placeholder:ev===ao.EndpointType.CHAT||ev===ao.EndpointType.EMBEDDINGS||ev===ao.EndpointType.RESPONSES||ev===ao.EndpointType.ANTHROPIC_MESSAGES||ev===ao.EndpointType.INTERACTIONS?"Type your message... (Shift+Enter for new line)":ev===ao.EndpointType.A2A_AGENTS?"Send a message to the A2A agent...":ev===ao.EndpointType.IMAGE_EDITS?"Describe how you want to edit the image...":ev===ao.EndpointType.SPEECH?"Enter text to convert to speech...":ev===ao.EndpointType.TRANSCRIPTION?"Optional: Add context or prompt for transcription...":"Describe the image you want to generate...",disabled:eN,className:"flex-1",autoSize:{minRows:1,maxRows:4},style:{resize:"none",border:"none",boxShadow:"none",background:"transparent",padding:"4px 0",fontSize:"14px",lineHeight:"20px"}}),(0,ey.jsx)(t$.Button,{onClick:tV,disabled:eN||(ev===ao.EndpointType.MCP?!(1===f.length&&"__all__"!==f[0]&&j):ev===ao.EndpointType.TRANSCRIPTION?!e6:!en.trim()),className:"shrink-0 ml-2 w-8! h-8! min-w-8! p-0! rounded-full! bg-blue-600! hover:bg-blue-700! disabled:bg-gray-300! border-none! text-white! disabled:text-gray-500! flex! items-center! justify-center!",children:(0,ey.jsx)(tf.ArrowUpOutlined,{style:{fontSize:"14px"}})})]}),eN&&(0,ey.jsx)(t$.Button,{onClick:()=>{eE.current&&(eE.current.abort(),eE.current=null,ek(!1),eI.default.info("Request cancelled"))},className:"bg-red-50 hover:bg-red-100 text-red-600 border-red-200",icon:ew.DeleteOutlined,children:"Cancel"})]})]})]})})]})}),(0,ey.jsxs)(eT.Modal,{title:"Generated Code",open:e7,onCancel:()=>e9(!1),footer:null,width:800,children:[(0,ey.jsxs)("div",{className:"flex justify-between items-end my-4",children:[(0,ey.jsxs)("div",{children:[(0,ey.jsx)(tO.Text,{className:"font-medium block mb-1 text-gray-700",children:"SDK Type"}),(0,ey.jsx)(eA.Select,{value:ts,onChange:e=>tr(e),style:{width:150},options:[{value:"openai",label:"OpenAI SDK"},{value:"azure",label:"Azure SDK"}]})]}),(0,ey.jsx)(eC.Button,{onClick:()=>{navigator.clipboard.writeText(te),eI.default.success("Copied to clipboard!")},children:"Copy to Clipboard"})]}),(0,ey.jsx)(tq.Prism,{language:"python",style:tW.coy,wrapLines:!0,wrapLongLines:!0,className:"rounded-md",customStyle:{maxHeight:"60vh",overflowY:"auto"},children:te})]}),p&&(0,ey.jsx)(tZ.ByokCredentialModal,{server:p,open:!!p,onClose:()=>g(null),onSuccess:e=>{tp(),g(null)}}),(0,ey.jsx)(eT.Modal,{title:"How Toolsets Work",open:m,onCancel:()=>h(!1),footer:[(0,ey.jsx)(eC.Button,{onClick:()=>h(!1),children:"Close"},"close")],width:600,children:(0,ey.jsxs)("div",{className:"space-y-4 py-2",children:[(0,ey.jsxs)("p",{className:"text-gray-700",children:[(0,ey.jsx)("strong",{children:"Toolsets"})," are named collections of specific tools from one or more MCP servers. Instead of exposing all tools from a server, a toolset gives an agent exactly the tools it needs."]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h4",{className:"font-semibold text-gray-800 mb-2",children:"How to use a toolset:"}),(0,ey.jsxs)("ol",{className:"list-decimal list-inside space-y-2 text-gray-700",children:[(0,ey.jsxs)("li",{children:["Select a ",(0,ey.jsx)("span",{style:{color:"#7c3aed",fontWeight:600},children:"Toolset"})," (purple badge) from the MCP Servers dropdown."]}),(0,ey.jsx)("li",{children:"The tool picker will show only the tools included in that toolset."}),(0,ey.jsx)("li",{children:"Select a tool and fill in its parameters, then send."}),(0,ey.jsx)("li",{children:"The tool call is routed to the correct underlying MCP server automatically."})]})]}),(0,ey.jsx)("div",{className:"bg-purple-50 border border-purple-200 rounded-sm p-3",children:(0,ey.jsxs)("p",{className:"text-sm text-purple-800",children:[(0,ey.jsx)("strong",{children:"Example:"}),' A "GitHub Read-only" toolset might include only'," ",(0,ey.jsx)("code",{children:"list_repos"})," and ",(0,ey.jsx)("code",{children:"get_file"})," from a GitHub MCP server — preventing agents from making writes."]})}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h4",{className:"font-semibold text-gray-800 mb-1",children:"Creating toolsets:"}),(0,ey.jsxs)("p",{className:"text-sm text-gray-600",children:["Admins can create and manage toolsets from the ",(0,ey.jsx)("strong",{children:"MCP"})," page → ",(0,ey.jsx)("strong",{children:"Toolsets"})," tab. Toolsets can then be assigned to keys and teams to scope their tool access."]})]})]})})]})},{TextArea:nl}=eE.Input,no="__new__";function nc({agentName:e,proxySettings:t,customProxyBaseUrl:s,disabledPersonalKeyCreation:r,creatingKey:a,createdKeyValue:n,onCreateKey:i}){let l,o=eM.proxyBaseUrl??((l=t?.LITELLM_UI_API_DOC_BASE_URL)&&l.trim()?l:t?.PROXY_BASE_URL?t.PROXY_BASE_URL:s?.trim()?s:""),c=n?n.startsWith("Bearer ")?n:`Bearer ${n}`:"Bearer sk-1234",d=`curl -L -X POST '${o}/v1/chat/completions' \\ --H 'x-litellm-api-key: ${c}' \\ --d '{ - "model": "${e}", - "stream": true, - "stream_options": { - "include_usage": true - }, - "messages": [ - { - "role": "user", - "content": "hey" - } - ] -}'`;return(0,ey.jsxs)("div",{className:"mx-auto max-w-3xl space-y-6",children:[(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-1",children:"Proxy base URL"}),(0,ey.jsx)("p",{className:"text-sm text-gray-600 font-mono bg-gray-50 px-2 py-1.5 rounded-sm border border-gray-200 break-all",children:o})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-2",children:"Call your agent (cURL)"}),(0,ey.jsx)(eO.default,{code:d,language:"bash"})]}),(0,ey.jsxs)("div",{className:"rounded-lg border border-gray-200 bg-gray-50 p-4",children:[(0,ey.jsx)("h3",{className:"text-sm font-semibold text-gray-900 mb-2",children:"Create a key for this agent"}),(0,ey.jsxs)("p",{className:"text-sm text-gray-600 mb-3",children:["Create a virtual key that can only call this agent. The key will be scoped to you (user_id) and restricted to the model ",(0,ey.jsx)("span",{className:"font-mono text-gray-800",children:e}),"."]}),(0,ey.jsx)(eC.Button,{type:"primary",onClick:i,loading:a,disabled:r,children:"Create key for this agent"}),r&&(0,ey.jsx)("p",{className:"text-xs text-amber-600 mt-2",children:"Key creation is disabled for your account."}),n&&(0,ey.jsx)("p",{className:"text-xs text-green-700 mt-2",children:"Key created. It is shown in the cURL example above — copy the snippet to use it."})]})]})}function nd(e){let t=e.model_info;return t?.id??null}function nu(e){return nd(e)??e.model_name}let nm="litellm_proxy/mcp/";function nh({accessToken:e,token:t,userID:s,userRole:r,disabledPersonalKeyCreation:a=!1,proxySettings:n,apiKey:i,customProxyBaseUrl:l}){let[o,c]=(0,eb.useState)([]),[d,u]=(0,eb.useState)([]),[m,h]=(0,eb.useState)(!0),[p,g]=(0,eb.useState)(null),[f,x]=(0,eb.useState)("configure"),[y,b]=(0,eb.useState)(!1),[v,w]=(0,eb.useState)(null),[j,_]=(0,eb.useState)(""),[N,S]=(0,eb.useState)(""),[k,C]=(0,eb.useState)(void 0),[E,T]=(0,eb.useState)(.7),[A,P]=(0,eb.useState)(4096),[R,O]=(0,eb.useState)([]),[I,M]=(0,eb.useState)([]),[$,L]=(0,eb.useState)(!1),[U,B]=(0,eb.useState)(!1),[D,q]=(0,eb.useState)(!1),W=i||e||"",z=p===no?null:o.find(e=>nu(e)===p)??null,F=p===no,H=z?nd(z):null,J=(0,eb.useCallback)(async()=>{if(!e||!s||!r)return[];h(!0);try{let t=await eL(e,s,r);return c(t),p&&(p===no||t.some(e=>nu(e)===p))||g(t.length>0?nu(t[0]):null),t}catch(e){return console.error(e),eI.default.fromBackend("Failed to load agents"),[]}finally{h(!1)}},[e,s,r]),V=(0,eb.useCallback)(async()=>{if(W)try{let e=await (0,eU.fetchAvailableModels)(W);u(e),!k&&e.length>0&&C(e[0].model_group)}catch(e){console.error(e)}},[W]);(0,eb.useEffect)(()=>{J()},[J]),(0,eb.useEffect)(()=>{V()},[V]);let G=(0,eb.useCallback)(async()=>{if(W){L(!0);try{let e=await (0,eM.fetchMCPServers)(W);M(Array.isArray(e)?e:e?.data??[])}catch(e){console.error("Error fetching MCP servers:",e)}finally{L(!1)}}},[W]);(0,eb.useEffect)(()=>{G()},[G]),(0,eb.useEffect)(()=>{w(null)},[p]),(0,eb.useEffect)(()=>{if(z&&!F){_(z.model_name),S(z.litellm_params?.litellm_system_prompt??""),C(function(e){if(e&&e.startsWith("litellm_agent/"))return e.slice(14)||void 0}(z.litellm_params?.model)??d[0]?.model_group);let e=z.litellm_params;T("number"==typeof e?.temperature?e.temperature:.7),P("number"==typeof e?.max_tokens?e.max_tokens:4096);let t=z.litellm_params?.tools;O(Array.isArray(t)?t.filter(e=>e&&"object"==typeof e&&"mcp"===e.type&&"string"==typeof e.server_url):[])}},[p,F,z?.model_name,z?.litellm_params?.tools]);let K=R.filter(e=>"mcp"===e.type&&e.server_url?.startsWith(nm)).map(e=>{let t=e.server_url.slice(nm.length),s=I.find(e=>(e.alias||e.server_name||e.server_id)===t);return s?.server_id}).filter(e=>null!=e),X=()=>{g(no),_(""),S("You are a helpful assistant."),C(d[0]?.model_group),T(.7),P(4096),O([]),x("configure")},Y=async()=>{if(!e||!j?.trim()||!k)return void eI.default.fromBackend("Name and underlying model are required");B(!0);try{let t=await (0,eM.modelCreateCall)(e,{model_name:j.trim(),litellm_params:{model:`litellm_agent/${k}`,litellm_system_prompt:N.trim()||void 0,temperature:E,max_tokens:A,tools:R},model_info:{}}),s=t?.model_id??t?.model_info?.id??null,r=await J(),a=s?r.find(e=>nd(e)===s)??r.find(e=>e.model_name===j.trim()):r.find(e=>e.model_name===j.trim());g(a?nu(a):r[0]?nu(r[0]):null),x("chat")}catch(e){eI.default.fromBackend("Failed to save agent")}finally{B(!1)}},Q=async()=>{if(!e||!z||!H||!j?.trim()||!k)return void eI.default.fromBackend("Name and underlying model are required");B(!0);try{await (0,eM.modelPatchUpdateCall)(e,{model_name:j.trim(),litellm_params:{model:`litellm_agent/${k}`,litellm_system_prompt:N.trim()||void 0,temperature:E,max_tokens:A,tools:R},model_info:z.model_info??{}},H),eI.default.success("Agent updated successfully");let t=await J(),s=t.find(e=>nd(e)===H)??t[0];g(s?nu(s):null)}catch(e){eI.default.fromBackend("Failed to update agent")}finally{B(!1)}},Z=async()=>{if(e&&s&&z){b(!0),w(null);try{let t=await (0,eM.keyCreateCall)(e,s,{models:[z.model_name],key_alias:`Agent: ${z.model_name}`}),r=t?.key??null;r?(w(r),eI.default.success("Virtual key created. Use it in the curl example below.")):eI.default.fromBackend("Key created but value not returned")}catch(e){eI.default.fromBackend("Failed to create key for agent")}finally{b(!1)}}};return e&&s&&r?(0,ey.jsxs)("div",{className:"flex h-full flex-col bg-white text-gray-900",children:[(0,ey.jsxs)("div",{className:"flex shrink-0 flex-col border-b border-gray-200",children:[(0,ey.jsxs)("div",{className:"flex h-12 items-center justify-between px-4",children:[(0,ey.jsx)("span",{className:"text-sm font-medium text-gray-900",children:"Agent Builder"}),F?(0,ey.jsx)(eC.Button,{type:"primary",icon:(0,ey.jsx)(ek.SaveOutlined,{}),onClick:Y,loading:U,disabled:!j?.trim()||!k,children:"Save Agent"}):(0,ey.jsx)("span",{className:"text-xs text-gray-500",children:"Build Agents that pass your compliance requirements."})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-2 border-t border-amber-200 bg-amber-50 px-4 py-2 text-xs text-amber-800",children:[(0,ey.jsx)(ej.ExperimentOutlined,{className:"shrink-0 text-amber-600"}),(0,ey.jsxs)("span",{children:["Agent Builder is experimental and may change or be removed without notice. We’d love your feedback—email us at"," ",(0,ey.jsx)("a",{href:"mailto:product@berri.ai",className:"font-medium text-amber-900 underline hover:text-amber-700",children:"product@berri.ai"}),"."]})]})]}),(0,ey.jsxs)("div",{className:"flex flex-1 overflow-hidden",children:[(0,ey.jsxs)("div",{className:"w-60 shrink-0 border-r border-gray-200 bg-white flex flex-col",children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-200 p-3",children:[(0,ey.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wide text-gray-500",children:"Agents"}),(0,ey.jsx)(eC.Button,{type:"text",size:"small",icon:(0,ey.jsx)(eN.PlusOutlined,{}),onClick:X,"aria-label":"Add agent"})]}),(0,ey.jsx)("div",{className:"flex-1 overflow-y-auto p-2",children:m?(0,ey.jsx)("div",{className:"flex justify-center py-4",children:(0,ey.jsx)(eP.Spin,{size:"small"})}):(0,ey.jsxs)(ey.Fragment,{children:[o.map(e=>{let t=nu(e);return(0,ey.jsxs)("button",{type:"button",onClick:()=>g(t),className:`mb-1 w-full rounded-md border-l-2 px-3 py-2 text-left text-sm transition-colors ${p===t?"border-blue-500 bg-blue-50 text-blue-800":"border-transparent hover:bg-gray-50"}`,children:[(0,ey.jsx)("div",{className:"font-medium truncate",children:e.model_name}),(0,ey.jsx)("div",{className:"text-[10px] text-gray-500 truncate",children:"litellm_agent"})]},t)}),(0,ey.jsxs)("button",{type:"button",onClick:X,className:"mb-1 w-full rounded-md border border-dashed border-gray-300 px-3 py-2 text-left text-sm text-gray-500 hover:border-blue-400 hover:bg-blue-50/50 hover:text-gray-700",children:[(0,ey.jsx)(eN.PlusOutlined,{className:"mr-1"})," New agent"]})]})})]}),(0,ey.jsxs)("div",{className:"flex flex-1 flex-col overflow-hidden",children:[null===p&&!F&&0===o.length&&!m&&(0,ey.jsx)("div",{className:"flex flex-1 items-center justify-center p-8 text-gray-500",children:"No agents yet. Add an agent to get started."}),(null!==p||F)&&(0,ey.jsx)(ey.Fragment,{children:(0,ey.jsx)(eR.Tabs,{activeKey:f,onChange:e=>x(e),className:"flex-1 overflow-hidden [&_.ant-tabs-content]:h-full [&_.ant-tabs-tabpane]:h-full [&_.ant-tabs-nav]:pl-4",items:[{key:"configure",label:(0,ey.jsxs)("span",{children:[(0,ey.jsx)(eS.RobotOutlined,{className:"mr-1"})," Configure"]}),children:(0,ey.jsx)("div",{className:"h-full overflow-y-auto p-6",children:F||z?(0,ey.jsxs)("div",{className:"mx-auto max-w-xl space-y-4",children:[!H&&z&&(0,ey.jsx)("div",{className:"rounded-sm border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:"This agent cannot be updated or deleted here (missing model id). Manage it from Models & Endpoints."}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"Agent name"}),(0,ey.jsx)(eE.Input,{value:j,onChange:e=>_(e.target.value),placeholder:"My Agent"})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"System prompt"}),(0,ey.jsx)(nl,{value:N,onChange:e=>S(e.target.value),placeholder:"You are a helpful assistant...",rows:6})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"Underlying LLM"}),(0,ey.jsx)(eA.Select,{value:k,onChange:C,className:"w-full",options:d.map(e=>({value:e.model_group,label:e.model_group})),placeholder:"Select model"})]}),(0,ey.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"Temperature"}),(0,ey.jsx)(eE.Input,{type:"number",min:0,max:2,step:.1,value:E,onChange:e=>T(Number(e.target.value))})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"Max tokens"}),(0,ey.jsx)(eE.Input,{type:"number",min:1,value:A,onChange:e=>P(Number(e.target.value))})]})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"mb-1 block text-sm font-medium text-gray-700",children:"MCP servers"}),(0,ey.jsx)(eA.Select,{mode:"multiple",placeholder:"Select MCP servers to attach (same format as chat completions API)",value:K,onChange:e=>{O(e.map(e=>{let t=I.find(t=>t.server_id===e),s=t?.alias||t?.server_name||e;return{type:"mcp",server_label:"litellm",server_url:`${nm}${s}`,require_approval:"never"}}))},loading:$,className:"w-full",allowClear:!0,showSearch:!0,optionFilterProp:"label",options:I.map(e=>({value:e.server_id,label:e.alias||e.server_name||e.server_id}))}),z&&R.length>0&&(0,ey.jsxs)("p",{className:"mt-1 text-xs text-gray-500",children:[R.length," MCP server",1!==R.length?"s":""," saved. Use the same"," ",(0,ey.jsx)("code",{className:"rounded-sm bg-gray-100 px-1",children:"tools"})," array in chat completions when calling this agent."]})]}),z&&(0,ey.jsxs)("div",{className:"flex flex-wrap items-center gap-2 pt-2",children:[H&&(0,ey.jsxs)(ey.Fragment,{children:[(0,ey.jsx)(eC.Button,{type:"primary",icon:(0,ey.jsx)(ek.SaveOutlined,{}),onClick:Q,loading:U,disabled:!j?.trim()||!k,children:"Update Agent"}),(0,ey.jsx)(eC.Button,{type:"default",danger:!0,icon:(0,ey.jsx)(ew.DeleteOutlined,{}),onClick:()=>{z&&H&&e&&eT.Modal.confirm({title:"Delete agent",content:`Are you sure you want to delete "${z.model_name}"? This cannot be undone.`,okText:"Delete",okType:"danger",cancelText:"Cancel",onOk:async()=>{q(!0);try{await (0,eM.modelDeleteCall)(e,H),eI.default.success("Agent deleted");let t=(await J()).filter(e=>nd(e)!==H);g(t.length>0?nu(t[0]):null)}catch(e){eI.default.fromBackend("Failed to delete agent")}finally{q(!1)}}})},loading:D,children:"Delete"})]}),(0,ey.jsx)(eC.Button,{type:"primary",icon:(0,ey.jsx)(ev.CommentOutlined,{}),onClick:()=>x("chat"),children:"Test in Chat"})]})]}):null})},{key:"chat",label:(0,ey.jsxs)("span",{children:[(0,ey.jsx)(ev.CommentOutlined,{className:"mr-1"})," Chat"]}),disabled:F,children:(0,ey.jsx)("div",{className:"flex h-full flex-col min-h-0",children:z?(0,ey.jsx)(ni,{simplified:!0,fixedModel:z.model_name,accessToken:e,token:t,userRole:r,userID:s,disabledPersonalKeyCreation:a,proxySettings:n},z.model_name):(0,ey.jsx)("div",{className:"flex flex-1 items-center justify-center text-gray-500",children:"Save an agent first to test in Chat."})})},{key:"test",label:(0,ey.jsxs)("span",{children:[(0,ey.jsx)(ej.ExperimentOutlined,{className:"mr-1"})," Batch Test"]}),disabled:F,children:(0,ey.jsx)("div",{className:"flex h-full flex-col min-h-0",children:z?(0,ey.jsx)(tp,{accessToken:e,disabledPersonalKeyCreation:a,backendMode:"chat_completions",fixedModel:z.model_name,proxySettings:n}):(0,ey.jsx)("div",{className:"flex flex-1 items-center justify-center text-gray-500",children:"Select an agent to run batch tests."})})},{key:"connect",label:(0,ey.jsxs)("span",{children:[(0,ey.jsx)(e_.LinkOutlined,{className:"mr-1"})," Connect"]}),disabled:F,children:(0,ey.jsx)("div",{className:"h-full overflow-y-auto p-6",children:z?(0,ey.jsx)(nc,{agentName:z.model_name,proxySettings:n,customProxyBaseUrl:l,accessToken:e,userID:s,disabledPersonalKeyCreation:a,creatingKey:y,createdKeyValue:v,onCreateKey:Z}):(0,ey.jsx)("div",{className:"flex flex-1 items-center justify-center text-gray-500",children:"Select an agent to see how to connect."})})}]})})]})]})]}):(0,ey.jsx)("div",{className:"flex h-full items-center justify-center p-8 text-gray-500",children:"Sign in to use Agent Builder."})}var np=e.i(741466),ng=e.i(655063),nf=e.i(239616);let nx=(0,eJ.default)("user-round",[["circle",{cx:"12",cy:"8",r:"5",key:"1hypcn"}],["path",{d:"M20 21a8 8 0 0 0-16 0",key:"rfgkzh"}]]);function ny({messages:e,isLoading:t}){if(0===e.length)return(0,ey.jsx)("div",{className:"h-full"});let s=[],r=0;for(;r(0,ey.jsxs)("div",{className:"whitespace-pre-wrap wrap-break-word",style:{wordWrap:"break-word",overflowWrap:"break-word",wordBreak:"break-word",hyphens:"auto"},children:[(0,ey.jsx)(aU,{message:e}),(0,ey.jsx)(ak.default,{components:{code({node:e,inline:t,className:s,children:r,...a}){let n=/language-(\w+)/.exec(s||"");return!t&&n?(0,ey.jsx)(tq.Prism,{style:tW.coy,language:n[1],PreTag:"div",className:"rounded-md my-2",wrapLines:!0,wrapLongLines:!0,...a,children:String(r).replace(/\n$/,"")}):(0,ey.jsx)("code",{className:`${s} px-1.5 py-0.5 rounded-sm bg-gray-100 text-sm font-mono`,...a,children:r})},pre:({node:e,...t})=>(0,ey.jsx)("pre",{style:{overflowX:"auto",maxWidth:"100%"},...t})},children:"string"==typeof e.content?e.content:""})]});return(0,ey.jsxs)("div",{className:"flex flex-col gap-6 min-w-0 w-full p-4",children:[s.map((e,r)=>{let n=e.assistant,i=n?.model||"Assistant";return(0,ey.jsxs)("div",{className:"space-y-4",children:[e.user&&(0,ey.jsxs)("div",{className:"space-y-2 min-w-0",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-3",children:[(0,ey.jsx)("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-100 text-blue-600",children:(0,ey.jsx)(nx,{size:16})}),(0,ey.jsx)("div",{className:"text-sm font-semibold text-gray-700",children:"You"})]}),a(e.user)]}),(0,ey.jsx)("div",{className:"border-t border-gray-200"}),n?(0,ey.jsxs)("div",{className:"space-y-3 min-w-0",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-3",children:[(0,ey.jsx)("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-gray-100 text-gray-600",children:(0,ey.jsx)(eH.Bot,{size:16})}),(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)("span",{className:"text-sm font-semibold text-gray-700",children:i}),n.toolName&&(0,ey.jsx)("span",{className:"rounded-sm bg-gray-100 px-2 py-0.5 text-xs text-gray-600",children:n.toolName})]})]}),n.reasoningContent&&(0,ey.jsx)(aH.default,{reasoningContent:n.reasoningContent}),n.searchResults&&(0,ey.jsx)(aX,{searchResults:n.searchResults}),a(n),(n.timeToFirstToken||n.totalLatency||n.usage)&&(0,ey.jsx)(aJ.default,{timeToFirstToken:n.timeToFirstToken,totalLatency:n.totalLatency,usage:n.usage,toolName:n.toolName})]}):t&&r===s.length-1?(0,ey.jsxs)("div",{className:"flex items-center gap-2 text-sm text-gray-500",children:[(0,ey.jsx)(e4.Loader2,{size:18,className:"animate-spin"}),(0,ey.jsx)("span",{children:"Generating response..."})]}):(0,ey.jsx)("div",{className:"text-sm text-gray-500",children:"Waiting for a response..."})]},r)}),t&&0===s.length&&(0,ey.jsxs)("div",{className:"flex items-center gap-2 text-gray-500",children:[(0,ey.jsx)(e4.Loader2,{size:18,className:"animate-spin"}),(0,ey.jsx)("span",{children:"Generating response..."})]})]})}function nb({value:e,options:t,loading:s,config:r,onChange:a}){return(0,ey.jsx)(eA.Select,{value:e||void 0,placeholder:s?`Loading ${r.selectorLabel.toLowerCase()}s...`:r.selectorPlaceholder,onChange:a,loading:s,showSearch:!0,filterOption:(e,t)=>(t?.label??"").toLowerCase().includes(e.toLowerCase()),options:t,className:"w-48 md:w-64 lg:w-72",notFoundContent:s?(0,ey.jsx)("div",{className:"flex items-center justify-center py-2",children:(0,ey.jsx)(eP.Spin,{size:"small"})}):`No ${r.selectorLabel.toLowerCase()}s available`})}var nv=e.i(312361);let nw="/v1/chat/completions",nj="/a2a",n_={[nw]:{id:nw,label:"/v1/chat/completions",selectorType:"model",selectorLabel:"Model",selectorPlaceholder:"Select a model",inputPlaceholder:"Send a prompt to compare models",loadingMessage:"Gathering responses from all models...",validationMessage:"Select a model before sending a message."},[nj]:{id:nj,label:"/a2a (Agents)",selectorType:"agent",selectorLabel:"Agent",selectorPlaceholder:"Select an agent",inputPlaceholder:"Send a message to compare agents",loadingMessage:"Gathering responses from all agents...",validationMessage:"Select an agent before sending a message."}},nN=e=>"agent"===n_[e].selectorType,nS=(e,t)=>nN(t)?e.agent:e.model;function nk({comparison:e,onUpdate:t,onRemove:s,canRemove:r,selectorOptions:a,isLoadingOptions:n,endpointConfig:i,apiKey:l}){let o=nN(i.id),c=nS(e,i.id),[d,u]=(0,eb.useState)(!1),m=(s,r)=>{t({[s]:r},e.applyAcrossModels?{applyToAll:!0,keysToApply:[s]}:void 0)},h=e.useAdvancedParams?1:.4,p=e.useAdvancedParams?"text-gray-700":"text-gray-400",g=(0,ey.jsxs)("div",{className:"w-[300px] max-h-[65vh] overflow-y-auto relative",children:[(0,ey.jsx)("button",{onClick:()=>{u(!1)},className:"absolute top-0 right-0 p-1 hover:bg-gray-100 rounded-sm transition-colors text-gray-500 hover:text-gray-700 z-10",children:(0,ey.jsx)(td.X,{size:14})}),(0,ey.jsxs)("div",{className:"space-y-2",children:[(0,ey.jsx)("div",{className:"flex items-center gap-2",children:(0,ey.jsx)(an.Checkbox,{checked:e.applyAcrossModels,onChange:s=>{s.target.checked?t({applyAcrossModels:!0,temperature:e.temperature,maxTokens:e.maxTokens,tags:[...e.tags],vectorStores:[...e.vectorStores],guardrails:[...e.guardrails],useAdvancedParams:e.useAdvancedParams},{applyToAll:!0,keysToApply:["temperature","maxTokens","tags","vectorStores","guardrails","useAdvancedParams"]}):t({applyAcrossModels:!1})},children:(0,ey.jsx)("span",{className:"text-xs font-medium",children:"Sync Settings Across Models"})})}),(0,ey.jsx)(nv.Divider,{className:"border-gray-200"}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h4",{className:"text-xs font-semibold text-gray-700 mb-1.5 uppercase tracking-wide",children:"General Settings"}),(0,ey.jsxs)("div",{className:"space-y-2",children:[(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"text-xs font-medium text-gray-600 block mb-0.5",children:"Tags"}),(0,ey.jsx)(t0,{value:e.tags,onChange:e=>m("tags",e),accessToken:l})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"text-xs font-medium text-gray-600 block mb-0.5",children:"Vector Stores"}),(0,ey.jsx)(t1.default,{value:e.vectorStores,onChange:e=>m("vectorStores",e),accessToken:l})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("label",{className:"text-xs font-medium text-gray-600 block mb-0.5",children:"Guardrails"}),(0,ey.jsx)(tJ.default,{value:e.guardrails,onChange:e=>m("guardrails",e),accessToken:l})]})]})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsx)("h4",{className:"text-xs font-semibold text-gray-700 mb-1.5 uppercase tracking-wide",children:"Advanced Settings"}),(0,ey.jsxs)("div",{className:"space-y-2",children:[(0,ey.jsx)("div",{className:"flex items-center gap-2 pb-1",children:(0,ey.jsx)(an.Checkbox,{checked:e.useAdvancedParams,onChange:s=>{t({useAdvancedParams:s.target.checked},e.applyAcrossModels?{applyToAll:!0,keysToApply:["useAdvancedParams"]}:void 0)},children:(0,ey.jsx)("span",{className:"text-sm font-medium",children:"Use Advanced Parameters"})})}),(0,ey.jsxs)("div",{className:"space-y-2 transition-opacity duration-200",style:{opacity:h},children:[(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,ey.jsx)("label",{className:`text-xs font-medium ${p}`,children:"Temperature"}),(0,ey.jsx)("span",{className:`text-xs ${p}`,children:e.temperature.toFixed(2)})]}),(0,ey.jsx)(ai.Slider,{min:0,max:2,step:.01,value:e.temperature,onChange:e=>{m("temperature",Math.min(2,Math.max(0,Number((Array.isArray(e)?e[0]:e).toFixed(2)))))},disabled:!e.useAdvancedParams})]}),(0,ey.jsxs)("div",{children:[(0,ey.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,ey.jsx)("label",{className:`text-xs font-medium ${p}`,children:"Max Tokens"}),(0,ey.jsx)("span",{className:`text-xs ${p}`,children:e.maxTokens})]}),(0,ey.jsx)(ai.Slider,{min:1,max:32768,step:1,value:e.maxTokens,onChange:e=>{m("maxTokens",Math.min(32768,Math.max(1,Math.round(Array.isArray(e)?e[0]:e))))},disabled:!e.useAdvancedParams})]})]})]})]})]})]});return(0,ey.jsxs)("div",{className:"bg-white first:border-l-0 border-l border-gray-200 flex flex-col min-h-0",children:[(0,ey.jsxs)("div",{className:"border-b flex items-center justify-between gap-3 px-4 py-3",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-3 flex-1",children:[(0,ey.jsx)(nb,{value:c,options:a,loading:n,config:i,onChange:e=>t(o?{agent:e}:{model:e})}),(0,ey.jsx)("div",{className:"flex items-center gap-2",children:(0,ey.jsx)(tL.Popover,{content:g,trigger:[],open:d,onOpenChange:()=>{},placement:"bottomRight",destroyTooltipOnHide:!1,children:(0,ey.jsx)("button",{onClick:e=>{e.stopPropagation(),u(e=>!e)},className:`p-2 rounded-lg transition-colors ${d?"bg-gray-200 text-gray-700":"hover:bg-gray-100 text-gray-600"}`,children:(0,ey.jsx)(nf.Settings,{size:18})})})})]}),r&&(0,ey.jsx)("button",{onClick:e=>{e.stopPropagation(),s()},className:"p-2 hover:bg-red-50 text-red-600 rounded-lg transition-colors",children:(0,ey.jsx)(td.X,{size:18})})]}),(0,ey.jsx)("div",{className:"relative flex-1 flex flex-col min-h-0",children:(0,ey.jsx)("div",{className:"flex-1 max-h-[calc(100vh-385px)] overflow-auto rounded-b-2xl",children:(0,ey.jsx)(ny,{messages:e.messages,isLoading:e.isLoading})})})]})}let{TextArea:nC}=eE.Input;function nE({value:e,onChange:t,onSend:s,disabled:r,hasAttachment:a,uploadComponent:n}){let i=!r&&(e.trim().length>0||!!a);return(0,ey.jsx)("div",{className:"flex items-center gap-2",children:(0,ey.jsxs)("div",{className:"flex items-center flex-1 bg-white border border-gray-300 rounded-xl px-3 py-1 min-h-[44px]",children:[n&&(0,ey.jsx)("div",{className:"shrink-0 mr-2",children:n}),(0,ey.jsx)(nC,{value:e,onChange:e=>t(e.target.value),onKeyDown:e=>{"Enter"===e.key&&!e.shiftKey&&(e.preventDefault(),i&&s())},placeholder:"Type your message... (Shift+Enter for new line)",disabled:r,className:"flex-1",autoSize:{minRows:1,maxRows:4},style:{resize:"none",border:"none",boxShadow:"none",background:"transparent",padding:"4px 0",fontSize:"14px",lineHeight:"20px"}}),(0,ey.jsx)(eC.Button,{onClick:s,disabled:!i,icon:(0,ey.jsx)(tf.ArrowUpOutlined,{}),shape:"circle"})]})})}let nT=["Can you summarize the key points?","What assumptions did you make?","What are the next steps?"],nA=["Write me a poem","Explain quantum computing","Draft a polite email requesting a meeting"];function nP({accessToken:e,disabledPersonalKeyCreation:t}){let[s,r]=(0,eb.useState)([{id:"1",model:"",agent:"",messages:[],isLoading:!1,tags:[],mcpTools:[],vectorStores:[],guardrails:[],temperature:1,maxTokens:2048,applyAcrossModels:!1,useAdvancedParams:!1},{id:"2",model:"",agent:"",messages:[],isLoading:!1,tags:[],mcpTools:[],vectorStores:[],guardrails:[],temperature:1,maxTokens:2048,applyAcrossModels:!1,useAdvancedParams:!1}]),[a,n]=(0,eb.useState)([]),[i,l]=(0,eb.useState)([]),[o,c]=(0,eb.useState)(!1),[d,u]=(0,eb.useState)(!1),[m,h]=(0,eb.useState)(nw),p=n_[m],g=nN(m),f=g?i.map(e=>({value:e.agent_name,label:e.agent_name||e.agent_id})):a.map(e=>({value:e,label:e})),x=g?d:o,[y,b]=(0,eb.useState)(""),[v,w]=(0,eb.useState)(null),[j,_]=(0,eb.useState)(null),[N,S]=(0,eb.useState)(t?"custom":"session"),[k,C]=(0,eb.useState)(""),[E]=(0,ng.useDebouncedValue)(k,{wait:np.DEBOUNCE_WAIT_MS}),[T]=(0,eb.useState)(()=>sessionStorage.getItem("customProxyBaseUrl")||"");(0,eb.useEffect)(()=>()=>{j&&URL.revokeObjectURL(j)},[j]);let A=(0,eb.useMemo)(()=>"session"===N?e||"":E.trim(),[N,e,E]),P=(0,eb.useMemo)(()=>s.length>0&&s.every(e=>!e.isLoading&&e.messages.some(e=>"assistant"===e.role)),[s]);(0,eb.useEffect)(()=>{let e=!0;return(async()=>{if(!A)return n([]);c(!0);try{let t=await (0,eU.fetchAvailableModels)(A);if(!e)return;let s=Array.from(new Set(t.map(e=>e.model_group)));n(s)}catch(t){console.error("CompareUI: failed to fetch models",t),e&&n([])}finally{e&&c(!1)}})(),()=>{e=!1}},[A]),(0,eb.useEffect)(()=>{let e=!0;return(async()=>{if(!A||!g)return l([]);u(!0);try{let t=await e$(A,T||void 0);if(!e)return;l(t)}catch(t){console.error("CompareUI: failed to fetch agents",t),e&&l([])}finally{e&&u(!1)}})(),()=>{e=!1}},[A,g]),(0,eb.useEffect)(()=>{0!==a.length&&r(e=>e.map((e,t)=>({...e,temperature:e.temperature??1,maxTokens:e.maxTokens??2048,applyAcrossModels:e.applyAcrossModels??!1,useAdvancedParams:e.useAdvancedParams??!1,...e.model?{}:{model:a[t%a.length]??""}})))},[a]);let R=()=>{j&&URL.revokeObjectURL(j),w(null),_(null)},O=(e,t)=>{r(s=>s.map(s=>{if(s.id!==e)return s;let r=[...s.messages],a=r[r.length-1];return a&&"assistant"===a.role?r[r.length-1]={...a,timeToFirstToken:t}:a&&"user"===a.role&&r.push({role:"assistant",content:"",timeToFirstToken:t}),{...s,messages:r}}))},I=(e,t)=>{r(s=>s.map(s=>{if(s.id!==e)return s;let r=[...s.messages],a=r[r.length-1];return a&&"assistant"===a.role?r[r.length-1]={...a,totalLatency:t}:a&&"user"===a.role&&r.push({role:"assistant",content:"",totalLatency:t}),{...s,messages:r}}))},M=!!e,$=async e=>{let t=e.trim(),a=!!v;if(!t&&!a)return;if(!A)return void eI.default.fromBackend("Please provide a Virtual Key or select Current UI Session");if(0===s.length)return;if(s.some(e=>{let t;return!((t=nS(e,m))&&t.trim())}))return void eI.default.fromBackend(p.validationMessage);let n=a?await ag(t,v):{role:"user",content:t},i=af(t,a,j||void 0,v?.name),l=new Map;s.forEach(e=>{let s=e.traceId??tH(),r=[...e.messages.map(({role:e,content:t})=>({role:e,content:Array.isArray(t)||"string"==typeof t?t:""})),n];l.set(e.id,{id:e.id,model:e.model,agent:e.agent,inputMessage:t,traceId:s,tags:e.tags,vectorStores:e.vectorStores,guardrails:e.guardrails,temperature:e.temperature,maxTokens:e.maxTokens,displayMessages:[...e.messages,i],apiChatHistory:r})}),0!==l.size&&(r(e=>e.map(e=>{let t=l.get(e.id);return t?{...e,traceId:t.traceId,messages:t.displayMessages,isLoading:!0}:e})),b(""),R(),l.forEach(e=>{let t=e.tags.length>0?e.tags:void 0,a=e.vectorStores.length>0?e.vectorStores:void 0,n=e.guardrails.length>0?e.guardrails:void 0,i=s.find(t=>t.id===e.id),l=i?.useAdvancedParams??!1;(g?t4(e.agent,e.inputMessage,(t,s)=>{r(r=>r.map(r=>{if(r.id!==e.id)return r;let a=[...r.messages],n=a[a.length-1];return n&&"assistant"===n.role?a[a.length-1]={...n,content:t,model:n.model??s}:a.push({role:"assistant",content:t,model:s}),{...r,messages:a}}))},A,void 0,t=>O(e.id,t),t=>I(e.id,t),void 0,T||void 0):eW(e.apiChatHistory,(t,s)=>{var a;return a=e.id,void(t&&r(e=>e.map(e=>{if(e.id!==a)return e;let r=[...e.messages],n=r[r.length-1];if(n&&"assistant"===n.role){let e="string"==typeof n.content?n.content:"";r[r.length-1]={...n,content:e+t,model:n.model??s}}else r.push({role:"assistant",content:t,model:s});return{...e,messages:r}})))},e.model,A,t,void 0,t=>{var s;return s=e.id,void(t&&r(e=>e.map(e=>{if(e.id!==s)return e;let r=[...e.messages],a=r[r.length-1];return a&&"assistant"===a.role?r[r.length-1]={...a,reasoningContent:(a.reasoningContent||"")+t}:a&&"user"===a.role&&r.push({role:"assistant",content:"",reasoningContent:t}),{...e,messages:r}})))},t=>O(e.id,t),t=>{var s,a;return s=e.id,void r(e=>e.map(e=>{if(e.id!==s)return e;let r=[...e.messages],n=r[r.length-1];return n&&"assistant"===n.role&&(r[r.length-1]={...n,usage:t,toolName:a}),{...e,messages:r}}))},e.traceId,a,n,void 0,void 0,void 0,t=>{var s;return s=e.id,void(t&&r(e=>e.map(e=>{if(e.id!==s)return e;let r=[...e.messages],a=r[r.length-1];return a&&"assistant"===a.role&&(r[r.length-1]={...a,searchResults:t}),{...e,messages:r}})))},l?e.temperature:void 0,l?e.maxTokens:void 0,t=>I(e.id,t),T||void 0)).catch(t=>{let s=t instanceof Error?t.message:String(t);console.error("CompareUI: failed to fetch response",t),eI.default.fromBackend(s),r(t=>t.map(t=>{if(t.id!==e.id)return t;let r=[...t.messages],a=r[r.length-1],n=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:"";return a&&"assistant"===a.role?r[r.length-1]={...a,content:n?`${n} -Error fetching response: ${s}`:`Error fetching response: ${s}`}:r.push({role:"assistant",content:`Error fetching response: ${s}`}),{...t,messages:r}}))}).finally(()=>{r(t=>t.map(t=>t.id===e.id?{...t,isLoading:!1}:t))})}))},L=e=>{b(e)},U=s.some(e=>e.messages.length>0),B=s.some(e=>e.isLoading),D=!!v,q=!!v?.name.toLowerCase().endsWith(".pdf"),W=!U&&!B&&!D;return(0,ey.jsx)("div",{className:"w-full h-full p-4 bg-white",children:(0,ey.jsxs)("div",{className:"rounded-2xl border border-gray-200 bg-white shadow-xs min-h-[calc(100vh-160px)] flex flex-col",children:[(0,ey.jsx)("div",{className:"border-b px-4 py-2",children:(0,ey.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)("span",{className:"text-sm font-medium text-gray-600",children:"Virtual Key Source"}),(0,ey.jsxs)(eA.Select,{value:N,onChange:e=>S(e),disabled:t,className:"w-48",children:[(0,ey.jsx)(eA.Select.Option,{value:"session",disabled:!M,children:"Current UI Session"}),(0,ey.jsx)(eA.Select.Option,{value:"custom",children:"Virtual Key"})]}),"custom"===N&&(0,ey.jsx)(eE.Input.Password,{value:k,onChange:e=>C(e.target.value),placeholder:"Enter Virtual Key",className:"w-56"})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-2",children:[(0,ey.jsx)("span",{className:"text-sm font-medium text-gray-600",children:"Endpoint"}),(0,ey.jsx)(eA.Select,{value:m,onChange:e=>h(e),className:"w-56",children:Object.values(n_).map(e=>({value:e.id,label:e.label})).map(e=>(0,ey.jsx)(eA.Select.Option,{value:e.value,children:e.label},e.value))})]}),(0,ey.jsxs)("div",{className:"flex items-center gap-3",children:[(0,ey.jsx)(eC.Button,{onClick:()=>{r(e=>e.map(e=>({...e,messages:[],traceId:void 0,isLoading:!1}))),b(""),R()},disabled:!U,icon:(0,ey.jsx)(tx.ClearOutlined,{}),children:"Clear All Chats"}),(0,ey.jsx)(tU.Tooltip,{title:s.length>=3?"Compare up to 3 models at a time":"Add another comparison",children:(0,ey.jsx)(eC.Button,{onClick:()=>{if(s.length>=3)return;let e=a[s.length%(a.length||1)]??"",t=i[s.length%(i.length||1)]?.agent_name??"",n={id:Date.now().toString(),model:e,agent:t,messages:[],isLoading:!1,tags:[],mcpTools:[],vectorStores:[],guardrails:[],temperature:1,maxTokens:2048,applyAcrossModels:!1,useAdvancedParams:!1};r(e=>[...e,n])},disabled:s.length>=3,icon:(0,ey.jsx)(eN.PlusOutlined,{}),children:"Add Comparison"})})]})]})}),(0,ey.jsx)("div",{className:"grid flex-1 min-h-0 auto-rows-fr",style:{gridTemplateColumns:`repeat(${s.length}, minmax(0, 1fr))`},children:s.map(e=>(0,ey.jsx)(nk,{comparison:e,onUpdate:(t,s)=>{var a;return a=e.id,void r(e=>{if(s?.applyToAll&&s.keysToApply?.length){let r={};s.keysToApply.forEach(e=>{let s=t[e];void 0!==s&&(r[e]=Array.isArray(s)?[...s]:s)});let n=Object.keys(r).length>0;return e.map(e=>e.id===a?{...e,...t}:n?{...e,...r}:e)}return e.map(e=>e.id===a?{...e,...t}:e)})},onRemove:()=>{var t;return t=e.id,void(s.length>1&&r(e=>e.filter(e=>e.id!==t)))},canRemove:s.length>1,selectorOptions:f,isLoadingOptions:x,endpointConfig:p,apiKey:A},e.id))}),(0,ey.jsx)("div",{className:"flex justify-center pb-4",children:(0,ey.jsx)("div",{className:"w-full max-w-3xl px-4",children:(0,ey.jsxs)("div",{className:"border border-gray-200 shadow-lg rounded-xl bg-white p-4",children:[(0,ey.jsx)("div",{className:"flex items-center justify-between gap-4 mb-3 min-h-8",children:D?(0,ey.jsx)("span",{className:"text-sm text-gray-500",children:"Attachment ready to send"}):W?(0,ey.jsx)("div",{className:"flex items-center gap-2 overflow-x-auto",children:nA.map(e=>(0,ey.jsx)("button",{type:"button",onClick:()=>L(e),className:"shrink-0 rounded-full border border-gray-200 px-3 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 cursor-pointer",children:e},e))}):P&&!D?(0,ey.jsx)("div",{className:"flex items-center gap-2 overflow-x-auto",children:nT.map(e=>(0,ey.jsx)("button",{type:"button",onClick:()=>L(e),className:"shrink-0 rounded-full border border-gray-200 px-3 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 cursor-pointer",children:e},e))}):B?(0,ey.jsxs)("span",{className:"flex items-center gap-2 text-sm text-gray-500",children:[(0,ey.jsx)("span",{className:"h-2 w-2 rounded-full bg-blue-500 animate-pulse","aria-hidden":!0}),p.loadingMessage]}):(0,ey.jsx)("span",{className:"text-sm text-gray-500",children:p.inputPlaceholder})}),v&&(0,ey.jsx)("div",{className:"mb-3",children:(0,ey.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-gray-50 rounded-lg border border-gray-200",children:[(0,ey.jsx)("div",{className:"relative inline-block",children:q?(0,ey.jsx)("div",{className:"w-10 h-10 rounded-md bg-red-500 flex items-center justify-center",children:(0,ey.jsx)(a_.FilePdfOutlined,{style:{fontSize:"16px",color:"white"}})}):(0,ey.jsx)("img",{src:j||"",alt:"Upload preview",className:"w-10 h-10 rounded-md border border-gray-200 object-cover"})}),(0,ey.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,ey.jsx)("div",{className:"text-sm font-medium text-gray-900 truncate",children:v.name}),(0,ey.jsx)("div",{className:"text-xs text-gray-500",children:q?"PDF":"Image"})]}),(0,ey.jsx)("button",{className:"flex items-center justify-center w-6 h-6 text-gray-400 hover:text-gray-600 hover:bg-gray-200 rounded-full transition-colors",onClick:R,children:(0,ey.jsx)(ew.DeleteOutlined,{style:{fontSize:"12px"}})})]})}),(0,ey.jsx)(nE,{value:y,onChange:e=>{b(e)},onSend:()=>{$(y)},disabled:0===s.length||s.every(e=>e.isLoading),hasAttachment:D,uploadComponent:(0,ey.jsx)(ap,{chatUploadedImage:v,chatImagePreviewUrl:j,onImageUpload:e=>(j&&URL.revokeObjectURL(j),w(e),_(URL.createObjectURL(e)),!1),onRemoveImage:R})})]})})})]})})}var nR=e.i(653824),nO=e.i(881073),nI=e.i(197647),nM=e.i(723731),n$=e.i(404206),nL=e.i(541202),nU=e.i(135214),nB=e.i(62478);e.s(["default",0,function(){let{accessToken:e,userRole:t,userId:s,disabledPersonalKeyCreation:r,token:a}=(0,nU.default)(),[n,i]=(0,eb.useState)(void 0);return(0,eb.useEffect)(()=>{(async()=>{if(e){let t=await (0,nB.fetchProxySettings)(e);t&&i({PROXY_BASE_URL:t.PROXY_BASE_URL,LITELLM_UI_API_DOC_BASE_URL:t.LITELLM_UI_API_DOC_BASE_URL})}})()},[e]),(0,ey.jsx)("div",{className:"h-full w-full flex flex-col",children:(0,ey.jsxs)(nR.TabGroup,{className:"w-full",style:{flex:1,minHeight:0,display:"flex",flexDirection:"column"},children:[(0,ey.jsxs)(nO.TabList,{className:"mb-0",children:[(0,ey.jsx)(nI.Tab,{children:"Chat"}),(0,ey.jsx)(nI.Tab,{children:"Compare"}),(0,ey.jsx)(nI.Tab,{children:"Compliance"}),(0,ey.jsx)(nI.Tab,{children:"Agent Builder (Experimental)"})]}),(0,ey.jsxs)(nM.TabPanels,{className:"h-full",children:[(0,ey.jsx)(n$.TabPanel,{className:"h-full",children:(0,ey.jsx)(ni,{accessToken:e,token:a,userRole:t,userID:s,disabledPersonalKeyCreation:r,proxySettings:n})}),(0,ey.jsx)(n$.TabPanel,{className:"h-full",children:(0,ey.jsx)(nP,{accessToken:e,disabledPersonalKeyCreation:r})}),(0,ey.jsx)(n$.TabPanel,{className:"h-full",children:(0,ey.jsx)(tp,{accessToken:e,disabledPersonalKeyCreation:r})}),(0,ey.jsxs)(n$.TabPanel,{className:"h-full",children:[(0,ey.jsx)(nL.DeprecationBanner,{featureName:"The Playground's Agent Builder"}),(0,ey.jsx)(nh,{accessToken:e,token:a,userID:s,userRole:t,disabledPersonalKeyCreation:r,proxySettings:n,customProxyBaseUrl:n?.LITELLM_UI_API_DOC_BASE_URL??n?.PROXY_BASE_URL})]})]})]})})}],213970)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0wo6dp1zxhzve.js b/litellm/proxy/_experimental/out/_next/static/chunks/0wo6dp1zxhzve.js deleted file mode 100644 index bf3e7abe6b7..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0wo6dp1zxhzve.js +++ /dev/null @@ -1,10 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},954616,e=>{"use strict";var t=e.i(271645),r=e.i(114272),n=e.i(540143),o=e.i(915823),l=e.i(619273),i=class extends o.Subscribable{#e;#t=void 0;#r;#n;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#o()}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,l.shallowEqualObjects)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#r,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,l.hashKey)(t.mutationKey)!==(0,l.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.#o(),this.#l(e)}getCurrentResult(){return this.#t}reset(){this.#r?.removeObserver(this),this.#r=void 0,this.#o(),this.#l()}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)}#o(){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}}#l(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)})})}},a=e.i(912598);e.s(["useMutation",0,function(e,r){let o=(0,a.useQueryClient)(r),[s]=t.useState(()=>new i(o,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let c=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(n.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),d=t.useCallback((e,t)=>{s.mutate(e,t).catch(l.noop)},[s]);if(c.error&&(0,l.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),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 o=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(o.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["ExclamationCircleOutlined",0,l],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),n=e.i(529681),o=e.i(242064),l=e.i(517455),i=e.i(185793),a=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 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 c=e=>{var{prefixCls:n,className:l,hoverable:i=!0}=e,a=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:c}=t.useContext(o.ConfigContext),d=c("card",n),u=(0,r.default)(`${d}-grid`,l,{[`${d}-grid-hoverable`]:i});return t.createElement("div",Object.assign({},a,{className:u}))};e.i(296059);var d=e.i(915654),u=e.i(183293),g=e.i(246422),m=e.i(838378);let p=(0,g.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:r,cardHeadPadding:n,colorBorderSecondary:o,boxShadowTertiary:l,bodyPadding:i,extraColor:a}=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:r,headerHeight:n,headerPadding:o,tabsMarginBottom:l}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:n,marginBottom:-1,padding:`0 ${(0,d.unit)(o)}`,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),{[` - > ${r}-typography, - > ${r}-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,d.unit)(e.lineWidth)} ${e.lineType} ${e.colorBorderSecondary}`}}})})(e),[`${t}-extra`]:{marginInlineStart:"auto",color:a,fontWeight:"normal",fontSize:e.fontSize},[`${t}-body`]:{padding:i,borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:r,cardShadow:n,lineWidth:o}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` - ${(0,d.unit)(o)} 0 0 0 ${r}, - 0 ${(0,d.unit)(o)} 0 0 ${r}, - ${(0,d.unit)(o)} ${(0,d.unit)(o)} 0 0 ${r}, - ${(0,d.unit)(o)} 0 0 0 ${r} inset, - 0 ${(0,d.unit)(o)} 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,d.unit)(e.borderRadiusLG)} ${(0,d.unit)(e.borderRadiusLG)} 0 0`}},[`${t}-actions`]:(e=>{let{componentCls:t,iconCls:r,actionsLiMargin:n,cardActionsIconSize:o,colorBorderSecondary:l,actionsBg:i}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:i,borderTop:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${l}`,display:"flex",borderRadius:`0 0 ${(0,d.unit)(e.borderRadiusLG)} ${(0,d.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,d.unit)(e.fontHeight),transition:`color ${e.motionDurationMid}`,"&:hover":{color:e.colorPrimary}},[`> ${r}`]:{fontSize:o,lineHeight:(0,d.unit)(e.calc(o).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,d.unit)(e.lineWidth)} ${e.lineType} ${l}`}}})})(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} ${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:r}},[`${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:n}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:r,headerPadding:n,bodyPadding:o}=e;return{[`${t}-head`]:{padding:`0 ${(0,d.unit)(n)}`,background:r,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,d.unit)(e.padding)} ${(0,d.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:r,headerPaddingSM:n,headerHeightSM:o,headerFontSizeSM:l}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:o,padding:`0 ${(0,d.unit)(n)}`,fontSize:l,[`> ${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 f=e.i(792812),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 h=e=>{let{actionClasses:r,actions:n=[],actionStyle:o}=e;return t.createElement("ul",{className:r,style:o},n.map((e,r)=>{let o=`action-${r}`;return t.createElement("li",{style:{width:`${100/n.length}%`},key:o},t.createElement("span",null,e))}))},y=t.forwardRef((e,s)=>{let d,{prefixCls:u,className:g,rootClassName:m,style:y,extra:v,headStyle:O={},bodyStyle:$={},title:j,loading:x,bordered:S,variant:C,size:w,type:E,cover:k,actions:M,tabList:P,children:N,activeTabKey:T,defaultActiveTabKey:z,tabBarExtraContent:B,hoverable:L,tabProps:R={},classNames:I,styles:H}=e,G=b(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:_,direction:D,card:W}=t.useContext(o.ConfigContext),[A]=(0,f.default)("card",C,S),F=e=>{var t;return(0,r.default)(null==(t=null==W?void 0:W.classNames)?void 0:t[e],null==I?void 0:I[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==W?void 0:W.styles)?void 0:t[e]),null==H?void 0:H[e])},X=t.useMemo(()=>{let e=!1;return t.Children.forEach(N,t=>{(null==t?void 0:t.type)===c&&(e=!0)}),e},[N]),q=_("card",u),[U,Q,V]=p(q),J=t.createElement(i.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},N),Y=void 0!==T,Z=Object.assign(Object.assign({},R),{[Y?"activeKey":"defaultActiveKey"]:Y?T:z,tabBarExtraContent:B}),ee=(0,l.default)(w),et=ee&&"default"!==ee?ee:"large",er=P?t.createElement(a.default,Object.assign({size:et},Z,{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},b(e,["tab"]))})})):null;if(j||v||er){let e=(0,r.default)(`${q}-head`,F("header")),n=(0,r.default)(`${q}-head-title`,F("title")),o=(0,r.default)(`${q}-extra`,F("extra")),l=Object.assign(Object.assign({},O),K("header"));d=t.createElement("div",{className:e,style:l},t.createElement("div",{className:`${q}-head-wrapper`},j&&t.createElement("div",{className:n,style:K("title")},j),v&&t.createElement("div",{className:o,style:K("extra")},v)),er)}let en=(0,r.default)(`${q}-cover`,F("cover")),eo=k?t.createElement("div",{className:en,style:K("cover")},k):null,el=(0,r.default)(`${q}-body`,F("body")),ei=Object.assign(Object.assign({},$),K("body")),ea=t.createElement("div",{className:el,style:ei},x?J:N),es=(0,r.default)(`${q}-actions`,F("actions")),ec=(null==M?void 0:M.length)?t.createElement(h,{actionClasses:es,actionStyle:K("actions"),actions:M}):null,ed=(0,n.default)(G,["onTabChange"]),eu=(0,r.default)(q,null==W?void 0:W.className,{[`${q}-loading`]:x,[`${q}-bordered`]:"borderless"!==A,[`${q}-hoverable`]:L,[`${q}-contain-grid`]:X,[`${q}-contain-tabs`]:null==P?void 0:P.length,[`${q}-${ee}`]:ee,[`${q}-type-${E}`]:!!E,[`${q}-rtl`]:"rtl"===D},g,m,Q,V),eg=Object.assign(Object.assign({},null==W?void 0:W.style),y);return U(t.createElement("div",Object.assign({ref:s},ed,{className:eu,style:eg}),d,eo,ea,ec))});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 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};y.Grid=c,y.Meta=e=>{let{prefixCls:n,className:l,avatar:i,title:a,description:s}=e,c=v(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:d}=t.useContext(o.ConfigContext),u=d("card",n),g=(0,r.default)(`${u}-meta`,l),m=i?t.createElement("div",{className:`${u}-meta-avatar`},i):null,p=a?t.createElement("div",{className:`${u}-meta-title`},a):null,f=s?t.createElement("div",{className:`${u}-meta-description`},s):null,b=p||f?t.createElement("div",{className:`${u}-meta-detail`},p,f):null;return t.createElement("div",Object.assign({},c,{className:g}),m,b)},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),o=e.i(242064),l=e.i(517455),i=e.i(150073);let a={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 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},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 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 g=e=>{let{itemPrefixCls:n,component:o,span:l,className:i,style:a,labelStyle:c,contentStyle:d,bordered:u,label:g,content:m,colon:p,type:f,styles:b}=e,{classNames:h}=t.useContext(s),y=Object.assign(Object.assign({},c),null==b?void 0:b.label),v=Object.assign(Object.assign({},d),null==b?void 0:b.content);if(u)return t.createElement(o,{colSpan:l,style:a,className:(0,r.default)(i,{[`${n}-item-${f}`]:"label"===f||"content"===f,[null==h?void 0:h.label]:(null==h?void 0:h.label)&&"label"===f,[null==h?void 0:h.content]:(null==h?void 0:h.content)&&"content"===f})},null!=g&&t.createElement("span",{style:y},g),null!=m&&t.createElement("span",{style:v},m));return t.createElement(o,{colSpan:l,style:a,className:(0,r.default)(`${n}-item`,i)},t.createElement("div",{className:`${n}-item-container`},null!=g&&t.createElement("span",{style:y,className:(0,r.default)(`${n}-item-label`,null==h?void 0:h.label,{[`${n}-item-no-colon`]:!p})},g),null!=m&&t.createElement("span",{style:v,className:(0,r.default)(`${n}-item-content`,null==h?void 0:h.content)},m)))};function m(e,{colon:r,prefixCls:n,bordered:o},{component:l,type:i,showLabel:a,showContent:s,labelStyle:c,contentStyle:d,styles:u}){return e.map(({label:e,children:m,prefixCls:p=n,className:f,style:b,labelStyle:h,contentStyle:y,span:v=1,key:O,styles:$},j)=>"string"==typeof l?t.createElement(g,{key:`${i}-${O||j}`,className:f,style:b,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),h),null==$?void 0:$.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),y),null==$?void 0:$.content)},span:v,colon:r,component:l,itemPrefixCls:p,bordered:o,label:a?e:null,content:s?m:null,type:i}):[t.createElement(g,{key:`label-${O||j}`,className:f,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.label),b),h),null==$?void 0:$.label),span:1,colon:r,component:l[0],itemPrefixCls:p,bordered:o,label:e,type:"label"}),t.createElement(g,{key:`content-${O||j}`,className:f,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.content),b),y),null==$?void 0:$.content),span:2*v-1,component:l[1],itemPrefixCls:p,bordered:o,content:m,type:"content"})])}let p=e=>{let r=t.useContext(s),{prefixCls:n,vertical:o,row:l,index:i,bordered:a}=e;return o?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${i}`,className:`${n}-row`},m(l,e,Object.assign({component:"th",type:"label",showLabel:!0},r))),t.createElement("tr",{key:`content-${i}`,className:`${n}-row`},m(l,e,Object.assign({component:"td",type:"content",showContent:!0},r)))):t.createElement("tr",{key:i,className:`${n}-row`},m(l,e,Object.assign({component:a?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},r)))};e.i(296059);var f=e.i(915654),b=e.i(183293),h=e.i(246422),y=e.i(838378);let v=(0,h.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:r,itemPaddingBottom:n,itemPaddingEnd:o,colonMarginRight:l,colonMarginLeft:i,titleMarginBottom:a}=e;return{[t]:Object.assign(Object.assign(Object.assign({},(0,b.resetComponent)(e)),(e=>{let{componentCls:t,labelBg:r}=e;return{[`&${t}-bordered`]:{[`> ${t}-view`]:{border:`${(0,f.unit)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`,"> table":{tableLayout:"auto"},[`${t}-row`]:{borderBottom:`${(0,f.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,f.unit)(e.padding)} ${(0,f.unit)(e.paddingLG)}`,borderInlineEnd:`${(0,f.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,f.unit)(e.paddingSM)} ${(0,f.unit)(e.paddingLG)}`}}},[`&${t}-small`]:{[`${t}-row`]:{[`> ${t}-item-label, > ${t}-item-content`]:{padding:`${(0,f.unit)(e.paddingXS)} ${(0,f.unit)(e.padding)}`}}}}}})(e)),{"&-rtl":{direction:"rtl"},[`${t}-header`]:{display:"flex",alignItems:"center",marginBottom:a},[`${t}-title`]:Object.assign(Object.assign({},b.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: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,f.unit)(i)} ${(0,f.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,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 O=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 $=e=>{let g,{prefixCls:m,title:f,extra:b,column:h,colon:y=!0,bordered:$,layout:j,children:x,className:S,rootClassName:C,style:w,size:E,labelStyle:k,contentStyle:M,styles:P,items:N,classNames:T}=e,z=O(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:B,direction:L,className:R,style:I,classNames:H,styles:G}=(0,o.useComponentConfig)("descriptions"),_=B("descriptions",m),D=(0,i.default)(),W=t.useMemo(()=>{var e;return"number"==typeof h?h:null!=(e=(0,n.matchScreen)(D,Object.assign(Object.assign({},a),h)))?e:3},[D,h]),A=(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,r=d(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)(D,t)})}),[g,D])),F=(0,l.default)(E),K=((e,r)=>{let[n,o]=(0,t.useMemo)(()=>{let t,n,o,l;return t=[],n=[],o=!1,l=0,r.filter(e=>e).forEach(r=>{let{filled:i}=r,a=u(r,["filled"]);if(i){n.push(a),t.push(n),n=[],l=0;return}let s=e-l;(l+=r.span||1)>=e?(l>e?(o=!0,n.push(Object.assign(Object.assign({},a),{span:s}))):n.push(a),t.push(n),n=[],l=0):n.push(a)}),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:M,styles:{content:Object.assign(Object.assign({},G.content),null==P?void 0:P.content),label:Object.assign(Object.assign({},G.label),null==P?void 0:P.label)},classNames:{label:(0,r.default)(H.label,null==T?void 0:T.label),content:(0,r.default)(H.content,null==T?void 0:T.content)}}),[k,M,P,T,H,G]);return X(t.createElement(s.Provider,{value:Q},t.createElement("div",Object.assign({className:(0,r.default)(_,R,H.root,null==T?void 0:T.root,{[`${_}-${F}`]:F&&"default"!==F,[`${_}-bordered`]:!!$,[`${_}-rtl`]:"rtl"===L},S,C,q,U),style:Object.assign(Object.assign(Object.assign(Object.assign({},I),G.root),null==P?void 0:P.root),w)},z),(f||b)&&t.createElement("div",{className:(0,r.default)(`${_}-header`,H.header,null==T?void 0:T.header),style:Object.assign(Object.assign({},G.header),null==P?void 0:P.header)},f&&t.createElement("div",{className:(0,r.default)(`${_}-title`,H.title,null==T?void 0:T.title),style:Object.assign(Object.assign({},G.title),null==P?void 0:P.title)},f),b&&t.createElement("div",{className:(0,r.default)(`${_}-extra`,H.extra,null==T?void 0:T.extra),style:Object.assign(Object.assign({},G.extra),null==P?void 0:P.extra)},b)),t.createElement("div",{className:`${_}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,r)=>t.createElement(p,{key:r,index:r,colon:y,prefixCls:_,vertical:"vertical"===j,bordered:$,row:e}))))))))};$.Item=({children:e})=>e,e.s(["Descriptions",0,$],869216)},368869,e=>{"use strict";e.i(296059);var t=e.i(868297),r=e.i(732961),n=e.i(289882),o=e.i(170517),l=e.i(628882),i=e.i(320890),a=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),m=e.i(135551);let p=(e,t)=>new m.FastColor(e).setA(t).toRgbString(),f=(e,t)=>new m.FastColor(e).lighten(t).toHexString(),b=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]}},h=(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:f(r,12),colorBgContainer:f(r,8),colorBgLayout:f(r,0),colorBgSpotlight:f(r,26),colorBgBlur:p(n,.04),colorBorder:f(r,26),colorBorderSecondary:f(r,19)}},y={defaultSeed:i.defaultConfig.token,useToken:function(){let[e,t,r]=(0,a.useToken)();return{theme:e,token:t,hashId:r}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let r=Object.keys(o.defaultPresetColors).map(t=>{let r=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,n,o)=>(e[`${t}-${o+1}`]=r[o],e[`${t}${o+1}`]=r[o],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),n=null!=t?t:(0,s.default)(e),l=(0,g.default)(e,{generateColorPalettes:b,generateNeutralColorPalettes:h});return Object.assign(Object.assign(Object.assign(Object.assign({},n),r),l),{colorPrimaryBg:l.colorPrimaryBorder,colorPrimaryBgHover:l.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let r=null!=t?t:(0,s.default)(e),n=r.fontSizeSM,o=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,d.default)(n)),{controlHeight:o}),(0,c.default)(Object.assign(Object.assign({},r),{controlHeight:o})))},getDesignToken:e=>{let i=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):n.default,a=Object.assign(Object.assign({},o.default),null==e?void 0:e.token);return(0,r.getComputedToken)(a,{override:null==e?void 0:e.token},i,l.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),o=e.i(869216),l=e.i(311451),i=e.i(212931),a=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:m,resourceInformationTitle:p,resourceInformation:f,onCancel:b,onOk:h,confirmLoading:y,requiredConfirmation:v}){let{Title:O,Text:$}=a.Typography,{token:j}=s.theme.useToken(),[x,S]=(0,d.useState)("");return(0,d.useEffect)(()=>{e&&S("")},[e]),(0,t.jsx)(i.Modal,{title:u,open:e,onOk:h,onCancel:b,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!v&&x!==v||y},cancelButtonProps:{disabled:y},children:(0,t.jsxs)("div",{className:"space-y-4",children:[g&&(0,t.jsx)(r.Alert,{message:g,type:"warning"}),(0,t.jsx)(n.Card,{title:p,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)(o.Descriptions,{column:1,size:"small",children:f&&f.map(({label:e,value:r,...n})=>(0,t.jsx)(o.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)($,{...n,children:r??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)($,{children:m})}),v&&(0,t.jsxs)("div",{className:"mb-6 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:[(0,t.jsxs)($,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)($,{children:"Type "}),(0,t.jsx)($,{strong:!0,type:"danger",children:v}),(0,t.jsx)($,{children:" to confirm deletion:"})]}),(0,t.jsx)(l.Input,{value:x,onChange:e=>S(e.target.value),placeholder:v,className:"rounded-md",prefix:(0,t.jsx)(c.ExclamationCircleOutlined,{style:{color:j.colorError}}),autoFocus:!0})]})]})})}])},362024,e=>{"use strict";var t=e.i(988122);e.s(["Collapse",()=>t.default])},166406,e=>{"use strict";var t=e.i(190144);e.s(["CopyOutlined",()=>t.default])},637235,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:"M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z"}}]},name:"clock-circle",theme:"outlined"};var o=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(o.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["ClockCircleOutlined",0,l],637235)},981339,e=>{"use strict";var t=e.i(185793);e.s(["Skeleton",()=>t.default])},350967,46757,e=>{"use strict";var t=e.i(290571),r=e.i(444755),n=e.i(673706),o=e.i(271645);let l={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"},i={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"},a={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,l,"gridColsLg",0,s,"gridColsMd",0,a,"gridColsSm",0,i],46757);let c=(0,n.makeClassName)("Grid"),d=(e,t)=>e&&Object.keys(t).includes(String(e))?t[e]:"",u=o.default.forwardRef((e,n)=>{let{numItems:u=1,numItemsSm:g,numItemsMd:m,numItemsLg:p,children:f,className:b}=e,h=(0,t.__rest)(e,["numItems","numItemsSm","numItemsMd","numItemsLg","children","className"]),y=d(u,l),v=d(g,i),O=d(m,a),$=d(p,s),j=(0,r.tremorTwMerge)(y,v,O,$);return o.default.createElement("div",Object.assign({ref:n,className:(0,r.tremorTwMerge)(c("root"),"grid",j,b)},h),f)});u.displayName="Grid",e.s(["Grid",0,u],350967)},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},597440,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:"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 o=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(o.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["default",0,l],597440)},955135,e=>{"use strict";var t=e.i(597440);e.s(["DeleteOutlined",()=>t.default])},743151,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.CopyToClipboard=void 0;var n=i(e.r(844343)),o=i(e.r(271645)),l=["text","onCopy","options","children"];function i(e){return e&&e.__esModule?e:{default:e}}function a(e){return(a="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 s(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},596239,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:"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),l=r.forwardRef(function(e,l){return r.createElement(o.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["LinkOutlined",0,l],596239)},21548,e=>{"use strict";var t=e.i(616303);e.s(["Empty",()=>t.default])},751904,e=>{"use strict";var t=e.i(401361);e.s(["EditOutlined",()=>t.default])},438957,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:"M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5l-41.1 41.1-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-44.9 44.9-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-65.3 65.3a8.03 8.03 0 000 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6A304.06 304.06 0 00608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644c-60.9 0-118.2-23.7-161.2-66.8-43.1-43-66.8-100.3-66.8-161.2 0-60.9 23.7-118.2 66.8-161.2 43-43.1 100.3-66.8 161.2-66.8 60.9 0 118.2 23.7 161.2 66.8 43.1 43 66.8 100.3 66.8 161.2 0 60.9-23.7 118.2-66.8 161.2z"}}]},name:"key",theme:"outlined"};var o=e.i(9583),l=r.forwardRef(function(e,l){return r.createElement(o.default,(0,t.default)({},e,{ref:l,icon:n}))});e.s(["KeyOutlined",0,l],438957)},823429,e=>{"use strict";let t=(0,e.i(475254).default)("square-pen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]]);e.s(["default",0,t])},700514,e=>{"use strict";var t=e.i(271645);e.s(["defaultPageSize",0,25,"useBaseUrl",0,()=>{let[e,r]=(0,t.useState)("http://localhost:4000");return(0,t.useEffect)(()=>{{let{protocol:e,host:t}=window.location;r(`${e}//${t}`)}},[]),e}])},366283,e=>{"use strict";var t=e.i(290571),r=e.i(271645),n=e.i(95779),o=e.i(444755),l=e.i(673706);let i=(0,l.makeClassName)("Callout"),a=r.default.forwardRef((e,a)=>{let{title:s,icon:c,color:d,className:u,children:g}=e,m=(0,t.__rest)(e,["title","icon","color","className","children"]);return r.default.createElement("div",Object.assign({ref:a,className:(0,o.tremorTwMerge)(i("root"),"flex flex-col overflow-hidden rounded-tremor-default text-tremor-default border-l-4 py-3 pr-3 pl-4",d?(0,o.tremorTwMerge)((0,l.getColorClassNames)(d,n.colorPalette.background).bgColor,(0,l.getColorClassNames)(d,n.colorPalette.darkBorder).borderColor,(0,l.getColorClassNames)(d,n.colorPalette.darkText).textColor,"dark:bg-opacity-10 bg-opacity-10"):(0,o.tremorTwMerge)("bg-tremor-brand-faint border-tremor-brand-emphasis text-tremor-brand-emphasis","dark:bg-dark-tremor-brand-muted/70 dark:border-dark-tremor-brand-emphasis dark:text-dark-tremor-brand-emphasis"),u)},m),r.default.createElement("div",{className:(0,o.tremorTwMerge)(i("header"),"flex items-start")},c?r.default.createElement(c,{className:(0,o.tremorTwMerge)(i("icon"),"flex-none h-5 w-5 mr-1.5")}):null,r.default.createElement("h4",{className:(0,o.tremorTwMerge)(i("title"),"font-semibold")},s)),r.default.createElement("p",{className:(0,o.tremorTwMerge)(i("body"),"overflow-y-auto",g?"mt-2":"")},g))});a.displayName="Callout",e.s(["Callout",0,a],366283)},286536,e=>{"use strict";let t=(0,e.i(475254).default)("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Eye",0,t],286536)},77705,e=>{"use strict";let t=(0,e.i(475254).default)("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);e.s(["EyeOff",0,t],77705)},153472,e=>{"use strict";var t,r,n=e.i(266027),o=e.i(954616),l=e.i(912598),i=e.i(243652),a=e.i(135214),s=e.i(602869),c=e.i(431703),d=((t={}).GENERAL_SETTINGS="general_settings",t),u=((r={}).MAXIMUM_SPEND_LOGS_RETENTION_PERIOD="maximum_spend_logs_retention_period",r);let g=async(e,t)=>{try{let r=s.proxyBaseUrl?`${s.proxyBaseUrl}/config/list?config_type=${t}`:`/config/list?config_type=${t}`,n=await fetch(r,{method:"GET",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"}});if(!n.ok){let e=await n.json(),t=(0,c.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await n.json()}catch(e){throw console.error(`Failed to get proxy config for ${t}:`,e),e}},m=(0,i.createQueryKeys)("proxyConfig"),p=async(e,t)=>{try{let r=s.proxyBaseUrl?`${s.proxyBaseUrl}/config/field/delete`:"/config/field/delete",n=await fetch(r,{method:"POST",headers:{[(0,s.getGlobalLitellmHeaderName)()]:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){let e=await n.json(),t=(0,c.deriveErrorMessage)(e);throw(0,s.handleError)(t),Error(t)}return await n.json()}catch(e){throw console.error(`Failed to delete proxy config field ${t.field_name}:`,e),e}};e.s(["ConfigType",()=>d,"GeneralSettingsFieldName",()=>u,"proxyConfigKeys",0,m,"useDeleteProxyConfigField",0,()=>{let{accessToken:e}=(0,a.default)(),t=(0,l.useQueryClient)();return(0,o.useMutation)({mutationFn:async t=>{if(!e)throw Error("Access token is required");return await p(e,t)},onSuccess:()=>{t.invalidateQueries({queryKey:m.all})}})},"useProxyConfig",0,e=>{let{accessToken:t}=(0,a.default)();return(0,n.useQuery)({queryKey:m.list({filters:{configType:e}}),queryFn:async()=>await g(t,e),enabled:!!t})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0wo7g25bvtjy-.js b/litellm/proxy/_experimental/out/_next/static/chunks/0wo7g25bvtjy-.js new file mode 100644 index 00000000000..4bb88210094 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0wo7g25bvtjy-.js @@ -0,0 +1,8 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,784774,e=>{"use strict";var t=e.i(843476),a=e.i(271645),l=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,l.cn)("w-full caption-bottom text-sm",e),...a})}));r.displayName="Table";let n=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("thead",{ref:r,"data-slot":"table-header",className:(0,l.cn)("[&_tr]:border-b",e),...a}));n.displayName="TableHeader";let s=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tbody",{ref:r,"data-slot":"table-body",className:(0,l.cn)("[&_tr:last-child]:border-0",e),...a}));s.displayName="TableBody";let i=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tfoot",{ref:r,"data-slot":"table-footer",className:(0,l.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a}));i.displayName="TableFooter";let o=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("tr",{ref:r,"data-slot":"table-row",className:(0,l.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...a}));o.displayName="TableRow";let c=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("th",{ref:r,"data-slot":"table-head",className:(0,l.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}));c.displayName="TableHead";let d=a.forwardRef(({className:e,...a},r)=>(0,t.jsx)("td",{ref:r,"data-slot":"table-cell",className:(0,l.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,l.cn)("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption",e.s(["Table",0,r,"TableBody",0,s,"TableCell",0,d,"TableFooter",0,i,"TableHead",0,c,"TableHeader",0,n,"TableRow",0,o])},355619,e=>{"use strict";var t=e.i(602869);let a=async(e,a,l)=>{try{if(null===e||null===a)return;if(null!==l){let r=(await (0,t.modelAvailableCall)(l,e,a,!0,null,!0)).data.map(e=>e.id),n=[],s=[];return r.forEach(e=>{e.endsWith("/*")?n.push(e):s.push(e)}),[...n,...s]}}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=[],l=[];return e.forEach(e=>{if(e.endsWith("/*")){let r=e.replace("/*",""),n=t.filter(e=>e.startsWith(r+"/"));l.push(...n),a.push(e)}else l.push(e)}),[...a,...l].filter((e,t,a)=>a.indexOf(e)===t)}])},185793,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),l=e.i(242064),r=e.i(529681);let n=e=>{let{prefixCls:l,className:r,style:n,size:s,shape:i}=e,o=(0,a.default)({[`${l}-lg`]:"large"===s,[`${l}-sm`]:"small"===s}),c=(0,a.default)({[`${l}-circle`]:"circle"===i,[`${l}-square`]:"square"===i,[`${l}-round`]:"round"===i}),d=t.useMemo(()=>"number"==typeof s?{width:s,height:s,lineHeight:`${s}px`}:{},[s]);return t.createElement("span",{className:(0,a.default)(l,o,c,r),style:Object.assign(Object.assign({},d),n)})};e.i(296059);var s=e.i(694758),i=e.i(915654),o=e.i(246422),c=e.i(838378);let d=new s.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)),p=e=>Object.assign({width:e},u(e)),f=(e,t,a)=>{let{skeletonButtonCls:l}=e;return{[`${a}${l}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${a}${l}-round`]:{borderRadius:t}}},b=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},u(e)),x=(0,o.genStyleHooks)("Skeleton",e=>{let{componentCls:t,calc:a}=e;return(e=>{let{componentCls:t,skeletonAvatarCls:a,skeletonTitleCls:l,skeletonParagraphCls:r,skeletonButtonCls:n,skeletonInputCls:s,skeletonImageCls:i,controlHeight:o,controlHeightLG:c,controlHeightSM:u,gradientFromColor:x,padding:h,marginSM:y,borderRadius:$,titleHeight:j,blockRadius:v,paragraphLiHeight:C,controlHeightXS:w,paragraphMarginTop:N}=e;return{[t]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:h,verticalAlign:"top",[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:x},m(o)),[`${a}-circle`]:{borderRadius:"50%"},[`${a}-lg`]:Object.assign({},m(c)),[`${a}-sm`]:Object.assign({},m(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[l]:{width:"100%",height:j,background:x,borderRadius:v,[`+ ${r}`]:{marginBlockStart:u}},[r]:{padding:0,"> li":{width:"100%",height:C,listStyle:"none",background:x,borderRadius:v,"+ li":{marginBlockStart:w}}},[`${r}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${l}, ${r} > li`]:{borderRadius:$}}},[`${t}-with-avatar ${t}-content`]:{[l]:{marginBlockStart:y,[`+ ${r}`]:{marginBlockStart:N}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},(e=>{let{borderRadiusSM:t,skeletonButtonCls:a,controlHeight:l,controlHeightLG:r,controlHeightSM:n,gradientFromColor:s,calc:i}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[a]:Object.assign({display:"inline-block",verticalAlign:"top",background:s,borderRadius:t,width:i(l).mul(2).equal(),minWidth:i(l).mul(2).equal()},b(l,i))},f(e,l,a)),{[`${a}-lg`]:Object.assign({},b(r,i))}),f(e,r,`${a}-lg`)),{[`${a}-sm`]:Object.assign({},b(n,i))}),f(e,n,`${a}-sm`))})(e)),(e=>{let{skeletonAvatarCls:t,gradientFromColor:a,controlHeight:l,controlHeightLG:r,controlHeightSM:n}=e;return{[t]:Object.assign({display:"inline-block",verticalAlign:"top",background:a},m(l)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},m(r)),[`${t}${t}-sm`]:Object.assign({},m(n))}})(e)),(e=>{let{controlHeight:t,borderRadiusSM:a,skeletonInputCls:l,controlHeightLG:r,controlHeightSM:n,gradientFromColor:s,calc:i}=e;return{[l]:Object.assign({display:"inline-block",verticalAlign:"top",background:s,borderRadius:a},g(t,i)),[`${l}-lg`]:Object.assign({},g(r,i)),[`${l}-sm`]:Object.assign({},g(n,i))}})(e)),(e=>{let{skeletonImageCls:t,imageSizeBase:a,gradientFromColor:l,borderRadiusSM:r,calc:n}=e;return{[t]:Object.assign(Object.assign({display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"middle",background:l,borderRadius:r},p(n(a).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},p(a)),{maxWidth:n(a).mul(4).equal(),maxHeight:n(a).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}})(e)),[`${t}${t}-block`]:{width:"100%",[n]:{width:"100%"},[s]:{width:"100%"}},[`${t}${t}-active`]:{[` + ${l}, + ${r} > li, + ${a}, + ${n}, + ${s}, + ${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: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"]]}),h=e=>{let{prefixCls:l,className:r,style:n,rows:s=0}=e,i=Array.from({length:s}).map((a,l)=>t.createElement("li",{key:l,style:{width:((e,t)=>{let{width:a,rows:l=2}=t;return Array.isArray(a)?a[e]:l-1===e?a:void 0})(l,e)}}));return t.createElement("ul",{className:(0,a.default)(l,r),style:n},i)},y=({prefixCls:e,className:l,width:r,style:n})=>t.createElement("h3",{className:(0,a.default)(e,l),style:Object.assign({width:r},n)});function $(e){return e&&"object"==typeof e?e:{}}let j=e=>{let{prefixCls:r,loading:s,className:i,rootClassName:o,style:c,children:d,avatar:u=!1,title:m=!0,paragraph:g=!0,active:p,round:f}=e,{getPrefixCls:b,direction:j,className:v,style:C}=(0,l.useComponentConfig)("skeleton"),w=b("skeleton",r),[N,k,M]=x(w);if(s||!("loading"in e)){let e,l,r=!!u,s=!!m,d=!!g;if(r){let a=Object.assign(Object.assign({prefixCls:`${w}-avatar`},s&&!d?{size:"large",shape:"square"}:{size:"large",shape:"circle"}),$(u));e=t.createElement("div",{className:`${w}-header`},t.createElement(n,Object.assign({},a)))}if(s||d){let e,a;if(s){let a=Object.assign(Object.assign({prefixCls:`${w}-title`},!r&&d?{width:"38%"}:r&&d?{width:"50%"}:{}),$(m));e=t.createElement(y,Object.assign({},a))}if(d){let e,l=Object.assign(Object.assign({prefixCls:`${w}-paragraph`},(e={},r&&s||(e.width="61%"),!r&&s?e.rows=3:e.rows=2,e)),$(g));a=t.createElement(h,Object.assign({},l))}l=t.createElement("div",{className:`${w}-content`},e,a)}let b=(0,a.default)(w,{[`${w}-with-avatar`]:r,[`${w}-active`]:p,[`${w}-rtl`]:"rtl"===j,[`${w}-round`]:f},v,i,o,k,M);return N(t.createElement("div",{className:b,style:Object.assign(Object.assign({},C),c)},e,l))}return null!=d?d:null};j.Button=e=>{let{prefixCls:s,className:i,rootClassName:o,active:c,block:d=!1,size:u="default"}=e,{getPrefixCls:m}=t.useContext(l.ConfigContext),g=m("skeleton",s),[p,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},i,o,f,b);return p(t.createElement("div",{className:y},t.createElement(n,Object.assign({prefixCls:`${g}-button`,size:u},h))))},j.Avatar=e=>{let{prefixCls:s,className:i,rootClassName:o,active:c,shape:d="circle",size:u="default"}=e,{getPrefixCls:m}=t.useContext(l.ConfigContext),g=m("skeleton",s),[p,f,b]=x(g),h=(0,r.default)(e,["prefixCls","className"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:c},i,o,f,b);return p(t.createElement("div",{className:y},t.createElement(n,Object.assign({prefixCls:`${g}-avatar`,shape:d,size:u},h))))},j.Input=e=>{let{prefixCls:s,className:i,rootClassName:o,active:c,block:d,size:u="default"}=e,{getPrefixCls:m}=t.useContext(l.ConfigContext),g=m("skeleton",s),[p,f,b]=x(g),h=(0,r.default)(e,["prefixCls"]),y=(0,a.default)(g,`${g}-element`,{[`${g}-active`]:c,[`${g}-block`]:d},i,o,f,b);return p(t.createElement("div",{className:y},t.createElement(n,Object.assign({prefixCls:`${g}-input`,size:u},h))))},j.Image=e=>{let{prefixCls:r,className:n,rootClassName:s,style:i,active:o}=e,{getPrefixCls:c}=t.useContext(l.ConfigContext),d=c("skeleton",r),[u,m,g]=x(d),p=(0,a.default)(d,`${d}-element`,{[`${d}-active`]:o},n,s,m,g);return u(t.createElement("div",{className:p},t.createElement("div",{className:(0,a.default)(`${d}-image`,n),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`})))))},j.Node=e=>{let{prefixCls:r,className:n,rootClassName:s,style:i,active:o,children:c}=e,{getPrefixCls:d}=t.useContext(l.ConfigContext),u=d("skeleton",r),[m,g,p]=x(u),f=(0,a.default)(u,`${u}-element`,{[`${u}-active`]:o},g,n,s,p);return m(t.createElement("div",{className:f},t.createElement("div",{className:(0,a.default)(`${u}-image`,n),style:i},c)))},e.s(["default",0,j],185793)},922611,e=>{"use strict";var t=e.i(271645),a=e.i(175066);function l(){}let r=t.createContext({add:l,remove:l});e.s(["usePanelRef",0,function(e){let l=t.useContext(r),n=t.useRef(null);return(0,a.default)(t=>{if(t){let a=e?t.querySelector(e):t;a&&(l.add(a),n.current=a)}else l.remove(n.current)})}])},500330,e=>{"use strict";var t=e.i(727749);let a=(e,t=0,a=!1,l=!0)=>{if(null==e||!Number.isFinite(e)||0===e&&!l)return"-";let r={minimumFractionDigits:t,maximumFractionDigits:t};if(!a)return e.toLocaleString("en-US",r);let n=e<0?"-":"",s=Math.abs(e),i=s,o="";return s>=1e6?(i=s/1e6,o="M"):s>=1e3&&(i=s/1e3,o="K"),`${n}${i.toLocaleString("en-US",r)}${o}`},l=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 l=document.createElement("textarea");l.value=e,l.style.position="fixed",l.style.left="-999999px",l.style.top="-999999px",l.setAttribute("readonly",""),document.body.appendChild(l),l.focus(),l.select();let r=document.execCommand("copy");if(document.body.removeChild(l),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,l,"formatNumberWithCommas",0,a,"getSpendString",0,(e,t=6)=>{if(null==e||!Number.isFinite(e)||0===e)return"-";let l=a(e,t,!1,!1);if(0===Number(l.replace(/,/g,""))){let e=(1/10**t).toFixed(t);return`< $${e}`}return`$${l}`},"updateExistingKeys",0,function(e,t){let a=structuredClone(e);for(let[e,l]of Object.entries(t))e in a&&(a[e]=l);return a}])},112179,581070,e=>{"use strict";var t=e.i(843476),a=e.i(487486),l=e.i(115504),r=e.i(746798);function n({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,n],581070);let s={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:i,dataTestId:o}){let c=(0,t.jsx)(a.Badge,{variant:"outline","data-testid":o,className:(0,l.cn)("whitespace-nowrap font-normal",s[e]),children:r});return i?(0,t.jsx)(n,{content:i,trigger:c}):c}],112179)},199931,e=>{"use strict";let t=(0,e.i(475254).default)("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]);e.s(["Waypoints",0,t],199931)},625901,e=>{"use strict";var t=e.i(266027),a=e.i(621482),l=e.i(912598),r=e.i(243652),n=e.i(602869),s=e.i(135214);let i=(0,r.createQueryKeys)("models"),o=(0,r.createQueryKeys)("modelHub"),c=(0,r.createQueryKeys)("allProxyModels");(0,r.createQueryKeys)("selectedTeamModels");let d=(0,r.createQueryKeys)("infiniteModels"),u=(0,r.createQueryKeys)("userModels"),m=new Set,g=e=>!!e?.litellm_params?.model?.startsWith("auto_router/"),p=e=>new Set(e.filter(g).map(e=>e.model_name).filter(e=>!!e)),f=e=>e.filter(g),b=async(e,t,a)=>{let l=await (0,n.modelInfoCall)(e,t,a,1,1e3),r=l?.total_pages??1;return[l,...await Promise.all(Array.from({length:Math.max(0,r-1)},(l,r)=>(0,n.modelInfoCall)(e,t,a,r+2,1e3)))].flatMap(e=>e?.data??[])},x=(e,t)=>i.list({filters:{scope:"autoRouters",...e&&{userId:e},...t&&{userRole:t}}});e.s(["autoRouterListKey",0,x,"fetchAllModelDeployments",0,b,"useAllProxyModels",0,()=>{let{accessToken:e,userId:a,userRole:l}=(0,s.default)();return(0,t.useQuery)({queryKey:c.list({}),queryFn:async()=>await (0,n.modelAvailableCall)(e,a,l,!0,null,!0,!1,"expand"),enabled:!!(e&&a&&l)})},"useAutoRouterModelGroups",0,()=>{let{accessToken:e,userId:a,userRole:l}=(0,s.default)(),{data:r}=(0,t.useQuery)({queryKey:x(a,l),queryFn:async()=>await b(e,a,l),enabled:!!(e&&a&&l),select:p});return r??m},"useAutoRouters",0,()=>{let{accessToken:e,userId:a,userRole:l}=(0,s.default)();return(0,t.useQuery)({queryKey:x(a,l),queryFn:async()=>await b(e,a,l),enabled:!!(e&&a&&l),select:f})},"useInfiniteModelInfo",0,(e=50,t)=>{let{accessToken:l,userId:r,userRole:i}=(0,s.default)();return(0,a.useInfiniteQuery)({queryKey:d.list({filters:{...r&&{userId:r},...i&&{userRole:i},size:e,...t&&{search:t}}}),queryFn:async({pageParam:a})=>await (0,n.modelInfoCall)(l,r,i,a,e,t),initialPageParam:1,getNextPageParam:e=>{if(e.current_page{let e=(0,l.useQueryClient)();return async()=>{await e.invalidateQueries({queryKey:i.lists()})}},"useModelHub",0,()=>{let{accessToken:e}=(0,s.default)();return(0,t.useQuery)({queryKey:o.list({}),queryFn:async()=>await (0,n.modelHubCall)(e),enabled:!!e})},"useModelsInfo",0,(e=1,a=50,l,r,o,c,d,u=!1)=>{let{accessToken:m,userId:g,userRole:p}=(0,s.default)();return(0,t.useQuery)({queryKey:i.list({filters:{...g&&{userId:g},...p&&{userRole:p},page:e,size:a,...l&&{search:l},...r&&{modelId:r},...o&&{teamId:o},...c&&{sortBy:c},...d&&{sortOrder:d},...u&&{excludeAutoRouters:"true"}}}),queryFn:async()=>await (0,n.modelInfoCall)(m,g,p,e,a,l,r,o,c,d,u),enabled:!!(m&&g&&p)})},"useUserModels",0,()=>{let{accessToken:e,userId:a,userRole:l}=(0,s.default)();return(0,t.useQuery)({queryKey:u.list({}),queryFn:async()=>(await (0,n.modelAvailableCall)(e,a,l)).data.map(e=>e.id),enabled:!!(e&&a&&l)})}])},622826,548151,200208,399536,997422,146512,547227,964471,630500,e=>{"use strict";var t=e.i(843476),a=e.i(271645),l=e.i(199931),r=e.i(625901),n=e.i(487486),s=e.i(115504);let i=new Set,o=(0,a.createContext)(i);function c(e){let t=(0,a.useContext)(o);return!!e&&t.has(e)}e.s(["AutoRouterIcon",0,function({size:e=12,className:a}){return(0,t.jsx)(l.Waypoints,{size:e,className:a,"aria-hidden":!0})},"AutoRouterModelGroupsProvider",0,function({children:e}){let a=(0,r.useAutoRouterModelGroups)();return(0,t.jsx)(o.Provider,{value:a,children:e})},"AutoRouterTag",0,function({modelGroup:e,className:a}){return c(e)?(0,t.jsxs)(n.Badge,{variant:"secondary",title:`Routed by auto-router "${e}"`,className:(0,s.cn)("gap-1.5 px-2.5 py-1 text-sm font-normal text-foreground",a),children:[(0,t.jsx)(l.Waypoints,{"aria-hidden":!0}),e]}):null},"useIsAutoRoutedModelGroup",0,c],548151);var d=e.i(581070);let u=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],m=e=>String(e).padStart(2,"0"),g=(e,t)=>"date"===t?`${u[e.getMonth()]} ${e.getDate()}, ${e.getFullYear()}`:`${u[e.getMonth()]} ${e.getDate()}, ${m(e.getHours())}:${m(e.getMinutes())}:${m(e.getSeconds())}`;e.s(["DateCell",0,function({value:e,precision:a="datetime",fallback:l="-"}){let r,n,s,i=e?new Date(e):null;return!i||Number.isNaN(i.getTime())?(0,t.jsx)("span",{className:"text-muted-foreground",children:l}):(0,t.jsx)(d.CellTooltip,{content:(r=Intl.DateTimeFormat().resolvedOptions().timeZone,n=`${u[i.getMonth()]} ${i.getDate()}, ${i.getFullYear()}`,s=`${m(i.getHours())}:${m(i.getMinutes())}:${m(i.getSeconds())}`,`${n}, ${s} (${r})`),trigger:(0,t.jsx)("span",{className:"whitespace-nowrap",children:g(i,a)})})},"formatCellDate",0,g],200208);var p=e.i(174886),f=e.i(500330);let b={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:r=!1,truncate:n=!0,fallback:i="-",tooltip:o,disabled:c=!1,dataTestId:u,className:m}){if(!e)return(0,t.jsx)("span",{className:"text-muted-foreground",children:i});let g=!!l&&!c,x=(0,s.cn)(b[a].base,g&&b[a].clickable,n&&"block max-w-[15ch] truncate",c&&"opacity-50",m),h=g?(0,t.jsx)("button",{type:"button",className:x,"data-testid":u,onClick:()=>l(e),children:e}):(0,t.jsx)("span",{className:x,"data-testid":u,children:e}),y=(0,t.jsx)(d.CellTooltip,{content:o??e,trigger:h});return r?(0,t.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1",children:[y,(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,f.copyToClipboard)(e)},children:(0,t.jsx)(p.Copy,{className:"size-3"})})]}):y}],399536);var x=e.i(463059),h=e.i(618566);let y="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",$=()=>(0,t.jsx)(x.ChevronRight,{className:"ml-auto size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"});function j({href:e,className:a,body:l}){let r=(0,h.useRouter)();return(0,t.jsxs)("a",{href:e,onClick:t=>{t.metaKey||t.ctrlKey||t.shiftKey||1===t.button||(t.preventDefault(),r.push(e))},className:(0,s.cn)(y,a),children:[l,(0,t.jsx)($,{})]})}e.s(["IdentityCell",0,function({title:e,subtitle:a,badge:l,onClick:r,href:n,className:i,titleClassName:o}){let c=(0,t.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,t.jsx)("span",{className:(0,s.cn)("truncate text-sm font-medium text-foreground",o),children:e}),(null!=a&&""!==a||null!=l)&&(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}),l]})]});return null!=n?(0,t.jsx)(j,{href:n,className:i,body:c}):null!=r?(0,t.jsxs)("button",{type:"button",onClick:r,className:(0,s.cn)(y,i),children:[c,(0,t.jsx)($,{})]}):(0,t.jsx)("div",{className:(0,s.cn)("min-w-0",i),children:c})}],997422);let v={hasModelAccess:!1,label:"Management"},C={hasModelAccess:!1,label:"Read-only"},w={hasModelAccess:!1,label:"SCIM"},N={hasModelAccess:!0,label:null},k=e=>e.startsWith("/scim"),M=(e,t)=>1===e.length&&e[0]===t,O=(e,t)=>"management"===t?v:"read_only"===t?C:Array.isArray(e)&&0!==e.length?e.every(k)?w:M(e,"management_routes")?v:M(e,"info_routes")?C:N:N;e.s(["deriveKeyModelScope",0,O],146512);var A=e.i(355619);let T="all-proxy-models",R=e=>{if(e===T)return"All Proxy Models";let t=(0,A.getModelDisplayName)(e);return t.length>30?`${t.slice(0,30)}...`:t};e.s(["ModelsCell",0,function({models:e,maxVisible:a=3,allowedRoutes:l,keyType:r}){if(!Array.isArray(e)||0===e.length){let e=O(l,r);return e.hasModelAccess?(0,t.jsx)(n.Badge,{variant:"secondary",children:"All Proxy Models"}):(0,t.jsx)(d.CellTooltip,{content:`Scoped to ${e.label} routes; this key cannot call any models`,trigger:(0,t.jsx)(n.Badge,{variant:"secondary",className:"cursor-default",children:"No model access"})})}let s=e.slice(0,a),i=e.slice(a);return(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[s.map((e,a)=>(0,t.jsx)(n.Badge,{variant:e===T?"secondary":"outline",children:R(e)},a)),i.length>0&&(0,t.jsx)(d.CellTooltip,{content:(0,t.jsx)("div",{className:"flex max-w-[280px] flex-col gap-0.5",children:i.map((e,a)=>(0,t.jsx)("span",{children:R(e)},a))}),trigger:(0,t.jsxs)(n.Badge,{variant:"outline",className:"cursor-default",children:["+",i.length," more"]})})]})}],547227),e.s(["MoneyCell",0,function({value:e,decimals:a=4,emptyText:l="-",showZero:r=!1}){return null==e||Number.isNaN(e)?(0,t.jsx)("span",{className:"text-muted-foreground",children:l}):0===e?r?(0,t.jsx)("span",{className:"whitespace-nowrap",children:`$${(0,f.formatNumberWithCommas)(0,a,!1,!0)}`}):(0,t.jsx)("span",{className:"text-muted-foreground",children:"-"}):(0,t.jsx)("span",{className:"whitespace-nowrap",children:(0,f.getSpendString)(e,a)})}],964471);var q=e.i(944835);e.s(["SpendBudgetCell",0,function({spend:e,maxBudget:a,teamMaxBudget:l}){let r="number"!=typeof e||Number.isNaN(e)?0:e,n=a??l??null,s=null==a&&null!=l,i="number"==typeof n&&n>0,o=i?r/n*100:0,c=r>0?(0,f.getSpendString)(r,4):"$0.00",d=null===n?"· Unlimited":`of $${(0,f.formatNumberWithCommas)(n)}${s?" (Team)":""}`;return(0,t.jsxs)("div",{className:"flex min-w-[130px] flex-col gap-1",children:[(0,t.jsxs)("div",{className:"whitespace-nowrap text-xs",children:[(0,t.jsx)("span",{className:"font-medium tabular-nums text-foreground",children:c})," ",(0,t.jsx)("span",{className:"text-muted-foreground",children:d})]}),i&&(0,t.jsx)(q.Meter,{value:r,max:n,"aria-valuetext":`${c} of $${(0,f.formatNumberWithCommas)(n)}`,children:(0,t.jsx)(q.MeterTrack,{children:(0,t.jsx)(q.MeterIndicator,{tone:o>100?"over":o>=80?"warning":"default"})})})]})}],630500),e.i(112179),e.s([],622826)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0xcneptpo0s76.js b/litellm/proxy/_experimental/out/_next/static/chunks/0xcneptpo0s76.js new file mode 100644 index 00000000000..a6cc571d340 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0xcneptpo0s76.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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)},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])},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)},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])},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)},361653,e=>{"use strict";let t=(0,e.i(475254).default)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);e.s(["default",0,t])},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),u=e.i(431703);let d=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,search_team_id_match:r.searchTeamIdMatch,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,u.deriveErrorMessage)(e);throw(0,l.handleError)(t),Error(t)}return await o.json()}catch(e){throw console.error("Failed to list teams:",e),e}},c=(0,o.createQueryKeys)("teamsTable"),f=(0,o.createQueryKeys)("teams"),m=async e=>{let t=await d(e,1,100),a=t.total_pages??1;return a<=1?t.teams:[t,...await Promise.all(Array.from({length:a-1},(t,a)=>d(e,a+2,100)))].flatMap(e=>e.teams)},h=(0,o.createQueryKeys)("infiniteTeams"),g=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,search_team_id_match:r.searchTeamIdMatch,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,u.deriveErrorMessage)(e);throw(0,l.handleError)(t),Error(t)}let d=await o.json();if(d&&"object"==typeof d&&"teams"in d)return d.teams;return d}catch(e){throw console.error("Failed to list deleted teams:",e),e}},p=(0,o.createQueryKeys)("deletedTeams");e.s(["teamListCall",0,d,"teamsTableKeys",0,c,"useAllTeams",0,()=>{let{accessToken:e}=(0,s.default)();return(0,r.useQuery)({queryKey:f.list({filters:{scope:"all",pageSize:100,accessToken:e??""}}),queryFn:async()=>await m(e),enabled:!!e,staleTime:3e4})},"useDeletedTeams",0,(e,a,i={})=>{let{accessToken:l}=(0,s.default)();return(0,r.useQuery)({queryKey:p.list({page:e,limit:a,...i}),queryFn:async()=>await g(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:h.list({filters:{pageSize:e,...t&&{search:t},...r&&{organizationId:r},...l&&{userId:l}}}),queryFn:async({pageParam:a})=>await d(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:f.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(f.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:f.list({}),queryFn:async()=>await n(e,t,a,null),enabled:!!e})},"useTeamsTable",0,(e,a,i={})=>{let{accessToken:l}=(0,s.default)();return(0,r.useQuery)({queryKey:c.list({page:e,limit:a,...i}),queryFn:async()=>await d(l,e,a,i),enabled:!!l,staleTime:3e4,placeholderData:t.keepPreviousData})}],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,u=e?.org_alias||null;return(0,r.useQuery)({queryKey:s.list(o||u?{filters:{...o&&{org_id:o},...u&&{org_alias:u}}}:{}),queryFn:async()=>await (0,a.organizationListCall)(i,o,u),enabled:!!(i&&l&&n)})}])},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)},755151,e=>{"use strict";var t=e.i(247153);e.s(["DownOutlined",()=>t.default])},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 u=l.find(e=>e.worker_id===n)??null,d=(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:u,selectWorker:d,disconnectFromWorker:(0,t.useCallback)(()=>{o(null),localStorage.removeItem(i),(0,a.switchToWorkerUrl)(null)},[])}}])},658041,e=>{"use strict";let t=(0,e.i(475254).default)("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);e.s(["Database",0,t],658041)},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])},761911,e=>{"use strict";var t=e.i(98740);e.s(["Users",()=>t.default])},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..."})]})]})}])},554134,e=>{"use strict";var t=e.i(843476),a=e.i(772436),r=e.i(115504);e.s(["ToolbarSeparator",0,function({className:e}){return(0,t.jsx)(a.Separator,{orientation:"vertical",className:(0,r.cn)("mx-1.5 h-5 data-vertical:self-center",e)})}])},252754,e=>{"use strict";let t=(0,e.i(475254).default)("wallet",[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]]);e.s(["Wallet",0,t],252754)},38982,e=>{"use strict";let t=(0,e.i(475254).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,t],38982)},581418,e=>{"use strict";let t=(0,e.i(475254).default)("shield-check",[["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"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["ShieldCheck",0,t],581418)},997625,e=>{"use strict";let t=(0,e.i(475254).default)("code-xml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);e.s(["Code2",0,t],997625)},487074,e=>{"use strict";let t=(0,e.i(475254).default)("piggy-bank",[["path",{d:"M11 17h3v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3a3.16 3.16 0 0 0 2-2h1a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1h-1a5 5 0 0 0-2-4V3a4 4 0 0 0-3.2 1.6l-.3.4H11a6 6 0 0 0-6 6v1a5 5 0 0 0 2 4v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1z",key:"1piglc"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M2 8v1a2 2 0 0 0 2 2h1",key:"1env43"}]]);e.s(["PiggyBank",0,t],487074)},607486,e=>{"use strict";let t=(0,e.i(475254).default)("building-2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);e.s(["Building2",0,t],607486)},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)},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)},531245,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],657150),e.s(["Bot",0,t],531245)},751247,e=>{"use strict";let t={viewToolPolicies:e.i(708347).all_admin_roles};e.s(["hasCapability",0,(e,a)=>null!=e&&t[a].includes(e),"rolesWithCapability",0,e=>[...t[e]]])},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])},922407,e=>{"use strict";var t=e.i(843476),a=e.i(519455),r=e.i(115504),i=e.i(643531),s=e.i(174886),l=e.i(271645);e.s(["default",0,({value:e,label:n,className:o,iconClassName:u="size-[15px]"})=>{let[d,c]=(0,l.useState)(!1);if((0,l.useEffect)(()=>{if(!d)return;let e=setTimeout(()=>c(!1),1200);return()=>clearTimeout(e)},[d]),!e)return null;let f=async()=>{if(navigator.clipboard)try{await navigator.clipboard.writeText(e),c(!0)}catch{c(!1)}};return(0,t.jsx)(a.Button,{type:"button",variant:"ghost",size:"icon-xs",onClick:f,"aria-label":n,title:n,className:(0,r.cn)("text-muted-foreground hover:text-primary",o),children:d?(0,t.jsx)(i.Check,{className:u}):(0,t.jsx)(s.Copy,{className:u})})}])},618393,e=>{"use strict";var t=e.i(953651);e.s(["Server",()=>t.default])},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])},239616,e=>{"use strict";var t=e.i(903446);e.s(["Settings",()=>t.default])},178583,e=>{"use strict";let t=(0,e.i(475254).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,t],178583)},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)},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])},952571,e=>{"use strict";var t=e.i(879664);e.s(["Info",()=>t.default])},582458,e=>{"use strict";let t=(0,e.i(475254).default)("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);e.s(["default",0,t])},89128,e=>{"use strict";var t=e.i(582458);e.s(["TriangleAlert",()=>t.default])},814431,e=>{"use strict";var t=e.i(271645),a=e.i(115571);function r(e){let t=t=>{"disableShowNewBadge"===t.key&&e()},r=t=>{let{key:a}=t.detail;"disableShowNewBadge"===a&&e()};return window.addEventListener("storage",t),window.addEventListener(a.LOCAL_STORAGE_EVENT,r),()=>{window.removeEventListener("storage",t),window.removeEventListener(a.LOCAL_STORAGE_EVENT,r)}}function i(){return"true"===(0,a.getLocalStorageItem)("disableShowNewBadge")}e.s(["useDisableShowNewBadge",0,function(){return(0,t.useSyncExternalStore)(r,i)}])},61574,e=>{"use strict";let t=(0,e.i(475254).default)("heart-pulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);e.s(["HeartPulse",0,t],61574)},218842,e=>{"use strict";var t=e.i(843476),a=e.i(906579),r=e.i(814431);e.s(["default",0,function({children:e,dot:i=!1}){return(0,r.useDisableShowNewBadge)()?e?(0,t.jsx)(t.Fragment,{children:e}):null:e?(0,t.jsx)(a.Badge,{color:"blue",count:i?void 0:"Beta",dot:i,children:e}):(0,t.jsx)(a.Badge,{color:"blue",count:i?void 0:"Beta",dot:i})}])},204258,e=>{"use strict";var t,a,r,i=e.i(843476);e.s([],958842),e.i(958842),e.i(247167);var s=e.i(271645),l=e.i(667865),n=e.i(552245),o=e.i(951437),u=e.i(788015),d=e.i(675606),c=e.i(56434),f=e.i(223910),m=e.i(733332);let h=s.createContext(void 0);function g(){let e=s.useContext(h);if(void 0===e)throw Error((0,m.default)(15));return e}var p=e.i(209407);let y=((t={}).open="data-open",t.closed="data-closed",t[t.startingStyle=p.TransitionStatusDataAttributes.startingStyle]="startingStyle",t[t.endingStyle=p.TransitionStatusDataAttributes.endingStyle]="endingStyle",t),v=((a={}).panelOpen="data-panel-open",a),x={[y.open]:""},b={[y.closed]:""},w={open:e=>e?x:b,...p.transitionStatusMapping},k=s.forwardRef(function(e,t){let{render:a,className:r,defaultOpen:m=!1,disabled:g=!1,onOpenChange:p,open:y,style:v,...x}=e,b=(0,l.useStableCallback)(p),k=function(e){let{open:t,defaultOpen:a,onOpenChange:r,disabled:i}=e,[n,m]=(0,o.useControlled)({controlled:t,default:a,name:"Collapsible",state:"open"}),{mounted:h,setMounted:g,transitionStatus:p}=(0,f.useTransitionStatus)(n,!0,!0),y=(0,u.useBaseUiId)(),[v,x]=s.useState(),b=v??y,w=(0,l.useStableCallback)(e=>{let t=!n,a=(0,d.createChangeEventDetails)(c.REASONS.triggerPress,e.nativeEvent);r(t,a),a.isCanceled||m(t)});return s.useMemo(()=>({disabled:i,handleTrigger:w,mounted:h,open:n,panelId:b,setMounted:g,setOpen:m,setPanelIdState:x,transitionStatus:p}),[i,w,h,n,b,g,m,x,p])}({open:y,defaultOpen:m,onOpenChange:b,disabled:g}),_=s.useMemo(()=>({open:k.open,disabled:k.disabled,transitionStatus:k.transitionStatus}),[k.open,k.disabled,k.transitionStatus]),j=s.useMemo(()=>({...k,onOpenChange:b,state:_}),[k,b,_]),S=(0,n.useRenderElement)("div",e,{state:_,ref:t,props:x,stateAttributesMapping:w});return(0,i.jsx)(h.Provider,{value:j,children:S})});var _=e.i(540886);let j={open:e=>e?{[v.panelOpen]:""}:null,...p.transitionStatusMapping},S=s.forwardRef(function(e,t){let{panelId:a,open:r,handleTrigger:i,state:s,disabled:l}=g(),{className:o,disabled:u=l,render:d,nativeButton:c=!0,style:f,...m}=e,{getButtonProps:h,buttonRef:p}=(0,_.useButton)({disabled:u,focusableWhenDisabled:!0,native:c});return(0,n.useRenderElement)("button",e,{state:s,ref:[t,p],props:[{"aria-controls":r?a:void 0,"aria-expanded":r,onClick:i},m,h],stateAttributesMapping:j})});var M=e.i(146376),C=e.i(377570),T=e.i(574735),z=e.i(828918),N=e.i(708445),A=e.i(446265),E=e.i(333848),R=e.i(137584),L=e.i(222640);let P={height:void 0,width:void 0};function B(e){return{height:e.scrollHeight,width:e.scrollWidth}}function I(e){return e.split(",").map(e=>e.trim()).some(e=>""!==e&&Number.parseFloat(e)>0)}function D(e,t,a){let r=e.style.getPropertyValue(t),i=e.style.getPropertyPriority(t);return e.style.setProperty(t,a),()=>{""===r?e.style.removeProperty(t):e.style.setProperty(t,r,i)}}let V=((r={}).collapsiblePanelHeight="--collapsible-panel-height",r.collapsiblePanelWidth="--collapsible-panel-width",r),q=s.forwardRef(function(e,t){let{className:a,hiddenUntilFound:r,keepMounted:i,render:o,id:u,style:f,...m}=e,{mounted:h,onOpenChange:p,open:v,panelId:x,setMounted:b,setPanelIdState:k,setOpen:_,state:j,transitionStatus:S}=g();(0,M.useIsoLayoutEffect)(()=>{if(u)return k(u),()=>{k(void 0)}},[u,k]);let{height:q,props:H,ref:F,shouldPreventOpenAnimation:U,shouldRender:O,transitionStatus:K,width:$}=function(e){let{externalRef:t,hiddenUntilFound:a,id:r,keepMounted:i,mounted:n,onOpenChange:o,open:u,setMounted:f,setOpen:m,transitionStatus:h}=e,g=s.useRef(null),p=s.useRef(null),[v,x]=s.useState(P),b=s.useRef(P),w=s.useRef(!1),k=s.useRef(u),_=s.useRef(!1),[j,S]=s.useState(!1),C=s.useRef(null),V=(0,z.useMergedRefs)(t,g),q=(0,A.useValueAsRef)({mounted:n,open:u}),H=(0,L.useAnimationsFinished)(g,!1,!1),F=!u&&!n,U=j?"idle":h,O=u&&(k.current||_.current),K=!u&&n&&"css-animation"===p.current&&void 0===v.height&&void 0===v.width?b.current:v,$=a&&F&&"css-animation"!==p.current,W=(0,l.useStableCallback)((e,t=!0)=>{t&&(b.current=e),x(e)}),Q=(0,l.useStableCallback)(()=>{C.current?.(),C.current=null}),G=(0,l.useStableCallback)(e=>{Q(),C.current=()=>{C.current=null,e()}}),Z=(0,l.useStableCallback)(()=>{u&&n&&"css-animation"===p.current&&(_.current=!0)});(0,M.useIsoLayoutEffect)(()=>{j&&"starting"!==h&&S(!1)},[j,h]),s.useEffect(()=>()=>{Z(),Q()},[Z,Q]),(0,M.useIsoLayoutEffect)(()=>{let e=g.current;if(!e)return;!u&&C.current&&Q();let t=function(e,t=!1){let a=(0,E.ownerWindow)(e).getComputedStyle(e),r=(a.animationName.split(",").map(e=>e.trim()).some(e=>""!==e&&"none"!==e)||t)&&I(a.animationDuration),i=I(a.transitionDuration);return r&&i||i?"css-transition":r?"css-animation":"none"}(e,O);if(p.current=t,u&&"idle"===h&&k.current&&"css-animation"===t){b.current=B(e);return}if(u&&"starting"===h){let a=w.current;if(w.current=!1,"none"===t){W(B(e)),S(!0);return}if("css-transition"===t){let t=function(e){let t={"justify-content":e.style.justifyContent,"align-items":e.style.alignItems,"align-content":e.style.alignContent,"justify-items":e.style.justifyItems};function a(){Object.entries(t).forEach(([t,a])=>{""===a?e.style.removeProperty(t):e.style.setProperty(t,a)})}Object.keys(t).forEach(t=>{e.style.setProperty(t,"initial","important")});let r=N.AnimationFrame.request(a);return()=>{N.AnimationFrame.cancel(r),a()}}(e);return W(B(e)),a&&(G(D(e,"transition-duration","0s")),S(!0)),t}if("css-animation"===t){if(W(B(e)),!a)return void D(e,"animation-name","none")();let t=D(e,"animation-name","none"),r=D(e,"animation-duration","0s");return t(),G(r),S(!0),void 0}}if(!u&&n&&("idle"===h||"starting"===h)){if(k.current=!1,_.current=!1,"none"===t){W(P,!1),f(!1);return}W(B(e));return}if("ending"!==h)return;if("none"===t)return void f(!1);let a=B(e);(a.height??0)>0||(a.width??0)>0?(W(a),"css-animation"===t&&D(e,"animation-name","none")()):f(!1)},[n,u,Q,W,f,G,O,h]),(0,R.useOpenChangeComplete)({enabled:u&&n&&"idle"===U,open:!0,ref:g,onComplete(){u&&W(P,!1)}}),s.useEffect(()=>{if(u||!n||"ending"!==U||!g.current)return;let e=new AbortController,t=-1;function a(){q.current.open||(f(!1),W(P,!1))}return t=N.AnimationFrame.request(()=>{e.signal.aborted||H(a,e.signal)}),()=>{N.AnimationFrame.cancel(t),e.abort()}},[q,n,u,U,H,W,f]),(0,M.useIsoLayoutEffect)(()=>{let e=g.current;e&&a&&F&&e.setAttribute("hidden","until-found")},[F,a]),s.useEffect(function(){let e=g.current;if(e)return(0,T.addEventListener)(e,"beforematch",function(e){let t=(0,d.createChangeEventDetails)(c.REASONS.none,e);o(!0,t),t.isCanceled||(w.current=!0,m(!0))})},[o,m]);let Y=i||a||n||u;return{height:K.height,props:{...$?{[y.startingStyle]:""}:void 0,hidden:F,id:r},ref:V,shouldPreventOpenAnimation:O,shouldRender:Y,transitionStatus:U,width:K.width}}({externalRef:t,hiddenUntilFound:r??!1,id:x,keepMounted:i??!1,mounted:h,onOpenChange:p,open:v,setMounted:b,setOpen:_,transitionStatus:S}),W={...j,transitionStatus:K},Q=(0,C.resolveStyle)(f,W),G=(0,n.useRenderElement)("div",{...e,style:void 0},{state:W,ref:F,props:[H,{style:{[V.collapsiblePanelHeight]:void 0===q?"auto":`${q}px`,[V.collapsiblePanelWidth]:void 0===$?"auto":`${$}px`}},m,Q?{style:Q}:void 0,U?{style:{animationName:"none"}}:void 0],stateAttributesMapping:w});return O?G:null});e.s(["Panel",0,q,"Root",0,k,"Trigger",0,S],596315);var H=e.i(596315),H=H;e.s(["Collapsible",0,function({...e}){return(0,i.jsx)(H.Root,{"data-slot":"collapsible",...e})},"CollapsibleContent",0,function({...e}){return(0,i.jsx)(H.Panel,{"data-slot":"collapsible-content",...e})},"CollapsibleTrigger",0,function({...e}){return(0,i.jsx)(H.Trigger,{"data-slot":"collapsible-trigger",...e})}],204258)},439573,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(115504);let i=(0,r.cva)({base:"group/alert relative grid w-full gap-0.5 rounded-lg border px-4 py-3 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",variants:{variant:{default:"bg-card text-card-foreground",destructive:"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",info:"border-blue-200 bg-blue-50 text-blue-900 *:data-[slot=alert-description]:text-blue-800 *:[svg]:text-blue-600",warning:"border-amber-200 bg-amber-50 text-amber-900 *:data-[slot=alert-description]:text-amber-800 *:[svg]:text-amber-600",error:"border-red-200 bg-red-50 text-red-900 *:data-[slot=alert-description]:text-red-800 *:[svg]:text-red-600"}},defaultVariants:{variant:"default"}}),s=a.forwardRef(({className:e,variant:a,...s},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"alert",role:"alert",className:(0,r.cn)(i({variant:a}),e),...s}));s.displayName="Alert";let l=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"alert-title",className:(0,r.cn)("font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",e),...a}));l.displayName="AlertTitle";let n=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"alert-description",className:(0,r.cn)("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",e),...a}));n.displayName="AlertDescription";let o=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"alert-action",className:(0,r.cn)("absolute top-2.5 right-3",e),...a}));o.displayName="AlertAction",e.s(["Alert",0,s,"AlertAction",0,o,"AlertDescription",0,n,"AlertTitle",0,l])},707621,e=>{"use strict";var t=e.i(361653);e.s(["CircleAlert",()=>t.default])},875475,e=>{"use strict";let t=(0,e.i(475254).default)("circle-play",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polygon",{points:"10 8 16 12 10 16 10 8",key:"1cimsy"}]]);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,e=>{"use strict";var t=e.i(843476),a=e.i(906579),r=e.i(814431);e.s(["default",0,function({children:e,dot:i=!1}){return(0,r.useDisableShowNewBadge)()?e?(0,t.jsx)(t.Fragment,{children:e}):null:e?(0,t.jsx)(a.Badge,{color:"blue",count:i?void 0:"New",dot:i,children:e}):(0,t.jsx)(a.Badge,{color:"blue",count:i?void 0:"New",dot:i})}])},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 u=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}));u.displayName="BreadcrumbPage";let d=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,{})}));d.displayName="BreadcrumbSeparator";var c=e.i(554134),f=e.i(111672),m=e.i(251773),h=e.i(771243),g=e.i(895335),p=e.i(853295),y=e.i(383862),v=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,v.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)(d,{}),(0,t.jsx)(o,{className:"min-w-0",children:(0,t.jsx)(u,{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)(y.default,{onWorkerSwitch:e=>{(0,b.clearTokenCookies)(),(0,w.clearStoredReturnUrl)(),localStorage.removeItem("litellm_selected_worker_id"),localStorage.removeItem("litellm_worker_url"),window.location.href=`${(0,w.getLoginUrl)()}?worker=${encodeURIComponent(e)}`}}),(0,t.jsx)(c.ToolbarSeparator,{})]}),(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)(c.ToolbarSeparator,{}),(0,t.jsx)(g.NotificationsBell,{})]})]})}var _=e.i(402874),j=e.i(936578),S=e.i(275144),M=e.i(557951),C=e.i(602869),T=e.i(135214);let z=({setPage:e,defaultSelectedKey:r,sidebarCollapsed:i,onToggleCollapsed:s})=>{let{accessToken:l}=(0,T.default)(),[n,o]=(0,a.useState)(null),[u,d]=(0,a.useState)(!1),[c,m]=(0,a.useState)(!1),[h,g]=(0,a.useState)(!1),[p,y]=(0,a.useState)(!1),[v,x]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{(async()=>{if(l)try{let e=await (0,C.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&&d(!!e.values.enable_projects_ui),e?.values?.disable_agents_for_internal_users!==void 0&&m(!!e.values.disable_agents_for_internal_users),e?.values?.allow_agents_for_team_admins!==void 0&&g(!!e.values.allow_agents_for_team_admins),e?.values?.disable_vector_stores_for_internal_users!==void 0&&y(!!e.values.disable_vector_stores_for_internal_users),e?.values?.allow_vector_stores_for_team_admins!==void 0&&x(!!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:u,disableAgentsForInternalUsers:c,allowAgentsForTeamAdmins:h,disableVectorStoresForInternalUsers:p,allowVectorStoresForTeamAdmins:v})};var N=e.i(618566),A=e.i(560445),E=e.i(143488);let R=({accessToken:e})=>{let{data:a}=(0,E.useHealthReadinessDetails)(e);return a?.is_detailed_debug?(0,t.jsx)(A.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),P=e.i(625005);let B="sales@berri.ai",I=(0,t.jsx)("a",{href:`mailto:${B}`,children:B}),D=({licenseInfo:e})=>{let[r,i]=(0,a.useState)(!1),s=e?.expiration_date??null,l=(0,P.getLicenseExpiryTier)(s),n=(0,P.getDaysUntilExpiration)(s);if(null===s||"none"===l||null===n)return null;let o="warning"===l,u=`litellm:licenseExpiryBannerDismissed:${s}`,d=!!o&&"true"===sessionStorage.getItem(u);if(o&&(r||d))return null;let c=(0,P.formatExpiryDate)(s),f="expired"===l?`Your LiteLLM Enterprise license expired on ${c}`:`Your LiteLLM Enterprise license ${n<=0?"expires today":1===n?"expires in 1 day":`expires in ${n} days`} (${c})`,m="expired"===l?(0,t.jsxs)(t.Fragment,{children:["Enterprise features are now disabled. Reach out to ",I," to restore access"]}):"critical"===l?(0,t.jsxs)(t.Fragment,{children:["Renew now to avoid losing enterprise features. Reach out to ",I]}):(0,t.jsxs)(t.Fragment,{children:["Renew before it lapses to keep enterprise features. Reach out to ",I]});return(0,t.jsx)(A.Alert,{message:f,description:m,type:"warning"===l?"warning":"error",showIcon:!0,banner:!0,closable:o,onClose:()=>{sessionStorage.setItem(u,"true"),i(!0)},style:{marginBottom:0,borderRadius:0}})},V=({accessToken:e})=>{let{data:a}=(0,L.useLicenseInfo)(e);return(0,t.jsx)(D,{licenseInfo:a??null})};var q=e.i(714004),H=e.i(571353),F=e.i(658140);let U=(0,e.i(431703).createApiClient)({getBaseUrl:()=>(0,C.getProxyBaseUrl)()??""});function O({children:e}){let{accessToken:a}=(0,M.useAuth)();return(0,t.jsx)(F.PluginModeProvider,{accessToken:a,children:e})}function K(){let{activePlugin:e}=(0,F.usePluginMode)(),r=e?.name,i=e?.url??"",{accessToken:s}=(0,M.useAuth)(),l=(0,a.useRef)(null),[n,o]=(0,a.useState)(null);return((0,a.useEffect)(()=>{if(!s||!r)return;let e=!1;return U.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 $({children:e}){let r=(0,N.useRouter)(),i=(0,N.useSearchParams)(),s=(0,N.usePathname)(),{accessToken:l}=(0,M.useAuth)(),[n,o]=(0,a.useState)(!1),{mode:u}=(0,F.usePluginMode)(),d=(0,H.legacyKeyForPathname)(s)||i.get("page")||"api-keys";return"ai-gateway"!==u?(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)(R,{accessToken:l}),(0,t.jsx)(V,{accessToken:l}),(0,t.jsx)(q.UserBanner,{accessToken:l}),(0,t.jsx)("main",{className:"flex min-h-0 flex-1 overflow-hidden",children:(0,t.jsx)(K,{})})]}):(0,t.jsxs)("div",{className:"flex h-screen overflow-hidden bg-background",children:[(0,t.jsx)(z,{setPage:e=>{let t=H.MIGRATED_PAGES[e];r.push(t?(0,H.migratedHref)(t):(0,H.legacyPageHref)(e))},defaultSelectedKey:d,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:d}),(0,t.jsx)(R,{accessToken:l}),(0,t.jsx)(V,{accessToken:l}),(0,t.jsx)(q.UserBanner,{accessToken:l}),(0,t.jsx)("main",{className:"min-w-0 flex-1 overflow-y-auto",children:e})]})]})}function W({children:e}){let r=(0,N.useRouter)(),i=(0,N.useSearchParams)(),{accessToken:s,authLoading:l}=(0,M.useAuth)(),n=!!i.get("invitation_id");return((0,a.useEffect)(()=>{!l&&n&&r.replace(`${(0,H.migratedHref)("onboarding")}?${i.toString()}`)},[l,n,r,i]),l||n)?(0,t.jsx)(j.default,{}):(0,t.jsx)(S.ThemeProvider,{accessToken:s,children:(0,t.jsx)($,{children:e})})}e.s(["AgentControlPlaneView",0,K,"default",0,function({children:e}){return(0,t.jsx)(a.Suspense,{fallback:(0,t.jsx)(j.default,{}),children:(0,t.jsx)(O,{children:(0,t.jsx)(W,{children:e})})})}],216370)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/14rmfrwspq6qw.js b/litellm/proxy/_experimental/out/_next/static/chunks/0xo7qvoxfppvz.js similarity index 87% rename from litellm/proxy/_experimental/out/_next/static/chunks/14rmfrwspq6qw.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0xo7qvoxfppvz.js index 547bfdafbdc..02777cb1ef2 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/14rmfrwspq6qw.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0xo7qvoxfppvz.js @@ -7,4 +7,4 @@ ${(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:r,actionsBg:o}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:o,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${r}`,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} ${r}`}}})})(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:r}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:a,padding:`0 ${(0,c.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 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 f=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))}))},y=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:g,rootClassName:m,style:y,extra:v,headStyle:$={},bodyStyle:O={},title:x,loading:j,bordered:S,variant:w,size:C,type:E,cover:M,actions:k,tabList:z,children:N,activeTabKey:T,defaultActiveTabKey:P,tabBarExtraContent:B,hoverable:R,tabProps:L={},classNames:I,styles:H}=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(a.ConfigContext),[F]=(0,p.default)("card",w,S),X=e=>{var t;return(0,n.default)(null==(t=null==A?void 0:A.classNames)?void 0:t[e],null==I?void 0:I[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==H?void 0:H[e])},q=t.useMemo(()=>{let e=!1;return t.Children.forEach(N,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[N]),U=W("card",u),[_,Q,V]=b(U),J=t.createElement(o.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:B}),ee=(0,r.default)(C),et=ee&&"default"!==ee?ee:"large",en=z?t.createElement(l.default,Object.assign({size:et},Z,{className:`${U}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:z.map(e=>{var{tab:t}=e;return Object.assign({label:t},h(e,["tab"]))})})):null;if(x||v||en){let e=(0,n.default)(`${U}-head`,X("header")),i=(0,n.default)(`${U}-head-title`,X("title")),a=(0,n.default)(`${U}-extra`,X("extra")),r=Object.assign(Object.assign({},$),K("header"));c=t.createElement("div",{className:e,style:r},t.createElement("div",{className:`${U}-head-wrapper`},x&&t.createElement("div",{className:i,style:K("title")},x),v&&t.createElement("div",{className:a,style:K("extra")},v)),en)}let ei=(0,n.default)(`${U}-cover`,X("cover")),ea=M?t.createElement("div",{className:ei,style:K("cover")},M):null,er=(0,n.default)(`${U}-body`,X("body")),eo=Object.assign(Object.assign({},O),K("body")),el=t.createElement("div",{className:er,style:eo},j?J:N),es=(0,n.default)(`${U}-actions`,X("actions")),ed=(null==k?void 0:k.length)?t.createElement(f,{actionClasses:es,actionStyle:K("actions"),actions:k}):null,ec=(0,i.default)(G,["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==z?void 0:z.length,[`${U}-${ee}`]:ee,[`${U}-type-${E}`]:!!E,[`${U}-rtl`]:"rtl"===D},g,m,Q,V),eg=Object.assign(Object.assign({},null==A?void 0:A.style),y);return _(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:eg}),c,ea,el,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 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};y.Grid=d,y.Meta=e=>{let{prefixCls:i,className:r,avatar:o,title:l,description:s}=e,d=v(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("card",i),g=(0,n.default)(`${u}-meta`,r),m=o?t.createElement("div",{className:`${u}-meta-avatar`},o):null,b=l?t.createElement("div",{className:`${u}-meta-title`},l):null,p=s?t.createElement("div",{className:`${u}-meta-description`},s):null,h=b||p?t.createElement("div",{className:`${u}-meta-detail`},b,p):null;return t.createElement("div",Object.assign({},d,{className:g}),m,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),a=e.i(242064),r=e.i(517455),o=e.i(150073);let l={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 g=e=>{let{itemPrefixCls:i,component:a,span:r,className:o,style:l,labelStyle:d,contentStyle:c,bordered:u,label:g,content:m,colon:b,type:p,styles:h}=e,{classNames:f}=t.useContext(s),y=Object.assign(Object.assign({},d),null==h?void 0:h.label),v=Object.assign(Object.assign({},c),null==h?void 0:h.content);if(u)return t.createElement(a,{colSpan:r,style:l,className:(0,n.default)(o,{[`${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!=m&&t.createElement("span",{style:v},m));return t.createElement(a,{colSpan:r,style:l,className:(0,n.default)(`${i}-item`,o)},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`]:!b})},g),null!=m&&t.createElement("span",{style:v,className:(0,n.default)(`${i}-item-content`,null==f?void 0:f.content)},m)))};function m(e,{colon:n,prefixCls:i,bordered:a},{component:r,type:o,showLabel:l,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:m,prefixCls:b=i,className:p,style:h,labelStyle:f,contentStyle:y,span:v=1,key:$,styles:O},x)=>"string"==typeof r?t.createElement(g,{key:`${o}-${$||x}`,className:p,style:h,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),null==O?void 0:O.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),y),null==O?void 0:O.content)},span:v,colon:n,component:r,itemPrefixCls:b,bordered:a,label:l?e:null,content:s?m:null,type:o}):[t.createElement(g,{key:`label-${$||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),f),null==O?void 0:O.label),span:1,colon:n,component:r[0],itemPrefixCls:b,bordered:a,label:e,type:"label"}),t.createElement(g,{key:`content-${$||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),h),y),null==O?void 0:O.content),span:2*v-1,component:r[1],itemPrefixCls:b,bordered:a,content:m,type:"content"})])}let b=e=>{let n=t.useContext(s),{prefixCls:i,vertical:a,row:r,index:o,bordered:l}=e;return a?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${o}`,className:`${i}-row`},m(r,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${o}`,className:`${i}-row`},m(r,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:o,className:`${i}-row`},m(r,e,Object.assign({component:l?["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 v=(0,f.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:a,colonMarginRight:r,colonMarginLeft:o,titleMarginBottom:l}=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:l},[`${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: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,p.unit)(o)} ${(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 $=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 O=e=>{let g,{prefixCls:m,title:p,extra:h,column:f,colon:y=!0,bordered:O,layout:x,children:j,className:S,rootClassName:w,style:C,size:E,labelStyle:M,contentStyle:k,styles:z,items:N,classNames:T}=e,P=$(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:B,direction:R,className:L,style:I,classNames:H,styles:G}=(0,a.useComponentConfig)("descriptions"),W=B("descriptions",m),D=(0,o.default)(),A=t.useMemo(()=>{var e;return"number"==typeof f?f:null!=(e=(0,i.matchScreen)(D,Object.assign(Object.assign({},l),f)))?e:3},[D,f]),F=(g=t.useMemo(()=>N||(0,d.default)(j).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[N,j]),t.useMemo(()=>g.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)(D,t)})}),[g,D])),X=(0,r.default)(E),K=((e,n)=>{let[i,a]=(0,t.useMemo)(()=>{let t,i,a,r;return t=[],i=[],a=!1,r=0,n.filter(e=>e).forEach(n=>{let{filled:o}=n,l=u(n,["filled"]);if(o){i.push(l),t.push(i),i=[],r=0;return}let s=e-r;(r+=n.span||1)>=e?(r>e?(a=!0,i.push(Object.assign(Object.assign({},l),{span:s}))):i.push(l),t.push(i),i=[],r=0):i.push(l)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:M,contentStyle:k,styles:{content:Object.assign(Object.assign({},G.content),null==z?void 0:z.content),label:Object.assign(Object.assign({},G.label),null==z?void 0:z.label)},classNames:{label:(0,n.default)(H.label,null==T?void 0:T.label),content:(0,n.default)(H.content,null==T?void 0:T.content)}}),[M,k,z,T,H,G]);return q(t.createElement(s.Provider,{value:Q},t.createElement("div",Object.assign({className:(0,n.default)(W,L,H.root,null==T?void 0:T.root,{[`${W}-${X}`]:X&&"default"!==X,[`${W}-bordered`]:!!O,[`${W}-rtl`]:"rtl"===R},S,w,U,_),style:Object.assign(Object.assign(Object.assign(Object.assign({},I),G.root),null==z?void 0:z.root),C)},P),(p||h)&&t.createElement("div",{className:(0,n.default)(`${W}-header`,H.header,null==T?void 0:T.header),style:Object.assign(Object.assign({},G.header),null==z?void 0:z.header)},p&&t.createElement("div",{className:(0,n.default)(`${W}-title`,H.title,null==T?void 0:T.title),style:Object.assign(Object.assign({},G.title),null==z?void 0:z.title)},p),h&&t.createElement("div",{className:(0,n.default)(`${W}-extra`,H.extra,null==T?void 0:T.extra),style:Object.assign(Object.assign({},G.extra),null==z?void 0:z.extra)},h)),t.createElement("div",{className:`${W}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,n)=>t.createElement(b,{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),a=e.i(170517),r=e.i(628882),o=e.i(320890),l=e.i(104458),s=e.i(722319),d=e.i(8398),c=e.i(279728);e.i(765846);var u=e.i(602716),g=e.i(328052),m=e.i(135551);let b=(e,t)=>new m.FastColor(e).setA(t).toRgbString(),p=(e,t)=>new m.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:b(i,.85),colorTextSecondary:b(i,.65),colorTextTertiary:b(i,.45),colorTextQuaternary:b(i,.25),colorFill:b(i,.18),colorFillSecondary:b(i,.12),colorFillTertiary:b(i,.08),colorFillQuaternary:b(i,.04),colorBgSolid:b(i,.95),colorBgSolidHover:b(i,1),colorBgSolidActive:b(i,.9),colorBgElevated:p(n,12),colorBgContainer:p(n,8),colorBgLayout:p(n,0),colorBgSpotlight:p(n,26),colorBgBlur:b(i,.04),colorBorder:p(n,26),colorBorderSecondary:p(n,19)}},y={defaultSeed:o.defaultConfig.token,useToken:function(){let[e,t,n]=(0,l.useToken)();return{theme:e,token:t,hashId:n}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let n=Object.keys(a.defaultPresetColors).map(t=>{let n=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,i,a)=>(e[`${t}-${a+1}`]=n[a],e[`${t}${a+1}`]=n[a],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,a=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,c.default)(i)),{controlHeight:a}),(0,d.default)(Object.assign(Object.assign({},n),{controlHeight:a})))},getDesignToken:e=>{let o=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):i.default,l=Object.assign(Object.assign({},a.default),null==e?void 0:e.token);return(0,n.getComputedToken)(l,{override:null==e?void 0:e.token},o,r.default)},defaultConfig:o.defaultConfig,_internalContext:o.DesignTokenContext};e.s(["theme",0,y],368869)},127952,e=>{"use strict";var t=e.i(843476),n=e.i(560445),i=e.i(175712),a=e.i(869216),r=e.i(311451),o=e.i(212931),l=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:g,message:m,resourceInformationTitle:b,resourceInformation:p,onCancel:h,onOk:f,confirmLoading:y,requiredConfirmation:v}){let{Title:$,Text:O}=l.Typography,{token:x}=s.theme.useToken(),[j,S]=(0,c.useState)("");return(0,c.useEffect)(()=>{e&&S("")},[e]),(0,t.jsx)(o.Modal,{title:u,open:e,onOk:f,onCancel:h,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!v&&j!==v||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:b,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)(a.Descriptions,{column:1,size:"small",children:p&&p.map(({label:e,value:n,...i})=>(0,t.jsx)(a.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:m})}),v&&(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:v}),(0,t.jsx)(O,{children:" to confirm deletion:"})]}),(0,t.jsx)(r.Input,{value:j,onChange:e=>S(e.target.value),placeholder:v,className:"rounded-md",prefix:(0,t.jsx)(d.ExclamationCircleOutlined,{style:{color:x.colorError}}),autoFocus:!0})]})]})})}])},954616,e=>{"use strict";var t=e.i(271645),n=e.i(114272),i=e.i(540143),a=e.i(915823),r=e.i(619273),o=class extends a.Subscribable{#e;#t=void 0;#n;#i;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#a()}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.#a(),this.#r(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#a(),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)}#a(){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)})})}},l=e.i(912598);e.s(["useMutation",0,function(e,n){let a=(0,l.useQueryClient)(n),[s]=t.useState(()=>new o(a,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let d=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(i.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),c=t.useCallback((e,t)=>{s.mutate(e,t).catch(r.noop)},[s]);if(d.error&&(0,r.shouldThrowError)(s.options.throwOnError,[d.error]))throw d.error;return{...d,mutate:c,mutateAsync:d.mutate}}],954616)},107233,603908,e=>{"use strict";let t=(0,e.i(475254).default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["default",0,t],603908),e.s(["Plus",0,t],107233)}]); \ No newline at end of file + `,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:r,actionsBg:o}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:o,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${r}`,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} ${r}`}}})})(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:r}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:a,padding:`0 ${(0,c.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 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 f=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))}))},y=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:g,rootClassName:m,style:y,extra:v,headStyle:$={},bodyStyle:O={},title:x,loading:j,bordered:S,variant:w,size:C,type:E,cover:M,actions:k,tabList:z,children:N,activeTabKey:T,defaultActiveTabKey:P,tabBarExtraContent:B,hoverable:R,tabProps:L={},classNames:I,styles:H}=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(a.ConfigContext),[F]=(0,p.default)("card",w,S),X=e=>{var t;return(0,n.default)(null==(t=null==A?void 0:A.classNames)?void 0:t[e],null==I?void 0:I[e])},K=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==H?void 0:H[e])},q=t.useMemo(()=>{let e=!1;return t.Children.forEach(N,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[N]),U=W("card",u),[_,Q,V]=b(U),J=t.createElement(o.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:B}),ee=(0,r.default)(C),et=ee&&"default"!==ee?ee:"large",en=z?t.createElement(l.default,Object.assign({size:et},Z,{className:`${U}-head-tabs`,onChange:t=>{var n;null==(n=e.onTabChange)||n.call(e,t)},items:z.map(e=>{var{tab:t}=e;return Object.assign({label:t},h(e,["tab"]))})})):null;if(x||v||en){let e=(0,n.default)(`${U}-head`,X("header")),i=(0,n.default)(`${U}-head-title`,X("title")),a=(0,n.default)(`${U}-extra`,X("extra")),r=Object.assign(Object.assign({},$),K("header"));c=t.createElement("div",{className:e,style:r},t.createElement("div",{className:`${U}-head-wrapper`},x&&t.createElement("div",{className:i,style:K("title")},x),v&&t.createElement("div",{className:a,style:K("extra")},v)),en)}let ei=(0,n.default)(`${U}-cover`,X("cover")),ea=M?t.createElement("div",{className:ei,style:K("cover")},M):null,er=(0,n.default)(`${U}-body`,X("body")),eo=Object.assign(Object.assign({},O),K("body")),el=t.createElement("div",{className:er,style:eo},j?J:N),es=(0,n.default)(`${U}-actions`,X("actions")),ed=(null==k?void 0:k.length)?t.createElement(f,{actionClasses:es,actionStyle:K("actions"),actions:k}):null,ec=(0,i.default)(G,["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==z?void 0:z.length,[`${U}-${ee}`]:ee,[`${U}-type-${E}`]:!!E,[`${U}-rtl`]:"rtl"===D},g,m,Q,V),eg=Object.assign(Object.assign({},null==A?void 0:A.style),y);return _(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:eg}),c,ea,el,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 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};y.Grid=d,y.Meta=e=>{let{prefixCls:i,className:r,avatar:o,title:l,description:s}=e,d=v(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(a.ConfigContext),u=c("card",i),g=(0,n.default)(`${u}-meta`,r),m=o?t.createElement("div",{className:`${u}-meta-avatar`},o):null,b=l?t.createElement("div",{className:`${u}-meta-title`},l):null,p=s?t.createElement("div",{className:`${u}-meta-description`},s):null,h=b||p?t.createElement("div",{className:`${u}-meta-detail`},b,p):null;return t.createElement("div",Object.assign({},d,{className:g}),m,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),a=e.i(242064),r=e.i(517455),o=e.i(150073);let l={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 g=e=>{let{itemPrefixCls:i,component:a,span:r,className:o,style:l,labelStyle:d,contentStyle:c,bordered:u,label:g,content:m,colon:b,type:p,styles:h}=e,{classNames:f}=t.useContext(s),y=Object.assign(Object.assign({},d),null==h?void 0:h.label),v=Object.assign(Object.assign({},c),null==h?void 0:h.content);if(u)return t.createElement(a,{colSpan:r,style:l,className:(0,n.default)(o,{[`${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!=m&&t.createElement("span",{style:v},m));return t.createElement(a,{colSpan:r,style:l,className:(0,n.default)(`${i}-item`,o)},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`]:!b})},g),null!=m&&t.createElement("span",{style:v,className:(0,n.default)(`${i}-item-content`,null==f?void 0:f.content)},m)))};function m(e,{colon:n,prefixCls:i,bordered:a},{component:r,type:o,showLabel:l,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:m,prefixCls:b=i,className:p,style:h,labelStyle:f,contentStyle:y,span:v=1,key:$,styles:O},x)=>"string"==typeof r?t.createElement(g,{key:`${o}-${$||x}`,className:p,style:h,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),null==O?void 0:O.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),y),null==O?void 0:O.content)},span:v,colon:n,component:r,itemPrefixCls:b,bordered:a,label:l?e:null,content:s?m:null,type:o}):[t.createElement(g,{key:`label-${$||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),f),null==O?void 0:O.label),span:1,colon:n,component:r[0],itemPrefixCls:b,bordered:a,label:e,type:"label"}),t.createElement(g,{key:`content-${$||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),h),y),null==O?void 0:O.content),span:2*v-1,component:r[1],itemPrefixCls:b,bordered:a,content:m,type:"content"})])}let b=e=>{let n=t.useContext(s),{prefixCls:i,vertical:a,row:r,index:o,bordered:l}=e;return a?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${o}`,className:`${i}-row`},m(r,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${o}`,className:`${i}-row`},m(r,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:o,className:`${i}-row`},m(r,e,Object.assign({component:l?["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 v=(0,f.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:i,itemPaddingEnd:a,colonMarginRight:r,colonMarginLeft:o,titleMarginBottom:l}=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:l},[`${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: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,p.unit)(o)} ${(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 $=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 O=e=>{let g,{prefixCls:m,title:p,extra:h,column:f,colon:y=!0,bordered:O,layout:x,children:j,className:S,rootClassName:w,style:C,size:E,labelStyle:M,contentStyle:k,styles:z,items:N,classNames:T}=e,P=$(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:B,direction:R,className:L,style:I,classNames:H,styles:G}=(0,a.useComponentConfig)("descriptions"),W=B("descriptions",m),D=(0,o.default)(),A=t.useMemo(()=>{var e;return"number"==typeof f?f:null!=(e=(0,i.matchScreen)(D,Object.assign(Object.assign({},l),f)))?e:3},[D,f]),F=(g=t.useMemo(()=>N||(0,d.default)(j).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[N,j]),t.useMemo(()=>g.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)(D,t)})}),[g,D])),X=(0,r.default)(E),K=((e,n)=>{let[i,a]=(0,t.useMemo)(()=>{let t,i,a,r;return t=[],i=[],a=!1,r=0,n.filter(e=>e).forEach(n=>{let{filled:o}=n,l=u(n,["filled"]);if(o){i.push(l),t.push(i),i=[],r=0;return}let s=e-r;(r+=n.span||1)>=e?(r>e?(a=!0,i.push(Object.assign(Object.assign({},l),{span:s}))):i.push(l),t.push(i),i=[],r=0):i.push(l)}),i.length>0&&t.push(i),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:M,contentStyle:k,styles:{content:Object.assign(Object.assign({},G.content),null==z?void 0:z.content),label:Object.assign(Object.assign({},G.label),null==z?void 0:z.label)},classNames:{label:(0,n.default)(H.label,null==T?void 0:T.label),content:(0,n.default)(H.content,null==T?void 0:T.content)}}),[M,k,z,T,H,G]);return q(t.createElement(s.Provider,{value:Q},t.createElement("div",Object.assign({className:(0,n.default)(W,L,H.root,null==T?void 0:T.root,{[`${W}-${X}`]:X&&"default"!==X,[`${W}-bordered`]:!!O,[`${W}-rtl`]:"rtl"===R},S,w,U,_),style:Object.assign(Object.assign(Object.assign(Object.assign({},I),G.root),null==z?void 0:z.root),C)},P),(p||h)&&t.createElement("div",{className:(0,n.default)(`${W}-header`,H.header,null==T?void 0:T.header),style:Object.assign(Object.assign({},G.header),null==z?void 0:z.header)},p&&t.createElement("div",{className:(0,n.default)(`${W}-title`,H.title,null==T?void 0:T.title),style:Object.assign(Object.assign({},G.title),null==z?void 0:z.title)},p),h&&t.createElement("div",{className:(0,n.default)(`${W}-extra`,H.extra,null==T?void 0:T.extra),style:Object.assign(Object.assign({},G.extra),null==z?void 0:z.extra)},h)),t.createElement("div",{className:`${W}-view`},t.createElement("table",null,t.createElement("tbody",null,K.map((e,n)=>t.createElement(b,{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),a=e.i(170517),r=e.i(628882),o=e.i(320890),l=e.i(104458),s=e.i(722319),d=e.i(8398),c=e.i(279728);e.i(765846);var u=e.i(602716),g=e.i(328052),m=e.i(135551);let b=(e,t)=>new m.FastColor(e).setA(t).toRgbString(),p=(e,t)=>new m.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:b(i,.85),colorTextSecondary:b(i,.65),colorTextTertiary:b(i,.45),colorTextQuaternary:b(i,.25),colorFill:b(i,.18),colorFillSecondary:b(i,.12),colorFillTertiary:b(i,.08),colorFillQuaternary:b(i,.04),colorBgSolid:b(i,.95),colorBgSolidHover:b(i,1),colorBgSolidActive:b(i,.9),colorBgElevated:p(n,12),colorBgContainer:p(n,8),colorBgLayout:p(n,0),colorBgSpotlight:p(n,26),colorBgBlur:b(i,.04),colorBorder:p(n,26),colorBorderSecondary:p(n,19)}},y={defaultSeed:o.defaultConfig.token,useToken:function(){let[e,t,n]=(0,l.useToken)();return{theme:e,token:t,hashId:n}},defaultAlgorithm:s.default,darkAlgorithm:(e,t)=>{let n=Object.keys(a.defaultPresetColors).map(t=>{let n=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,i,a)=>(e[`${t}-${a+1}`]=n[a],e[`${t}${a+1}`]=n[a],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,a=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,c.default)(i)),{controlHeight:a}),(0,d.default)(Object.assign(Object.assign({},n),{controlHeight:a})))},getDesignToken:e=>{let o=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):i.default,l=Object.assign(Object.assign({},a.default),null==e?void 0:e.token);return(0,n.getComputedToken)(l,{override:null==e?void 0:e.token},o,r.default)},defaultConfig:o.defaultConfig,_internalContext:o.DesignTokenContext};e.s(["theme",0,y],368869)},127952,e=>{"use strict";var t=e.i(843476),n=e.i(560445),i=e.i(175712),a=e.i(869216),r=e.i(311451),o=e.i(212931),l=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:g,message:m,resourceInformationTitle:b,resourceInformation:p,onCancel:h,onOk:f,confirmLoading:y,requiredConfirmation:v}){let{Text:$}=l.Typography,{token:O}=s.theme.useToken(),[x,j]=(0,c.useState)("");return(0,c.useEffect)(()=>{e&&j("")},[e]),(0,t.jsx)(o.Modal,{title:u,open:e,onOk:f,onCancel:h,confirmLoading:y,okText:y?"Deleting...":"Delete",cancelText:"Cancel",okButtonProps:{danger:!0,disabled:!!v&&x!==v||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:b,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:O.colorErrorBg,borderColor:O.colorErrorBorder}},style:{backgroundColor:O.colorErrorBg,borderColor:O.colorErrorBorder},children:(0,t.jsx)(a.Descriptions,{column:1,size:"small",children:p&&p.map(({label:e,value:n,...i})=>(0,t.jsx)(a.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)($,{...i,children:n??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)($,{children:m})}),v&&(0,t.jsxs)("div",{className:"mb-6 mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:[(0,t.jsxs)($,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)($,{children:"Type "}),(0,t.jsx)($,{strong:!0,type:"danger",children:v}),(0,t.jsx)($,{children:" to confirm deletion:"})]}),(0,t.jsx)(r.Input,{value:x,onChange:e=>j(e.target.value),placeholder:v,className:"rounded-md",prefix:(0,t.jsx)(d.ExclamationCircleOutlined,{style:{color:O.colorError}}),autoFocus:!0})]})]})})}])},954616,e=>{"use strict";var t=e.i(271645),n=e.i(114272),i=e.i(540143),a=e.i(915823),r=e.i(619273),o=class extends a.Subscribable{#e;#t=void 0;#n;#i;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#a()}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.#a(),this.#r(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#a(),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)}#a(){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)})})}},l=e.i(912598);e.s(["useMutation",0,function(e,n){let a=(0,l.useQueryClient)(n),[s]=t.useState(()=>new o(a,e));t.useEffect(()=>{s.setOptions(e)},[s,e]);let d=t.useSyncExternalStore(t.useCallback(e=>s.subscribe(i.notifyManager.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),c=t.useCallback((e,t)=>{s.mutate(e,t).catch(r.noop)},[s]);if(d.error&&(0,r.shouldThrowError)(s.options.throwOnError,[d.error]))throw d.error;return{...d,mutate:c,mutateAsync:d.mutate}}],954616)},107233,603908,e=>{"use strict";let t=(0,e.i(475254).default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["default",0,t],603908),e.s(["Plus",0,t],107233)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0xs1uz0umxpo_.js b/litellm/proxy/_experimental/out/_next/static/chunks/0xs1uz0umxpo_.js new file mode 100644 index 00000000000..688cd7b623d --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0xs1uz0umxpo_.js @@ -0,0 +1,10 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,409797,e=>{"use strict";var t=e.i(631171);e.s(["ChevronDownIcon",()=>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 n=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,n,"useCompositeListContext",0,function(){return t.useContext(n)}])},53687,e=>{"use strict";var t=e.i(271645),n=e.i(921374),l=e.i(667865),r=e.i(146376),i=e.i(545356),a=e.i(843476);function o(){return new Map}function s(){return new Set}function d(e,t){let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING||n&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:n&Node.DOCUMENT_POSITION_PRECEDING||n&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:c,elementsRef:u,labelsRef:g,onMapChange:b}=e,m=(0,l.useStableCallback)(b),p=t.useRef(0),f=(0,n.useRefWithInit)(s).current,h=(0,n.useRefWithInit)(o).current,[y,$]=t.useState(0),v=t.useRef(y),O=(0,l.useStableCallback)((e,t)=>{h.set(e,t??null),v.current+=1,$(v.current)}),x=(0,l.useStableCallback)(e=>{h.delete(e),v.current+=1,$(v.current)}),j=t.useMemo(()=>{let e=new Map;return Array.from(h.keys()).filter(e=>e.isConnected).sort(d).forEach((t,n)=>{let l=h.get(t)??{};e.set(t,{...l,index:n})}),e},[h,y]);(0,r.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===j.size)return;let e=new MutationObserver(e=>{let t=new Set,n=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(n),e.addedNodes.forEach(n)}),0===t.size&&(v.current+=1,$(v.current))});return j.forEach((t,n)=>{n.parentElement&&e.observe(n.parentElement,{childList:!0})}),()=>{e.disconnect()}},[j]),(0,r.useIsoLayoutEffect)(()=>{v.current===y&&(u.current.length!==j.size&&(u.current.length=j.size),g&&g.current.length!==j.size&&(g.current.length=j.size),p.current=j.size),m(j)},[m,j,u,g,y]),(0,r.useIsoLayoutEffect)(()=>()=>{u.current=[]},[u]),(0,r.useIsoLayoutEffect)(()=>()=>{g&&(g.current=[])},[g]);let S=(0,l.useStableCallback)(e=>(f.add(e),()=>{f.delete(e)}));(0,r.useIsoLayoutEffect)(()=>{f.forEach(e=>e(j))},[f,j]);let C=t.useMemo(()=>({register:O,unregister:x,subscribeMapChange:S,elementsRef:u,labelsRef:g,nextIndexRef:p}),[O,x,S,u,g,p]);return(0,a.jsx)(i.CompositeListContext.Provider,{value:C,children:c})}])},673553,e=>{"use strict";var t,n=e.i(271645),l=e.i(146376),r=e.i(545356);let i=((t={})[t.None=0]="None",t[t.GuessFromOrder=1]="GuessFromOrder",t);e.s(["IndexGuessBehavior",0,i,"useCompositeListItem",0,function(e={}){let{label:t,metadata:a,textRef:o,indexGuessBehavior:s,index:d}=e,{register:c,unregister:u,subscribeMapChange:g,elementsRef:b,labelsRef:m,nextIndexRef:p}=(0,r.useCompositeListContext)(),f=n.useRef(-1),[h,y]=n.useState(d??(s===i.GuessFromOrder?()=>{if(-1===f.current){let e=p.current;p.current+=1,f.current=e}return f.current}:-1)),$=n.useRef(null),v=n.useCallback(e=>{if($.current=e,-1!==h&&null!==e&&(b.current[h]=e,m)){let n=void 0!==t;m.current[h]=n?t:o?.current?.textContent??e.textContent}},[h,b,m,t,o]);return(0,l.useIsoLayoutEffect)(()=>{if(null!=d)return;let e=$.current;if(e)return c(e,a),()=>{u(e)}},[d,c,u,a]),(0,l.useIsoLayoutEffect)(()=>{if(null==d)return g(e=>{let t=$.current?e.get($.current)?.index:null;null!=t&&y(t)})},[d,g,y]),{ref:v,index:h}}])},302747,e=>{"use strict";var t=e.i(843476),n=e.i(271645),l=e.i(115504);let r=n.forwardRef(({className:e,...n},r)=>(0,t.jsx)("div",{ref:r,"data-slot":"skeleton",className:(0,l.cn)("animate-pulse rounded-md bg-accent",e),...n}));r.displayName="Skeleton",e.s(["Skeleton",0,r])},110204,e=>{"use strict";var t=e.i(843476),n=e.i(271645),l=e.i(115504);let r=n.forwardRef(({className:e,...n},r)=>(0,t.jsx)("label",{ref:r,"data-slot":"label",className:(0,l.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),...n}));r.displayName="Label",e.s(["Label",0,r])},270377,e=>{"use strict";e.i(247167);var t=e.i(931067),n=e.i(271645);let l={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 r=e.i(9583),i=n.forwardRef(function(e,i){return n.createElement(r.default,(0,t.default)({},e,{ref:i,icon:l}))});e.s(["ExclamationCircleOutlined",0,i],270377)},175712,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),l=e.i(529681),r=e.i(242064),i=e.i(517455),a=e.i(185793),o=e.i(721369),s=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n};let d=e=>{var{prefixCls:l,className:i,hoverable:a=!0}=e,o=s(e,["prefixCls","className","hoverable"]);let{getPrefixCls:d}=t.useContext(r.ConfigContext),c=d("card",l),u=(0,n.default)(`${c}-grid`,i,{[`${c}-grid-hoverable`]:a});return t.createElement("div",Object.assign({},o,{className:u}))};e.i(296059);var c=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:l,colorBorderSecondary:r,boxShadowTertiary:i,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:i},[`${t}-head`]:(e=>{let{antCls:t,componentCls:n,headerHeight:l,headerPadding:r,tabsMarginBottom:i}=e;return Object.assign(Object.assign({display:"flex",justifyContent:"center",flexDirection:"column",minHeight:l,marginBottom:-1,padding:`0 ${(0,c.unit)(r)}`,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:i,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:a,borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},[`${t}-grid`]:(e=>{let{cardPaddingBase:t,colorBorderSecondary:n,cardShadow:l,lineWidth:r}=e;return{width:"33.33%",padding:t,border:0,borderRadius:0,boxShadow:` + ${(0,c.unit)(r)} 0 0 0 ${n}, + 0 ${(0,c.unit)(r)} 0 0 ${n}, + ${(0,c.unit)(r)} ${(0,c.unit)(r)} 0 0 ${n}, + ${(0,c.unit)(r)} 0 0 0 ${n} inset, + 0 ${(0,c.unit)(r)} 0 0 ${n} inset; + `,transition:`all ${e.motionDurationMid}`,"&-hoverable:hover":{position:"relative",zIndex:1,boxShadow:l}}})(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:l,cardActionsIconSize:r,colorBorderSecondary:i,actionsBg:a}=e;return Object.assign(Object.assign({margin:0,padding:0,listStyle:"none",background:a,borderTop:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${i}`,display:"flex",borderRadius:`0 0 ${(0,c.unit)(e.borderRadiusLG)} ${(0,c.unit)(e.borderRadiusLG)}`},(0,u.clearFix)()),{"& > li":{margin:l,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:r,lineHeight:(0,c.unit)(e.calc(r).mul(e.lineHeight).equal())}},"&:not(:last-child)":{borderInlineEnd:`${(0,c.unit)(e.lineWidth)} ${e.lineType} ${i}`}}})})(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} ${r}`,[`${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:l}}},[`${t}-type-inner`]:(e=>{let{componentCls:t,colorFillAlter:n,headerPadding:l,bodyPadding:r}=e;return{[`${t}-head`]:{padding:`0 ${(0,c.unit)(l)}`,background:n,"&-title":{fontSize:e.fontSize}},[`${t}-body`]:{padding:`${(0,c.unit)(e.padding)} ${(0,c.unit)(r)}`}}})(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:l,headerHeightSM:r,headerFontSizeSM:i}=e;return{[`${t}-small`]:{[`> ${t}-head`]:{minHeight:r,padding:`0 ${(0,c.unit)(l)}`,fontSize:i,[`> ${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),f=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n};let h=e=>{let{actionClasses:n,actions:l=[],actionStyle:r}=e;return t.createElement("ul",{className:n,style:r},l.map((e,n)=>{let r=`action-${n}`;return t.createElement("li",{style:{width:`${100/l.length}%`},key:r},t.createElement("span",null,e))}))},y=t.forwardRef((e,s)=>{let c,{prefixCls:u,className:g,rootClassName:b,style:y,extra:$,headStyle:v={},bodyStyle:O={},title:x,loading:j,bordered:S,variant:C,size:E,type:N,cover:w,actions:z,tabList:T,children:k,activeTabKey:I,defaultActiveTabKey:B,tabBarExtraContent:L,hoverable:P,tabProps:M={},classNames:R,styles:G}=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:W,direction:D,card:A}=t.useContext(r.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==R?void 0:R[e])},_=e=>{var t;return Object.assign(Object.assign({},null==(t=null==A?void 0:A.styles)?void 0:t[e]),null==G?void 0:G[e])},K=t.useMemo(()=>{let e=!1;return t.Children.forEach(k,t=>{(null==t?void 0:t.type)===d&&(e=!0)}),e},[k]),U=W("card",u),[q,Q,V]=m(U),Y=t.createElement(a.default,{loading:!0,active:!0,paragraph:{rows:4},title:!1},k),J=void 0!==I,Z=Object.assign(Object.assign({},M),{[J?"activeKey":"defaultActiveKey"]:J?I:B,tabBarExtraContent:L}),ee=(0,i.default)(E),et=ee&&"default"!==ee?ee:"large",en=T?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:T.map(e=>{var{tab:t}=e;return Object.assign({label:t},f(e,["tab"]))})})):null;if(x||$||en){let e=(0,n.default)(`${U}-head`,X("header")),l=(0,n.default)(`${U}-head-title`,X("title")),r=(0,n.default)(`${U}-extra`,X("extra")),i=Object.assign(Object.assign({},v),_("header"));c=t.createElement("div",{className:e,style:i},t.createElement("div",{className:`${U}-head-wrapper`},x&&t.createElement("div",{className:l,style:_("title")},x),$&&t.createElement("div",{className:r,style:_("extra")},$)),en)}let el=(0,n.default)(`${U}-cover`,X("cover")),er=w?t.createElement("div",{className:el,style:_("cover")},w):null,ei=(0,n.default)(`${U}-body`,X("body")),ea=Object.assign(Object.assign({},O),_("body")),eo=t.createElement("div",{className:ei,style:ea},j?Y:k),es=(0,n.default)(`${U}-actions`,X("actions")),ed=(null==z?void 0:z.length)?t.createElement(h,{actionClasses:es,actionStyle:_("actions"),actions:z}):null,ec=(0,l.default)(H,["onTabChange"]),eu=(0,n.default)(U,null==A?void 0:A.className,{[`${U}-loading`]:j,[`${U}-bordered`]:"borderless"!==F,[`${U}-hoverable`]:P,[`${U}-contain-grid`]:K,[`${U}-contain-tabs`]:null==T?void 0:T.length,[`${U}-${ee}`]:ee,[`${U}-type-${N}`]:!!N,[`${U}-rtl`]:"rtl"===D},g,b,Q,V),eg=Object.assign(Object.assign({},null==A?void 0:A.style),y);return q(t.createElement("div",Object.assign({ref:s},ec,{className:eu,style:eg}),c,er,eo,ed))});var $=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n};y.Grid=d,y.Meta=e=>{let{prefixCls:l,className:i,avatar:a,title:o,description:s}=e,d=$(e,["prefixCls","className","avatar","title","description"]),{getPrefixCls:c}=t.useContext(r.ConfigContext),u=c("card",l),g=(0,n.default)(`${u}-meta`,i),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,f=m||p?t.createElement("div",{className:`${u}-meta-detail`},m,p):null;return t.createElement("div",Object.assign({},d,{className:g}),b,f)},e.s(["Card",0,y],175712)},869216,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(343794),l=e.i(908206),r=e.i(242064),i=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 d=e.i(876556),c=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n},u=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n};let g=e=>{let{itemPrefixCls:l,component:r,span:i,className:a,style:o,labelStyle:d,contentStyle:c,bordered:u,label:g,content:b,colon:m,type:p,styles:f}=e,{classNames:h}=t.useContext(s),y=Object.assign(Object.assign({},d),null==f?void 0:f.label),$=Object.assign(Object.assign({},c),null==f?void 0:f.content);if(u)return t.createElement(r,{colSpan:i,style:o,className:(0,n.default)(a,{[`${l}-item-${p}`]:"label"===p||"content"===p,[null==h?void 0:h.label]:(null==h?void 0:h.label)&&"label"===p,[null==h?void 0:h.content]:(null==h?void 0:h.content)&&"content"===p})},null!=g&&t.createElement("span",{style:y},g),null!=b&&t.createElement("span",{style:$},b));return t.createElement(r,{colSpan:i,style:o,className:(0,n.default)(`${l}-item`,a)},t.createElement("div",{className:`${l}-item-container`},null!=g&&t.createElement("span",{style:y,className:(0,n.default)(`${l}-item-label`,null==h?void 0:h.label,{[`${l}-item-no-colon`]:!m})},g),null!=b&&t.createElement("span",{style:$,className:(0,n.default)(`${l}-item-content`,null==h?void 0:h.content)},b)))};function b(e,{colon:n,prefixCls:l,bordered:r},{component:i,type:a,showLabel:o,showContent:s,labelStyle:d,contentStyle:c,styles:u}){return e.map(({label:e,children:b,prefixCls:m=l,className:p,style:f,labelStyle:h,contentStyle:y,span:$=1,key:v,styles:O},x)=>"string"==typeof i?t.createElement(g,{key:`${a}-${v||x}`,className:p,style:f,styles:{label:Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),h),null==O?void 0:O.label),content:Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),y),null==O?void 0:O.content)},span:$,colon:n,component:i,itemPrefixCls:m,bordered:r,label:o?e:null,content:s?b:null,type:a}):[t.createElement(g,{key:`label-${v||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},d),null==u?void 0:u.label),f),h),null==O?void 0:O.label),span:1,colon:n,component:i[0],itemPrefixCls:m,bordered:r,label:e,type:"label"}),t.createElement(g,{key:`content-${v||x}`,className:p,style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),null==u?void 0:u.content),f),y),null==O?void 0:O.content),span:2*$-1,component:i[1],itemPrefixCls:m,bordered:r,content:b,type:"content"})])}let m=e=>{let n=t.useContext(s),{prefixCls:l,vertical:r,row:i,index:a,bordered:o}=e;return r?t.createElement(t.Fragment,null,t.createElement("tr",{key:`label-${a}`,className:`${l}-row`},b(i,e,Object.assign({component:"th",type:"label",showLabel:!0},n))),t.createElement("tr",{key:`content-${a}`,className:`${l}-row`},b(i,e,Object.assign({component:"td",type:"content",showContent:!0},n)))):t.createElement("tr",{key:a,className:`${l}-row`},b(i,e,Object.assign({component:o?["th","td"]:"td",type:"item",showLabel:!0,showContent:!0},n)))};e.i(296059);var p=e.i(915654),f=e.i(183293),h=e.i(246422),y=e.i(838378);let $=(0,h.genStyleHooks)("Descriptions",e=>(e=>{let{componentCls:t,extraColor:n,itemPaddingBottom:l,itemPaddingEnd:r,colonMarginRight:i,colonMarginLeft:a,titleMarginBottom:o}=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,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({},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:l,paddingInlineEnd:r},"> 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)(i)}`},[`&${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 l in e)Object.prototype.hasOwnProperty.call(e,l)&&0>t.indexOf(l)&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,l=Object.getOwnPropertySymbols(e);rt.indexOf(l[r])&&Object.prototype.propertyIsEnumerable.call(e,l[r])&&(n[l[r]]=e[l[r]]);return n};let O=e=>{let g,{prefixCls:b,title:p,extra:f,column:h,colon:y=!0,bordered:O,layout:x,children:j,className:S,rootClassName:C,style:E,size:N,labelStyle:w,contentStyle:z,styles:T,items:k,classNames:I}=e,B=v(e,["prefixCls","title","extra","column","colon","bordered","layout","children","className","rootClassName","style","size","labelStyle","contentStyle","styles","items","classNames"]),{getPrefixCls:L,direction:P,className:M,style:R,classNames:G,styles:H}=(0,r.useComponentConfig)("descriptions"),W=L("descriptions",b),D=(0,a.default)(),A=t.useMemo(()=>{var e;return"number"==typeof h?h:null!=(e=(0,l.matchScreen)(D,Object.assign(Object.assign({},o),h)))?e:3},[D,h]),F=(g=t.useMemo(()=>k||(0,d.default)(j).map(e=>Object.assign(Object.assign({},null==e?void 0:e.props),{key:e.key})),[k,j]),t.useMemo(()=>g.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,l.matchScreen)(D,t)})}),[g,D])),X=(0,i.default)(N),_=((e,n)=>{let[l,r]=(0,t.useMemo)(()=>{let t,l,r,i;return t=[],l=[],r=!1,i=0,n.filter(e=>e).forEach(n=>{let{filled:a}=n,o=u(n,["filled"]);if(a){l.push(o),t.push(l),l=[],i=0;return}let s=e-i;(i+=n.span||1)>=e?(i>e?(r=!0,l.push(Object.assign(Object.assign({},o),{span:s}))):l.push(o),t.push(l),l=[],i=0):l.push(o)}),l.length>0&&t.push(l),[t=t.map(t=>{let n=t.reduce((e,t)=>e+(t.span||1),0);if(n({labelStyle:w,contentStyle:z,styles:{content:Object.assign(Object.assign({},H.content),null==T?void 0:T.content),label:Object.assign(Object.assign({},H.label),null==T?void 0:T.label)},classNames:{label:(0,n.default)(G.label,null==I?void 0:I.label),content:(0,n.default)(G.content,null==I?void 0:I.content)}}),[w,z,T,I,G,H]);return K(t.createElement(s.Provider,{value:Q},t.createElement("div",Object.assign({className:(0,n.default)(W,M,G.root,null==I?void 0:I.root,{[`${W}-${X}`]:X&&"default"!==X,[`${W}-bordered`]:!!O,[`${W}-rtl`]:"rtl"===P},S,C,U,q),style:Object.assign(Object.assign(Object.assign(Object.assign({},R),H.root),null==T?void 0:T.root),E)},B),(p||f)&&t.createElement("div",{className:(0,n.default)(`${W}-header`,G.header,null==I?void 0:I.header),style:Object.assign(Object.assign({},H.header),null==T?void 0:T.header)},p&&t.createElement("div",{className:(0,n.default)(`${W}-title`,G.title,null==I?void 0:I.title),style:Object.assign(Object.assign({},H.title),null==T?void 0:T.title)},p),f&&t.createElement("div",{className:(0,n.default)(`${W}-extra`,G.extra,null==I?void 0:I.extra),style:Object.assign(Object.assign({},H.extra),null==T?void 0:T.extra)},f)),t.createElement("div",{className:`${W}-view`},t.createElement("table",null,t.createElement("tbody",null,_.map((e,n)=>t.createElement(m,{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),l=e.i(289882),r=e.i(170517),i=e.i(628882),a=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),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(),f=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]}},h=(e,t)=>{let n=e||"#000",l=t||"#fff";return{colorBgBase:n,colorTextBase:l,colorText:m(l,.85),colorTextSecondary:m(l,.65),colorTextTertiary:m(l,.45),colorTextQuaternary:m(l,.25),colorFill:m(l,.18),colorFillSecondary:m(l,.12),colorFillTertiary:m(l,.08),colorFillQuaternary:m(l,.04),colorBgSolid:m(l,.95),colorBgSolidHover:m(l,1),colorBgSolidActive:m(l,.9),colorBgElevated:p(n,12),colorBgContainer:p(n,8),colorBgLayout:p(n,0),colorBgSpotlight:p(n,26),colorBgBlur:m(l,.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(r.defaultPresetColors).map(t=>{let n=(0,u.generate)(e[t],{theme:"dark"});return Array.from({length:10},()=>1).reduce((e,l,r)=>(e[`${t}-${r+1}`]=n[r],e[`${t}${r+1}`]=n[r],e),{})}).reduce((e,t)=>e=Object.assign(Object.assign({},e),t),{}),l=null!=t?t:(0,s.default)(e),i=(0,g.default)(e,{generateColorPalettes:f,generateNeutralColorPalettes:h});return Object.assign(Object.assign(Object.assign(Object.assign({},l),n),i),{colorPrimaryBg:i.colorPrimaryBorder,colorPrimaryBgHover:i.colorPrimaryBorderHover})},compactAlgorithm:(e,t)=>{let n=null!=t?t:(0,s.default)(e),l=n.fontSizeSM,r=n.controlHeight-4;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n),function(e){let{sizeUnit:t,sizeStep:n}=e,l=n-2;return{sizeXXL:t*(l+10),sizeXL:t*(l+6),sizeLG:t*(l+2),sizeMD:t*(l+2),sizeMS:t*(l+1),size:t*l,sizeSM:t*l,sizeXS:t*(l-1),sizeXXS:t*(l-1)}}(null!=t?t:e)),(0,c.default)(l)),{controlHeight:r}),(0,d.default)(Object.assign(Object.assign({},n),{controlHeight:r})))},getDesignToken:e=>{let a=(null==e?void 0:e.algorithm)?(0,t.createTheme)(e.algorithm):l.default,o=Object.assign(Object.assign({},r.default),null==e?void 0:e.token);return(0,n.getComputedToken)(o,{override:null==e?void 0:e.token},a,i.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),l=e.i(175712),r=e.i(869216),i=e.i(311451),a=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:g,message:b,resourceInformationTitle:m,resourceInformation:p,onCancel:f,onOk:h,confirmLoading:y,requiredConfirmation:$}){let{Text:v}=o.Typography,{token:O}=s.theme.useToken(),[x,j]=(0,c.useState)("");return(0,c.useEffect)(()=>{e&&j("")},[e]),(0,t.jsx)(a.Modal,{title:u,open:e,onOk:h,onCancel:f,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)(l.Card,{title:m,className:"mt-4",styles:{body:{padding:"16px"},header:{backgroundColor:O.colorErrorBg,borderColor:O.colorErrorBorder}},style:{backgroundColor:O.colorErrorBg,borderColor:O.colorErrorBorder},children:(0,t.jsx)(r.Descriptions,{column:1,size:"small",children:p&&p.map(({label:e,value:n,...l})=>(0,t.jsx)(r.Descriptions.Item,{label:(0,t.jsx)("span",{className:"font-semibold",children:e}),children:(0,t.jsx)(v,{...l,children:n??"-"})},e))})}),(0,t.jsx)("div",{children:(0,t.jsx)(v,{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)(v,{className:"block text-base font-medium text-gray-700 dark:text-gray-300 mb-2",children:[(0,t.jsx)(v,{children:"Type "}),(0,t.jsx)(v,{strong:!0,type:"danger",children:$}),(0,t.jsx)(v,{children:" to confirm deletion:"})]}),(0,t.jsx)(i.Input,{value:x,onChange:e=>j(e.target.value),placeholder:$,className:"rounded-md",prefix:(0,t.jsx)(d.ExclamationCircleOutlined,{style:{color:O.colorError}}),autoFocus:!0})]})]})})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/0kx52ovlpa34x.js b/litellm/proxy/_experimental/out/_next/static/chunks/0zy8o1br4cxj_.js similarity index 80% rename from litellm/proxy/_experimental/out/_next/static/chunks/0kx52ovlpa34x.js rename to litellm/proxy/_experimental/out/_next/static/chunks/0zy8o1br4cxj_.js index 19919f968ea..c836b48caa2 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/0kx52ovlpa34x.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/0zy8o1br4cxj_.js @@ -4,4 +4,4 @@ `]:{[`&:hover ${t}-inner`]:{borderColor:e.colorPrimary}},[`${r}:not(${r}-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}`}}},[` ${r}-checked:not(${r}-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}`}}}}},{[`${r}-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,v.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let h=(0,m.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[b(t,e)]);e.s(["default",0,h,"getStyle",0,b],236836);var g=e.i(681216),x=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 y=t.forwardRef((e,p)=>{var f;let{prefixCls:m,className:v,rootClassName:b,children:y,indeterminate:C=!1,style:S,onMouseEnter:k,onMouseLeave:w,skipGroup:E=!1,disabled:_}=e,N=x(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:$,direction:j,checkbox:O}=t.useContext(s.ConfigContext),P=t.useContext(u),{isFormItemInput:R}=t.useContext(d.FormItemInputContext),M=t.useContext(i.default),T=null!=(f=(null==P?void 0:P.disabled)||_)?f:M,L=t.useRef(N.value),I=t.useRef(null),z=(0,l.composeRef)(p,I);t.useEffect(()=>{null==P||P.registerValue(N.value)},[]),t.useEffect(()=>{if(!E)return N.value!==L.current&&(null==P||P.cancelValue(L.current),null==P||P.registerValue(N.value),L.current=N.value),()=>null==P?void 0:P.cancelValue(N.value)},[N.value]),t.useEffect(()=>{var e;(null==(e=I.current)?void 0:e.input)&&(I.current.input.indeterminate=C)},[C]);let A=$("checkbox",m),D=(0,c.default)(A),[B,V,q]=h(A,D),G=Object.assign({},N);P&&!E&&(G.onChange=(...e)=>{N.onChange&&N.onChange.apply(N,e),P.toggleOption&&P.toggleOption({label:y,value:N.value})},G.name=P.name,G.checked=P.value.includes(N.value));let H=(0,r.default)(`${A}-wrapper`,{[`${A}-rtl`]:"rtl"===j,[`${A}-wrapper-checked`]:G.checked,[`${A}-wrapper-disabled`]:T,[`${A}-wrapper-in-form-item`]:R},null==O?void 0:O.className,v,b,q,D,V),W=(0,r.default)({[`${A}-indeterminate`]:C},n.TARGET_CLS,V),[K,F]=(0,g.default)(G.onClick);return B(t.createElement(o.default,{component:"Checkbox",disabled:T},t.createElement("label",{className:H,style:Object.assign(Object.assign({},null==O?void 0:O.style),S),onMouseEnter:k,onMouseLeave:w,onClick:K},t.createElement(a.default,Object.assign({},G,{onClick:F,prefixCls:A,className:W,disabled:T,ref:z})),null!=y&&t.createElement("span",{className:`${A}-label`},y))))});var C=e.i(8211),S=e.i(529681),k=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 w=t.forwardRef((e,a)=>{let{defaultValue:l,children:o,options:n=[],prefixCls:i,className:d,rootClassName:p,style:f,onChange:m}=e,v=k(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:b,direction:g}=t.useContext(s.ConfigContext),[x,w]=t.useState(v.value||l||[]),[E,_]=t.useState([]);t.useEffect(()=>{"value"in v&&w(v.value||[])},[v.value]);let N=t.useMemo(()=>n.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[n]),$=e=>{_(t=>t.filter(t=>t!==e))},j=e=>{_(t=>[].concat((0,C.default)(t),[e]))},O=e=>{let t=x.indexOf(e.value),r=(0,C.default)(x);-1===t?r.push(e.value):r.splice(t,1),"value"in v||w(r),null==m||m(r.filter(e=>E.includes(e)).sort((e,t)=>N.findIndex(t=>t.value===e)-N.findIndex(e=>e.value===t)))},P=b("checkbox",i),R=`${P}-group`,M=(0,c.default)(P),[T,L,I]=h(P,M),z=(0,S.default)(v,["value","disabled"]),A=n.length?N.map(e=>t.createElement(y,{prefixCls:P,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,r.default)(`${R}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):o,D=t.useMemo(()=>({toggleOption:O,value:x,disabled:v.disabled,name:v.name,registerValue:j,cancelValue:$}),[O,x,v.disabled,v.name,j,$]),B=(0,r.default)(R,{[`${R}-rtl`]:"rtl"===g},d,p,I,M,L);return T(t.createElement("div",Object.assign({className:B,style:f},z,{ref:a}),t.createElement(u.Provider,{value:D},A)))});y.Group=w,y.__ANT_CHECKBOX=!0,e.s(["default",0,y],374276)},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},250980,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:"M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["PlusCircleIcon",0,r],250980)},983561,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:"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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["RobotOutlined",0,o],983561)},992619,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(779241),l=e.i(599724),o=e.i(199133),n=e.i(983561),s=e.i(343488),i=e.i(695411);e.s(["default",0,({accessToken:e,value:c,placeholder:d="Select a Model",onChange:u,disabled:p=!1,style:f,className:m,showLabel:v=!0,labelText:b="Select Model"})=>{let[h,g]=(0,r.useState)(c),[x,y]=(0,r.useState)(!1),[C,S]=(0,r.useState)([]);(0,r.useEffect)(()=>{g(c)},[c]),(0,r.useEffect)(()=>{e&&(async()=>{try{let t=await (0,i.fetchAvailableModels)(e);t.length>0&&S(t)}catch(e){console.error("Error fetching model info:",e)}})()},[e]);let k=(0,s.useDebouncedCallback)(e=>{g(e),u?.(e)},{wait:500});return(0,t.jsxs)("div",{children:[v&&(0,t.jsxs)(l.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(n.RobotOutlined,{className:"mr-2"})," ",b]}),(0,t.jsx)(o.Select,{value:h,placeholder:d,onChange:e=>{"custom"===e?(y(!0),g(void 0)):(y(!1),g(e),u&&u(e))},options:[...Array.from(new Set(C.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%",...f},showSearch:!0,className:`rounded-md ${m||""}`,disabled:p}),x&&(0,t.jsx)(a.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:k,disabled:p})]})}])},797672,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:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"}))});e.s(["PencilIcon",0,r],797672)},916940,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(199133),l=e.i(602869);e.s(["default",0,({onChange:e,value:o,className:n,accessToken:s,placeholder:i="Select vector stores",disabled:c=!1})=>{let[d,u]=(0,r.useState)([]),[p,f]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(s){f(!0);try{let e=await (0,l.vectorStoreListCall)(s);e.data&&u(e.data)}catch(e){console.error("Error fetching vector stores:",e)}finally{f(!1)}}})()},[s]),(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:i,onChange:e,value:o,loading:p,className:n,allowClear:!0,options:d.map(e=>({label:`${e.vector_store_name||e.vector_store_id} (${e.vector_store_id})`,value:e.vector_store_id,title:e.vector_store_description||e.vector_store_id})),optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:c})})}])},435451,e=>{"use strict";var t=e.i(843476),r=e.i(290571),a=e.i(271645);let l=e=>{var t=(0,r.__rest)(e,[]);return a.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"}),a.default.createElement("path",{d:"M12 4v16m8-8H4"}))},o=e=>{var t=(0,r.__rest)(e,[]);return a.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"}),a.default.createElement("path",{d:"M20 12H4"}))};var n=e.i(444755),s=e.i(673706),i=e.i(677955);let c="flex mx-auto text-tremor-content-subtle dark:text-dark-tremor-content-subtle",d="cursor-pointer hover:text-tremor-content dark:hover:text-dark-tremor-content",u=a.default.forwardRef((e,t)=>{let{onSubmit:u,enableStepper:p=!0,disabled:f,onValueChange:m,onChange:v}=e,b=(0,r.__rest)(e,["onSubmit","enableStepper","disabled","onValueChange","onChange"]),h=(0,a.useRef)(null),[g,x]=a.default.useState(!1),y=a.default.useCallback(()=>{x(!0)},[]),C=a.default.useCallback(()=>{x(!1)},[]),[S,k]=a.default.useState(!1),w=a.default.useCallback(()=>{k(!0)},[]),E=a.default.useCallback(()=>{k(!1)},[]);return a.default.createElement(i.default,Object.assign({type:"number",ref:(0,s.mergeRefs)([h,t]),disabled:f,makeInputClassName:(0,s.makeClassName)("NumberInput"),onKeyDown:e=>{var t;if("Enter"===e.key&&!e.ctrlKey&&!e.altKey&&!e.shiftKey){let e=null==(t=h.current)?void 0:t.value;null==u||u(parseFloat(null!=e?e:""))}"ArrowDown"===e.key&&y(),"ArrowUp"===e.key&&w()},onKeyUp:e=>{"ArrowDown"===e.key&&C(),"ArrowUp"===e.key&&E()},onChange:e=>{f||(null==m||m(parseFloat(e.target.value)),null==v||v(e))},stepper:p?a.default.createElement("div",{className:(0,n.tremorTwMerge)("flex justify-center align-middle")},a.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=h.current)||e.stepDown(),null==(t=h.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,n.tremorTwMerge)(!f&&d,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},a.default.createElement(o,{"data-testid":"step-down",className:(g?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"})),a.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=h.current)||e.stepUp(),null==(t=h.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,n.tremorTwMerge)(!f&&d,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},a.default.createElement(l,{"data-testid":"step-up",className:(S?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"}))):null},b))});u.displayName="NumberInput",e.s(["default",0,({step:e=.01,style:r={width:"100%"},placeholder:a="Enter a numerical value",min:l,max:o,onChange:n,...s})=>(0,t.jsx)(u,{onWheel:e=>e.currentTarget.blur(),step:e,style:r,placeholder:a,min:l,max:o,onChange:n,...s})],435451)},860585,e=>{"use strict";var t=e.i(843476),r=e.i(199133);let{Option:a}=r.Select;e.s(["default",0,({value:e,onChange:l,className:o="",style:n={}})=>(0,t.jsxs)(r.Select,{style:{width:"100%",...n},value:e||void 0,onChange:l,className:o,placeholder:"n/a",allowClear:!0,children:[(0,t.jsx)(a,{value:"1h",children:"hourly"}),(0,t.jsx)(a,{value:"24h",children:"daily"}),(0,t.jsx)(a,{value:"7d",children:"weekly"}),(0,t.jsx)(a,{value:"30d",children:"monthly"})]}),"getBudgetDurationLabel",0,e=>e?({"1h":"hourly","24h":"daily","7d":"weekly","30d":"monthly"})[e]||e:"Not set"])},213205,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:"M678.3 642.4c24.2-13 51.9-20.4 81.4-20.4h.1c3 0 4.4-3.6 2.2-5.6a371.67 371.67 0 00-103.7-65.8c-.4-.2-.8-.3-1.2-.5C719.2 505 759.6 431.7 759.6 349c0-137-110.8-248-247.5-248S264.7 212 264.7 349c0 82.7 40.4 156 102.6 201.1-.4.2-.8.3-1.2.5-44.7 18.9-84.8 46-119.3 80.6a373.42 373.42 0 00-80.4 119.5A373.6 373.6 0 00137 888.8a8 8 0 008 8.2h59.9c4.3 0 7.9-3.5 8-7.8 2-77.2 32.9-149.5 87.6-204.3C357 628.2 432.2 597 512.2 597c56.7 0 111.1 15.7 158 45.1a8.1 8.1 0 008.1.3zM512.2 521c-45.8 0-88.9-17.9-121.4-50.4A171.2 171.2 0 01340.5 349c0-45.9 17.9-89.1 50.3-121.6S466.3 177 512.2 177s88.9 17.9 121.4 50.4A171.2 171.2 0 01683.9 349c0 45.9-17.9 89.1-50.3 121.6C601.1 503.1 558 521 512.2 521zM880 759h-84v-84c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v84h-84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h84v84c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-84h84c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"}}]},name:"user-add",theme:"outlined"};var l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["UserAddOutlined",0,o],213205)},75921,e=>{"use strict";var t=e.i(843476),r=e.i(266027),a=e.i(243652),l=e.i(602869),o=e.i(135214);let n=(0,a.createQueryKeys)("mcpAccessGroups");var s=e.i(500727),i=e.i(699857),c=e.i(199133),d=e.i(234713);let u="toolset:";e.s(["default",0,({onChange:e,value:a,className:p,accessToken:f,placeholder:m="Select MCP servers",disabled:v=!1,teamId:b,allowNoMcpServers:h=!1,allowAllProxyMcpServers:g=!1})=>{let{data:x=[],isLoading:y}=(0,s.useMCPServers)(b),{data:C=[],isLoading:S}=(()=>{let{accessToken:e}=(0,o.default)();return(0,r.useQuery)({queryKey:n.list({}),queryFn:async()=>await (0,l.fetchMCPAccessGroups)(e),enabled:!!e})})(),{data:k=[],isLoading:w}=(0,i.useMCPToolsets)(),E=new Set(C),_=[...C.map(e=>({label:e,value:e,type:"accessGroup",searchText:`${e} Access Group`})),...x.map(e=>({label:`${e.server_name||e.server_id} (${e.server_id})`,value:e.server_id,type:"server",searchText:`${e.server_name||e.server_id} ${e.server_id} MCP Server`})),...k.map(e=>({label:e.toolset_name,value:`${u}${e.toolset_id}`,type:"toolset",searchText:`${e.toolset_name} ${e.toolset_id} Toolset`}))],N={accessGroup:"#52c41a",server:"#1890ff",toolset:"#722ed1"},$={accessGroup:"Access Group",server:"MCP Server",toolset:"Toolset"},j=[...a?.servers||[],...a?.accessGroups||[],...(a?.toolsets||[]).map(e=>`${u}${e}`)],O=h&&j.includes(d.NO_MCP_SERVERS_SENTINEL),P=j.includes(d.ALL_PROXY_MCP_SERVERS_SENTINEL);return(0,t.jsx)("div",{children:(0,t.jsxs)(c.Select,{mode:"multiple",placeholder:m,onChange:t=>{if(g&&t.includes(d.ALL_PROXY_MCP_SERVERS_SENTINEL))return void e({servers:[d.ALL_PROXY_MCP_SERVERS_SENTINEL],accessGroups:[],toolsets:[]});if(h&&t.includes(d.NO_MCP_SERVERS_SENTINEL))return void e({servers:[d.NO_MCP_SERVERS_SENTINEL],accessGroups:[],toolsets:[]});let r=t.filter(e=>e.startsWith(u)).map(e=>e.slice(u.length)),a=t.filter(e=>!e.startsWith(u));e({servers:a.filter(e=>!E.has(e)),accessGroups:a.filter(e=>E.has(e)),toolsets:r})},value:j,loading:y||S||w,className:p,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:v,filterOption:(e,t)=>t?.value===d.NO_MCP_SERVERS_SENTINEL||t?.value===d.ALL_PROXY_MCP_SERVERS_SENTINEL||(_.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:[(g||P)&&(0,t.jsx)(c.Select.Option,{value:d.ALL_PROXY_MCP_SERVERS_SENTINEL,label:"All Proxy MCP Servers",children:(0,t.jsx)("span",{style:{color:"#1890ff",fontWeight:500},children:"All Proxy MCP Servers"})},d.ALL_PROXY_MCP_SERVERS_SENTINEL),h&&(0,t.jsx)(c.Select.Option,{value:d.NO_MCP_SERVERS_SENTINEL,label:"No MCP Servers",children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{flex:1},children:"No MCP Servers"}),(0,t.jsx)("span",{style:{color:"#8c8c8c",fontSize:"12px",fontWeight:500,opacity:.8},children:"Block all"})]})},d.NO_MCP_SERVERS_SENTINEL),_.map(e=>(0,t.jsx)(c.Select.Option,{value:e.value,label:e.label,disabled:O||P,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:N[e.type],flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:N[e.type],fontSize:"12px",fontWeight:500,opacity:.8},children:$[e.type]})]})},e.value))]})})}],75921)}]); \ No newline at end of file + `]:{[`&: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}`}}}}},{[`${r}-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,v.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let h=(0,m.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[b(t,e)]);e.s(["default",0,h,"getStyle",0,b],236836);var g=e.i(681216),x=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 y=t.forwardRef((e,p)=>{var f;let{prefixCls:m,className:v,rootClassName:b,children:y,indeterminate:C=!1,style:S,onMouseEnter:k,onMouseLeave:w,skipGroup:E=!1,disabled:_}=e,N=x(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:$,direction:j,checkbox:O}=t.useContext(s.ConfigContext),P=t.useContext(u),{isFormItemInput:R}=t.useContext(d.FormItemInputContext),M=t.useContext(i.default),T=null!=(f=(null==P?void 0:P.disabled)||_)?f:M,L=t.useRef(N.value),I=t.useRef(null),z=(0,l.composeRef)(p,I);t.useEffect(()=>{null==P||P.registerValue(N.value)},[]),t.useEffect(()=>{if(!E)return N.value!==L.current&&(null==P||P.cancelValue(L.current),null==P||P.registerValue(N.value),L.current=N.value),()=>null==P?void 0:P.cancelValue(N.value)},[N.value]),t.useEffect(()=>{var e;(null==(e=I.current)?void 0:e.input)&&(I.current.input.indeterminate=C)},[C]);let A=$("checkbox",m),D=(0,c.default)(A),[B,V,q]=h(A,D),G=Object.assign({},N);P&&!E&&(G.onChange=(...e)=>{N.onChange&&N.onChange.apply(N,e),P.toggleOption&&P.toggleOption({label:y,value:N.value})},G.name=P.name,G.checked=P.value.includes(N.value));let H=(0,r.default)(`${A}-wrapper`,{[`${A}-rtl`]:"rtl"===j,[`${A}-wrapper-checked`]:G.checked,[`${A}-wrapper-disabled`]:T,[`${A}-wrapper-in-form-item`]:R},null==O?void 0:O.className,v,b,q,D,V),W=(0,r.default)({[`${A}-indeterminate`]:C},n.TARGET_CLS,V),[K,F]=(0,g.default)(G.onClick);return B(t.createElement(o.default,{component:"Checkbox",disabled:T},t.createElement("label",{className:H,style:Object.assign(Object.assign({},null==O?void 0:O.style),S),onMouseEnter:k,onMouseLeave:w,onClick:K},t.createElement(a.default,Object.assign({},G,{onClick:F,prefixCls:A,className:W,disabled:T,ref:z})),null!=y&&t.createElement("span",{className:`${A}-label`},y))))});var C=e.i(8211),S=e.i(529681),k=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 w=t.forwardRef((e,a)=>{let{defaultValue:l,children:o,options:n=[],prefixCls:i,className:d,rootClassName:p,style:f,onChange:m}=e,v=k(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:b,direction:g}=t.useContext(s.ConfigContext),[x,w]=t.useState(v.value||l||[]),[E,_]=t.useState([]);t.useEffect(()=>{"value"in v&&w(v.value||[])},[v.value]);let N=t.useMemo(()=>n.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[n]),$=e=>{_(t=>t.filter(t=>t!==e))},j=e=>{_(t=>[].concat((0,C.default)(t),[e]))},O=e=>{let t=x.indexOf(e.value),r=(0,C.default)(x);-1===t?r.push(e.value):r.splice(t,1),"value"in v||w(r),null==m||m(r.filter(e=>E.includes(e)).sort((e,t)=>N.findIndex(t=>t.value===e)-N.findIndex(e=>e.value===t)))},P=b("checkbox",i),R=`${P}-group`,M=(0,c.default)(P),[T,L,I]=h(P,M),z=(0,S.default)(v,["value","disabled"]),A=n.length?N.map(e=>t.createElement(y,{prefixCls:P,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,r.default)(`${R}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):o,D=t.useMemo(()=>({toggleOption:O,value:x,disabled:v.disabled,name:v.name,registerValue:j,cancelValue:$}),[O,x,v.disabled,v.name,j,$]),B=(0,r.default)(R,{[`${R}-rtl`]:"rtl"===g},d,p,I,M,L);return T(t.createElement("div",Object.assign({className:B,style:f},z,{ref:a}),t.createElement(u.Provider,{value:D},A)))});y.Group=w,y.__ANT_CHECKBOX=!0,e.s(["default",0,y],374276)},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},250980,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:"M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["PlusCircleIcon",0,r],250980)},983561,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:"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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["RobotOutlined",0,o],983561)},992619,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(779241),l=e.i(599724),o=e.i(199133),n=e.i(983561),s=e.i(343488),i=e.i(695411);e.s(["default",0,({accessToken:e,value:c,placeholder:d="Select a Model",onChange:u,disabled:p=!1,style:f,className:m,showLabel:v=!0,labelText:b="Select Model"})=>{let[h,g]=(0,r.useState)(c),[x,y]=(0,r.useState)(!1),[C,S]=(0,r.useState)([]);(0,r.useEffect)(()=>{g(c)},[c]),(0,r.useEffect)(()=>{e&&(async()=>{try{let t=await (0,i.fetchAvailableModels)(e);t.length>0&&S(t)}catch(e){console.error("Error fetching model info:",e)}})()},[e]);let k=(0,s.useDebouncedCallback)(e=>{g(e),u?.(e)},{wait:500});return(0,t.jsxs)("div",{children:[v&&(0,t.jsxs)(l.Text,{className:"font-medium block mb-2 text-gray-700 flex items-center",children:[(0,t.jsx)(n.RobotOutlined,{className:"mr-2"})," ",b]}),(0,t.jsx)(o.Select,{value:h,placeholder:d,onChange:e=>{"custom"===e?(y(!0),g(void 0)):(y(!1),g(e),u&&u(e))},options:[...Array.from(new Set(C.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%",...f},showSearch:!0,className:`rounded-md ${m||""}`,disabled:p}),x&&(0,t.jsx)(a.TextInput,{className:"mt-2",placeholder:"Enter custom model name",onValueChange:k,disabled:p})]})}])},797672,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:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"}))});e.s(["PencilIcon",0,r],797672)},916940,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(199133),l=e.i(602869);e.s(["default",0,({onChange:e,value:o,className:n,accessToken:s,placeholder:i="Select vector stores",disabled:c=!1})=>{let[d,u]=(0,r.useState)([]),[p,f]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{(async()=>{if(s){f(!0);try{let e=await (0,l.vectorStoreListCall)(s);e.data&&u(e.data)}catch(e){console.error("Error fetching vector stores:",e)}finally{f(!1)}}})()},[s]),(0,t.jsx)("div",{children:(0,t.jsx)(a.Select,{mode:"multiple",placeholder:i,onChange:e,value:o,loading:p,className:n,allowClear:!0,options:d.map(e=>({label:`${e.vector_store_name||e.vector_store_id} (${e.vector_store_id})`,value:e.vector_store_id,title:e.vector_store_description||e.vector_store_id})),optionFilterProp:"label",showSearch:!0,style:{width:"100%"},disabled:c})})}])},435451,e=>{"use strict";var t=e.i(843476),r=e.i(290571),a=e.i(271645);let l=e=>{var t=(0,r.__rest)(e,[]);return a.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"}),a.default.createElement("path",{d:"M12 4v16m8-8H4"}))},o=e=>{var t=(0,r.__rest)(e,[]);return a.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"}),a.default.createElement("path",{d:"M20 12H4"}))};var n=e.i(444755),s=e.i(673706),i=e.i(677955);let c="flex mx-auto text-tremor-content-subtle dark:text-dark-tremor-content-subtle",d="cursor-pointer hover:text-tremor-content dark:hover:text-dark-tremor-content",u=a.default.forwardRef((e,t)=>{let{onSubmit:u,enableStepper:p=!0,disabled:f,onValueChange:m,onChange:v}=e,b=(0,r.__rest)(e,["onSubmit","enableStepper","disabled","onValueChange","onChange"]),h=(0,a.useRef)(null),[g,x]=a.default.useState(!1),y=a.default.useCallback(()=>{x(!0)},[]),C=a.default.useCallback(()=>{x(!1)},[]),[S,k]=a.default.useState(!1),w=a.default.useCallback(()=>{k(!0)},[]),E=a.default.useCallback(()=>{k(!1)},[]);return a.default.createElement(i.default,Object.assign({type:"number",ref:(0,s.mergeRefs)([h,t]),disabled:f,makeInputClassName:(0,s.makeClassName)("NumberInput"),onKeyDown:e=>{var t;if("Enter"===e.key&&!e.ctrlKey&&!e.altKey&&!e.shiftKey){let e=null==(t=h.current)?void 0:t.value;null==u||u(parseFloat(null!=e?e:""))}"ArrowDown"===e.key&&y(),"ArrowUp"===e.key&&w()},onKeyUp:e=>{"ArrowDown"===e.key&&C(),"ArrowUp"===e.key&&E()},onChange:e=>{f||(null==m||m(parseFloat(e.target.value)),null==v||v(e))},stepper:p?a.default.createElement("div",{className:(0,n.tremorTwMerge)("flex justify-center align-middle")},a.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=h.current)||e.stepDown(),null==(t=h.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,n.tremorTwMerge)(!f&&d,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},a.default.createElement(o,{"data-testid":"step-down",className:(g?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"})),a.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=h.current)||e.stepUp(),null==(t=h.current)||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,n.tremorTwMerge)(!f&&d,c,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},a.default.createElement(l,{"data-testid":"step-up",className:(S?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"}))):null},b))});u.displayName="NumberInput",e.s(["default",0,({step:e=.01,style:r={width:"100%"},placeholder:a="Enter a numerical value",min:l,max:o,onChange:n,...s})=>(0,t.jsx)(u,{onWheel:e=>e.currentTarget.blur(),step:e,style:r,placeholder:a,min:l,max:o,onChange:n,...s})],435451)},860585,e=>{"use strict";var t=e.i(843476),r=e.i(199133);let{Option:a}=r.Select;e.s(["default",0,({value:e,onChange:l,className:o="",style:n={},placeholder:s="n/a"})=>(0,t.jsxs)(r.Select,{style:{width:"100%",...n},value:e||void 0,onChange:l,className:o,placeholder:s,allowClear:!0,children:[(0,t.jsx)(a,{value:"1h",children:"hourly"}),(0,t.jsx)(a,{value:"24h",children:"daily"}),(0,t.jsx)(a,{value:"7d",children:"weekly"}),(0,t.jsx)(a,{value:"30d",children:"monthly"})]}),"getBudgetDurationLabel",0,e=>e?({"1h":"hourly","24h":"daily","7d":"weekly","30d":"monthly"})[e]||e:"Not set"])},213205,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:"M678.3 642.4c24.2-13 51.9-20.4 81.4-20.4h.1c3 0 4.4-3.6 2.2-5.6a371.67 371.67 0 00-103.7-65.8c-.4-.2-.8-.3-1.2-.5C719.2 505 759.6 431.7 759.6 349c0-137-110.8-248-247.5-248S264.7 212 264.7 349c0 82.7 40.4 156 102.6 201.1-.4.2-.8.3-1.2.5-44.7 18.9-84.8 46-119.3 80.6a373.42 373.42 0 00-80.4 119.5A373.6 373.6 0 00137 888.8a8 8 0 008 8.2h59.9c4.3 0 7.9-3.5 8-7.8 2-77.2 32.9-149.5 87.6-204.3C357 628.2 432.2 597 512.2 597c56.7 0 111.1 15.7 158 45.1a8.1 8.1 0 008.1.3zM512.2 521c-45.8 0-88.9-17.9-121.4-50.4A171.2 171.2 0 01340.5 349c0-45.9 17.9-89.1 50.3-121.6S466.3 177 512.2 177s88.9 17.9 121.4 50.4A171.2 171.2 0 01683.9 349c0 45.9-17.9 89.1-50.3 121.6C601.1 503.1 558 521 512.2 521zM880 759h-84v-84c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v84h-84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h84v84c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-84h84c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"}}]},name:"user-add",theme:"outlined"};var l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["UserAddOutlined",0,o],213205)},75921,e=>{"use strict";var t=e.i(843476),r=e.i(266027),a=e.i(243652),l=e.i(602869),o=e.i(135214);let n=(0,a.createQueryKeys)("mcpAccessGroups");var s=e.i(500727),i=e.i(699857),c=e.i(199133),d=e.i(234713);let u="toolset:";e.s(["default",0,({onChange:e,value:a,className:p,accessToken:f,placeholder:m="Select MCP servers",disabled:v=!1,teamId:b,allowNoMcpServers:h=!1,allowAllProxyMcpServers:g=!1})=>{let{data:x=[],isLoading:y}=(0,s.useMCPServers)(b),{data:C=[],isLoading:S}=(()=>{let{accessToken:e}=(0,o.default)();return(0,r.useQuery)({queryKey:n.list({}),queryFn:async()=>await (0,l.fetchMCPAccessGroups)(e),enabled:!!e})})(),{data:k=[],isLoading:w}=(0,i.useMCPToolsets)(),E=new Set(C),_=[...C.map(e=>({label:e,value:e,type:"accessGroup",searchText:`${e} Access Group`})),...x.map(e=>({label:`${e.server_name||e.server_id} (${e.server_id})`,value:e.server_id,type:"server",searchText:`${e.server_name||e.server_id} ${e.server_id} MCP Server`})),...k.map(e=>({label:e.toolset_name,value:`${u}${e.toolset_id}`,type:"toolset",searchText:`${e.toolset_name} ${e.toolset_id} Toolset`}))],N={accessGroup:"#52c41a",server:"#1890ff",toolset:"#722ed1"},$={accessGroup:"Access Group",server:"MCP Server",toolset:"Toolset"},j=[...a?.servers||[],...a?.accessGroups||[],...(a?.toolsets||[]).map(e=>`${u}${e}`)],O=h&&j.includes(d.NO_MCP_SERVERS_SENTINEL),P=j.includes(d.ALL_PROXY_MCP_SERVERS_SENTINEL);return(0,t.jsx)("div",{children:(0,t.jsxs)(c.Select,{mode:"multiple",placeholder:m,onChange:t=>{if(g&&t.includes(d.ALL_PROXY_MCP_SERVERS_SENTINEL))return void e({servers:[d.ALL_PROXY_MCP_SERVERS_SENTINEL],accessGroups:[],toolsets:[]});if(h&&t.includes(d.NO_MCP_SERVERS_SENTINEL))return void e({servers:[d.NO_MCP_SERVERS_SENTINEL],accessGroups:[],toolsets:[]});let r=t.filter(e=>e.startsWith(u)).map(e=>e.slice(u.length)),a=t.filter(e=>!e.startsWith(u));e({servers:a.filter(e=>!E.has(e)),accessGroups:a.filter(e=>E.has(e)),toolsets:r})},value:j,loading:y||S||w,className:p,allowClear:!0,showSearch:!0,style:{width:"100%"},disabled:v,filterOption:(e,t)=>t?.value===d.NO_MCP_SERVERS_SENTINEL||t?.value===d.ALL_PROXY_MCP_SERVERS_SENTINEL||(_.find(e=>e.value===t?.value)?.searchText||"").toLowerCase().includes(e.toLowerCase()),children:[(g||P)&&(0,t.jsx)(c.Select.Option,{value:d.ALL_PROXY_MCP_SERVERS_SENTINEL,label:"All Proxy MCP Servers",children:(0,t.jsx)("span",{style:{color:"#1890ff",fontWeight:500},children:"All Proxy MCP Servers"})},d.ALL_PROXY_MCP_SERVERS_SENTINEL),h&&(0,t.jsx)(c.Select.Option,{value:d.NO_MCP_SERVERS_SENTINEL,label:"No MCP Servers",children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{flex:1},children:"No MCP Servers"}),(0,t.jsx)("span",{style:{color:"#8c8c8c",fontSize:"12px",fontWeight:500,opacity:.8},children:"Block all"})]})},d.NO_MCP_SERVERS_SENTINEL),_.map(e=>(0,t.jsx)(c.Select.Option,{value:e.value,label:e.label,disabled:O||P,children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsx)("span",{style:{display:"inline-block",width:8,height:8,borderRadius:"50%",background:N[e.type],flexShrink:0}}),(0,t.jsx)("span",{style:{flex:1},children:e.label}),(0,t.jsx)("span",{style:{color:N[e.type],fontSize:"12px",fontWeight:500,opacity:.8},children:$[e.type]})]})},e.value))]})})}],75921)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/11_8skd8xyc2y.js b/litellm/proxy/_experimental/out/_next/static/chunks/11_8skd8xyc2y.js deleted file mode 100644 index 82e8dbd7ae0..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/11_8skd8xyc2y.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,526612,e=>{"use strict";var t=e.i(843476),a=e.i(109799),i=e.i(625901),s=e.i(618566),r=e.i(271645),n=e.i(611363),l=e.i(950594),o=e.i(115504),d=e.i(741466),c=e.i(343488);let m=({placeholder:e,value:a,onChange:i,icon:s,className:n})=>{let[m,u]=(0,r.useState)(a);(0,r.useEffect)(()=>{u(a)},[a]);let g=(0,c.useDebouncedCallback)(e=>i(e),{wait:d.DEBOUNCE_WAIT_MS});return(0,t.jsxs)(l.InputGroup,{className:(0,o.cx)("w-64",n),children:[s&&(0,t.jsx)(l.InputGroupAddon,{children:(0,t.jsx)(s,{className:"size-4 text-muted-foreground"})}),(0,t.jsx)(l.InputGroupInput,{placeholder:e,value:m,onChange:e=>{let t=e.target.value;u(t),g(t)}})]})};var u=e.i(519455);let g=(0,e.i(475254).default)("funnel",[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]]),x=({onClick:e,active:a,hasActiveFilters:i,label:s="Filters"})=>(0,t.jsxs)("span",{className:"relative inline-flex",children:[(0,t.jsxs)(u.Button,{variant:"outline",onClick:e,className:(0,o.cn)(a&&"bg-muted"),children:[(0,t.jsx)(g,{className:"size-4"}),s]}),i&&(0,t.jsx)("sup",{"aria-hidden":"true",className:"absolute -top-0.5 -right-0.5 size-1.5 rounded-full bg-primary"})]});var h=e.i(367240);let p=({onClick:e,label:a="Reset Filters"})=>(0,t.jsxs)(u.Button,{variant:"outline",onClick:e,children:[(0,t.jsx)(h.RotateCcw,{className:"size-4"}),a]});var b=e.i(555436),j=e.i(284614);let _=({filters:e,showFilters:a,onToggleFilters:i,onChange:s,onReset:r})=>{let n=!!(e.org_id||e.org_alias);return(0,t.jsxs)("div",{className:"flex flex-col space-y-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsx)(m,{placeholder:"Search by Organization Name",value:e.org_alias,onChange:e=>s("org_alias",e),icon:b.Search,className:"w-64"}),(0,t.jsx)(x,{onClick:()=>i(!a),active:a,hasActiveFilters:n}),(0,t.jsx)(p,{onClick:r})]}),a&&(0,t.jsx)("div",{className:"flex flex-wrap items-center gap-3 mt-3",children:(0,t.jsx)(m,{placeholder:"Search by Organization ID",value:e.org_id,onChange:e=>s("org_id",e),icon:j.User,className:"w-64"})})]})};var v=e.i(912598),f=e.i(127952),z=e.i(727749),y=e.i(602869),C=e.i(954616),N=e.i(162386),S=e.i(75921),w=e.i(223210),M=e.i(182668),k=e.i(776639),T=e.i(793479),O=e.i(967489),F=e.i(624687),D=e.i(916940),P=e.i(991326),I=e.i(768371);let A=e=>"boolean"==typeof e?e:Array.isArray(e)?e.some(A):null!==e&&"object"==typeof e&&Object.values(e).some(A);var B=e.i(681307);let R=B.z.object({max_budget:B.z.number().nullish(),budget_duration:B.z.string().nullish(),tpm_limit:B.z.number().nullish(),rpm_limit:B.z.number().nullish()}),L=B.z.record(B.z.string(),B.z.unknown()),U=e=>""===e.trim()?null:Number(e),E=B.z.string().refine(e=>""===e.trim()||/^\d+$/.test(e.trim()),"Must be a non-negative whole number"),K=B.z.string().refine(e=>""===e.trim()||Number.isFinite(Number(e))&&Number(e)>=0,"Must be a non-negative number"),V={organization_alias:B.z.string().min(1,"Please input an organization name"),models:B.z.array(B.z.string()),max_budget:K,budget_duration:B.z.string(),tpm_limit:E,rpm_limit:E,vector_stores:B.z.array(B.z.string()),mcp:B.z.object({servers:B.z.array(B.z.string()),accessGroups:B.z.array(B.z.string()),toolsets:B.z.array(B.z.string())}),metadata:B.z.string().refine(e=>""===e.trim()||(e=>{try{let t=JSON.parse(e);return"object"==typeof t&&null!==t&&!Array.isArray(t)}catch{return!1}})(e),"Metadata must be a valid JSON object")},q=B.z.object(V),G="never",H=[{value:G,label:"No reset"},{value:"24h",label:"daily"},{value:"7d",label:"weekly"},{value:"30d",label:"monthly"}],Q=async(e,t)=>{let{data:a}=await I.fetchClient.PATCH("/v2/organization/{organization_id}",{params:{path:{organization_id:e}},body:t});return a},$=({organizationId:e,org:i,accessToken:s,onCancel:r,onSaved:n,patchOrganization:l=Q})=>{let o,d=(0,v.useQueryClient)(),c=(0,P.useZodForm)(q,{defaultValues:(o=R.parse(i.litellm_budget_table??{}),{organization_alias:i.organization_alias??"",models:i.models??[],max_budget:o.max_budget?.toString()??"",budget_duration:o.budget_duration??"",tpm_limit:o.tpm_limit?.toString()??"",rpm_limit:o.rpm_limit?.toString()??"",vector_stores:i.object_permission?.vector_stores??[],mcp:{servers:i.object_permission?.mcp_servers??[],accessGroups:i.object_permission?.mcp_access_groups??[],toolsets:i.object_permission?.mcp_toolsets??[]},metadata:i.metadata&&Object.keys(i.metadata).length>0?JSON.stringify(i.metadata,null,2):""})}),{isDirty:m}=c.formState,g=(0,C.useMutation)({mutationFn:t=>l(e,t),onSuccess:()=>{z.default.success("Organization settings updated successfully"),d.invalidateQueries({queryKey:a.organizationKeys.all}),n()},onError:e=>z.default.fromBackend(e instanceof Error?e.message:"Failed to update organization settings")}),x=c.handleSubmit(e=>{var t;let a,i,s;g.mutate((i=(e=>{if(void 0!==e.vector_stores||void 0!==e.mcp)return{...void 0!==e.vector_stores&&{vector_stores:e.vector_stores},...void 0!==e.mcp&&{mcp_servers:e.mcp.servers,mcp_access_groups:e.mcp.accessGroups,mcp_toolsets:e.mcp.toolsets}}})((a=c.formState.dirtyFields,t=Object.fromEntries(Object.keys(e).filter(e=>A(a[e])).map(t=>[t,e[t]])))),{...void 0!==t.organization_alias&&{organization_alias:t.organization_alias},...void 0!==t.models&&{models:t.models},...void 0!==t.max_budget&&{max_budget:U(t.max_budget)},...void 0!==t.tpm_limit&&{tpm_limit:U(t.tpm_limit)},...void 0!==t.rpm_limit&&{rpm_limit:U(t.rpm_limit)},...void 0!==t.budget_duration&&{budget_duration:""===t.budget_duration?null:t.budget_duration},...void 0!==t.metadata&&{metadata:""===(s=t.metadata).trim()?null:L.parse(JSON.parse(s))},...void 0!==i&&{object_permission:i}}))});return(0,t.jsxs)("form",{onSubmit:x,noValidate:!0,children:[(0,t.jsxs)(w.FieldGroup,{children:[(0,t.jsx)(M.FormField,{control:c.control,name:"organization_alias",label:"Organization Name",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e})}),(0,t.jsx)(M.FormField,{control:c.control,name:"models",label:"Models",children:e=>(0,t.jsx)(N.ModelSelect,{value:e.value,onChange:e.onChange,context:"organization",options:{includeSpecialOptions:!0,showAllProxyModelsOverride:!0}})}),(0,t.jsx)(M.FormField,{control:c.control,name:"max_budget",label:"Max Budget (USD)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:"any",min:0})}),(0,t.jsx)(M.FormField,{control:c.control,name:"budget_duration",label:"Reset Budget",children:({id:e,value:a,onChange:i,"aria-invalid":s,"aria-describedby":r})=>(0,t.jsxs)(O.Select,{items:H,value:""===a?G:a,onValueChange:e=>i(e===G?"":e),children:[(0,t.jsx)(O.SelectTrigger,{id:e,"aria-invalid":s,"aria-describedby":r,children:(0,t.jsx)(O.SelectValue,{})}),(0,t.jsx)(O.SelectContent,{children:H.map(e=>(0,t.jsx)(O.SelectItem,{value:e.value,children:e.label},e.value))})]})}),(0,t.jsx)(M.FormField,{control:c.control,name:"tpm_limit",label:"Tokens per minute Limit (TPM)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:1,min:0})}),(0,t.jsx)(M.FormField,{control:c.control,name:"rpm_limit",label:"Requests per minute Limit (RPM)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:1,min:0})}),(0,t.jsx)(M.FormField,{control:c.control,name:"vector_stores",label:"Vector Stores",children:e=>(0,t.jsx)(D.default,{value:e.value,onChange:e.onChange,accessToken:s,placeholder:"Select vector stores"})}),(0,t.jsx)(M.FormField,{control:c.control,name:"mcp",label:"MCP Servers & Access Groups",children:e=>(0,t.jsx)(S.default,{value:e.value,onChange:e.onChange,accessToken:s,placeholder:"Select MCP servers and access groups"})}),(0,t.jsx)(M.FormField,{control:c.control,name:"metadata",label:"Metadata",children:({ref:e,...a})=>(0,t.jsx)(F.Textarea,{...a,ref:e,rows:4})})]}),(0,t.jsx)("div",{className:"sticky z-10 bg-white p-4 border-t border-gray-200 -bottom-6 -inset-x-6 mt-6",children:(0,t.jsxs)("div",{className:"flex justify-end items-center gap-2",children:[(0,t.jsx)(u.Button,{type:"button",variant:"outline",onClick:r,disabled:g.isPending,children:"Cancel"}),(0,t.jsx)(u.Button,{type:"submit",disabled:!m||g.isPending,children:g.isPending?"Saving...":"Save Changes"})]})})]})},W={organization_alias:"",models:[],max_budget:"",budget_duration:"",tpm_limit:"",rpm_limit:"",vector_stores:[],mcp:{servers:[],accessGroups:[],toolsets:[]},metadata:""},J=B.z.record(B.z.string(),B.z.unknown()),Z=async e=>{let{data:t}=await I.fetchClient.POST("/organization/new",{body:e});return t},X=({open:e,onOpenChange:i,accessToken:s,createOrganization:r=Z})=>{let n=(0,v.useQueryClient)(),l=(0,P.useZodForm)(q,{defaultValues:W}),o=(0,C.useMutation)({mutationFn:e=>r(e),onSuccess:()=>{z.default.success("Organization created successfully"),n.invalidateQueries({queryKey:a.organizationKeys.all}),l.reset(W),i(!1)},onError:e=>z.default.fromBackend(e instanceof Error?e.message:"Failed to create organization")}),d=e=>{(e||!o.isPending)&&(e||l.reset(W),i(e))},c=l.handleSubmit(e=>{if(!o.isPending){let t,a;o.mutate((a=Object.keys(t={...e.vector_stores.length>0&&{vector_stores:e.vector_stores},...e.mcp.servers.length>0&&{mcp_servers:e.mcp.servers},...e.mcp.accessGroups.length>0&&{mcp_access_groups:e.mcp.accessGroups},...e.mcp.toolsets.length>0&&{mcp_toolsets:e.mcp.toolsets}}).length>0?t:void 0,{organization_alias:e.organization_alias,models:e.models,...""!==e.max_budget.trim()&&{max_budget:Number(e.max_budget)},...""!==e.tpm_limit.trim()&&{tpm_limit:Number(e.tpm_limit)},...""!==e.rpm_limit.trim()&&{rpm_limit:Number(e.rpm_limit)},...""!==e.budget_duration&&{budget_duration:e.budget_duration},...""!==e.metadata.trim()&&{metadata:J.parse(JSON.parse(e.metadata))},...void 0!==a&&{object_permission:a}}))}});return(0,t.jsx)(k.Dialog,{open:e,onOpenChange:d,children:(0,t.jsxs)(k.DialogContent,{className:"sm:max-w-3xl max-h-[90vh] overflow-y-auto",children:[(0,t.jsx)(k.DialogHeader,{children:(0,t.jsx)(k.DialogTitle,{children:"Create Organization"})}),(0,t.jsxs)("form",{onSubmit:c,noValidate:!0,children:[(0,t.jsxs)(w.FieldGroup,{children:[(0,t.jsx)(M.FormField,{control:l.control,name:"organization_alias",label:"Organization Name",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e})}),(0,t.jsx)(M.FormField,{control:l.control,name:"models",label:"Models",children:e=>(0,t.jsx)(N.ModelSelect,{value:e.value,onChange:e.onChange,context:"organization",options:{includeSpecialOptions:!0,showAllProxyModelsOverride:!0}})}),(0,t.jsx)(M.FormField,{control:l.control,name:"max_budget",label:"Max Budget (USD)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:"any",min:0})}),(0,t.jsx)(M.FormField,{control:l.control,name:"budget_duration",label:"Reset Budget",children:({id:e,value:a,onChange:i,"aria-invalid":s,"aria-describedby":r})=>(0,t.jsxs)(O.Select,{items:H,value:""===a?G:a,onValueChange:e=>i(e===G?"":e),children:[(0,t.jsx)(O.SelectTrigger,{id:e,"aria-invalid":s,"aria-describedby":r,children:(0,t.jsx)(O.SelectValue,{})}),(0,t.jsx)(O.SelectContent,{children:H.map(e=>(0,t.jsx)(O.SelectItem,{value:e.value,children:e.label},e.value))})]})}),(0,t.jsx)(M.FormField,{control:l.control,name:"tpm_limit",label:"Tokens per minute Limit (TPM)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:1,min:0})}),(0,t.jsx)(M.FormField,{control:l.control,name:"rpm_limit",label:"Requests per minute Limit (RPM)",children:({ref:e,...a})=>(0,t.jsx)(T.Input,{...a,ref:e,type:"number",step:1,min:0})}),(0,t.jsx)(M.FormField,{control:l.control,name:"vector_stores",label:"Allowed Vector Stores",description:"Select vector stores this organization can access. Leave empty for access to all vector stores",children:e=>(0,t.jsx)(D.default,{value:e.value,onChange:e.onChange,accessToken:s,placeholder:"Select vector stores (optional)"})}),(0,t.jsx)(M.FormField,{control:l.control,name:"mcp",label:"Allowed MCP Servers",description:"Select MCP servers, access groups, and toolsets this organization can access. Leave empty for access to all",children:e=>(0,t.jsx)(S.default,{value:e.value,onChange:e.onChange,accessToken:s,placeholder:"Select MCP servers and access groups (optional)"})}),(0,t.jsx)(M.FormField,{control:l.control,name:"metadata",label:"Metadata",children:({ref:e,...a})=>(0,t.jsx)(F.Textarea,{...a,ref:e,rows:4})})]}),(0,t.jsxs)(k.DialogFooter,{className:"mt-6",children:[(0,t.jsx)(u.Button,{type:"button",variant:"outline",onClick:()=>d(!1),disabled:o.isPending,children:"Cancel"}),(0,t.jsx)(u.Button,{type:"submit",disabled:o.isPending,children:o.isPending?"Creating...":"Create Organization"})]})]})]})})};var Y=e.i(785242),ee=e.i(695420);e.i(622826);var et=e.i(964471),ea=e.i(922407),ei=e.i(515288),es=e.i(677572),er=e.i(500330),en=e.i(571353),el=e.i(980187),eo=e.i(487486);let ed="px-2.5 py-1 text-sm";function ec({href:e,variant:a="secondary",className:i,children:r}){let n=(0,s.useRouter)();return e?(0,t.jsx)(eo.Badge,{variant:a,className:(0,o.cn)("cursor-pointer",ed,i),render:(0,t.jsx)("a",{href:e,onClick:t=>{t.metaKey||t.ctrlKey||t.shiftKey||1===t.button||(t.preventDefault(),n.push(e))}}),children:r}):(0,t.jsx)(eo.Badge,{variant:a,className:(0,o.cn)(ed,i),children:r})}var em=e.i(871689),eu=e.i(294612),eg=e.i(907308),ex=e.i(384767),eh=e.i(276173);let ep=({organizationId:e,onClose:i,accessToken:s,is_org_admin:n,is_proxy_admin:l,userModels:o,editOrg:d})=>{let c=(0,v.useQueryClient)(),{data:m,isLoading:g}=(0,a.useOrganization)(e),[x,h]=(0,r.useState)(!1),[p,b]=(0,r.useState)(!1),[j,_]=(0,r.useState)(!1),[f,C]=(0,r.useState)(null),N=n||l,{data:S}=(0,Y.useTeams)(),{onTabChange:w,hasVisited:M}=(0,ee.useVisitedTabs)(d?"settings":"overview"),k=(0,r.useMemo)(()=>(0,el.createTeamAliasMap)(S),[S]),T=async t=>{try{if(null==s)return;let i={user_email:t.user_email,user_id:t.user_id,role:t.role};await (0,y.organizationMemberAddCall)(s,e,i),z.default.success("Organization member added successfully"),b(!1),c.invalidateQueries({queryKey:a.organizationKeys.all})}catch(e){z.default.fromBackend("Failed to add organization member"),console.error("Error adding organization member:",e)}},O=async t=>{try{if(!s)return;let i={user_email:t.user_email,user_id:t.user_id,role:t.role};await (0,y.organizationMemberUpdateCall)(s,e,i),z.default.success("Organization member updated successfully"),_(!1),c.invalidateQueries({queryKey:a.organizationKeys.all})}catch(e){z.default.fromBackend("Failed to update organization member"),console.error("Error updating organization member:",e)}},F=async t=>{try{if(!s)return;await (0,y.organizationMemberDeleteCall)(s,e,t.user_id),z.default.success("Organization member deleted successfully"),_(!1),c.invalidateQueries({queryKey:a.organizationKeys.all})}catch(e){z.default.fromBackend("Failed to delete organization member"),console.error("Error deleting organization member:",e)}};if(g)return(0,t.jsx)("div",{className:"p-4",children:"Loading..."});if(!m)return(0,t.jsx)("div",{className:"p-4",children:"Organization not found"});let D=[{title:"Spend (USD)",key:"spend",render:(e,a)=>{let i=null!=a.user_id?(m.members||[]).find(e=>e.user_id===a.user_id):void 0;return(0,t.jsx)(et.MoneyCell,{value:i?.spend,decimals:4})}},{title:"Created At",key:"created_at",render:(e,a)=>{let i=null!=a.user_id?(m.members||[]).find(e=>e.user_id===a.user_id):void 0;return(0,t.jsx)("span",{children:i?.created_at?new Date(i.created_at).toLocaleString():"-"})}}];return(0,t.jsxs)("div",{className:"h-screen w-full bg-background p-4",children:[(0,t.jsx)("div",{className:"mb-6 flex items-center justify-between",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)(u.Button,{variant:"ghost",onClick:i,className:"mb-4",children:[(0,t.jsx)(em.ArrowLeft,{className:"size-4"}),"Back to Organizations"]}),(0,t.jsx)("h1",{className:"text-xl font-semibold tracking-tight text-foreground",children:m.organization_alias}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("span",{className:"font-mono text-sm text-muted-foreground",children:m.organization_id}),(0,t.jsx)(ea.default,{value:m.organization_id,label:"Copy organization ID",iconClassName:"size-3"})]})]})}),(0,t.jsxs)(es.Tabs,{defaultValue:d?"settings":"overview",onValueChange:w,className:"mb-4",children:[(0,t.jsxs)(es.TabsList,{variant:"line",className:"h-auto w-full justify-start rounded-none border-b p-0",children:[(0,t.jsx)(es.TabsTrigger,{value:"overview",className:"flex-none rounded-none px-4 py-2",children:"Overview"}),(0,t.jsx)(es.TabsTrigger,{value:"members",className:"flex-none rounded-none px-4 py-2",children:"Members"}),(0,t.jsx)(es.TabsTrigger,{value:"settings",className:"flex-none rounded-none px-4 py-2",children:"Settings"})]}),(0,t.jsx)(es.TabsContent,{keepMounted:M("overview"),value:"overview",className:"pt-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3",children:[(0,t.jsx)(ei.Card,{children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Organization Details"}),(0,t.jsxs)("div",{className:"mt-2 text-sm text-foreground",children:[(0,t.jsxs)("p",{children:["Created: ",new Date(m.created_at).toLocaleDateString()]}),(0,t.jsxs)("p",{children:["Updated: ",new Date(m.updated_at).toLocaleDateString()]}),(0,t.jsxs)("p",{children:["Created By: ",m.created_by]})]})]})}),(0,t.jsx)(ei.Card,{children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Budget Status"}),(0,t.jsxs)("div",{className:"mt-2 text-sm text-foreground",children:[(0,t.jsxs)("p",{className:"text-xl font-semibold",children:["$",(0,er.formatNumberWithCommas)(m.spend,4)]}),(0,t.jsxs)("p",{children:["of"," ",null===m.litellm_budget_table.max_budget?"Unlimited":`$${(0,er.formatNumberWithCommas)(m.litellm_budget_table.max_budget,4)}`]}),m.litellm_budget_table.budget_duration&&(0,t.jsxs)("p",{className:"text-muted-foreground",children:["Reset: ",m.litellm_budget_table.budget_duration]})]})]})}),(0,t.jsx)(ei.Card,{children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Rate Limits"}),(0,t.jsxs)("div",{className:"mt-2 text-sm text-foreground",children:[(0,t.jsxs)("p",{children:["TPM: ",m.litellm_budget_table.tpm_limit||"Unlimited"]}),(0,t.jsxs)("p",{children:["RPM: ",m.litellm_budget_table.rpm_limit||"Unlimited"]}),m.litellm_budget_table.max_parallel_requests&&(0,t.jsxs)("p",{children:["Max Parallel Requests: ",m.litellm_budget_table.max_parallel_requests]})]})]})}),(0,t.jsx)(ei.Card,{children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Models"}),(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2",children:0===m.models.length?(0,t.jsx)(ec,{children:"All proxy models"}):m.models.map((e,a)=>(0,t.jsx)(ec,{children:e},a))})]})}),(0,t.jsx)(ei.Card,{children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Teams"}),(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2",children:m.teams?.map((e,a)=>{var i;return(0,t.jsx)(ec,{href:(i=e.team_id,`${(0,en.migratedHref)("teams")}?team=${encodeURIComponent(i)}`),children:k[e.team_id]||e.team_id},a)})})]})}),(0,t.jsx)(ex.default,{objectPermission:m.object_permission,variant:"card",accessToken:s})]})}),(0,t.jsx)(es.TabsContent,{keepMounted:M("members"),value:"members",className:"pt-4",children:(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsx)(eu.default,{members:(m.members||[]).map(e=>({role:e.user_role||"",user_id:e.user_id,user_email:e.user_email})),canEdit:N,onEdit:e=>{C(e),_(!0)},onDelete:e=>F(e),onAddMember:()=>b(!0),roleColumnTitle:"Organization Role",extraColumns:D,emptyText:"No members found"})})}),(0,t.jsx)(es.TabsContent,{keepMounted:M("settings"),value:"settings",className:"pt-4",children:(0,t.jsx)(ei.Card,{className:"max-h-[65vh] overflow-y-auto",children:(0,t.jsxs)(ei.CardContent,{children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-foreground",children:"Organization Settings"}),N&&!x&&(0,t.jsx)(u.Button,{onClick:()=>h(!0),children:"Edit Settings"})]}),x?(0,t.jsx)($,{organizationId:e,org:m,accessToken:s||"",onCancel:()=>h(!1),onSaved:()=>h(!1)}):(0,t.jsxs)("div",{className:"space-y-4 text-sm",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Organization Name"}),(0,t.jsx)("div",{children:m.organization_alias})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Organization ID"}),(0,t.jsx)("div",{className:"font-mono",children:m.organization_id})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Created At"}),(0,t.jsx)("div",{children:new Date(m.created_at).toLocaleString()})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Models"}),(0,t.jsx)("div",{className:"mt-1 flex flex-wrap gap-2",children:m.models.map((e,a)=>(0,t.jsx)(ec,{children:e},a))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Rate Limits"}),(0,t.jsxs)("div",{children:["TPM: ",m.litellm_budget_table.tpm_limit||"Unlimited"]}),(0,t.jsxs)("div",{children:["RPM: ",m.litellm_budget_table.rpm_limit||"Unlimited"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium text-foreground",children:"Budget"}),(0,t.jsxs)("div",{children:["Max:"," ",null!==m.litellm_budget_table.max_budget?`$${(0,er.formatNumberWithCommas)(m.litellm_budget_table.max_budget,4)}`:"No Limit"]}),(0,t.jsxs)("div",{children:["Reset: ",m.litellm_budget_table.budget_duration||"Never"]})]}),(0,t.jsx)(ex.default,{objectPermission:m.object_permission,variant:"inline",className:"border-t pt-4",accessToken:s})]})]})})})]}),(0,t.jsx)(eg.default,{isVisible:p,onCancel:()=>b(!1),onSubmit:T,accessToken:s,title:"Add Organization Member",roles:[{label:"org_admin",value:"org_admin",description:"Can add and remove members, and change their roles."},{label:"internal_user",value:"internal_user",description:"Can view/create keys for themselves within organization."},{label:"internal_user_viewer",value:"internal_user_viewer",description:"Can only view their keys within organization."}],defaultRole:"internal_user"}),(0,t.jsx)(eh.default,{visible:j,onCancel:()=>_(!1),onSubmit:O,initialData:f,mode:"edit",config:{title:"Edit Member",showEmail:!0,showUserId:!0,roleOptions:[{label:"Org Admin",value:"org_admin"},{label:"Internal User",value:"internal_user"},{label:"Internal User Viewer",value:"internal_user_viewer"}]}})]})};var eb=e.i(607486),ej=e.i(886407);e.i(707701);var e_=e.i(807235),ev=e.i(541071),ef=e.i(788699),ez=e.i(727612),ey=e.i(494862),eC=e.i(200208),eN=e.i(997422),eS=e.i(547227),ew=e.i(755146);let eM=e=>e.litellm_budget_table??{};function ek({organization:e}){let{tpm_limit:a,rpm_limit:i}=eM(e);return(0,t.jsxs)("div",{className:"flex flex-col text-xs text-muted-foreground",children:[(0,t.jsxs)("span",{children:["TPM: ",a||"Unlimited"]}),(0,t.jsxs)("span",{children:["RPM: ",i||"Unlimited"]})]})}function eT({organization:e,onEditClick:a,onDeleteClick:i}){return(0,t.jsxs)(ew.DropdownMenu,{children:[(0,t.jsx)(ew.DropdownMenuTrigger,{"aria-label":"Open organization actions","data-testid":`organization-actions-${e.organization_id}`,className:(0,o.cn)((0,u.buttonVariants)({variant:"ghost",size:"icon-sm"}),"text-muted-foreground"),children:(0,t.jsx)(ev.MoreHorizontal,{className:"size-4"})}),(0,t.jsxs)(ew.DropdownMenuContent,{align:"end",className:"w-52",children:[(0,t.jsxs)(ew.DropdownMenuItem,{"data-testid":"organization-action-edit",onClick:()=>a(e.organization_id),children:[(0,t.jsx)(ef.Pencil,{}),"Edit"]}),(0,t.jsxs)(ew.DropdownMenuItem,{variant:"destructive","data-testid":"organization-action-delete",onClick:()=>i(e.organization_id),children:[(0,t.jsx)(ez.Trash2,{}),"Delete"]})]})]})}let eO=[{id:"created_at",desc:!0}];function eF({searchActive:e}){let a=e?ej.SearchX:eb.Building2;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)(a,{className:"size-5 text-muted-foreground"})}),(0,t.jsx)("div",{className:"text-sm font-medium text-foreground",children:e?"No matching organizations":"No organizations yet"}),(0,t.jsx)("div",{className:"text-sm text-muted-foreground",children:e?"No organizations match your search. Try a different name or ID.":"Create an organization to group teams, models, and budgets."})]})}let eD=({organizations:e,isLoading:a,userRole:i,searchActive:s,onOrganizationClick:n,onEditClick:l,onDeleteClick:o})=>{let[d,c]=(0,r.useState)(eO),m=(0,r.useMemo)(()=>(({userRole:e,onOrganizationClick:a,onEditClick:i,onDeleteClick:s})=>[{id:"organization_id",accessorKey:"organization_id",meta:{title:"Organization ID"},header:({column:e})=>(0,t.jsx)(ey.DataTableSortHeader,{column:e,title:"Organization ID"}),size:220,enableSorting:!0,cell:({row:e})=>(0,t.jsx)(eN.IdentityCell,{title:e.original.organization_id,titleClassName:"font-mono text-xs font-normal",className:"max-w-56",onClick:()=>a(e.original.organization_id)})},{id:"organization_alias",accessorKey:"organization_alias",meta:{title:"Organization Name"},header:({column:e})=>(0,t.jsx)(ey.DataTableSortHeader,{column:e,title:"Organization Name"}),size:200,enableSorting:!0,cell:({row:e})=>{let a=e.original.organization_alias;return(0,t.jsx)("span",{className:"block max-w-56 truncate text-sm font-medium",title:a??void 0,children:a||"-"})}},{id:"created_at",accessorKey:"created_at",sortingFn:"datetime",meta:{title:"Created"},header:({column:e})=>(0,t.jsx)(ey.DataTableSortHeader,{column:e,title:"Created"}),size:130,enableSorting:!0,cell:({row:e})=>(0,t.jsx)(eC.DateCell,{value:e.original.created_at,precision:"date"})},{id:"spend",accessorKey:"spend",meta:{title:"Spend (USD)"},header:({column:e})=>(0,t.jsx)(ey.DataTableSortHeader,{column:e,title:"Spend (USD)"}),size:120,enableSorting:!0,cell:({row:e})=>(0,t.jsx)(et.MoneyCell,{value:e.original.spend,decimals:4})},{id:"max_budget",meta:{title:"Budget (USD)"},header:"Budget (USD)",size:120,enableSorting:!1,cell:({row:e})=>(0,t.jsx)(et.MoneyCell,{value:eM(e.original).max_budget,decimals:2,emptyText:"Unlimited",showZero:!0})},{id:"models",meta:{title:"Models",skeleton:"chips"},header:"Models",size:260,enableSorting:!1,cell:({row:e})=>(0,t.jsx)(eS.ModelsCell,{models:e.original.models})},{id:"limits",meta:{title:"TPM / RPM Limits"},header:"TPM / RPM Limits",size:150,enableSorting:!1,cell:({row:e})=>(0,t.jsx)(ek,{organization:e.original})},{id:"members",meta:{title:"Members"},header:"Members",size:100,enableSorting:!1,cell:({row:e})=>(0,t.jsxs)("span",{className:"text-sm",children:[e.original.members?.length??0," Members"]})},{id:"actions",meta:{className:"text-right",headerClassName:"text-right"},header:()=>(0,t.jsx)("span",{className:"sr-only",children:"Actions"}),size:64,enableSorting:!1,enableHiding:!1,cell:({row:a})=>"Admin"===e?(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(eT,{organization:a.original,onEditClick:i,onDeleteClick:s})}):null}])({userRole:i,onOrganizationClick:n,onEditClick:l,onDeleteClick:o}),[i,n,l,o]);return(0,t.jsx)(e_.DataTable,{data:e,columns:m,getRowId:(e,t)=>e.organization_id||String(t),sortingMode:"client",sorting:d,onSortingChange:c,isLoading:a,loadingMessage:"Loading organizations…",noDataMessage:(0,t.jsx)(eF,{searchActive:s}),size:"compact"})},eP=({userRole:e,accessToken:l,premiumUser:o})=>{let d,c,m,{orgId:g,openOrg:x,close:h}=(d=(0,s.useSearchParams)(),c=(0,r.useCallback)(e=>{(0,n.navigateWithParams)(t=>{t.set("org",e)})},[]),m=(0,r.useCallback)(()=>{(0,n.navigateWithParams)(e=>{e.delete("org")})},[]),{orgId:d?.get("org")??null,openOrg:c,close:m}),[p,b]=(0,r.useState)(!1),[j,C]=(0,r.useState)(!1),[N,S]=(0,r.useState)(null),[w,M]=(0,r.useState)(!1),[k,T]=(0,r.useState)(!1),[O,F]=(0,r.useState)(!1),[D,P]=(0,r.useState)({org_id:"",org_alias:""}),I=(0,v.useQueryClient)(),{data:A=[],isLoading:B}=(0,a.useOrganizations)({org_id:D.org_id,org_alias:D.org_alias}),{data:R=[]}=(0,i.useUserModels)(),L=!!(D.org_id||D.org_alias),U=async()=>{if(N&&l)try{M(!0),await (0,y.organizationDeleteCall)(l,N),z.default.success("Organization deleted successfully"),C(!1),S(null),await I.invalidateQueries({queryKey:a.organizationKeys.lists()})}catch(e){console.error("Error deleting organization:",e)}finally{M(!1)}};return o?(0,t.jsxs)("div",{className:"mx-4 mt-4 flex flex-col gap-4",children:[("Admin"===e||"Org Admin"===e)&&(0,t.jsx)(u.Button,{className:"w-fit",onClick:()=>T(!0),children:"+ Create New Organization"}),g?(0,t.jsx)(ep,{organizationId:g,onClose:()=>{h(),b(!1)},accessToken:l,is_org_admin:!0,is_proxy_admin:"Admin"===e,userModels:R,editOrg:p}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"Click on an organization ID to view its details."}),(0,t.jsx)(_,{filters:D,showFilters:O,onToggleFilters:F,onChange:(e,t)=>{P(a=>({...a,[e]:t}))},onReset:()=>{P({org_id:"",org_alias:""})}}),(0,t.jsx)(eD,{organizations:A,isLoading:B,userRole:e,searchActive:L,onOrganizationClick:e=>{b(!1),x(e)},onEditClick:e=>{x(e),b(!0)},onDeleteClick:e=>{e&&(S(e),C(!0))}})]}),(0,t.jsx)(X,{open:k,onOpenChange:T,accessToken:l||""}),(0,t.jsx)(f.default,{isOpen:j,title:"Delete Organization?",message:"Are you sure you want to delete this organization? This action cannot be undone.",resourceInformationTitle:"Organization Information",resourceInformation:[{label:"Organization ID",value:N,code:!0}],onCancel:()=>{C(!1),S(null)},onOk:U,confirmLoading:w})]}):(0,t.jsx)("div",{className:"mx-4 mt-4",children:(0,t.jsxs)("p",{className:"text-sm text-muted-foreground",children:["This is a LiteLLM Enterprise feature, and requires a valid key to use. Get a trial key"," ",(0,t.jsx)("a",{href:"https://www.litellm.ai/#pricing",target:"_blank",rel:"noopener noreferrer",className:"text-primary underline-offset-4 hover:underline",children:"here"}),"."]})})};var eI=e.i(135214);e.s(["default",0,function(){let{accessToken:e,userRole:a,premiumUser:i}=(0,eI.default)();return(0,t.jsx)(eP,{userRole:a??"",accessToken:e,premiumUser:i??!1})}],526612)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/11_h-ycwasbfv.js b/litellm/proxy/_experimental/out/_next/static/chunks/11_h-ycwasbfv.js deleted file mode 100644 index dd804406519..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/11_h-ycwasbfv.js +++ /dev/null @@ -1,7 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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])},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)},755146,e=>{"use strict";var t=e.i(843476),a=e.i(451512),i=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:r=0,side:n="bottom",sideOffset:l=4,className:o,...s}){return(0,t.jsx)(a.Menu.Portal,{children:(0,t.jsx)(a.Menu.Positioner,{className:"isolate z-50 outline-none",align:e,alignOffset:r,side:n,sideOffset:l,children:(0,t.jsx)(a.Menu.Popup,{"data-slot":"dropdown-menu-content",className:(0,i.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",o),...s})})})},"DropdownMenuItem",0,function({className:e,inset:r,variant:n="default",...l}){return(0,t.jsx)(a.Menu.Item,{"data-slot":"dropdown-menu-item","data-inset":r,"data-variant":n,className:(0,i.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),...l})},"DropdownMenuSeparator",0,function({className:e,...r}){return(0,t.jsx)(a.Menu.Separator,{"data-slot":"dropdown-menu-separator",className:(0,i.cn)("-mx-1 my-1 h-px bg-border",e),...r})},"DropdownMenuTrigger",0,function({...e}){return(0,t.jsx)(a.Menu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}])},541071,373488,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(["default",0,t],373488),e.s(["MoreHorizontal",0,t],541071)},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)},655063,e=>{"use strict";var t=e.i(399029),a=e.i(271645);e.s(["useDebouncedValue",0,function(e,i,r){let[n,l,o]=(0,t.useDebouncedState)(e,i,r);return(0,a.useEffect)(()=>{l(e)},[e,l]),[n,o]}])},166406,e=>{"use strict";var t=e.i(190144);e.s(["CopyOutlined",()=>t.default])},447566,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M872 474H286.9l350.2-304c5.6-4.9 2.2-14-5.2-14h-88.5c-3.9 0-7.6 1.4-10.5 3.9L155 487.8a31.96 31.96 0 000 48.3L535.1 866c1.5 1.3 3.3 2 5.2 2h91.5c7.4 0 10.8-9.2 5.2-14L286.9 550H872c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"arrow-left",theme:"outlined"};var r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["ArrowLeftOutlined",0,n],447566)},653496,e=>{"use strict";var t=e.i(721369);e.s(["Tabs",()=>t.default])},629569,e=>{"use strict";var t=e.i(290571),a=e.i(95779),i=e.i(444755),r=e.i(673706),n=e.i(271645);let l=n.default.forwardRef((e,l)=>{let{color:o,children:s,className:c}=e,d=(0,t.__rest)(e,["color","children","className"]);return n.default.createElement("p",Object.assign({ref:l,className:(0,i.tremorTwMerge)("font-medium text-tremor-title",o?(0,r.getColorClassNames)(o,a.colorPalette.darkText).textColor:"text-tremor-content-strong dark:text-dark-tremor-content-strong",c)},d),s)});l.displayName="Title",e.s(["Title",0,l],629569)},304967,e=>{"use strict";var t=e.i(290571),a=e.i(271645),i=e.i(480731),r=e.i(95779),n=e.i(444755),l=e.i(673706);let o=(0,l.makeClassName)("Card"),s=a.default.forwardRef((e,s)=>{let{decoration:c="",decorationColor:d,children:u,className:m}=e,f=(0,t.__rest)(e,["decoration","decorationColor","children","className"]);return a.default.createElement("div",Object.assign({ref:s,className:(0,n.tremorTwMerge)(o("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",d?(0,l.getColorClassNames)(d,r.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",(e=>{if(!e)return"";switch(e){case i.HorizontalPositions.Left:return"border-l-4";case i.VerticalPositions.Top:return"border-t-4";case i.HorizontalPositions.Right:return"border-r-4";case i.VerticalPositions.Bottom:return"border-b-4";default:return""}})(c),m)},f),u)});s.displayName="Card",e.s(["Card",0,s],304967)},91874,681216,e=>{"use strict";var t=e.i(931067),a=e.i(209428),i=e.i(211577),r=e.i(392221),n=e.i(703923),l=e.i(343794),o=e.i(914949),s=e.i(271645),c=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],d=(0,s.forwardRef)(function(e,d){var u=e.prefixCls,m=void 0===u?"rc-checkbox":u,f=e.className,p=e.style,g=e.checked,h=e.disabled,v=e.defaultChecked,b=e.type,x=void 0===b?"checkbox":b,$=e.title,y=e.onChange,k=(0,n.default)(e,c),C=(0,s.useRef)(null),w=(0,s.useRef)(null),S=(0,o.default)(void 0!==v&&v,{value:g}),z=(0,r.default)(S,2),O=z[0],E=z[1];(0,s.useImperativeHandle)(d,function(){return{focus:function(e){var t;null==(t=C.current)||t.focus(e)},blur:function(){var e;null==(e=C.current)||e.blur()},input:C.current,nativeElement:w.current}});var j=(0,l.default)(m,f,(0,i.default)((0,i.default)({},"".concat(m,"-checked"),O),"".concat(m,"-disabled"),h));return s.createElement("span",{className:j,title:$,style:p,ref:w},s.createElement("input",(0,t.default)({},k,{className:"".concat(m,"-input"),ref:C,onChange:function(t){h||("checked"in e||E(t.target.checked),null==y||y({target:(0,a.default)((0,a.default)({},e),{},{type:x,checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},disabled:h,checked:!!O,type:x})),s.createElement("span",{className:"".concat(m,"-inner")}))});e.s(["default",0,d],91874);var u=e.i(963188);e.s(["default",0,function(e){let t=s.default.useRef(null),a=()=>{u.default.cancel(t.current),t.current=null};return[()=>{a(),t.current=(0,u.default)(()=>{t.current=null})},i=>{t.current&&(i.stopPropagation(),a()),null==e||e(i)}]}],681216)},374276,236836,e=>{"use strict";e.i(247167);var t=e.i(271645),a=e.i(343794),i=e.i(91874),r=e.i(611935),n=e.i(121872),l=e.i(26905),o=e.i(242064),s=e.i(937328),c=e.i(321883),d=e.i(62139);let u=t.default.createContext(null);e.i(296059);var m=e.i(915654),f=e.i(183293),p=e.i(246422),g=e.i(838378);function h(e,t){return(e=>{let{checkboxCls:t}=e,a=`${t}-wrapper`;return[{[`${t}-group`]:Object.assign(Object.assign({},(0,f.resetComponent)(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[a]:Object.assign(Object.assign({},(0,f.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,f.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,f.genFocusOutline)(e)},[`${t}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${(0,m.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,m.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,g.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let v=(0,p.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[h(t,e)]);e.s(["default",0,v,"getStyle",0,h],236836);var b=e.i(681216),x=function(e,t){var a={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(a[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,i=Object.getOwnPropertySymbols(e);rt.indexOf(i[r])&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(a[i[r]]=e[i[r]]);return a};let $=t.forwardRef((e,m)=>{var f;let{prefixCls:p,className:g,rootClassName:h,children:$,indeterminate:y=!1,style:k,onMouseEnter:C,onMouseLeave:w,skipGroup:S=!1,disabled:z}=e,O=x(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:E,direction:j,checkbox:M}=t.useContext(o.ConfigContext),N=t.useContext(u),{isFormItemInput:_}=t.useContext(d.FormItemInputContext),B=t.useContext(s.default),I=null!=(f=(null==N?void 0:N.disabled)||z)?f:B,P=t.useRef(O.value),R=t.useRef(null),q=(0,r.composeRef)(m,R);t.useEffect(()=>{null==N||N.registerValue(O.value)},[]),t.useEffect(()=>{if(!S)return O.value!==P.current&&(null==N||N.cancelValue(P.current),null==N||N.registerValue(O.value),P.current=O.value),()=>null==N?void 0:N.cancelValue(O.value)},[O.value]),t.useEffect(()=>{var e;(null==(e=R.current)?void 0:e.input)&&(R.current.input.indeterminate=y)},[y]);let L=E("checkbox",p),H=(0,c.default)(L),[T,V,D]=v(L,H),W=Object.assign({},O);N&&!S&&(W.onChange=(...e)=>{O.onChange&&O.onChange.apply(O,e),N.toggleOption&&N.toggleOption({label:$,value:O.value})},W.name=N.name,W.checked=N.value.includes(O.value));let A=(0,a.default)(`${L}-wrapper`,{[`${L}-rtl`]:"rtl"===j,[`${L}-wrapper-checked`]:W.checked,[`${L}-wrapper-disabled`]:I,[`${L}-wrapper-in-form-item`]:_},null==M?void 0:M.className,g,h,D,H,V),X=(0,a.default)({[`${L}-indeterminate`]:y},l.TARGET_CLS,V),[G,F]=(0,b.default)(W.onClick);return T(t.createElement(n.default,{component:"Checkbox",disabled:I},t.createElement("label",{className:A,style:Object.assign(Object.assign({},null==M?void 0:M.style),k),onMouseEnter:C,onMouseLeave:w,onClick:G},t.createElement(i.default,Object.assign({},W,{onClick:F,prefixCls:L,className:X,disabled:I,ref:q})),null!=$&&t.createElement("span",{className:`${L}-label`},$))))});var y=e.i(8211),k=e.i(529681),C=function(e,t){var a={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(a[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,i=Object.getOwnPropertySymbols(e);rt.indexOf(i[r])&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(a[i[r]]=e[i[r]]);return a};let w=t.forwardRef((e,i)=>{let{defaultValue:r,children:n,options:l=[],prefixCls:s,className:d,rootClassName:m,style:f,onChange:p}=e,g=C(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:h,direction:b}=t.useContext(o.ConfigContext),[x,w]=t.useState(g.value||r||[]),[S,z]=t.useState([]);t.useEffect(()=>{"value"in g&&w(g.value||[])},[g.value]);let O=t.useMemo(()=>l.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[l]),E=e=>{z(t=>t.filter(t=>t!==e))},j=e=>{z(t=>[].concat((0,y.default)(t),[e]))},M=e=>{let t=x.indexOf(e.value),a=(0,y.default)(x);-1===t?a.push(e.value):a.splice(t,1),"value"in g||w(a),null==p||p(a.filter(e=>S.includes(e)).sort((e,t)=>O.findIndex(t=>t.value===e)-O.findIndex(e=>e.value===t)))},N=h("checkbox",s),_=`${N}-group`,B=(0,c.default)(N),[I,P,R]=v(N,B),q=(0,k.default)(g,["value","disabled"]),L=l.length?O.map(e=>t.createElement($,{prefixCls:N,key:e.value.toString(),disabled:"disabled"in e?e.disabled:g.disabled,value:e.value,checked:x.includes(e.value),onChange:e.onChange,className:(0,a.default)(`${_}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):n,H=t.useMemo(()=>({toggleOption:M,value:x,disabled:g.disabled,name:g.name,registerValue:j,cancelValue:E}),[M,x,g.disabled,g.name,j,E]),T=(0,a.default)(_,{[`${_}-rtl`]:"rtl"===b},d,m,R,B,P);return I(t.createElement("div",Object.assign({className:T,style:f},q,{ref:i}),t.createElement(u.Provider,{value:H},L)))});$.Group=w,$.__ANT_CHECKBOX=!0,e.s(["default",0,$],374276)},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},389083,e=>{"use strict";var t=e.i(290571),a=e.i(271645),i=e.i(829087),r=e.i(480731),n=e.i(95779),l=e.i(444755),o=e.i(673706);let s={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,o.makeClassName)("Badge"),u=a.default.forwardRef((e,u)=>{let{color:m,icon:f,size:p=r.Sizes.SM,tooltip:g,className:h,children:v}=e,b=(0,t.__rest)(e,["color","icon","size","tooltip","className","children"]),x=f||null,{tooltipProps:$,getReferenceProps:y}=(0,i.useTooltip)();return a.default.createElement("span",Object.assign({ref:(0,o.mergeRefs)([u,$.refs.setReference]),className:(0,l.tremorTwMerge)(d("root"),"w-max shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-small ring-1 ring-inset",m?(0,l.tremorTwMerge)((0,o.getColorClassNames)(m,n.colorPalette.background).bgColor,(0,o.getColorClassNames)(m,n.colorPalette.iconText).textColor,(0,o.getColorClassNames)(m,n.colorPalette.iconRing).ringColor,"bg-opacity-10 ring-opacity-20","dark:bg-opacity-5 dark:ring-opacity-60"):(0,l.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"),s[p].paddingX,s[p].paddingY,s[p].fontSize,h)},y,b),a.default.createElement(i.default,Object.assign({text:g},$)),x?a.default.createElement(x,{className:(0,l.tremorTwMerge)(d("icon"),"shrink-0 -ml-1 mr-1.5",c[p].height,c[p].width)}):null,a.default.createElement("span",{className:(0,l.tremorTwMerge)(d("text"),"whitespace-nowrap")},v))});u.displayName="Badge",e.s(["Badge",0,u],389083)},530212,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:"M10 19l-7-7m0 0l7-7m-7 7h18"}))});e.s(["ArrowLeftIcon",0,a],530212)},637235,e=>{"use strict";e.i(247167);var t=e.i(931067),a=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:"M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z"}}]},name:"clock-circle",theme:"outlined"};var r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["ClockCircleOutlined",0,n],637235)},211576,e=>{"use strict";var t=e.i(131757);e.s(["Col",()=>t.default])},245704,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["CheckCircleOutlined",0,n],245704)},724154,e=>{"use strict";e.i(247167);var t=e.i(931067),a=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-372 0-89 31.3-170.8 83.5-234.8l523.3 523.3C682.8 852.7 601 884 512 884zm288.5-137.2L277.2 223.5C341.2 171.3 423 140 512 140c205.4 0 372 166.6 372 372 0 89-31.3 170.8-83.5 234.8z"}}]},name:"stop",theme:"outlined"};var r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["StopOutlined",0,n],724154)},118366,e=>{"use strict";var t=e.i(991124);e.s(["CopyIcon",()=>t.default])},928685,e=>{"use strict";var t=e.i(38953);e.s(["SearchOutlined",()=>t.default])},21548,e=>{"use strict";var t=e.i(616303);e.s(["Empty",()=>t.default])},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])},149192,e=>{"use strict";var t=e.i(864517);e.s(["CloseOutlined",()=>t.default])},518617,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["CloseCircleOutlined",0,n],518617)},19732,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["ExperimentOutlined",0,n],19732)},826910,e=>{"use strict";var t=e.i(201072);e.s(["CheckCircleFilled",()=>t.default])},988846,181692,438100,e=>{"use strict";var t=e.i(54943);e.s(["SearchIcon",()=>t.default],988846);let a=(0,e.i(475254).default)("key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);e.s(["default",0,a],181692),e.s(["KeyIcon",0,a],438100)},302202,e=>{"use strict";var t=e.i(953651);e.s(["ServerIcon",()=>t.default])},168118,e=>{"use strict";var t=e.i(879664);e.s(["InfoIcon",()=>t.default])},462433,e=>{e.q("/litellm-asset-prefix/_next/static/media/aim_security.15w_gpz3t43v3.jpeg")},80967,e=>{e.q("/litellm-asset-prefix/_next/static/media/akto.3jgaivqd683t4.svg")},20698,e=>{e.q("/litellm-asset-prefix/_next/static/media/aporia.2e_nhf0zf8oli.png")},509105,e=>{e.q("/litellm-asset-prefix/_next/static/media/cato_networks.1awrzn_1otwbt.svg")},648931,e=>{e.q("/litellm-asset-prefix/_next/static/media/cisco.0pf2ni7nes2im.png")},689521,e=>{e.q("/litellm-asset-prefix/_next/static/media/deepkeep.0k6ge0vqyxdi0.svg")},579477,e=>{e.q("/litellm-asset-prefix/_next/static/media/enkrypt_ai.3_-p3-cd2dkrp.avif")},872799,e=>{e.q("/litellm-asset-prefix/_next/static/media/guardrails_ai.0c_76h1qg_2ff.jpeg")},616667,e=>{e.q("/litellm-asset-prefix/_next/static/media/javelin.300c2jc378vi4.png")},356349,e=>{e.q("/litellm-asset-prefix/_next/static/media/lakeraai.2xbgu6-fr-5ca.jpeg")},855305,e=>{e.q("/litellm-asset-prefix/_next/static/media/lasso.1elqma2u3h-qi.png")},480509,e=>{e.q("/litellm-asset-prefix/_next/static/media/litellm_logo.2q-1n9v95d189.jpg")},622024,e=>{e.q("/litellm-asset-prefix/_next/static/media/noma_security.07ydrwasze5i8.png")},818207,e=>{e.q("/litellm-asset-prefix/_next/static/media/palo_alto_networks.3t0xwyuc-6s43.jpeg")},896626,e=>{e.q("/litellm-asset-prefix/_next/static/media/pangea.0ldsllwi7dvjg.png")},297290,e=>{e.q("/litellm-asset-prefix/_next/static/media/pillar.09s1gdql9yppp.jpeg")},414170,e=>{e.q("/litellm-asset-prefix/_next/static/media/prompt_security.34ps_5vqhm25q.png")},923884,e=>{e.q("/litellm-asset-prefix/_next/static/media/promptguard.0m31gz-559aca.svg")},295045,e=>{e.q("/litellm-asset-prefix/_next/static/media/qohash.14emr-wtp42k3.jpg")},145645,e=>{e.q("/litellm-asset-prefix/_next/static/media/repelloai.3ossrsdbm80kg.png")},205897,e=>{e.q("/litellm-asset-prefix/_next/static/media/straiker.0hnk6y758t2jh.svg")},926168,e=>{e.q("/litellm-asset-prefix/_next/static/media/xecguard.317q_7yg6brag.svg")},583306,e=>{e.q("/litellm-asset-prefix/_next/static/media/zscaler.42cagyicgk81q.svg")},788191,e=>{"use strict";e.i(247167);var t=e.i(931067),a=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:"M719.4 499.1l-296.1-215A15.9 15.9 0 00398 297v430c0 13.1 14.8 20.5 25.3 12.9l296.1-215a15.9 15.9 0 000-25.8zm-257.6 134V390.9L628.5 512 461.8 633.1z"}}]},name:"play-circle",theme:"outlined"};var r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["PlayCircleOutlined",0,n],788191)},987432,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["SaveOutlined",0,n],987432)},750113,e=>{"use strict";var t=e.i(684024);e.s(["QuestionCircleOutlined",()=>t.default])},266537,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};var r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["ArrowRightOutlined",0,n],266537)},758472,634831,e=>{"use strict";let t=(0,e.i(475254).default)("code",[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]);e.s(["Code",0,t],758472);var a=e.i(546467);e.s(["ExternalLinkIcon",()=>a.default],634831)},328196,e=>{"use strict";var t=e.i(361653);e.s(["AlertCircleIcon",()=>t.default])},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["ExportOutlined",0,n],872934)},245094,e=>{"use strict";e.i(247167);var t=e.i(931067),a=e.i(271645);let i={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 r=e.i(9583),n=a.forwardRef(function(e,n){return a.createElement(r.default,(0,t.default)({},e,{ref:n,icon:i}))});e.s(["CodeOutlined",0,n],245094)},573421,e=>{"use strict";e.i(247167);var t=e.i(8211),a=e.i(271645),i=e.i(343794),r=e.i(887719),n=e.i(908206),l=e.i(242064),o=e.i(721132),s=e.i(517455),c=e.i(281256),d=e.i(150073),u=e.i(165370),m=e.i(244451);let f=a.default.createContext({});f.Consumer;var p=e.i(763731),g=e.i(211576),h=function(e,t){var a={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(a[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,i=Object.getOwnPropertySymbols(e);rt.indexOf(i[r])&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(a[i[r]]=e[i[r]]);return a};let v=a.default.forwardRef((e,t)=>{let r,{prefixCls:n,children:o,actions:s,extra:c,styles:d,className:u,classNames:m,colStyle:v}=e,b=h(e,["prefixCls","children","actions","extra","styles","className","classNames","colStyle"]),{grid:x,itemLayout:$}=(0,a.useContext)(f),{getPrefixCls:y,list:k}=(0,a.useContext)(l.ConfigContext),C=e=>{var t,a;return(0,i.default)(null==(a=null==(t=null==k?void 0:k.item)?void 0:t.classNames)?void 0:a[e],null==m?void 0:m[e])},w=e=>{var t,a;return Object.assign(Object.assign({},null==(a=null==(t=null==k?void 0:k.item)?void 0:t.styles)?void 0:a[e]),null==d?void 0:d[e])},S=y("list",n),z=s&&s.length>0&&a.default.createElement("ul",{className:(0,i.default)(`${S}-item-action`,C("actions")),key:"actions",style:w("actions")},s.map((e,t)=>a.default.createElement("li",{key:`${S}-item-action-${t}`},e,t!==s.length-1&&a.default.createElement("em",{className:`${S}-item-action-split`})))),O=a.default.createElement(x?"div":"li",Object.assign({},b,x?{}:{ref:t},{className:(0,i.default)(`${S}-item`,{[`${S}-item-no-flex`]:!("vertical"===$?!!c:(r=!1,a.Children.forEach(o,e=>{"string"==typeof e&&(r=!0)}),!(r&&a.Children.count(o)>1)))},u)}),"vertical"===$&&c?[a.default.createElement("div",{className:`${S}-item-main`,key:"content"},o,z),a.default.createElement("div",{className:(0,i.default)(`${S}-item-extra`,C("extra")),key:"extra",style:w("extra")},c)]:[o,z,(0,p.cloneElement)(c,{key:"extra"})]);return x?a.default.createElement(g.Col,{ref:t,flex:1,style:v},O):O});v.Meta=e=>{var{prefixCls:t,className:r,avatar:n,title:o,description:s}=e,c=h(e,["prefixCls","className","avatar","title","description"]);let{getPrefixCls:d}=(0,a.useContext)(l.ConfigContext),u=d("list",t),m=(0,i.default)(`${u}-item-meta`,r),f=a.default.createElement("div",{className:`${u}-item-meta-content`},o&&a.default.createElement("h4",{className:`${u}-item-meta-title`},o),s&&a.default.createElement("div",{className:`${u}-item-meta-description`},s));return a.default.createElement("div",Object.assign({},c,{className:m}),n&&a.default.createElement("div",{className:`${u}-item-meta-avatar`},n),(o||s)&&f)},e.i(296059);var b=e.i(915654),x=e.i(183293),$=e.i(246422),y=e.i(838378);let k=(0,$.genStyleHooks)("List",e=>{let t=(0,y.mergeToken)(e,{listBorderedCls:`${e.componentCls}-bordered`,minHeight:e.controlHeightLG});return[(e=>{let{componentCls:t,antCls:a,controlHeight:i,minHeight:r,paddingSM:n,marginLG:l,padding:o,itemPadding:s,colorPrimary:c,itemPaddingSM:d,itemPaddingLG:u,paddingXS:m,margin:f,colorText:p,colorTextDescription:g,motionDurationSlow:h,lineWidth:v,headerBg:$,footerBg:y,emptyTextPadding:k,metaMarginBottom:C,avatarMarginRight:w,titleMarginBottom:S,descriptionFontSize:z}=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:$},[`${t}-footer`]:{background:y},[`${t}-header, ${t}-footer`]:{paddingBlock:n},[`${t}-pagination`]:{marginBlockStart:l,[`${a}-pagination-options`]:{textAlign:"start"}},[`${t}-spin`]:{minHeight:r,textAlign:"center"},[`${t}-items`]:{margin:0,padding:0,listStyle:"none"},[`${t}-item`]:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:s,color:p,[`${t}-item-meta`]:{display:"flex",flex:1,alignItems:"flex-start",maxWidth:"100%",[`${t}-item-meta-avatar`]:{marginInlineEnd:w},[`${t}-item-meta-content`]:{flex:"1 0",width:0,color:p},[`${t}-item-meta-title`]:{margin:`0 0 ${(0,b.unit)(e.marginXXS)} 0`,color:p,fontSize:e.fontSize,lineHeight:e.lineHeight,"> a":{color:p,transition:`all ${h}`,"&:hover":{color:c}}},[`${t}-item-meta-description`]:{color:g,fontSize:z,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:g,fontSize:e.fontSize,lineHeight:e.lineHeight,textAlign:"center","&:first-child":{paddingInlineStart:0}},[`${t}-item-action-split`]:{position:"absolute",insetBlockStart:"50%",insetInlineEnd:0,width:v,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)(o)} 0`,color:g,fontSize:e.fontSizeSM,textAlign:"center"},[`${t}-empty-text`]:{padding:k,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:f,paddingBlock:0,borderBlockEnd:"none"},[`${t}-vertical ${t}-item`]:{alignItems:"initial",[`${t}-item-main`]:{display:"block",flex:1},[`${t}-item-extra`]:{marginInlineStart:l},[`${t}-item-meta`]:{marginBlockEnd:C,[`${t}-item-meta-title`]:{marginBlockStart:0,marginBlockEnd:S,color:p,fontSize:e.fontSizeLG,lineHeight:e.lineHeightLG}},[`${t}-item-action`]:{marginBlockStart:o,marginInlineStart:"auto","> li":{padding:`0 ${(0,b.unit)(o)}`,"&: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:i},[`${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:i,margin:r,itemPaddingSM:n,itemPaddingLG:l,marginLG:o,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:i},[`${a}-pagination`]:{margin:`${(0,b.unit)(r)} ${(0,b.unit)(o)}`}},[`${t}${a}-sm`]:{[`${a}-item,${a}-header,${a}-footer`]:{padding:n}},[`${t}${a}-lg`]:{[`${a}-item,${a}-header,${a}-footer`]:{padding:l}}}})(t),(e=>{let{componentCls:t,screenSM:a,screenMD:i,marginLG:r,marginSM:n,margin:l}=e;return{[`@media screen and (max-width:${i}px)`]:{[t]:{[`${t}-item`]:{[`${t}-item-action`]:{marginInlineStart:r}}},[`${t}-vertical`]:{[`${t}-item`]:{[`${t}-item-extra`]:{marginInlineStart:r}}}},[`@media screen and (max-width: ${a}px)`]:{[t]:{[`${t}-item`]:{flexWrap:"wrap",[`${t}-action`]:{marginInlineStart:n}}},[`${t}-vertical`]:{[`${t}-item`]:{flexWrap:"wrap-reverse",[`${t}-item-main`]:{minWidth:e.contentWidth},[`${t}-item-extra`]:{margin:`auto auto ${(0,b.unit)(l)}`}}}}}})(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 C=function(e,t){var a={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&0>t.indexOf(i)&&(a[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,i=Object.getOwnPropertySymbols(e);rt.indexOf(i[r])&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(a[i[r]]=e[i[r]]);return a};let w=a.forwardRef(function(e,p){let{pagination:g=!1,prefixCls:h,bordered:v=!1,split:b=!0,className:x,rootClassName:$,style:y,children:w,itemLayout:S,loadMore:z,grid:O,dataSource:E=[],size:j,header:M,footer:N,loading:_=!1,rowKey:B,renderItem:I,locale:P}=e,R=C(e,["pagination","prefixCls","bordered","split","className","rootClassName","style","children","itemLayout","loadMore","grid","dataSource","size","header","footer","loading","rowKey","renderItem","locale"]),q=g&&"object"==typeof g?g:{},[L,H]=a.useState(q.defaultCurrent||1),[T,V]=a.useState(q.defaultPageSize||10),{getPrefixCls:D,direction:W,className:A,style:X}=(0,l.useComponentConfig)("list"),{renderEmpty:G}=a.useContext(l.ConfigContext),F=e=>(t,a)=>{var i;H(t),V(a),g&&(null==(i=null==g?void 0:g[e])||i.call(g,t,a))},Y=F("onChange"),K=F("onShowSizeChange"),J=!!(z||g||N),U=D("list",h),[Q,Z,ee]=k(U),et=_;"boolean"==typeof et&&(et={spinning:et});let ea=!!(null==et?void 0:et.spinning),ei=(0,s.default)(j),er="";switch(ei){case"large":er="lg";break;case"small":er="sm"}let en=(0,i.default)(U,{[`${U}-vertical`]:"vertical"===S,[`${U}-${er}`]:er,[`${U}-split`]:b,[`${U}-bordered`]:v,[`${U}-loading`]:ea,[`${U}-grid`]:!!O,[`${U}-something-after-last-item`]:J,[`${U}-rtl`]:"rtl"===W},A,x,$,Z,ee),el=(0,r.default)({current:1,total:0,position:"bottom"},{total:E.length,current:L,pageSize:T},g||{}),eo=Math.ceil(el.total/el.pageSize);el.current=Math.min(el.current,eo);let es=g&&a.createElement("div",{className:(0,i.default)(`${U}-pagination`)},a.createElement(u.default,Object.assign({align:"end"},el,{onChange:Y,onShowSizeChange:K}))),ec=(0,t.default)(E);g&&E.length>(el.current-1)*el.pageSize&&(ec=(0,t.default)(E).splice((el.current-1)*el.pageSize,el.pageSize));let ed=Object.keys(O||{}).some(e=>["xs","sm","md","lg","xl","xxl"].includes(e)),eu=(0,d.default)(ed),em=a.useMemo(()=>{for(let e=0;e{if(!O)return;let e=em&&O[em]?O[em]:O.column;if(e)return{width:`${100/e}%`,maxWidth:`${100/e}%`}},[JSON.stringify(O),em]),ep=ea&&a.createElement("div",{style:{minHeight:53}});if(ec.length>0){let e=ec.map((e,t)=>{let i;return I?((i="function"==typeof B?B(e):B?e[B]:e.key)||(i=`list-item-${t}`),a.createElement(a.Fragment,{key:i},I(e,t))):null});ep=O?a.createElement(c.Row,{gutter:O.gutter},a.Children.map(e,e=>a.createElement("div",{key:null==e?void 0:e.key,style:ef},e))):a.createElement("ul",{className:`${U}-items`},e)}else w||ea||(ep=a.createElement("div",{className:`${U}-empty-text`},(null==P?void 0:P.emptyText)||(null==G?void 0:G("List"))||a.createElement(o.default,{componentName:"List"})));let eg=el.position,eh=a.useMemo(()=>({grid:O,itemLayout:S}),[JSON.stringify(O),S]);return Q(a.createElement(f.Provider,{value:eh},a.createElement("div",Object.assign({ref:p,style:Object.assign(Object.assign({},X),y),className:en},R),("top"===eg||"both"===eg)&&es,M&&a.createElement("div",{className:`${U}-header`},M),a.createElement(m.default,Object.assign({},et),ep,w),N&&a.createElement("div",{className:`${U}-footer`},N),z||("bottom"===eg||"both"===eg)&&es)))});w.Item=v,e.s(["List",0,w],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/11f7pk3f8kvvz.js b/litellm/proxy/_experimental/out/_next/static/chunks/11f7pk3f8kvvz.js deleted file mode 100644 index ee754fcf6fe..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/11f7pk3f8kvvz.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,515288,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(115504);let l=r.forwardRef(({className:e,size:r="default",...l},o)=>(0,t.jsx)("div",{ref:o,"data-slot":"card","data-size":r,className:(0,a.cn)("group/card flex flex-col gap-(--card-spacing) rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...l}));l.displayName="Card";let o=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-header",className:(0,a.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",e),...r}));o.displayName="CardHeader";let s=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-title",className:(0,a.cn)("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",e),...r}));s.displayName="CardTitle";let n=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-description",className:(0,a.cn)("text-sm text-muted-foreground",e),...r}));n.displayName="CardDescription";let i=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-action",className:(0,a.cn)("col-start-2 row-span-2 row-start-1 self-start justify-self-end",e),...r}));i.displayName="CardAction";let d=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-content",className:(0,a.cn)("px-(--card-spacing)",e),...r}));d.displayName="CardContent";let c=r.forwardRef(({className:e,...r},l)=>(0,t.jsx)("div",{ref:l,"data-slot":"card-footer",className:(0,a.cn)("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",e),...r}));c.displayName="CardFooter",e.s(["Card",0,l,"CardAction",0,i,"CardContent",0,d,"CardDescription",0,n,"CardFooter",0,c,"CardHeader",0,o,"CardTitle",0,s])},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])},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)},768371,e=>{"use strict";let t,r;var a=e.i(247167);let l=/\{[^{}]+\}/g;function o(e,t,r){if(null==t)return"";if("object"==typeof t)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${r?.allowReserved===!0?t:encodeURIComponent(t)}`}function s(e,t,r){if(!t||"object"!=typeof t)return"";let a=[],l={simple:",",label:".",matrix:";"}[r.style]||"&";if("deepObject"!==r.style&&!1===r.explode){for(let e in t)a.push(e,!0===r.allowReserved?t[e]:encodeURIComponent(t[e]));let l=a.join(",");switch(r.style){case"form":return`${e}=${l}`;case"label":return`.${l}`;case"matrix":return`;${e}=${l}`;default:return l}}for(let l in t){let s="deepObject"===r.style?`${e}[${l}]`:l;a.push(o(s,t[l],r))}let s=a.join(l);return"label"===r.style||"matrix"===r.style?`${l}${s}`:s}function n(e,t,r){if(!Array.isArray(t))return"";if(!1===r.explode){let a={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[r.style]||",",l=(!0===r.allowReserved?t:t.map(e=>encodeURIComponent(e))).join(a);switch(r.style){case"simple":return l;case"label":return`.${l}`;case"matrix":return`;${e}=${l}`;default:return`${e}=${l}`}}let a={simple:",",label:".",matrix:";"}[r.style]||"&",l=[];for(let a of t)"simple"===r.style||"label"===r.style?l.push(!0===r.allowReserved?a:encodeURIComponent(a)):l.push(o(e,a,r));return"label"===r.style||"matrix"===r.style?`${a}${l.join(a)}`:l.join(a)}function i(e){return function(t){let r=[];if(t&&"object"==typeof t)for(let a in t){let l=t[a];if(null!=l){if(Array.isArray(l)){if(0===l.length)continue;r.push(n(a,l,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if("object"==typeof l){r.push(s(a,l,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}r.push(o(a,l,e))}}return r.join("&")}}function d(e,t){let r=e;for(let a of e.match(l)??[]){let e=a.substring(1,a.length-1),l=!1,i="simple";if(e.endsWith("*")&&(l=!0,e=e.substring(0,e.length-1)),e.startsWith(".")?(i="label",e=e.substring(1)):e.startsWith(";")&&(i="matrix",e=e.substring(1)),!t||void 0===t[e]||null===t[e])continue;let d=t[e];if(Array.isArray(d)){r=r.replace(a,n(e,d,{style:i,explode:l}));continue}if("object"==typeof d){r=r.replace(a,s(e,d,{style:i,explode:l}));continue}if("matrix"===i){r=r.replace(a,`;${o(e,d)}`);continue}r=r.replace(a,"label"===i?`.${encodeURIComponent(d)}`:encodeURIComponent(d))}return r}function c(e,t){return e instanceof FormData?e:t&&"application/x-www-form-urlencoded"===(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])?new URLSearchParams(e).toString():JSON.stringify(e)}function u(...e){let t=new Headers;for(let r of e)if(r&&"object"==typeof r)for(let[e,a]of r instanceof Headers?r.entries():Object.entries(r))if(null===a)t.delete(e);else if(Array.isArray(a))for(let r of a)t.append(e,r);else void 0!==a&&t.set(e,a);return t}function m(e){return e.endsWith("/")?e.substring(0,e.length-1):e}var f=e.i(954616),h=e.i(621482),g=e.i(869230),p=e.i(469637),b=e.i(254440),x=e.i(266027),v=e.i(431703),y=e.i(97198);let w=async(e,t)=>new Request(t,{method:e.method,headers:e.headers,body:e.body?await e.arrayBuffer():void 0,mode:e.mode,credentials:e.credentials,cache:e.cache,redirect:e.redirect,referrer:e.referrer,referrerPolicy:e.referrerPolicy,integrity:e.integrity,keepalive:e.keepalive,signal:e.signal}),j=function(e){let{baseUrl:t="",Request:r=globalThis.Request,fetch:l=globalThis.fetch,querySerializer:o,bodySerializer:s,pathSerializer:n,headers:f,requestInitExt:h,...g}={...e};h="object"==typeof a.default&&Number.parseInt(a.default?.versions?.node?.substring(0,2))>=18&&a.default.versions.undici?h:void 0,t=m(t);let p=[];async function b(e,a){var b,x;let v,y,w,j,N,{baseUrl:C,fetch:k=l,Request:S=r,headers:R,params:M={},parseAs:E="json",querySerializer:$,bodySerializer:T=s??c,pathSerializer:D,body:_,middleware:O=[],...P}=a||{},H=t;C&&(H=m(C)??t);let z="function"==typeof o?o:i(o);$&&(z="function"==typeof $?$:i({..."object"==typeof o?o:{},...$}));let L=D||n||d,Y=void 0===_?void 0:T(_,u(f,R,M.header)),A=u(void 0===Y||Y instanceof FormData?{}:{"Content-Type":"application/json"},f,R,M.header),V=[...p,...O],I={redirect:"follow",...g,...P,body:Y,headers:A},q=new S((b=e,x={baseUrl:H,params:M,querySerializer:z,pathSerializer:L},v=`${x.baseUrl}${b}`,x.params?.path&&(v=x.pathSerializer(v,x.params.path)),(y=x.querySerializer(x.params.query??{})).startsWith("?")&&(y=y.substring(1)),y&&(v+=`?${y}`),v),I);for(let e in P)e in q||(q[e]=P[e]);if(V.length){for(let t of(w=Math.random().toString(36).slice(2,11),j=Object.freeze({baseUrl:H,fetch:k,parseAs:E,querySerializer:z,bodySerializer:T,pathSerializer:L}),V))if(t&&"object"==typeof t&&"function"==typeof t.onRequest){let r=await t.onRequest({request:q,schemaPath:e,params:M,options:j,id:w});if(r)if(r instanceof S)q=r;else if(r instanceof Response){N=r;break}else throw Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!N){try{N=await k(q,h)}catch(r){let t=r;if(V.length)for(let r=V.length-1;r>=0;r--){let a=V[r];if(a&&"object"==typeof a&&"function"==typeof a.onError){let r=await a.onError({request:q,error:t,schemaPath:e,params:M,options:j,id:w});if(r){if(r instanceof Response){t=void 0,N=r;break}if(r instanceof Error){t=r;continue}throw Error("onError: must return new Response() or instance of Error")}}}if(t)throw t}if(V.length)for(let t=V.length-1;t>=0;t--){let r=V[t];if(r&&"object"==typeof r&&"function"==typeof r.onResponse){let t=await r.onResponse({request:q,response:N,schemaPath:e,params:M,options:j,id:w});if(t){if(!(t instanceof Response))throw Error("onResponse: must return new Response() when modifying the response");N=t}}}}let B=N.headers.get("Content-Length");if(204===N.status||"HEAD"===q.method||"0"===B&&!N.headers.get("Transfer-Encoding")?.includes("chunked"))return N.ok?{data:void 0,response:N}:{error:void 0,response:N};if(N.ok){let e=async()=>{if("stream"===E)return N.body;if("json"===E&&!B){let e=await N.text();return e?JSON.parse(e):void 0}return await N[E]()};return{data:await e(),response:N}}let F=await N.text();try{F=JSON.parse(F)}catch{}return{error:F,response:N}}return{request:(e,t,r)=>b(t,{...r,method:e.toUpperCase()}),GET:(e,t)=>b(e,{...t,method:"GET"}),PUT:(e,t)=>b(e,{...t,method:"PUT"}),POST:(e,t)=>b(e,{...t,method:"POST"}),DELETE:(e,t)=>b(e,{...t,method:"DELETE"}),OPTIONS:(e,t)=>b(e,{...t,method:"OPTIONS"}),HEAD:(e,t)=>b(e,{...t,method:"HEAD"}),PATCH:(e,t)=>b(e,{...t,method:"PATCH"}),TRACE:(e,t)=>b(e,{...t,method:"TRACE"}),use(...e){for(let t of e)if(t){if("object"!=typeof t||!("onRequest"in t||"onResponse"in t||"onError"in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");p.push(t)}},eject(...e){for(let t of e){let e=p.indexOf(t);-1!==e&&p.splice(e,1)}}}}({baseUrl:globalThis.location?.origin??""});j.use({async onRequest({request:e}){let t=(0,y.getRequestBaseUrl)(),r=t?await w(e,((e,t)=>{let{pathname:r,search:a}=new URL(e);return`${t.replace(/\/+$/,"")}${r}${a}`})(e.url,t)):e,a=(0,y.getAuthToken)();return a&&r.headers.set((0,y.getAuthHeaderName)(),`Bearer ${a}`),r},async onResponse({response:e}){let t;if(e.ok)return e;let r=await e.clone().text(),a=r;try{a=JSON.parse(r),t=(0,v.deriveErrorMessage)(a)}catch{t=r||`HTTP ${e.status}`}throw(0,y.reportError)(t),new v.ApiError(t,e.status,a)}});let N=(t=async({queryKey:[e,t,r],signal:a})=>{let l=j[e.toUpperCase()],{data:o,error:s,response:n}=await l(t,{signal:a,...r});if(s)throw s;return 204===n.status||"0"===n.headers.get("Content-Length")?o??null:o},{queryOptions:r=(e,r,...[a,l])=>({queryKey:void 0===a?[e,r]:[e,r,a],queryFn:t,...l}),useQuery:(e,t,...[a,l,o])=>(0,x.useQuery)(r(e,t,a,l),o),useSuspenseQuery:(e,t,...[a,l,o])=>{var s;return s=r(e,t,a,l),(0,p.useBaseQuery)({...s,enabled:!0,suspense:!0,throwOnError:b.defaultThrowOnError,placeholderData:void 0},g.QueryObserver,o)},useInfiniteQuery:(e,t,a,l,o)=>{let{pageParamName:s="cursor",...n}=l,{queryKey:i}=r(e,t,a);return(0,h.useInfiniteQuery)({queryKey:i,queryFn:async({queryKey:[e,t,r],pageParam:a=0,signal:l})=>{let o=j[e.toUpperCase()],n={...r,signal:l,params:{...r?.params||{},query:{...r?.params?.query,[s]:a}}},{data:i,error:d}=await o(t,n);if(d)throw d;return i},...n},o)},useMutation:(e,t,r,a)=>(0,f.useMutation)({mutationKey:[e,t],mutationFn:async r=>{let a=j[e.toUpperCase()],{data:l,error:o}=await a(t,r);if(o)throw o;return l},...r},a)});e.s(["$api",0,N,"fetchClient",0,j],768371)},560025,e=>{"use strict";e.i(247167);var t=e.i(271645),r=e.i(343794),a=e.i(931067),l=e.i(392221),o=e.i(703923),s=e.i(211577),n=e.i(209428),i=e.i(410160),d=e.i(914949),c=e.i(529681),u=e.i(611935),m=e.i(361275),f=e.i(174428),h=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}},g=function(e){return void 0!==e?"".concat(e,"px"):void 0};function p(e){var a=e.prefixCls,o=e.containerRef,s=e.value,i=e.getValueIndex,d=e.motionName,c=e.onMotionStart,p=e.onMotionEnd,b=e.direction,x=e.vertical,v=void 0!==x&&x,y=t.useRef(null),w=t.useState(s),j=(0,l.default)(w,2),N=j[0],C=j[1],k=function(e){var t,r=i(e),l=null==(t=o.current)?void 0:t.querySelectorAll(".".concat(a,"-item"))[r];return(null==l?void 0:l.offsetParent)&&l},S=t.useState(null),R=(0,l.default)(S,2),M=R[0],E=R[1],$=t.useState(null),T=(0,l.default)($,2),D=T[0],_=T[1];(0,f.default)(function(){if(N!==s){var e=k(N),t=k(s),r=h(e,v),a=h(t,v);C(s),E(r),_(a),e&&t?c():p()}},[s]);var O=t.useMemo(function(){if(v){var e;return g(null!=(e=null==M?void 0:M.top)?e:0)}return"rtl"===b?g(-(null==M?void 0:M.right)):g(null==M?void 0:M.left)},[v,b,M]),P=t.useMemo(function(){if(v){var e;return g(null!=(e=null==D?void 0:D.top)?e:0)}return"rtl"===b?g(-(null==D?void 0:D.right)):g(null==D?void 0:D.left)},[v,b,D]);return M&&D?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(){E(null),_(null),p()}},function(e,l){var o=e.className,s=e.style,i=(0,n.default)((0,n.default)({},s),{},{"--thumb-start-left":O,"--thumb-start-width":g(null==M?void 0:M.width),"--thumb-active-left":P,"--thumb-active-width":g(null==D?void 0:D.width),"--thumb-start-top":O,"--thumb-start-height":g(null==M?void 0:M.height),"--thumb-active-top":P,"--thumb-active-height":g(null==D?void 0:D.height)}),d={ref:(0,u.composeRef)(y,l),style:i,className:(0,r.default)("".concat(a,"-thumb"),o)};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,o=e.disabled,n=e.checked,i=e.label,d=e.title,c=e.value,u=e.name,m=e.onChange,f=e.onFocus,h=e.onBlur,g=e.onKeyDown,p=e.onKeyUp,b=e.onMouseDown;return t.createElement("label",{className:(0,r.default)(l,(0,s.default)({},"".concat(a,"-item-disabled"),o)),onMouseDown:b},t.createElement("input",{name:u,className:"".concat(a,"-item-input"),type:"radio",disabled:o,checked:n,onChange:function(e){o||m(e,c)},onFocus:f,onBlur:h,onKeyDown:g,onKeyUp:p}),t.createElement("div",{className:"".concat(a,"-item-label"),title:d},i))},v=t.forwardRef(function(e,m){var f,h=e.prefixCls,g=void 0===h?"rc-segmented":h,v=e.direction,y=e.vertical,w=e.options,j=void 0===w?[]:w,N=e.disabled,C=e.defaultValue,k=e.value,S=e.name,R=e.onChange,M=e.className,E=e.motionName,$=(0,o.default)(e,b),T=t.useRef(null),D=t.useMemo(function(){return(0,u.composeRef)(T,m)},[T,m]),_=t.useMemo(function(){return j.map(function(e){if("object"===(0,i.default)(e)&&null!==e){var t=function(e){if(void 0!==e.title)return e.title;if("object"!==(0,i.default)(e.label)){var t;return null==(t=e.label)?void 0:t.toString()}}(e);return(0,n.default)((0,n.default)({},e),{},{title:t})}return{label:null==e?void 0:e.toString(),title:null==e?void 0:e.toString(),value:e}})},[j]),O=(0,d.default)(null==(f=_[0])?void 0:f.value,{value:k,defaultValue:C}),P=(0,l.default)(O,2),H=P[0],z=P[1],L=t.useState(!1),Y=(0,l.default)(L,2),A=Y[0],V=Y[1],I=function(e,t){z(t),null==R||R(t)},q=(0,c.default)($,["children"]),B=t.useState(!1),F=(0,l.default)(B,2),U=F[0],K=F[1],W=t.useState(!1),G=(0,l.default)(W,2),Q=G[0],X=G[1],J=function(){X(!0)},Z=function(){X(!1)},ee=function(){K(!1)},et=function(e){"Tab"===e.key&&K(!0)},er=function(e){var t=_.findIndex(function(e){return e.value===H}),r=_.length,a=_[(t+e+r)%r];a&&(z(a.value),null==R||R(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:N?void 0:0,"aria-orientation":y?"vertical":"horizontal"},q,{className:(0,r.default)(g,(0,s.default)((0,s.default)((0,s.default)({},"".concat(g,"-rtl"),"rtl"===v),"".concat(g,"-disabled"),N),"".concat(g,"-vertical"),y),void 0===M?"":M),ref:D}),t.createElement("div",{className:"".concat(g,"-group")},t.createElement(p,{vertical:y,prefixCls:g,value:H,containerRef:T,motionName:"".concat(g,"-").concat(void 0===E?"thumb-motion":E),direction:v,getValueIndex:function(e){return _.findIndex(function(t){return t.value===e})},onMotionStart:function(){V(!0)},onMotionEnd:function(){V(!1)}}),_.map(function(e){return t.createElement(x,(0,a.default)({},e,{name:S,key:e.value,prefixCls:g,className:(0,r.default)(e.className,"".concat(g,"-item"),(0,s.default)((0,s.default)({},"".concat(g,"-item-selected"),e.value===H&&!A),"".concat(g,"-item-focused"),Q&&U&&e.value===H)),checked:e.value===H,onChange:I,onFocus:J,onBlur:Z,onKeyDown:ea,onKeyUp:et,onMouseDown:ee,disabled:!!N||!!e.disabled}))})))}),y=e.i(981444),w=e.i(242064),j=e.i(517455);e.i(296059);var N=e.i(915654),C=e.i(183293),k=e.i(246422),S=e.i(838378);function R(e,t){return{[`${e}, ${e}:hover, ${e}:focus`]:{color:t.colorTextDisabled,cursor:"not-allowed"}}}function M(e){return{background:e.itemSelectedBg,boxShadow:e.boxShadowTertiary}}let E=Object.assign({overflow:"hidden"},C.textEllipsis),$=(0,k.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,C.resetComponent)(e)),{display:"inline-block",padding:e.trackPadding,color:e.itemColor,background:e.trackBg,borderRadius:e.borderRadius,transition:`all ${e.motionDurationMid}`}),(0,C.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,N.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({},M(e)),{color:e.itemSelectedColor}),"&-focused":(0,C.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,N.unit)(r),padding:`0 ${(0,N.unit)(e.segmentedPaddingHorizontal)}`},E),"&-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({},M(e)),{position:"absolute",insetBlockStart:0,insetInlineStart:0,width:0,height:"100%",padding:`${(0,N.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,N.unit)(a),padding:`0 ${(0,N.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,N.unit)(l),padding:`0 ${(0,N.unit)(e.segmentedPaddingHorizontalSM)}`},[`${t}-item, ${t}-thumb`]:{borderRadius:e.borderRadiusXS}}}),R(`&-disabled ${t}-item`,e)),R(`${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,S.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:o,lineWidthBold:s,colorBgLayout:n}=e;return{trackPadding:s,trackBg:n,itemColor:t,itemHoverColor:r,itemHoverBg:a,itemSelectedBg:l,itemActiveBg:o,itemSelectedColor:r}});var T=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 D=t.forwardRef((e,a)=>{let l=(0,y.default)(),{prefixCls:o,className:s,rootClassName:n,block:i,options:d=[],size:c="middle",style:u,vertical:m,shape:f="default",name:h=l}=e,g=T(e,["prefixCls","className","rootClassName","block","options","size","style","vertical","shape","name"]),{getPrefixCls:p,direction:b,className:x,style:N}=(0,w.useComponentConfig)("segmented"),C=p("segmented",o),[k,S,R]=$(C),M=(0,j.default)(c),E=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({},T(e,["icon","label"])),{label:t.createElement(t.Fragment,null,t.createElement("span",{className:`${C}-item-icon`},r),a&&t.createElement("span",null,a))})}return e}),[d,C]),D=(0,r.default)(s,n,x,{[`${C}-block`]:i,[`${C}-sm`]:"small"===M,[`${C}-lg`]:"large"===M,[`${C}-vertical`]:m,[`${C}-shape-${f}`]:"round"===f},S,R),_=Object.assign(Object.assign({},N),u);return k(t.createElement(v,Object.assign({},g,{name:h,className:D,style:_,options:E,ref:a,prefixCls:C,direction:b,vertical:m})))});e.s(["Segmented",0,D],560025)},872934,e=>{"use strict";e.i(247167);var t=e.i(931067),r=e.i(271645);let a={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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["ExportOutlined",0,o],872934)},888288,e=>{"use strict";var t=e.i(271645);e.s(["default",0,(e,r)=>{let a=void 0!==r,[l,o]=(0,t.useState)(e);return[a?r:l,e=>{a||o(e)}]}])},793130,e=>{"use strict";var t=e.i(290571),r=e.i(783222),a=e.i(433336),l=e.i(271645),o=e.i(394487),s=e.i(503269),n=e.i(214520),i=e.i(746725),d=e.i(914189),c=e.i(144279),u=e.i(294316),m=e.i(601893),f=e.i(140721),h=e.i(942803),g=e.i(233538),p=e.i(694421),b=e.i(700020),x=e.i(35889),v=e.i(998348),y=e.i(722678);let w=(0,l.createContext)(null);w.displayName="GroupContext";let j=l.Fragment,N=Object.assign((0,b.forwardRefWithAs)(function(e,t){var j;let N=(0,l.useId)(),C=(0,h.useProvidedId)(),k=(0,m.useDisabled)(),{id:S=C||`headlessui-switch-${N}`,disabled:R=k||!1,checked:M,defaultChecked:E,onChange:$,name:T,value:D,form:_,autoFocus:O=!1,...P}=e,H=(0,l.useContext)(w),[z,L]=(0,l.useState)(null),Y=(0,l.useRef)(null),A=(0,u.useSyncRefs)(Y,t,null===H?null:H.setSwitch,L),V=(0,n.useDefaultValue)(E),[I,q]=(0,s.useControllable)(M,$,null!=V&&V),B=(0,i.useDisposables)(),[F,U]=(0,l.useState)(!1),K=(0,d.useEvent)(()=>{U(!0),null==q||q(!I),B.nextFrame(()=>{U(!1)})}),W=(0,d.useEvent)(e=>{if((0,g.isDisabledReactIssue7711)(e.currentTarget))return e.preventDefault();e.preventDefault(),K()}),G=(0,d.useEvent)(e=>{e.key===v.Keys.Space?(e.preventDefault(),K()):e.key===v.Keys.Enter&&(0,p.attemptSubmit)(e.currentTarget)}),Q=(0,d.useEvent)(e=>e.preventDefault()),X=(0,y.useLabelledBy)(),J=(0,x.useDescribedBy)(),{isFocusVisible:Z,focusProps:ee}=(0,r.useFocusRing)({autoFocus:O}),{isHovered:et,hoverProps:er}=(0,a.useHover)({isDisabled:R}),{pressed:ea,pressProps:el}=(0,o.useActivePress)({disabled:R}),eo=(0,l.useMemo)(()=>({checked:I,disabled:R,hover:et,focus:Z,active:ea,autofocus:O,changing:F}),[I,et,Z,ea,R,F,O]),es=(0,b.mergeProps)({id:S,ref:A,role:"switch",type:(0,c.useResolveButtonType)(e,z),tabIndex:-1===e.tabIndex?0:null!=(j=e.tabIndex)?j:0,"aria-checked":I,"aria-labelledby":X,"aria-describedby":J,disabled:R||void 0,autoFocus:O,onClick:W,onKeyUp:G,onKeyPress:Q},ee,er,el),en=(0,l.useCallback)(()=>{if(void 0!==V)return null==q?void 0:q(V)},[q,V]),ei=(0,b.useRender)();return l.default.createElement(l.default.Fragment,null,null!=T&&l.default.createElement(f.FormFields,{disabled:R,data:{[T]:D||"on"},overrides:{type:"checkbox",checked:I},form:_,onReset:en}),ei({ourProps:es,theirProps:P,slot:eo,defaultTag:"button",name:"Switch"}))}),{Group:function(e){var t;let[r,a]=(0,l.useState)(null),[o,s]=(0,y.useLabels)(),[n,i]=(0,x.useDescriptions)(),d=(0,l.useMemo)(()=>({switch:r,setSwitch:a}),[r,a]),c=(0,b.useRender)();return l.default.createElement(i,{name:"Switch.Description",value:n},l.default.createElement(s,{name:"Switch.Label",value:o,props:{htmlFor:null==(t=d.switch)?void 0:t.id,onClick(e){r&&(e.currentTarget instanceof HTMLLabelElement&&e.preventDefault(),r.click(),r.focus({preventScroll:!0}))}}},l.default.createElement(w.Provider,{value:d},c({ourProps:{},theirProps:e,slot:{},defaultTag:j,name:"Switch.Group"}))))},Label:y.Label,Description:x.Description});var C=e.i(888288),k=e.i(95779),S=e.i(444755),R=e.i(673706),M=e.i(829087);let E=(0,R.makeClassName)("Switch"),$=l.default.forwardRef((e,r)=>{let{checked:a,defaultChecked:o=!1,onChange:s,color:n,name:i,error:d,errorMessage:c,disabled:u,required:m,tooltip:f,id:h}=e,g=(0,t.__rest)(e,["checked","defaultChecked","onChange","color","name","error","errorMessage","disabled","required","tooltip","id"]),p={bgColor:n?(0,R.getColorClassNames)(n,k.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",ringColor:n?(0,R.getColorClassNames)(n,k.colorPalette.ring).ringColor:"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"},[b,x]=(0,C.default)(o,a),[v,y]=(0,l.useState)(!1),{tooltipProps:w,getReferenceProps:j}=(0,M.useTooltip)(300);return l.default.createElement("div",{className:"flex flex-row items-center justify-start"},l.default.createElement(M.default,Object.assign({text:f},w)),l.default.createElement("div",Object.assign({ref:(0,R.mergeRefs)([r,w.refs.setReference]),className:(0,S.tremorTwMerge)(E("root"),"flex flex-row relative h-5")},g,j),l.default.createElement("input",{type:"checkbox",className:(0,S.tremorTwMerge)(E("input"),"absolute w-5 h-5 cursor-pointer left-0 top-0 opacity-0"),name:i,required:m,checked:b,onChange:e=>{e.preventDefault()}}),l.default.createElement(N,{checked:b,onChange:e=>{x(e),null==s||s(e)},disabled:u,className:(0,S.tremorTwMerge)(E("switch"),"w-10 h-5 group relative inline-flex shrink-0 cursor-pointer items-center justify-center rounded-tremor-full","focus:outline-none",u?"cursor-not-allowed":""),onFocus:()=>y(!0),onBlur:()=>y(!1),id:h},l.default.createElement("span",{className:(0,S.tremorTwMerge)(E("sr-only"),"sr-only")},"Switch ",b?"on":"off"),l.default.createElement("span",{"aria-hidden":"true",className:(0,S.tremorTwMerge)(E("background"),b?p.bgColor:"bg-tremor-border dark:bg-dark-tremor-border","pointer-events-none absolute mx-auto h-3 w-9 rounded-tremor-full transition-colors duration-100 ease-in-out")}),l.default.createElement("span",{"aria-hidden":"true",className:(0,S.tremorTwMerge)(E("round"),b?(0,S.tremorTwMerge)(p.bgColor,"translate-x-5 border-tremor-background dark:border-dark-tremor-background"):"translate-x-0 bg-tremor-border dark:bg-dark-tremor-border border-tremor-background dark:border-dark-tremor-background","pointer-events-none absolute left-0 inline-block h-5 w-5 transform rounded-tremor-full border-2 shadow-tremor-input duration-100 ease-in-out transition",v?(0,S.tremorTwMerge)("ring-2",p.ringColor):"")}))),d&&c?l.default.createElement("p",{className:(0,S.tremorTwMerge)(E("errorMessage"),"text-sm text-red-500 mt-1 ")},c):null)});$.displayName="Switch",e.s(["Switch",0,$],793130)},418371,e=>{"use strict";var t=e.i(843476),r=e.i(174553);e.s(["ProviderLogo",0,({provider:e,className:a="w-4 h-4"})=>(0,t.jsx)(r.Logo,{provider:e,className:a})])},497650,e=>{"use strict";var t=e.i(309821);e.s(["Progress",()=>t.default])},980187,e=>{"use strict";e.s(["createTeamAliasMap",0,e=>e?e.reduce((e,t)=>(e[t.team_id]=t.team_alias,e),{}):{},"resolveTeamAliasFromTeamID",0,(e,t)=>{let r=t.find(t=>t.team_id===e);return r?r.team_alias:null}])},289793,e=>{"use strict";var t=e.i(602869),r=e.i(266027),a=e.i(243652),l=e.i(708347),o=e.i(135214);let s=(0,a.createQueryKeys)("agents");e.s(["useAgents",0,()=>{let{accessToken:e,userRole:a}=(0,o.default)();return(0,r.useQuery)({queryKey:s.list({}),queryFn:async()=>await (0,t.getAgentsList)(e),enabled:!!e&&l.all_admin_roles.includes(a||"")})}])},366283,e=>{"use strict";var t=e.i(290571),r=e.i(271645),a=e.i(95779),l=e.i(444755),o=e.i(673706);let s=(0,o.makeClassName)("Callout"),n=r.default.forwardRef((e,n)=>{let{title:i,icon:d,color:c,className:u,children:m}=e,f=(0,t.__rest)(e,["title","icon","color","className","children"]);return r.default.createElement("div",Object.assign({ref:n,className:(0,l.tremorTwMerge)(s("root"),"flex flex-col overflow-hidden rounded-tremor-default text-tremor-default border-l-4 py-3 pr-3 pl-4",c?(0,l.tremorTwMerge)((0,o.getColorClassNames)(c,a.colorPalette.background).bgColor,(0,o.getColorClassNames)(c,a.colorPalette.darkBorder).borderColor,(0,o.getColorClassNames)(c,a.colorPalette.darkText).textColor,"dark:bg-opacity-10 bg-opacity-10"):(0,l.tremorTwMerge)("bg-tremor-brand-faint border-tremor-brand-emphasis text-tremor-brand-emphasis","dark:bg-dark-tremor-brand-muted/70 dark:border-dark-tremor-brand-emphasis dark:text-dark-tremor-brand-emphasis"),u)},f),r.default.createElement("div",{className:(0,l.tremorTwMerge)(s("header"),"flex items-start")},d?r.default.createElement(d,{className:(0,l.tremorTwMerge)(s("icon"),"flex-none h-5 w-5 mr-1.5")}):null,r.default.createElement("h4",{className:(0,l.tremorTwMerge)(s("title"),"font-semibold")},i)),r.default.createElement("p",{className:(0,l.tremorTwMerge)(s("body"),"overflow-y-auto",m?"mt-2":"")},m))});n.displayName="Callout",e.s(["Callout",0,n],366283)},232164,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:"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 000 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm62.6-651.7l224.6 19 19 224.6L477.5 694 233.9 450.5l311.9-311.9zm60.16 186.23a48 48 0 1067.88-67.89 48 48 0 10-67.88 67.89zM889.7 539.8l-39.6-39.5a8.03 8.03 0 00-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 00-11.3 0l-39.6 39.5a8.03 8.03 0 000 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z"}}]},name:"tags",theme:"outlined"};var l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["TagsOutlined",0,o],232164)},738014,e=>{"use strict";var t=e.i(135214),r=e.i(602869),a=e.i(266027);let l=(0,e.i(243652).createQueryKeys)("users");e.s(["useCurrentUser",0,()=>{let{accessToken:e,userId:o}=(0,t.default)();return(0,a.useQuery)({queryKey:l.detail(o),queryFn:async()=>await (0,r.userGetInfoV2)(e),enabled:!!(e&&o)})}])},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 l=e.i(9583),o=r.forwardRef(function(e,o){return r.createElement(l.default,(0,t.default)({},e,{ref:o,icon:a}))});e.s(["GlobalOutlined",0,o],160818)},37091,e=>{"use strict";var t=e.i(290571),r=e.i(95779),a=e.i(444755),l=e.i(673706),o=e.i(271645);let s=o.default.forwardRef((e,s)=>{let{color:n,children:i,className:d}=e,c=(0,t.__rest)(e,["color","children","className"]);return o.default.createElement("p",Object.assign({ref:s,className:(0,a.tremorTwMerge)(n?(0,l.getColorClassNames)(n,r.colorPalette.lightText).textColor:"text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",d)},c),i)});s.displayName="Subtitle",e.s(["Subtitle",0,s],37091)},617802,149121,1023,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(602869),l=e.i(500330),o=e.i(135214);e.s(["default",0,({userSpend:e,userMaxBudget:s,selectedTeam:n})=>{let{accessToken:i,userRole:d,userId:c}=(0,o.default)(),[u,m]=(0,r.useState)(null!==e?e:0),[f,h]=(0,r.useState)(n?Number((0,l.formatNumberWithCommas)(n.max_budget,4)):null);(0,r.useEffect)(()=>{if(n)if("Default Team"===n.team_alias)h(s);else{let e=!1;if(n.team_memberships)for(let t of n.team_memberships)t.user_id===c&&"max_budget"in t.litellm_budget_table&&null!==t.litellm_budget_table.max_budget&&(h(t.litellm_budget_table.max_budget),e=!0);e||h(n.max_budget)}else h(s)},[n,s]);let[g,p]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(!i||!c||!d)return};(async()=>{try{if(null===c||null===d)return;if(null!==i){let e=(await (0,a.modelAvailableCall)(i,c,d)).data.map(e=>e.id);p(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[d,i,c]),(0,r.useEffect)(()=>{null!==e&&m(e)},[e]);let b=[];n&&n.models&&(b=n.models),b&&b.includes("all-proxy-models")?b=g:b&&b.includes("all-team-models")?b=n.models:b&&0===b.length&&(b=g);let x=null!==f?`$${(0,l.formatNumberWithCommas)(Number(f),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 s=e.i(343053);e.i(622826);var n=e.i(399536),i=e.i(964471),d=e.i(871943),c=e.i(360820),u=e.i(560025),m=e.i(592968),f=e.i(20147),h=e.i(152990),g=e.i(682830),p=e.i(784774);function b({data:e=[],columns:a,getRowId:l,onRowClick:o,renderSubComponent:s,getRowCanExpand:n,isLoading:i=!1,loadingMessage:d="Loading...",noDataMessage:c="No results",enableSorting:u=!1}){let m=!!s&&!!n,f=a.some(e=>void 0!==e.size),[x,v]=(0,r.useState)([]),y=(0,h.useReactTable)({data:e,columns:a,...u&&{state:{sorting:x},onSortingChange:v,enableSortingRemoval:!1},...m&&{getRowCanExpand:n},...l&&{getRowId:l},getCoreRowModel:(0,g.getCoreRowModel)(),...u&&{getSortedRowModel:(0,g.getSortedRowModel)()},...m&&{getExpandedRowModel:(0,g.getExpandedRowModel)()}}),w=f?{minWidth:y.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)(p.Table,{className:f?"table-fixed":"table-fixed w-full box-border",style:w,children:[(0,t.jsx)(p.TableHeader,{children:y.getHeaderGroups().map(e=>(0,t.jsx)(p.TableRow,{className:"bg-muted/50 hover:bg-muted/50",children:e.headers.map(e=>{let r=u&&e.column.getCanSort(),a=e.column.getIsSorted(),l=e.column.columnDef.meta?.numeric;return(0,t.jsx)(p.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:f?{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 ${l?"justify-end":""}`,children:[(0,h.flexRender)(e.column.columnDef.header,e.getContext()),r&&(0,t.jsx)("span",{className:"text-muted-foreground",children:"asc"===a?"↑":"desc"===a?"↓":"⇅"})]})},e.id)})},e.id))}),(0,t.jsx)(p.TableBody,{children:i?(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:a.length,className:"h-8 text-center",children:(0,t.jsx)("div",{className:"text-center text-muted-foreground",children:(0,t.jsx)("p",{children:d})})})}):y.getRowModel().rows.length>0?y.getRowModel().rows.map(e=>(0,t.jsxs)(r.Fragment,{children:[(0,t.jsx)(p.TableRow,{className:`h-8 ${o?"cursor-pointer":""}`,onClick:()=>o?.(e.original),children:e.getVisibleCells().map(e=>(0,t.jsx)(p.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:f?{width:e.column.getSize()}:void 0,children:(0,h.flexRender)(e.column.columnDef.cell,e.getContext())},e.id))}),m&&e.getIsExpanded()&&s&&(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:e.getVisibleCells().length,className:"p-0",children:(0,t.jsx)("div",{className:"w-full max-w-full overflow-hidden box-border",children:s({row:e})})})})]},e.id)):(0,t.jsx)(p.TableRow,{className:"hover:bg-transparent",children:(0,t.jsx)(p.TableCell,{colSpan:a.length,className:"h-24 text-center align-middle",children:(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:c})})})})]})})}e.s(["DataTable",0,b],149121),e.s(["default",0,({topKeys:e,teams:h,showTags:g=!1,topKeysLimit:p,setTopKeysLimit:x})=>{let{accessToken:v,userRole:y,userId:w,premiumUser:j}=(0,o.default)(),[N,C]=(0,r.useState)(!1),[k,S]=(0,r.useState)(null),[R,M]=(0,r.useState)(void 0),[E,$]=(0,r.useState)("table"),[T,D]=(0,r.useState)(new Set),_=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);M(r),S(e.api_key),C(!0)}catch(e){console.error("Error fetching key info:",e)}},O=()=>{C(!1),S(null),M(void 0)};r.default.useEffect(()=>{let e=e=>{"Escape"===e.key&&N&&O()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[N]);let P=[{header:"Key ID",accessorKey:"api_key",cell:e=>(0,t.jsx)(n.IdCell,{value:e.getValue(),onClick:()=>_(e.row.original)})},{header:"Key Alias",accessorKey:"key_alias",cell:e=>e.getValue()||"-"}],H={header:"Spend (USD)",accessorKey:"spend",meta:{numeric:!0},cell:e=>(0,t.jsx)(i.MoneyCell,{value:e.getValue(),decimals:2})},z=g?[...P,{header:"Tags",accessorKey:"tags",cell:e=>{let r=e.getValue(),a=e.row.original.api_key,o=T.has(a);if(!r||0===r.length)return"-";let s=r.sort((e,t)=>t.usage-e.usage),n=o?s:s.slice(0,2),i=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:[n.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)),i&&(0,t.jsx)("button",{onClick:()=>{D(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:o?"Show fewer tags":"Show all tags",children:o?(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"})})]})})}},H]:[...P,H],L=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:p,onChange:e=>x(e)}),(0,t.jsxs)("div",{className:"flex space-x-2",children:[(0,t.jsx)("button",{onClick:()=>$("table"),className:`px-3 py-1 text-sm rounded-md ${"table"===E?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Table View"}),(0,t.jsx)("button",{onClick:()=>$("chart"),className:`px-3 py-1 text-sm rounded-md ${"chart"===E?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-700"}`,children:"Chart View"})]})]}),"chart"===E?(0,t.jsx)("div",{className:"relative max-h-[600px] overflow-y-auto",children:(0,t.jsx)(s.BarChart,{className:"mt-4 cursor-pointer hover:opacity-90",style:{height:52*Math.min(L.length,p)},data:L,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=>_(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)(b,{columns:z,data:e,isLoading:!1})}),N&&k&&R&&(0,t.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:e=>{e.target===e.currentTarget&&O()},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:O,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)(f.default,{keyId:k,onClose:O,keyData:R,teams:h})})]})})]})}],1023)},973706,e=>{"use strict";var t=e.i(843476),r=e.i(72713),a=e.i(637235),l=e.i(994388),o=e.i(599724),s=e.i(166540),n=e.i(271645);let i=[{label:"Today",shortLabel:"today",getValue:()=>({from:(0,s.default)().startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Last 7 days",shortLabel:"7d",getValue:()=>({from:(0,s.default)().subtract(7,"days").startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Last 30 days",shortLabel:"30d",getValue:()=>({from:(0,s.default)().subtract(30,"days").startOf("day").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Month to date",shortLabel:"MTD",getValue:()=>({from:(0,s.default)().startOf("month").toDate(),to:(0,s.default)().endOf("day").toDate()})},{label:"Year to date",shortLabel:"YTD",getValue:()=>({from:(0,s.default)().startOf("year").toDate(),to:(0,s.default)().endOf("day").toDate()})}];e.s(["default",0,({value:e,onValueChange:d,label:c="Select Time Range",showTimeRange:u=!0})=>{let[m,f]=(0,n.useState)(!1),[h,g]=(0,n.useState)(e),[p,b]=(0,n.useState)(null),[x,v]=(0,n.useState)(""),[y,w]=(0,n.useState)(""),j=(0,n.useRef)(null),N=(0,n.useCallback)(e=>{if(!e.from||!e.to)return null;for(let t of i){let r=t.getValue(),a=(0,s.default)(e.from).isSame((0,s.default)(r.from),"day"),l=(0,s.default)(e.to).isSame((0,s.default)(r.to),"day");if(a&&l)return t.shortLabel}return null},[]);(0,n.useEffect)(()=>{b(N(e))},[e,N]);let C=(0,n.useCallback)(()=>{if(!x||!y)return{isValid:!0,error:""};let e=(0,s.default)(x,"YYYY-MM-DD"),t=(0,s.default)(y,"YYYY-MM-DD");return e.isValid()&&t.isValid()?t.isBefore(e)?{isValid:!1,error:"End date cannot be before start date"}:{isValid:!0,error:""}:{isValid:!1,error:"Invalid date format"}},[x,y])();(0,n.useEffect)(()=>{e.from&&v((0,s.default)(e.from).format("YYYY-MM-DD")),e.to&&w((0,s.default)(e.to).format("YYYY-MM-DD")),g(e)},[e]),(0,n.useEffect)(()=>{let e=e=>{j.current&&!j.current.contains(e.target)&&f(!1)};return m&&document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[m]);let k=(0,n.useCallback)((e,t)=>{if(!e||!t)return"Select date range";let r=e=>(0,s.default)(e).format("D MMM, HH:mm");return`${r(e)} - ${r(t)}`},[]),S=(0,n.useCallback)(e=>{let t;if(!e.from)return e;let r={...e},a=new Date(e.from);return t=new Date(e.to?e.to:e.from),a.toDateString()===t.toDateString(),a.setHours(0,0,0,0),t.setHours(23,59,59,999),r.from=a,r.to=t,r},[]),R=(0,n.useCallback)(()=>{try{if(x&&y&&C.isValid){let e=(0,s.default)(x,"YYYY-MM-DD").startOf("day"),t=(0,s.default)(y,"YYYY-MM-DD").endOf("day");if(e.isValid()&&t.isValid()){let r={from:e.toDate(),to:t.toDate()};g(r);let a=N(r);b(a)}}}catch(e){console.warn("Invalid date format:",e)}},[x,y,C.isValid,N]);return(0,n.useEffect)(()=>{R()},[R]),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[c&&(0,t.jsx)(o.Text,{className:"text-sm font-medium text-gray-700 whitespace-nowrap",children:c}),(0,t.jsxs)("div",{className:"relative",ref:j,children:[(0,t.jsx)("div",{className:"w-[300px] px-3 py-2 text-sm border border-gray-300 rounded-md bg-white cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500",onClick:()=>f(!m),children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(a.ClockCircleOutlined,{className:"text-gray-600"}),(0,t.jsx)("span",{className:"text-gray-900",children:k(e.from,e.to)})]}),(0,t.jsx)("svg",{className:`w-4 h-4 text-gray-400 transition-transform ${m?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]})}),m&&(0,t.jsx)("div",{className:"absolute top-full right-0 z-9999 min-w-[600px] mt-1 bg-white border border-gray-200 rounded-lg shadow-xl",children:(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsxs)("div",{className:"w-1/2 border-r border-gray-200",children:[(0,t.jsx)("div",{className:"p-3 border-b border-gray-200",children:(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:"Relative time"})}),(0,t.jsx)("div",{className:"h-[350px] overflow-y-auto",children:i.map(e=>{let r=p===e.shortLabel;return(0,t.jsxs)("div",{className:`flex items-center justify-between px-5 py-4 cursor-pointer border-b border-gray-100 transition-colors ${r?"bg-blue-50 hover:bg-blue-100 border-blue-200":"hover:bg-gray-50"}`,onClick:()=>(e=>{let{from:t,to:r}=e.getValue();g({from:t,to:r}),b(e.shortLabel),v((0,s.default)(t).format("YYYY-MM-DD")),w((0,s.default)(r).format("YYYY-MM-DD"))})(e),children:[(0,t.jsx)("span",{className:`text-sm ${r?"text-blue-700 font-medium":"text-gray-700"}`,children:e.label}),(0,t.jsx)("span",{className:`text-xs px-2 py-1 rounded capitalize ${r?"text-blue-700 bg-blue-100":"text-gray-500 bg-gray-100"}`,children:e.shortLabel})]},e.label)})})]}),(0,t.jsxs)("div",{className:"w-1/2 relative",children:[(0,t.jsx)("div",{className:"p-3.5 border-b border-gray-200",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(r.CalendarOutlined,{className:"text-gray-600"}),(0,t.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:"Start and end dates"})]})}),(0,t.jsxs)("div",{className:"p-6 space-y-6 pb-20",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-sm text-gray-700 mb-1 block",children:"Start date"}),(0,t.jsx)("input",{type:"date",value:x,onChange:e=>v(e.target.value),className:`w-65 px-3 py-2 text-sm border rounded-md cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 ${!C.isValid?"border-red-300 focus:border-red-500 focus:ring-red-200":"border-gray-300"}`})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-sm text-gray-700 mb-1 block",children:"End date"}),(0,t.jsx)("input",{type:"date",value:y,onChange:e=>w(e.target.value),className:`w-65 px-3 py-2 text-sm border rounded-md cursor-pointer hover:border-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 ${!C.isValid?"border-red-300 focus:border-red-500 focus:ring-red-200":"border-gray-300"}`})]}),!C.isValid&&C.error&&(0,t.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-md p-3",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("svg",{className:"w-4 h-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})}),(0,t.jsx)("span",{className:"text-sm text-red-700 font-medium",children:C.error})]})}),h.from&&h.to&&C.isValid&&(0,t.jsxs)("div",{className:"bg-blue-50 p-3 rounded-md space-y-1",children:[(0,t.jsxs)("div",{className:"text-xs text-blue-800",children:[(0,t.jsx)("span",{className:"font-medium",children:"From:"})," ",(0,s.default)(h.from).format("MMM D, YYYY [at] HH:mm:ss")]}),(0,t.jsxs)("div",{className:"text-xs text-blue-800",children:[(0,t.jsx)("span",{className:"font-medium",children:"To:"})," ",(0,s.default)(h.to).format("MMM D, YYYY [at] HH:mm:ss")]})]})]}),(0,t.jsx)("div",{className:"absolute bottom-4 right-4",children:(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(l.Button,{variant:"secondary",onClick:()=>{g(e),e.from&&v((0,s.default)(e.from).format("YYYY-MM-DD")),e.to&&w((0,s.default)(e.to).format("YYYY-MM-DD")),b(N(e)),f(!1)},children:"Cancel"}),(0,t.jsx)(l.Button,{onClick:()=>{h.from&&h.to&&C.isValid&&(d(h),requestIdleCallback(()=>{d(S(h))},{timeout:100}),f(!1))},disabled:!h.from||!h.to||!C.isValid,children:"Apply"})]})})]})]})})]})]})}])},567425,e=>{"use strict";var t=e.i(271645);let r=["total_spend","total_prompt_tokens","total_completion_tokens","total_tokens","total_api_requests","total_successful_requests","total_failed_requests","total_cache_read_input_tokens","total_cache_creation_input_tokens"],a={results:[],metadata:{total_spend:0,total_prompt_tokens:0,total_completion_tokens:0,total_tokens:0,total_api_requests:0,total_successful_requests:0,total_failed_requests:0,total_cache_read_input_tokens:0,total_cache_creation_input_tokens:0,total_pages:1,has_more:!1,page:1}};e.s(["usePaginatedDailyActivity",0,function({fetchFn:e,args:l,enabled:o}){let[s,n]=(0,t.useState)(a),[i,d]=(0,t.useState)(!1),[c,u]=(0,t.useState)(!1),[m,f]=(0,t.useState)({currentPage:0,totalPages:0}),[h,g]=(0,t.useState)(!1),p=(0,t.useRef)(0),b=(0,t.useRef)(!1),x=(0,t.useRef)(null),v=(0,t.useRef)(l);v.current=l;let y=JSON.stringify(l),w=(0,t.useCallback)(()=>{b.current=!0,g(!0),u(!1),null!==x.current&&(clearTimeout(x.current),x.current=null)},[]);return(0,t.useEffect)(()=>{if(!o){n(a),d(!1),u(!1),f({currentPage:0,totalPages:0}),g(!1);return}let t=++p.current;b.current=!1,g(!1);let l=()=>p.current!==t||b.current,s=e=>new Promise(t=>{x.current=setTimeout(()=>{x.current=null,t()},e)});return(async()=>{let t=v.current;d(!0),u(!1),f({currentPage:1,totalPages:1});try{let a=[...t.slice(0,3),1,...t.slice(3)],o=await e(...a);if(l())return;n(o);let i=o.metadata?.total_pages||1;if(f({currentPage:1,totalPages:i}),i<=1)return void d(!1);d(!1),u(!0);let c=[...o.results],m={...o.metadata};for(let a=2;a<=i;a++){if(l()||(await s(300),l()))return;let o=[...t.slice(0,3),a,...t.slice(3)],d=await e(...o);if(l())return;c=[...c,...d.results],(m=function(e,t){let a={...e};for(let l of r)a[l]=(e[l]||0)+(t[l]||0);return a}(m,d.metadata)).total_pages=i,m.has_more=a{p.current++,null!==x.current&&(clearTimeout(x.current),x.current=null)}},[o,e,y]),{data:s,loading:i,isFetchingMore:c,progress:m,cancelled:h,cancel:w}}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/11tayjjqv4w7m.js b/litellm/proxy/_experimental/out/_next/static/chunks/11tayjjqv4w7m.js new file mode 100644 index 00000000000..b102045e122 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/11tayjjqv4w7m.js @@ -0,0 +1,3 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97859,e=>{"use strict";e.s(["AGENT_CALL_TYPES",0,["asend_message"],"ERROR_CODE_OPTIONS",0,[{label:"400 - Bad Request",value:"400"},{label:"401 - Invalid Authentication",value:"401"},{label:"403 - Permission Denied",value:"403"},{label:"404 - Not Found",value:"404"},{label:"408 - Request Timeout",value:"408"},{label:"422 - Unprocessable Entity",value:"422"},{label:"429 - Rate Limited",value:"429"},{label:"500 - Internal Server Error",value:"500"},{label:"502 - Bad Gateway",value:"502"},{label:"503 - Service Unavailable",value:"503"},{label:"529 - Overloaded",value:"529"}],"MCP_CALL_TYPES",0,["call_mcp_tool","list_mcp_tools"],"QUICK_SELECT_OPTIONS",0,[{label:"Last Minute",value:1,unit:"minutes"},{label:"Last 15 Minutes",value:15,unit:"minutes"},{label:"Last Hour",value:1,unit:"hours"},{label:"Last 4 Hours",value:4,unit:"hours"},{label:"Last 24 Hours",value:24,unit:"hours"},{label:"Last 7 Days",value:7,unit:"days"}]])},894660,283086,e=>{"use strict";var t=e.i(801312);e.s(["LeftOutlined",()=>t.default],894660);let s=(0,e.i(475254).default)("sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);e.s(["Sparkles",0,s],283086)},3565,502626,e=>{"use strict";var t=e.i(843476),s=e.i(271645),r=e.i(464571),l=e.i(608856),a=e.i(560025),n=e.i(492030),i=e.i(166406),o=e.i(894660),d=e.i(240647),c=e.i(531245),m=e.i(283086),x=e.i(195116);e.i(622826);var u=e.i(548151),p=e.i(97859),h=e.i(487486),g=e.i(115504);function f({origin:e,className:s}){return"autorouter_classifier"!==e?null:(0,t.jsx)(h.Badge,{variant:"secondary",title:"Tier classification call made by the auto-router, not a request the caller sent",className:(0,g.cn)("px-2 py-0 text-[10px] font-normal",s),children:"Classify"})}var y=e.i(770914),j=e.i(262218),b=e.i(592968),v=e.i(898586),N=e.i(149192),_=e.i(536591),_=_,w=e.i(755151),k=e.i(166540),S=e.i(916925);let C="24px",T="request",A="response",L="monospace",M="#f0f0f0",{Text:I}=v.Typography;function E({log:e,onClose:s,onPrevious:r,onNext:l,statusLabel:a,statusColor:n,environment:i}){let o=e.custom_llm_provider||"",d=o?(0,S.getProviderLogoAndName)(o):null;return(0,t.jsxs)("div",{style:{padding:"16px 24px",borderBottom:`1px solid ${M}`,backgroundColor:"#fff",position:"sticky",top:0,zIndex:10},children:[(0,t.jsx)(z,{model:e.model,modelGroup:e.model_group,internalCallOrigin:e.metadata?.internal_call_origin,providerLogo:d?.logo,providerName:d?.displayName}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:8},children:[(0,t.jsx)(D,{requestId:e.request_id}),(0,t.jsx)(O,{onPrevious:r,onNext:l,onClose:s})]}),(0,t.jsx)(B,{log:e,statusLabel:a,statusColor:n,environment:i})]})}function z({model:e,modelGroup:s,internalCallOrigin:r,providerLogo:l,providerName:a}){return(0,t.jsxs)(y.Space,{size:8,style:{marginBottom:8},children:[l&&(0,t.jsx)("img",{src:l,alt:a||"Provider",style:{width:24,height:24},onError:e=>{e.target.style.display="none"}}),(0,t.jsxs)(y.Space,{size:8,direction:"horizontal",children:[(0,t.jsx)(I,{strong:!0,style:{fontSize:14},children:e}),a&&(0,t.jsx)(I,{type:"secondary",style:{fontSize:12},children:a}),(0,t.jsx)(u.AutoRouterTag,{modelGroup:s}),(0,t.jsx)(f,{origin:r})]})]})}function D({requestId:e}){return(0,t.jsx)("div",{style:{flex:1,minWidth:0},children:(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)(I,{strong:!0,copyable:{text:e,tooltips:["Copy Request ID","Copied!"]},style:{fontSize:16,fontFamily:L,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",display:"block"},children:e})})})}function O({onPrevious:e,onNext:s,onClose:l}){let a={border:"1px solid #d9d9d9",borderRadius:4,padding:"0 4px",fontSize:12,fontFamily:"monospace",marginLeft:4,background:"#fafafa"};return(0,t.jsxs)(y.Space,{size:4,split:(0,t.jsx)("div",{style:{width:1,height:20,background:M}}),children:[(0,t.jsxs)(r.Button,{type:"text",size:"small",onClick:e,children:[(0,t.jsx)(_.default,{}),(0,t.jsx)("span",{style:a,children:"K"})]}),(0,t.jsxs)(r.Button,{type:"text",size:"small",onClick:s,children:[(0,t.jsx)(w.DownOutlined,{}),(0,t.jsx)("span",{style:a,children:"J"})]}),(0,t.jsx)(b.Tooltip,{title:"ESC to close",children:(0,t.jsx)(r.Button,{type:"text",icon:(0,t.jsx)(N.CloseOutlined,{}),onClick:l})})]})}function B({log:e,statusLabel:s,statusColor:r,environment:l}){return(0,t.jsxs)(y.Space,{size:12,children:[(0,t.jsx)(j.Tag,{color:r,children:s}),(0,t.jsxs)(j.Tag,{children:["Env: ",l]}),(0,t.jsxs)(y.Space,{size:8,children:[(0,t.jsx)(I,{type:"secondary",style:{fontSize:13},children:(0,k.default)(e.startTime).format("MMM D, YYYY h:mm:ss A")}),(0,t.jsxs)(I,{type:"secondary",style:{fontSize:13},children:["(",(0,k.default)(e.startTime).fromNow(),")"]})]})]})}var R=e.i(869216),F=e.i(175712),P=e.i(653496),q=e.i(560445),$=e.i(362024),W=e.i(91739),J=e.i(482725),H=e.i(827252),Y=e.i(500330);let G=e=>e>=.8?"text-green-600":"text-yellow-600",U=({entities:e})=>{let[r,l]=(0,s.useState)(!0),[a,n]=(0,s.useState)({});return e&&0!==e.length?(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsxs)("div",{className:"flex items-center mb-2 cursor-pointer",onClick:()=>l(!r),children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${r?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h4",{className:"font-medium",children:["Detected Entities (",e.length,")"]})]}),r&&(0,t.jsx)("div",{className:"space-y-2",children:e.map((e,s)=>{let r=a[s]||!1;return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>{n(e=>({...e,[s]:!e[s]}))},children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${r?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsx)("span",{className:"font-medium mr-2",children:e.entity_type}),(0,t.jsxs)("span",{className:`font-mono ${G(e.score)}`,children:["Score: ",e.score.toFixed(2)]})]}),(0,t.jsxs)("span",{className:"text-xs text-gray-500",children:["Position: ",e.start,"-",e.end]})]}),r&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4 mb-2",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Entity Type:"}),(0,t.jsx)("span",{children:e.entity_type})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Position:"}),(0,t.jsxs)("span",{children:["Characters ",e.start,"-",e.end]})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Confidence:"}),(0,t.jsx)("span",{className:G(e.score),children:e.score.toFixed(2)})]})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[e.recognition_metadata&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Recognizer:"}),(0,t.jsx)("span",{children:e.recognition_metadata.recognizer_name})]}),(0,t.jsxs)("div",{className:"flex overflow-hidden",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Identifier:"}),(0,t.jsx)("span",{className:"truncate text-xs font-mono",children:e.recognition_metadata.recognizer_identifier})]})]}),e.analysis_explanation&&(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Explanation:"}),(0,t.jsx)("span",{children:e.analysis_explanation})]})]})]})})]},s)})})]}):null},V=(e,s="slate")=>(0,t.jsx)("span",{className:`px-2 py-1 rounded-md text-xs font-medium inline-block ${{green:"bg-green-100 text-green-800",red:"bg-red-100 text-red-800",blue:"bg-blue-50 text-blue-700",slate:"bg-slate-100 text-slate-800",amber:"bg-amber-100 text-amber-800"}[s]}`,children:e}),K=e=>e?V("detected","red"):V("not detected","slate"),Q=({title:e,count:r,defaultOpen:l=!0,right:a,children:n})=>{let[i,o]=(0,s.useState)(l);return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>o(e=>!e),children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${i?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h5",{className:"font-medium",children:[e," ","number"==typeof r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal",children:["(",r,")"]})]})]}),(0,t.jsx)("div",{children:a})]}),i&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:n})]})},X=({label:e,children:s,mono:r})=>(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:e}),(0,t.jsx)("span",{className:r?"font-mono text-sm break-all":"",children:s})]}),Z=()=>(0,t.jsx)("div",{className:"my-3 border-t"}),ee=({response:e})=>{if(!e)return null;let s=e.outputs??e.output??[],r="GUARDRAIL_INTERVENED"===e.action?"red":"green",l=(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[e.guardrailCoverage?.textCharacters&&V(`text guarded ${e.guardrailCoverage.textCharacters.guarded??0}/${e.guardrailCoverage.textCharacters.total??0}`,"blue"),e.guardrailCoverage?.images&&V(`images guarded ${e.guardrailCoverage.images.guarded??0}/${e.guardrailCoverage.images.total??0}`,"blue")]}),a=e.usage&&(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(e.usage).map(([e,s])=>"number"==typeof s?(0,t.jsxs)("span",{className:"px-2 py-1 bg-slate-100 text-slate-800 rounded-md text-xs font-medium",children:[e,": ",s]},e):null)});return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"border rounded-lg p-4",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Action:",children:V(e.action??"N/A",r)}),e.actionReason&&(0,t.jsx)(X,{label:"Action Reason:",children:e.actionReason}),e.blockedResponse&&(0,t.jsx)(X,{label:"Blocked Response:",children:(0,t.jsx)("span",{className:"italic",children:e.blockedResponse})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Coverage:",children:l}),(0,t.jsx)(X,{label:"Usage:",children:a})]})]}),s.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(Z,{}),(0,t.jsx)("h4",{className:"font-medium mb-2",children:"Outputs"}),(0,t.jsx)("div",{className:"space-y-2",children:s.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsx)("div",{className:"text-sm whitespace-pre-wrap",children:e.text??(0,t.jsx)("em",{children:"(non-text output)"})})},s))})]})]}),e.assessments?.length?(0,t.jsx)("div",{className:"space-y-3",children:e.assessments.map((e,s)=>{let r=(0,t.jsxs)("div",{className:"flex flex-wrap gap-1",children:[e.wordPolicy&&V("word","slate"),e.contentPolicy&&V("content","slate"),e.topicPolicy&&V("topic","slate"),e.sensitiveInformationPolicy&&V("sensitive-info","slate"),e.contextualGroundingPolicy&&V("contextual-grounding","slate"),e.automatedReasoningPolicy&&V("automated-reasoning","slate")]});return(0,t.jsxs)(Q,{title:`Assessment #${s+1}`,defaultOpen:!0,right:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[e.invocationMetrics?.guardrailProcessingLatency!=null&&V(`${e.invocationMetrics.guardrailProcessingLatency} ms`,"amber"),r]}),children:[e.wordPolicy&&(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Word Policy"}),(e.wordPolicy.customWords?.length??0)>0&&(0,t.jsx)(Q,{title:"Custom Words",defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:e.wordPolicy.customWords.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-mono text-sm break-all",children:e.match})]}),K(e.detected)]},s))})}),(e.wordPolicy.managedWordLists?.length??0)>0&&(0,t.jsx)(Q,{title:"Managed Word Lists",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.wordPolicy.managedWordLists.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-mono text-sm break-all",children:e.match}),e.type&&V(e.type,"slate")]}),K(e.detected)]},s))})})]}),e.contentPolicy?.filters?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Content Policy"}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"min-w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"text-left text-gray-600",children:[(0,t.jsx)("th",{className:"py-1 pr-4",children:"Type"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Action"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Detected"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Strength"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Confidence"})]})}),(0,t.jsx)("tbody",{children:e.contentPolicy.filters.map((e,s)=>(0,t.jsxs)("tr",{className:"border-t",children:[(0,t.jsx)("td",{className:"py-1 pr-4",children:e.type??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:V(e.action??"—",e.detected?"red":"slate")}),(0,t.jsx)("td",{className:"py-1 pr-4",children:K(e.detected)}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.filterStrength??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.confidence??"—"})]},s))})]})})]}):null,e.contextualGroundingPolicy?.filters?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Contextual Grounding"}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"min-w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"text-left text-gray-600",children:[(0,t.jsx)("th",{className:"py-1 pr-4",children:"Type"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Action"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Detected"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Score"}),(0,t.jsx)("th",{className:"py-1 pr-4",children:"Threshold"})]})}),(0,t.jsx)("tbody",{children:e.contextualGroundingPolicy.filters.map((e,s)=>(0,t.jsxs)("tr",{className:"border-t",children:[(0,t.jsx)("td",{className:"py-1 pr-4",children:e.type??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:V(e.action??"—",e.detected?"red":"slate")}),(0,t.jsx)("td",{className:"py-1 pr-4",children:K(e.detected)}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.score??"—"}),(0,t.jsx)("td",{className:"py-1 pr-4",children:e.threshold??"—"})]},s))})]})})]}):null,e.sensitiveInformationPolicy&&(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Sensitive Information"}),(e.sensitiveInformationPolicy.piiEntities?.length??0)>0&&(0,t.jsx)(Q,{title:"PII Entities",defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:e.sensitiveInformationPolicy.piiEntities.map((e,s)=>(0,t.jsxs)("div",{className:"flex justify-between items-center p-2 bg-gray-50 rounded-sm",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.action??"N/A",e.detected?"red":"slate"),e.type&&V(e.type,"slate"),(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.match})]}),K(e.detected)]},s))})}),(e.sensitiveInformationPolicy.regexes?.length??0)>0&&(0,t.jsx)(Q,{title:"Custom Regexes",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.sensitiveInformationPolicy.regexes.map((e,s)=>(0,t.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between p-2 bg-gray-50 rounded-sm gap-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-medium",children:e.name??"regex"}),(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.regex})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[K(e.detected),e.match&&(0,t.jsx)("span",{className:"font-mono text-xs break-all",children:e.match})]})]},s))})})]}),e.topicPolicy?.topics?.length?(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h6",{className:"font-medium mb-2",children:"Topic Policy"}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:e.topicPolicy.topics.map((e,s)=>(0,t.jsx)("div",{className:"px-3 py-1.5 bg-gray-50 rounded-md text-xs",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[V(e.action??"N/A",e.detected?"red":"slate"),(0,t.jsx)("span",{className:"font-medium",children:e.name??"topic"}),e.type&&V(e.type,"slate"),K(e.detected)]})},s))})]}):null,e.invocationMetrics&&(0,t.jsx)(Q,{title:"Invocation Metrics",defaultOpen:!1,children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(X,{label:"Latency (ms)",children:e.invocationMetrics.guardrailProcessingLatency??"—"}),(0,t.jsx)(X,{label:"Coverage:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[e.invocationMetrics.guardrailCoverage?.textCharacters&&V(`text ${e.invocationMetrics.guardrailCoverage.textCharacters.guarded??0}/${e.invocationMetrics.guardrailCoverage.textCharacters.total??0}`,"blue"),e.invocationMetrics.guardrailCoverage?.images&&V(`images ${e.invocationMetrics.guardrailCoverage.images.guarded??0}/${e.invocationMetrics.guardrailCoverage.images.total??0}`,"blue")]})})]}),(0,t.jsx)("div",{className:"space-y-2",children:(0,t.jsx)(X,{label:"Usage:",children:(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:e.invocationMetrics.usage&&Object.entries(e.invocationMetrics.usage).map(([e,s])=>"number"==typeof s?(0,t.jsxs)("span",{className:"px-2 py-1 bg-slate-100 text-slate-800 rounded-md text-xs font-medium",children:[e,": ",s]},e):null)})})})]})}),e.automatedReasoningPolicy?.findings?.length?(0,t.jsx)(Q,{title:"Automated Reasoning Findings",defaultOpen:!1,children:(0,t.jsx)("div",{className:"space-y-2",children:e.automatedReasoningPolicy.findings.map((e,s)=>(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-2 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)},s))})}):null]},s)})}):null,(0,t.jsx)(Q,{title:"Raw Bedrock Guardrail Response",defaultOpen:!1,children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)})})]})},et=(e,s="slate")=>(0,t.jsx)("span",{className:`px-2 py-1 rounded-md text-xs font-medium inline-block ${{green:"bg-green-100 text-green-800",red:"bg-red-100 text-red-800",blue:"bg-blue-50 text-blue-700",slate:"bg-slate-100 text-slate-800",amber:"bg-amber-100 text-amber-800"}[s]}`,children:e}),es=({title:e,count:r,defaultOpen:l=!0,children:a})=>{let[n,i]=(0,s.useState)(l);return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>i(e=>!e),children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${n?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("h5",{className:"font-medium",children:[e," ","number"==typeof r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal",children:["(",r,")"]})]})]})}),n&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:a})]})},er=({label:e,children:s,mono:r})=>(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:e}),(0,t.jsx)("span",{className:r?"font-mono text-sm break-all":"",children:s})]}),el=({response:e})=>{if(!e||"string"==typeof e)return"string"==typeof e&&e?(0,t.jsx)("div",{className:"bg-white rounded-lg border border-red-200 p-4",children:(0,t.jsxs)("div",{className:"text-red-800",children:[(0,t.jsx)("h5",{className:"font-medium mb-2",children:"Error"}),(0,t.jsx)("p",{className:"text-sm",children:e})]})}):null;let s=Array.isArray(e)?e:[];if(0===s.length)return(0,t.jsx)("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:(0,t.jsx)("div",{className:"text-gray-600 text-sm",children:"No detections found"})});let r=s.filter(e=>"pattern"===e.type),l=s.filter(e=>"blocked_word"===e.type),a=s.filter(e=>"category_keyword"===e.type),n=s.filter(e=>"BLOCK"===e.action).length,i=s.filter(e=>"MASK"===e.action).length,o=s.length;return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(er,{label:"Total Detections:",children:(0,t.jsx)("span",{className:"font-semibold",children:o})}),(0,t.jsx)(er,{label:"Actions:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[n>0&&et(`${n} blocked`,"red"),i>0&&et(`${i} masked`,"blue"),0===n&&0===i&&et("passed","green")]})})]}),(0,t.jsx)("div",{className:"space-y-2",children:(0,t.jsx)(er,{label:"By Type:",children:(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[r.length>0&&et(`${r.length} patterns`,"slate"),l.length>0&&et(`${l.length} keywords`,"slate"),a.length>0&&et(`${a.length} categories`,"slate")]})})})]})}),r.length>0&&(0,t.jsx)(es,{title:"Patterns Matched",count:r.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:r.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Pattern:",children:e.pattern_name||"unknown"})}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),l.length>0&&(0,t.jsx)(es,{title:"Blocked Words Detected",count:l.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:l.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(er,{label:"Keyword:",mono:!0,children:e.keyword||"unknown"}),e.description&&(0,t.jsx)(er,{label:"Description:",children:e.description})]}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),a.length>0&&(0,t.jsx)(es,{title:"Category Keywords Detected",count:a.length,defaultOpen:!0,children:(0,t.jsx)("div",{className:"space-y-2",children:a.map((e,s)=>(0,t.jsx)("div",{className:"p-3 bg-gray-50 rounded-md",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)(er,{label:"Category:",children:e.category||"unknown"}),(0,t.jsx)(er,{label:"Keyword:",mono:!0,children:e.keyword||"unknown"}),e.severity&&(0,t.jsx)(er,{label:"Severity:",children:et(e.severity,"high"===e.severity?"red":"medium"===e.severity?"amber":"slate")})]}),(0,t.jsx)("div",{className:"space-y-1",children:(0,t.jsx)(er,{label:"Action:",children:et(e.action,"BLOCK"===e.action?"red":"blue")})})]})},s))})}),(0,t.jsx)(es,{title:"Raw Detection Data",defaultOpen:!1,children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(s,null,2)})})]})};var ea=e.i(602869);let en=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"7",stroke:"#16A34A",strokeWidth:"1.5",fill:"#F0FDF4"}),(0,t.jsx)("path",{d:"M5 8l2 2 4-4",stroke:"#16A34A",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),ei=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"7",stroke:"#DC2626",strokeWidth:"1.5",fill:"#FEF2F2"}),(0,t.jsx)("path",{d:"M6 6l4 4M10 6l-4 4",stroke:"#DC2626",strokeWidth:"1.5",strokeLinecap:"round"})]}),eo=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",className:"animate-spin",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"6",stroke:"#D1D5DB",strokeWidth:"2"}),(0,t.jsx)("path",{d:"M8 2a6 6 0 0 1 6 6",stroke:"#6366F1",strokeWidth:"2",strokeLinecap:"round"})]}),ed=({title:e,data:r,loading:l,error:a})=>{let[n,i]=(0,s.useState)(!1);return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg bg-white",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>i(!n),children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[l?(0,t.jsx)(eo,{}):a?(0,t.jsx)(b.Tooltip,{title:a,children:(0,t.jsx)("span",{className:"text-gray-400 text-sm",children:"--"})}):r?.compliant?(0,t.jsx)(en,{}):(0,t.jsx)(ei,{}),(0,t.jsx)("span",{className:"font-medium text-sm text-gray-900",children:e})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[!l&&!a&&r&&(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-semibold uppercase ${r.compliant?"bg-green-100 text-green-700 border border-green-200":"bg-red-100 text-red-700 border border-red-200"}`,children:r.compliant?"COMPLIANT":"NON-COMPLIANT"}),a&&(0,t.jsx)("span",{className:"px-2 py-0.5 rounded-sm text-[11px] font-medium bg-gray-100 text-gray-500 border border-gray-200",children:"UNAVAILABLE"}),(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",className:`transition-transform ${n?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"M6 8l4 4 4-4",stroke:"#6B7280",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})]}),n&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 py-3",children:[l&&(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Checking compliance..."}),a&&(0,t.jsx)("p",{className:"text-sm text-red-600",children:a}),r&&(0,t.jsx)("div",{className:"space-y-2",children:r.checks.map((e,s)=>(0,t.jsxs)("div",{className:"flex items-start gap-2",children:[(0,t.jsx)("div",{className:"shrink-0 mt-0.5",children:e.passed?(0,t.jsx)(en,{}):(0,t.jsx)(ei,{})}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-gray-900",children:e.check_name}),(0,t.jsx)("span",{className:"text-[10px] font-mono text-gray-400",children:e.article})]}),(0,t.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:e.detail})]})]},s))})]})]})},ec=({accessToken:e,logEntry:r})=>{let[l,a]=(0,s.useState)(null),[n,i]=(0,s.useState)(null),[o,d]=(0,s.useState)(!1),[c,m]=(0,s.useState)(!1),[x,u]=(0,s.useState)(null),[p,h]=(0,s.useState)(null);return(0,s.useEffect)(()=>{if(!e||!r.request_id)return;let t={request_id:r.request_id,user_id:r.user,model:r.model,timestamp:r.startTime,guardrail_information:r.metadata?.guardrail_information};d(!0),u(null),(0,ea.checkEuAiActCompliance)(e,t).then(a).catch(e=>u(e.message||"Failed to check EU AI Act compliance")).finally(()=>d(!1)),m(!0),h(null),(0,ea.checkGdprCompliance)(e,t).then(i).catch(e=>h(e.message||"Failed to check GDPR compliance")).finally(()=>m(!1))},[e,r]),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Regulatory Compliance"}),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)(ed,{title:"EU AI Act",data:l,loading:o,error:x}),(0,t.jsx)(ed,{title:"GDPR",data:n,loading:c,error:p})]})]})},em=new Set(["presidio","bedrock","litellm_content_filter"]),ex=(e,t)=>{if(null==e)return!1;if("string"==typeof e)return e===t;if(Array.isArray(e))return e.includes(t);if("object"==typeof e&&"default"in e){let s=e.default;if("string"==typeof s)return s===t;if(Array.isArray(s))return s.some(e=>"string"==typeof e&&e===t)}return!1},eu=e=>Object.values(e.masked_entity_count||{}).reduce((e,t)=>e+("number"==typeof t?t:0),0),ep=e=>"success"===(e.guardrail_status??"").toLowerCase(),eh=e=>e.policy_template||e.guardrail_name,eg=()=>(0,t.jsxs)("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none",children:[(0,t.jsx)("circle",{cx:"20",cy:"20",r:"20",fill:"#EEF2FF"}),(0,t.jsx)("path",{d:"M20 10l8 4v6c0 5.25-3.4 10.15-8 11.5C15.4 30.15 12 25.25 12 20v-6l8-4z",stroke:"#6366F1",strokeWidth:"1.5",fill:"none"}),(0,t.jsx)("path",{d:"M16 20l3 3 5-6",stroke:"#6366F1",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})]}),ef=({className:e})=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",className:e,children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#16A34A",strokeWidth:"1.5",fill:"#F0FDF4"}),(0,t.jsx)("path",{d:"M7 11l3 3 5-6",stroke:"#16A34A",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),ey=({className:e})=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",className:e,children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#DC2626",strokeWidth:"1.5",fill:"#FEF2F2"}),(0,t.jsx)("path",{d:"M8 8l6 6M14 8l-6 6",stroke:"#DC2626",strokeWidth:"1.5",strokeLinecap:"round"})]}),ej=()=>(0,t.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",children:[(0,t.jsx)("circle",{cx:"11",cy:"11",r:"10",stroke:"#3B82F6",strokeWidth:"1.5",fill:"#EFF6FF"}),(0,t.jsx)("path",{d:"M9 7.5l6 3.5-6 3.5V7.5z",fill:"#3B82F6"})]}),eb=()=>(0,t.jsx)("svg",{width:"22",height:"22",viewBox:"0 0 22 22",fill:"none",children:(0,t.jsx)("circle",{cx:"11",cy:"11",r:"5",fill:"#9CA3AF"})}),ev=({expanded:e})=>(0,t.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",className:`transition-transform ${e?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"M6 8l4 4 4-4",stroke:"#6B7280",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),eN=()=>(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:(0,t.jsx)("path",{d:"M8 2v8m0 0l-3-3m3 3l3-3M3 12h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),e_=({matchDetails:e})=>e&&0!==e.length?(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("h5",{className:"text-sm font-medium mb-2 text-gray-700",children:["Match Details (",e.length,")"]}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"w-full text-sm",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"border-b text-left text-gray-500",children:[(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Type"}),(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Method"}),(0,t.jsx)("th",{className:"pb-2 pr-4 font-medium",children:"Action"}),(0,t.jsx)("th",{className:"pb-2 font-medium",children:"Detail"})]})}),(0,t.jsx)("tbody",{children:e.map((e,s)=>(0,t.jsxs)("tr",{className:"border-b border-gray-100",children:[(0,t.jsx)("td",{className:"py-2 pr-4",children:e.type}),(0,t.jsx)("td",{className:"py-2 pr-4",children:(0,t.jsx)("span",{className:"px-2 py-0.5 bg-slate-100 text-slate-700 rounded-sm text-xs",children:e.detection_method??"-"})}),(0,t.jsx)("td",{className:"py-2 pr-4",children:(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-xs font-medium ${"BLOCK"===e.action_taken?"bg-red-100 text-red-800":"bg-blue-50 text-blue-700"}`,children:e.action_taken??"-"})}),(0,t.jsxs)("td",{className:"py-2 font-mono text-xs text-gray-600 break-all",children:[e.category?`[${e.category}] `:"",e.snippet??"-"]})]},s))})]})})]}):null,ew=({response:e})=>{let[r,l]=(0,s.useState)(!1);return(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"flex items-center justify-between p-3 bg-gray-50 cursor-pointer hover:bg-gray-100",onClick:()=>l(!r),children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(ev,{expanded:r}),(0,t.jsx)("h5",{className:"font-medium text-sm ml-1",children:"Raw Guardrail Response"})]})}),r&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:(0,t.jsx)("pre",{className:"bg-gray-50 rounded-sm p-3 text-xs overflow-x-auto",children:JSON.stringify(e,null,2)})})]})})},ek=({entries:e})=>{let r=(0,s.useMemo)(()=>[...e].sort((e,t)=>(e.start_time??0)-(t.start_time??0)),[e]),l=(0,s.useMemo)(()=>{if(0===r.length)return[];let e=r[0].start_time,t=[];t.push({type:"request",label:"Request received",offsetMs:0});let s=r.filter(e=>ex(e.guardrail_mode,"pre_call")),l=r.filter(e=>ex(e.guardrail_mode,"post_call")||ex(e.guardrail_mode,"logging_only")),a=r.filter(e=>ex(e.guardrail_mode,"during_call"));for(let r of s){let s=Math.round((r.end_time-e)*1e3);t.push({type:"guardrail",label:`Pre-call guardrail: ${eh(r)}`,offsetMs:s,status:ep(r)?"PASSED":"FAILED",isSuccess:ep(r)})}let n=s.length>0?Math.max(...s.map(e=>e.end_time)):e,i=Math.round((((l.length>0?Math.min(...l.map(e=>e.start_time)):void 0)??n+1)-e)*1e3);for(let s of(t.push({type:"llm",label:"LLM call",offsetMs:i}),a)){let r=Math.round((s.end_time-e)*1e3);t.push({type:"guardrail",label:`During-call guardrail: ${eh(s)}`,offsetMs:r,status:ep(s)?"PASSED":"FAILED",isSuccess:ep(s)})}for(let s of l){let r=Math.round((s.end_time-e)*1e3);t.push({type:"guardrail",label:`Post-call guardrail: ${eh(s)}`,offsetMs:r,status:ep(s)?"PASSED":"FAILED",isSuccess:ep(s)})}let o=Math.round((Math.max(...r.map(e=>e.end_time))-e)*1e3)+1;return t.push({type:"response",label:"Response returned",offsetMs:o}),t},[r]);return(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Request Lifecycle"}),(0,t.jsx)("div",{className:"relative",children:l.map((e,s)=>(0,t.jsxs)("div",{className:"flex items-start gap-3 relative",children:[(0,t.jsxs)("div",{className:"flex flex-col items-center",children:[(0,t.jsx)("div",{className:"shrink-0",children:"request"===e.type||"response"===e.type?(0,t.jsx)(eb,{}):"llm"===e.type?(0,t.jsx)(ej,{}):e.isSuccess?(0,t.jsx)(ef,{}):(0,t.jsx)(ey,{})}),s{let r,l,[a,n]=(0,s.useState)(!1),i=ep(e),o=eu(e),d=eh(e),c=(r=Math.round(1e3*e.duration),`${r}ms`),m=null==(l=(e=>{if(null==e)return null;if("string"==typeof e)return e;if(Array.isArray(e)){let t=e[0];return"string"==typeof t?t:null}if("object"==typeof e&&"default"in e){let t=e.default;if("string"==typeof t)return t;if(Array.isArray(t)){let e=t[0];return"string"==typeof e?e:null}}return null})(e.guardrail_mode))||""===l?"—":l.replace(/_/g,"-").toUpperCase(),x=(e=>{if(!ep(e))return null;if(null!=e.risk_score)return e.risk_score;let t=eu(e),s=e.patterns_checked??0,r=e.confidence_score??0;if(0===s&&0===r)return 0;let l=7*(s>0?t/s:0)+3*r;return t>0&&l<2&&(l=2),Math.min(10,Math.round(10*l)/10)})(e),u=e.guardrail_provider??"presidio",p=e.guardrail_response,h=Array.isArray(p)?p:[],g="bedrock"!==u||null===p||"object"!=typeof p||Array.isArray(p)?void 0:p,f=null!=e.patterns_checked?`${o}/${e.patterns_checked} matched`:o>0?`${o} matched`:null;return(0,t.jsxs)("div",{className:"border border-gray-200 rounded-lg bg-white",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 px-4 py-3 cursor-pointer hover:bg-gray-50 transition-colors",onClick:()=>n(!a),children:[(0,t.jsx)("div",{className:"shrink-0",children:i?(0,t.jsx)(ef,{}):(0,t.jsx)(ey,{})}),(0,t.jsxs)("div",{className:"flex items-center gap-2 flex-wrap flex-1 min-w-0",children:[(0,t.jsx)("span",{className:"font-semibold text-gray-900 text-sm truncate",children:d}),(0,t.jsx)("span",{className:"px-2 py-0.5 border border-blue-200 bg-blue-50 text-blue-700 rounded-sm text-[11px] font-semibold uppercase shrink-0",children:m}),(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-semibold uppercase shrink-0 ${i?"bg-green-100 text-green-700 border border-green-200":"bg-red-100 text-red-700 border border-red-200"}`,children:i?"PASSED":"FAILED"}),f&&(0,t.jsx)("span",{className:`px-2 py-0.5 rounded text-[11px] font-medium shrink-0 ${0===o?"bg-green-50 text-green-700 border border-green-200":"bg-amber-50 text-amber-700 border border-amber-200"}`,children:f}),null!=e.confidence_score&&(0,t.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-600 border border-gray-200 rounded-sm text-[11px] font-medium shrink-0",children:[(100*e.confidence_score).toFixed(0),"% conf"]}),null!=x&&i&&(0,t.jsx)(b.Tooltip,{title:`Risk score: ${x}/10`,children:(0,t.jsxs)("span",{className:`px-2 py-0.5 border rounded-sm text-[11px] font-semibold shrink-0 ${x<=3?"text-green-600 bg-green-50 border-green-200":x<=6?"text-amber-600 bg-amber-50 border-amber-200":"text-red-600 bg-red-50 border-red-200"}`,children:["Risk ",x,"/10"]})})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 shrink-0",children:[(0,t.jsx)("span",{className:"text-sm text-gray-500 font-mono",children:c}),e.detection_method&&(0,t.jsx)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-600 border border-gray-200 rounded-sm text-[11px] font-medium",children:e.detection_method.split(",")[0].trim()}),(0,t.jsx)(ev,{expanded:a})]})]}),a&&(0,t.jsxs)("div",{className:"border-t border-gray-100 px-4 py-3",children:[e.classification&&(0,t.jsxs)("div",{className:"mb-3 bg-gray-50 rounded-lg p-3 space-y-1",children:[(0,t.jsx)("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:"Classification"}),e.classification.category&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Category:"}),(0,t.jsx)("span",{children:e.classification.category})]}),e.classification.article_reference&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Reference:"}),(0,t.jsx)("span",{className:"font-mono",children:e.classification.article_reference})]}),null!=e.classification.confidence&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Confidence:"}),(0,t.jsxs)("span",{children:[(100*e.classification.confidence).toFixed(0),"%"]})]}),e.classification.reason&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"font-medium w-1/3 text-gray-500",children:"Reason:"}),(0,t.jsx)("span",{children:e.classification.reason})]})]}),e.match_details&&e.match_details.length>0&&(0,t.jsx)(e_,{matchDetails:e.match_details}),o>0&&(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("h5",{className:"text-sm font-medium text-gray-700 mb-2",children:"Masked Entities"}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(e.masked_entity_count||{}).map(([e,s])=>(0,t.jsxs)("span",{className:"px-2 py-1 bg-blue-50 text-blue-700 rounded-sm text-xs font-medium",children:[e,": ",s]},e))})]}),"presidio"===u&&h.length>0&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(U,{entities:h})}),"bedrock"===u&&g&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(ee,{response:g})}),"litellm_content_filter"===u&&p&&(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)(el,{response:p})}),u&&!em.has(u)&&p&&(0,t.jsx)(ew,{response:p})]})]})},eC=({data:e,accessToken:r,logEntry:l})=>{let a=(0,s.useMemo)(()=>Array.isArray(e)?e.filter(e=>!!e):e?[e]:[],[e]),n=a.filter(ep).length,i=n===a.length,o=(0,s.useMemo)(()=>Math.round(1e3*a.reduce((e,t)=>e+(t.duration??0),0)),[a]);return 0===a.length?null:(0,t.jsxs)("div",{className:"bg-white rounded-xl border border-gray-200 shadow-xs w-full max-w-full overflow-hidden mb-6",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-100",children:[(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)(eg,{}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-gray-900",children:"Guardrails & Policy Compliance"}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-0.5",children:[(0,t.jsxs)("span",{className:"text-sm text-gray-500",children:[a.length," guardrail",1!==a.length?"s":""," evaluated"]}),(0,t.jsx)("span",{className:"text-gray-300",children:"|"}),(0,t.jsxs)("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold ${i?"bg-green-50 text-green-700 border border-green-200":"bg-red-50 text-red-700 border border-red-200"}`,children:[i?(0,t.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:(0,t.jsx)("path",{d:"M3 6l2.5 2.5L9 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):null,n," Passed"]})]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-6",children:[(0,t.jsx)("div",{className:"text-right",children:(0,t.jsxs)("div",{className:"text-sm font-medium text-gray-900",children:["Total: ",o,"ms overhead"]})}),(0,t.jsxs)("button",{onClick:()=>{let e=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),t=URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download=`guardrail-compliance-log-${new Date().toISOString().slice(0,10)}.json`,s.click(),URL.revokeObjectURL(t)},className:"inline-flex items-center gap-2 px-4 py-2 border border-gray-300 rounded-lg text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 transition-colors",children:[(0,t.jsx)(eN,{}),"Export Compliance Log"]})]})]}),r&&l&&(0,t.jsx)("div",{className:"px-6 py-4 border-b border-gray-100",children:(0,t.jsx)(ec,{accessToken:r,logEntry:l})}),(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsx)("div",{className:"border-b border-gray-100 px-6 py-5",children:(0,t.jsx)(ek,{entries:a})}),(0,t.jsxs)("div",{className:"px-6 py-5",children:[(0,t.jsx)("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4",children:"Evaluation Details"}),(0,t.jsx)("div",{className:"space-y-3",children:a.map((e,s)=>(0,t.jsx)(eS,{entry:e},`${e.guardrail_name??"guardrail"}-${s}`))})]})]})]})};var eT=e.i(291542),eA=e.i(245704),eL=e.i(518617),eM=e.i(19732);let{Text:eI}=v.Typography;function eE({data:e}){let s=Array.isArray(e)?e:[e];return s.length?(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[(0,t.jsx)(eM.ExperimentOutlined,{style:{fontSize:16,color:"#6366f1"}}),(0,t.jsx)(eI,{strong:!0,style:{fontSize:15},children:"LLM Judge Results"})]}),s.map((e,s)=>(0,t.jsx)(ez,{entry:e},e.eval_id||s))]}):null}function ez({entry:e}){let s=e.passed,r=s?"#52c41a":"#ff4d4f",l=(e.verdicts||[]).filter(e=>"overall"!==(e.criterion_name||"").toLowerCase()),a=[{title:"Criterion",dataIndex:"criterion_name",key:"criterion_name",width:160,render:e=>(0,t.jsx)(eI,{strong:!0,style:{whiteSpace:"nowrap"},children:e})},{title:"Weight",dataIndex:"weight",key:"weight",width:65,render:e=>null!=e?(0,t.jsxs)(eI,{type:"secondary",style:{fontSize:12},children:[e,"%"]}):null},{title:"Score",dataIndex:"score",key:"score",width:65,render:e=>(0,t.jsx)(eI,{style:{color:e>=70?"#52c41a":e>=50?"#faad14":"#ff4d4f",fontWeight:600},children:e})},{title:(0,t.jsx)(b.Tooltip,{title:"Score × Weight — how much each criterion contributes to the final score",children:(0,t.jsx)("span",{style:{borderBottom:"1px dashed #aaa",cursor:"help"},children:"Weighted"})}),key:"weighted",width:75,render:(e,s)=>{if(null==s.weight)return null;let r=s.score*s.weight/100;return(0,t.jsx)(eI,{type:"secondary",style:{fontSize:12},children:r%1==0?r:r.toFixed(1)})}},{title:"Comment",dataIndex:"reasoning",key:"reasoning",ellipsis:{showTitle:!1},render:e=>(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)("span",{style:{fontSize:12},children:e})})}];return(0,t.jsxs)(F.Card,{size:"small",className:"mb-3",style:{borderLeft:`3px solid ${r}`},title:(0,t.jsxs)(y.Space,{children:[s?(0,t.jsx)(eA.CheckCircleOutlined,{style:{color:"#52c41a"}}):(0,t.jsx)(eL.CloseCircleOutlined,{style:{color:"#ff4d4f"}}),(0,t.jsx)(eI,{strong:!0,children:e.eval_name}),(0,t.jsx)(j.Tag,{color:s?"success":"error",children:s?"PASSED":"FAILED"}),(0,t.jsx)(b.Tooltip,{title:"Weighted average of all criterion scores. Each criterion has a weight (%) set when the eval was created — higher-weight criteria count more toward the final score.",children:(0,t.jsxs)(eI,{type:"secondary",style:{fontSize:12,cursor:"help",borderBottom:"1px dashed #aaa"},children:[e.overall_score?.toFixed(0)," / 100",null!=e.threshold&&` (threshold: ${e.threshold})`]})})]}),extra:(0,t.jsxs)(y.Space,{size:"small",children:[e.judge_model&&(0,t.jsxs)(eI,{type:"secondary",style:{fontSize:12},children:["Judge: ",e.judge_model]}),null!=e.iteration&&(0,t.jsxs)(eI,{type:"secondary",style:{fontSize:12},children:["Iter: ",e.iteration+1]})]}),children:[e.eval_error&&(0,t.jsxs)(eI,{type:"warning",style:{display:"block",marginBottom:8,fontSize:12},children:["Judge error: ",e.eval_error]}),l.length>0?(0,t.jsx)(eT.Table,{dataSource:l,columns:a,pagination:!1,size:"small",rowKey:"criterion_name",scroll:{x:!0},summary:()=>{if(!l.some(e=>null!=e.weight))return null;let e=l.reduce((e,t)=>e+(null!=t.weight?t.score*t.weight/100:0),0);return(0,t.jsxs)(eT.Table.Summary.Row,{children:[(0,t.jsx)(eT.Table.Summary.Cell,{index:0,children:(0,t.jsx)(eI,{strong:!0,style:{fontSize:12},children:"Total"})}),(0,t.jsx)(eT.Table.Summary.Cell,{index:1}),(0,t.jsx)(eT.Table.Summary.Cell,{index:2}),(0,t.jsx)(eT.Table.Summary.Cell,{index:3,children:(0,t.jsx)(eI,{strong:!0,style:{fontSize:12,color:r},children:e%1==0?e:e.toFixed(1)})}),(0,t.jsx)(eT.Table.Summary.Cell,{index:4})]})}}):(0,t.jsxs)(eI,{type:"secondary",style:{fontSize:12},children:["Score: ",e.overall_score?.toFixed(1)," — no per-criterion breakdown available."]})]})}let eD=e=>null==e?"-":`$${(0,Y.formatNumberWithCommas)(e,8)}`,eO=e=>null==e?"-":`${(100*e).toFixed(2)}%`,eB=({costBreakdown:e,totalSpend:s,promptTokens:r,completionTokens:l,cacheHit:a,rawInputTokens:n,cacheReadTokens:i,cacheCreationTokens:o})=>{let d=a?.toLowerCase()==="true",c=void 0!==r||void 0!==l,m=e?.input_cost!==void 0||e?.output_cost!==void 0,x=e?.additional_costs&&Object.entries(e.additional_costs).some(([,e])=>null!=e&&0!==e);if(!(m||c||x||e&&(void 0!==e.discount_percent&&0!==e.discount_percent||void 0!==e.discount_amount&&0!==e.discount_amount||void 0!==e.margin_percent&&0!==e.margin_percent||void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount||void 0!==e.margin_total_amount&&0!==e.margin_total_amount)))return null;let u=e&&(void 0!==e.discount_percent&&0!==e.discount_percent||void 0!==e.discount_amount&&0!==e.discount_amount),p=e&&(void 0!==e.margin_percent&&0!==e.margin_percent||void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount||void 0!==e.margin_total_amount&&0!==e.margin_total_amount),h=d?0:e?.input_cost,g=d?0:e?.output_cost,f=d?0:e?.original_cost,y=d?0:e?.total_cost??s;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{className:"flex items-center justify-between w-full",children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Cost Breakdown"}),(0,t.jsxs)("div",{className:"flex items-center space-x-2 mr-4",children:[(0,t.jsx)("span",{className:"text-sm text-gray-500",children:"Total:"}),(0,t.jsxs)("span",{className:"text-sm font-semibold text-gray-900",children:[eD(s),d&&" (Cached)"]})]})]}),children:(0,t.jsxs)("div",{className:"p-6 space-y-4",children:[(0,t.jsxs)("div",{className:"space-y-2 max-w-2xl",children:[(()=>{if(e?.cache_read_cost!==void 0||e?.cache_creation_cost!==void 0){let s=d?0:(h??0)-(e?.cache_read_cost??0)-(e?.cache_creation_cost??0);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Input Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(s),null!=n&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",n.toLocaleString()," tokens)"]})]})]}),(e?.cache_read_cost??0)>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Prompt Cache Read Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(d?0:e?.cache_read_cost),(i??0)>0&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",(i??0).toLocaleString()," tokens)"]})]})]}),(e?.cache_creation_cost??0)>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Prompt Cache Write Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(d?0:e?.cache_creation_cost),(o??0)>0&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",(o??0).toLocaleString()," tokens)"]})]})]})]})}return(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Input Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(h),void 0!==r&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",r.toLocaleString()," prompt tokens)"]})]})]})})(),(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Output Cost:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:[eD(g),void 0!==l&&(0,t.jsxs)("span",{className:"text-gray-500 font-normal ml-1",children:["(",l.toLocaleString()," completion tokens)"]})]})]}),e?.tool_usage_cost!==void 0&&e.tool_usage_cost>0&&(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsx)("span",{className:"text-gray-600 font-medium w-1/3",children:"Tool Usage Cost:"}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(e.tool_usage_cost)})]}),e?.additional_costs&&Object.entries(e.additional_costs).filter(([,e])=>null!=e&&0!==e).map(([e,s])=>(0,t.jsxs)("div",{className:"flex text-sm",children:[(0,t.jsxs)("span",{className:"text-gray-600 font-medium w-1/3",children:[e,":"]}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(s)})]},e))]}),!d&&(0,t.jsx)("div",{className:"pt-2 border-t border-gray-100 max-w-2xl",children:(0,t.jsxs)("div",{className:"flex text-sm font-semibold",children:[(0,t.jsx)("span",{className:"text-gray-900 w-1/3",children:"Original LLM Cost:"}),(0,t.jsx)("span",{className:"text-gray-900",children:eD(f)})]})}),(u||p)&&(0,t.jsxs)("div",{className:"pt-2 space-y-2 max-w-2xl",children:[u&&(0,t.jsxs)("div",{className:"space-y-2",children:[void 0!==e.discount_percent&&0!==e.discount_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsxs)("span",{className:"font-medium w-1/3",children:["Discount (",eO(e.discount_percent),"):"]}),(0,t.jsxs)("span",{className:"text-gray-900",children:["-",eD(e.discount_amount)]})]}),void 0!==e.discount_amount&&void 0===e.discount_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Discount Amount:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:["-",eD(e.discount_amount)]})]})]}),p&&(0,t.jsxs)("div",{className:"space-y-2",children:[void 0!==e.margin_percent&&0!==e.margin_percent&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsxs)("span",{className:"font-medium w-1/3",children:["Margin (",eO(e.margin_percent),"):"]}),(0,t.jsxs)("span",{className:"text-gray-900",children:["+",eD((e.margin_total_amount||0)-(e.margin_fixed_amount||0))]})]}),void 0!==e.margin_fixed_amount&&0!==e.margin_fixed_amount&&(0,t.jsxs)("div",{className:"flex text-sm text-gray-600",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Margin:"}),(0,t.jsxs)("span",{className:"text-gray-900",children:["+",eD(e.margin_fixed_amount)]})]})]})]}),(0,t.jsx)("div",{className:"mt-4 pt-4 border-t border-gray-200 max-w-2xl",children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("span",{className:"font-bold text-sm text-gray-900 w-1/3",children:"Final Calculated Cost:"}),(0,t.jsxs)("span",{className:"text-sm font-bold text-gray-900",children:[eD(y),d&&" (Cached)"]})]})})]})}]})})},eR=({show:e})=>e?(0,t.jsxs)("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 flex items-start",children:[(0,t.jsx)("div",{className:"text-blue-500 mr-3 shrink-0 mt-0.5",children:(0,t.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,t.jsx)("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),(0,t.jsx)("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})]})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"text-sm font-medium text-blue-800",children:"Request/Response Data Not Available"}),(0,t.jsxs)("p",{className:"text-sm text-blue-700 mt-1",children:["To view request and response details, enable prompt storage in your LiteLLM configuration by adding the following to your ",(0,t.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded-sm",children:"proxy_config.yaml"})," file, or toggle the setting in ",(0,t.jsx)("strong",{children:"Admin Settings → Logging Settings"}),"."]}),(0,t.jsx)("pre",{className:"mt-2 bg-white p-3 rounded-sm border border-blue-200 text-xs font-mono overflow-auto",children:`general_settings: + store_model_in_db: true + store_prompts_in_spend_logs: true`}),(0,t.jsx)("p",{className:"text-xs text-blue-700 mt-2",children:"Note: This will only affect new requests after the configuration change."})]})]}):null;function eF({data:e}){let[r,l]=(0,s.useState)({});if(!e||0===e.length)return null;let a=e=>new Date(1e3*e).toLocaleString();return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Vector Store Requests"}),children:(0,t.jsx)("div",{className:"p-4",children:e.map((e,s)=>{var n,i;return(0,t.jsxs)("div",{className:"mb-6 last:mb-0",children:[(0,t.jsx)("div",{className:"bg-white rounded-lg border p-4 mb-4",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Query:"}),(0,t.jsx)("span",{className:"font-mono",children:e.query})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Vector Store ID:"}),(0,t.jsx)("span",{className:"font-mono",children:e.vector_store_id})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Provider:"}),(0,t.jsx)("span",{className:"flex items-center",children:(()=>{let{logo:s,displayName:r}=(0,S.getProviderLogoAndName)(e.custom_llm_provider);return(0,t.jsxs)(t.Fragment,{children:[s&&(0,t.jsx)("img",{src:s,alt:`${r} logo`,className:"h-5 w-5 mr-2"}),r]})})()})]})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Start Time:"}),(0,t.jsx)("span",{children:a(e.start_time)})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"End Time:"}),(0,t.jsx)("span",{children:a(e.end_time)})]}),(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("span",{className:"font-medium w-1/3",children:"Duration:"}),(0,t.jsx)("span",{children:(n=e.start_time,i=e.end_time,`${((i-n)*1e3).toFixed(2)}ms`)})]})]})]})}),(0,t.jsx)("h4",{className:"font-medium mb-2",children:"Search Results"}),(0,t.jsx)("div",{className:"space-y-2",children:e.vector_store_search_response.data.map((e,a)=>{let n=r[`${s}-${a}`]||!1;return(0,t.jsxs)("div",{className:"border rounded-lg overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex items-center p-3 bg-gray-50 cursor-pointer",onClick:()=>{let e;return e=`${s}-${a}`,void l(t=>({...t,[e]:!t[e]}))},children:[(0,t.jsx)("svg",{className:`w-5 h-5 mr-2 transition-transform ${n?"transform rotate-90":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})}),(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)("span",{className:"font-medium mr-2",children:["Result ",a+1]}),(0,t.jsxs)("span",{className:"text-gray-500 text-sm",children:["Score: ",(0,t.jsx)("span",{className:"font-mono",children:e.score.toFixed(4)})]})]})]}),n&&(0,t.jsx)("div",{className:"p-3 border-t bg-white",children:e.content.map((e,s)=>(0,t.jsxs)("div",{className:"mb-2 last:mb-0",children:[(0,t.jsx)("div",{className:"text-xs text-gray-500 mb-1",children:e.type}),(0,t.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap break-all bg-gray-50 p-2 rounded-sm",children:e.text})]},s))})]},a)})})]},s)})})}]})})}let{Text:eP}=v.Typography;function eq({value:e,maxWidth:s=180}){return e?(0,t.jsx)(b.Tooltip,{title:e,children:(0,t.jsx)(eP,{copyable:{text:e,tooltips:["Copy","Copied!"]},style:{maxWidth:s,display:"inline-block",verticalAlign:"bottom",fontFamily:L,fontSize:12},ellipsis:!0,children:e})}):(0,t.jsx)(eP,{type:"secondary",children:"-"})}let{Text:e$}=v.Typography;function eW({prompt:e=0,completion:s=0,total:r=0}){return(0,t.jsxs)(e$,{children:[r.toLocaleString()," (",e.toLocaleString()," prompt tokens + ",s.toLocaleString()," completion tokens)"]})}let eJ=e=>!!e&&e instanceof Date,eH=e=>"object"==typeof e&&null!==e,eY=e=>!!e&&e instanceof Object&&"function"==typeof e;function eG(e,t){return void 0===t&&(t=!1),!e||t?`"${e}"`:e}function eU(e){let{field:t,value:r,data:l,lastElement:a,openBracket:n,closeBracket:i,level:o,style:d,shouldExpandNode:c,clickToExpandNode:m,outerRef:x,beforeExpandChange:u}=e,p=(0,s.useRef)(!1),[h,g]=(0,s.useState)(()=>c(o,r,t)),f=(0,s.useRef)(null);(0,s.useEffect)(()=>{p.current?g(c(o,r,t)):p.current=!0},[c]);let y=(0,s.useId)();if(0===l.length)return function(e){let{field:t,openBracket:r,closeBracket:l,lastElement:a,style:n}=e;return(0,s.createElement)("div",{className:n.basicChildStyle,role:"treeitem","aria-selected":void 0},(t||""===t)&&(0,s.createElement)("span",{className:n.label},eG(t,n.quotesForFieldNames),":"),(0,s.createElement)("span",{className:n.punctuation},r),(0,s.createElement)("span",{className:n.punctuation},l),!a&&(0,s.createElement)("span",{className:n.punctuation},","))}({field:t,openBracket:n,closeBracket:i,lastElement:a,style:d});let j=h?d.collapseIcon:d.expandIcon,b=h?d.ariaLables.collapseJson:d.ariaLables.expandJson,v=o+1,N=l.length-1,_=e=>{h!==e&&(!u||u({level:o,value:r,field:t,newExpandValue:e}))&&g(e)},w=e=>{if("ArrowRight"===e.key||"ArrowLeft"===e.key)e.preventDefault(),_("ArrowRight"===e.key);else if("ArrowUp"===e.key||"ArrowDown"===e.key){e.preventDefault();let t="ArrowUp"===e.key?-1:1;if(!x.current)return;let s=x.current.querySelectorAll("[role=button]"),r=-1;for(let e=0;e{var e;_(!h);let t=f.current;if(!t)return;let s=null==(e=x.current)?void 0:e.querySelector('[role=button][tabindex="0"]');s&&(s.tabIndex=-1),t.tabIndex=0,t.focus()};return(0,s.createElement)("div",{className:d.basicChildStyle,role:"treeitem","aria-expanded":h,"aria-selected":void 0},(0,s.createElement)("span",{className:j,onClick:k,onKeyDown:w,role:"button","aria-label":b,"aria-expanded":h,"aria-controls":h?y:void 0,ref:f,tabIndex:0===o?0:-1}),(t||""===t)&&(m?(0,s.createElement)("span",{className:d.clickableLabel,onClick:k,onKeyDown:w},eG(t,d.quotesForFieldNames),":"):(0,s.createElement)("span",{className:d.label},eG(t,d.quotesForFieldNames),":")),(0,s.createElement)("span",{className:d.punctuation},n),h?(0,s.createElement)("ul",{id:y,role:"group",className:d.childFieldsContainer},l.map((e,t)=>(0,s.createElement)(eX,{key:e[0]||t,field:e[0],value:e[1],style:d,lastElement:t===N,level:v,shouldExpandNode:c,clickToExpandNode:m,beforeExpandChange:u,outerRef:x}))):(0,s.createElement)("span",{className:d.collapsedContent,onClick:k,onKeyDown:w}),(0,s.createElement)("span",{className:d.punctuation},i),!a&&(0,s.createElement)("span",{className:d.punctuation},","))}function eV(e){let{field:t,value:s,style:r,lastElement:l,shouldExpandNode:a,clickToExpandNode:n,level:i,outerRef:o,beforeExpandChange:d}=e;return eU({field:t,value:s,lastElement:l||!1,level:i,openBracket:"{",closeBracket:"}",style:r,shouldExpandNode:a,clickToExpandNode:n,data:Object.keys(s).map(e=>[e,s[e]]),outerRef:o,beforeExpandChange:d})}function eK(e){let{field:t,value:s,style:r,lastElement:l,level:a,shouldExpandNode:n,clickToExpandNode:i,outerRef:o,beforeExpandChange:d}=e;return eU({field:t,value:s,lastElement:l||!1,level:a,openBracket:"[",closeBracket:"]",style:r,shouldExpandNode:n,clickToExpandNode:i,data:s.map(e=>[void 0,e]),outerRef:o,beforeExpandChange:d})}function eQ(e){let t,{field:r,value:l,style:a,lastElement:n}=e,i=a.otherValue;if(null===l)t="null",i=a.nullValue;else if(void 0===l)t="undefined",i=a.undefinedValue;else if("string"==typeof l||l instanceof String){var o;o=!a.noQuotesForStringValues,t=a.stringifyStringValues?JSON.stringify(l):o?`"${l}"`:l,i=a.stringValue}else if("boolean"==typeof l||l instanceof Boolean)t=l?"true":"false",i=a.booleanValue;else if("number"==typeof l||l instanceof Number)t=l.toString(),i=a.numberValue;else"bigint"==typeof l||l instanceof BigInt?(t=`${l.toString()}n`,i=a.numberValue):t=eJ(l)?l.toISOString():eY(l)?"function() { }":l.toString();return(0,s.createElement)("div",{className:a.basicChildStyle,role:"treeitem","aria-selected":void 0},(r||""===r)&&(0,s.createElement)("span",{className:a.label},eG(r,a.quotesForFieldNames),":"),(0,s.createElement)("span",{className:i},t),!n&&(0,s.createElement)("span",{className:a.punctuation},","))}function eX(e){let t=e.value;return Array.isArray(t)?(0,s.createElement)(eK,Object.assign({},e)):!eH(t)||eJ(t)||eY(t)?(0,s.createElement)(eQ,Object.assign({},e)):(0,s.createElement)(eV,Object.assign({},e))}let eZ={container:"_2IvMF _GzYRV",basicChildStyle:"_2bkNM",childFieldsContainer:"_1BXBN",label:"_1MGIk",clickableLabel:"_2YKJg _1MGIk _1MFti",nullValue:"_2T6PJ",undefinedValue:"_1Gho6",stringValue:"_vGjyY",booleanValue:"_3zQKs",numberValue:"_1bQdo",otherValue:"_1xvuR",punctuation:"_3uHL6 _3eOF8",collapseIcon:"_oLqym _f10Tu _1MFti _1LId0",expandIcon:"_2AXVT _f10Tu _1MFti _1UmXx",collapsedContent:"_2KJWg _1pNG9 _1MFti",noQuotesForStringValues:!1,quotesForFieldNames:!1,ariaLables:{collapseJson:"collapse JSON",expandJson:"expand JSON"},stringifyStringValues:!1},e0=()=>!0,e1=e=>{let{data:t,style:r=eZ,shouldExpandNode:l=e0,clickToExpandNode:a=!1,beforeExpandChange:n,compactTopLevel:i,...o}=e,d=(0,s.useRef)(null);return(0,s.createElement)("div",Object.assign({"aria-label":"JSON view"},o,{className:r.container,ref:d,role:"tree"}),i&&eH(t)?Object.entries(t).map(e=>{let[t,i]=e;return(0,s.createElement)(eX,{key:t,field:t,value:i,style:{...eZ,...r},lastElement:!0,level:1,shouldExpandNode:l,clickToExpandNode:a,beforeExpandChange:n,outerRef:d})}):(0,s.createElement)(eX,{value:t,style:{...eZ,...r},lastElement:!0,level:0,shouldExpandNode:l,clickToExpandNode:a,outerRef:d,beforeExpandChange:n}))},{Text:e2}=v.Typography;function e5({data:e}){return e?(0,t.jsx)("div",{style:{maxHeight:400,overflow:"auto",background:"#fafafa",padding:12,borderRadius:4},children:(0,t.jsx)("div",{className:"**:[[role='tree']]:bg-white **:[[role='tree']]:text-slate-900",children:(0,t.jsx)(e1,{data:e,style:eZ,clickToExpandNode:!0})})}):(0,t.jsx)(e2,{type:"secondary",children:"No data"})}var e4=e.i(133356);let e6=e=>e.request_duration_ms??Date.parse(e.endTime)-Date.parse(e.startTime);function e3(e){if("string"==typeof e)try{return JSON.parse(e)}catch{}return e}function e8(e){return Array.isArray(e)?e:e?[e]:[]}function e9(e){if("string"==typeof e)try{return JSON.parse(e)}catch{}return e}var e7=e.i(366308);let{Text:te}=v.Typography;function tt({tool:e}){let s=Object.entries(e.parameters?.properties||{}).map(([t,s])=>({key:t,name:t,type:s.type||"any",description:s.description||"-",required:e.parameters?.required?.includes(t)||!1})),r=[{title:"Parameter",dataIndex:"name",key:"name",render:(e,s)=>(0,t.jsxs)(te,{code:!0,children:[e,s.required&&(0,t.jsx)(te,{type:"danger",children:"*"})]})},{title:"Type",dataIndex:"type",key:"type",render:e=>(0,t.jsx)(te,{code:!0,style:{color:"#1890ff"},children:e})},{title:"Description",dataIndex:"description",key:"description",render:e=>(0,t.jsx)(te,{type:"secondary",children:e})}];return(0,t.jsxs)("div",{children:[e.description&&(0,t.jsx)("div",{style:{marginBottom:16},children:(0,t.jsx)(te,{style:{lineHeight:1.6,whiteSpace:"pre-wrap"},children:e.description})}),s.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsx)(te,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:8},children:"Parameters"}),(0,t.jsx)(eT.Table,{dataSource:s,columns:r,pagination:!1,size:"small",bordered:!0})]}),e.called&&e.callData&&(0,t.jsxs)("div",{style:{marginTop:16},children:[(0,t.jsx)(te,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:8},children:"Called With"}),(0,t.jsx)("div",{style:{background:"#f6ffed",border:"1px solid #b7eb8f",borderRadius:4,padding:12},children:(0,t.jsx)("pre",{style:{margin:0,fontSize:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:JSON.stringify(e.callData.arguments,null,2)})})]})]})}function ts({tool:e}){let s={type:"function",function:{name:e.name,description:e.description,parameters:e.parameters}};return(0,t.jsx)("pre",{style:{margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:12,background:"#fafafa",padding:12,borderRadius:4,maxHeight:300,overflow:"auto"},children:JSON.stringify(s,null,2)})}let{Text:tr}=v.Typography;function tl({tool:e}){let[r,l]=(0,s.useState)("formatted");return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:12},children:[(0,t.jsx)(tr,{type:"secondary",style:{fontSize:12},children:"Description"}),(0,t.jsxs)(W.Radio.Group,{size:"small",value:r,onChange:e=>l(e.target.value),children:[(0,t.jsx)(W.Radio.Button,{value:"formatted",children:"Formatted"}),(0,t.jsx)(W.Radio.Button,{value:"json",children:"JSON"})]})]}),"formatted"===r?(0,t.jsx)(tt,{tool:e}):(0,t.jsx)(ts,{tool:e})]})}let{Text:ta}=v.Typography;function tn({tool:e}){let[r,l]=(0,s.useState)(!1);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:8,overflow:"hidden"},children:[(0,t.jsxs)("div",{onClick:()=>l(!r),style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"12px 16px",cursor:"pointer",background:r?"#fafafa":"#fff",transition:"background 0.2s"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10},children:[(0,t.jsx)(e7.ToolOutlined,{style:{color:"#8c8c8c",fontSize:14}}),(0,t.jsxs)(ta,{style:{fontSize:14},children:[e.index,". ",e.name]})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,t.jsx)(j.Tag,{color:e.called?"blue":"default",children:e.called?"called":"not called"}),r?(0,t.jsx)(w.DownOutlined,{style:{fontSize:12,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:12,color:"#8c8c8c"}})]})]}),r&&(0,t.jsx)("div",{style:{padding:"16px",borderTop:"1px solid #f0f0f0",background:"#fff"},children:(0,t.jsx)(tl,{tool:e})})]})}let{Text:ti}=v.Typography;function to({log:e}){let s=function(e){let t,s=!(t=e9(e.proxy_server_request||e.messages))||Array.isArray(t)?[]:"object"==typeof t&&t.tools&&Array.isArray(t.tools)?t.tools:[];if(0===s.length)return[];let r=function(e){let t=e9(e.response);if(!t||"object"!=typeof t)return[];let s=t.choices;if(Array.isArray(s)&&s.length>0){let e=s[0].message;if(e&&Array.isArray(e.tool_calls))return e.tool_calls}if(Array.isArray(t.content)){let e=t.content.filter(e=>"tool_use"===e.type);if(e.length>0)return e.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:JSON.stringify(e.input||{})}}))}if(Array.isArray(t.tool_calls))return t.tool_calls;if(Array.isArray(t.results)){let e=[];for(let s of t.results)if("response.done"===s.type&&s.response?.output)for(let t of s.response.output)"function_call"===t.type&&e.push({id:t.call_id||"",type:"function",function:{name:t.name||"",arguments:t.arguments||"{}"}});if(e.length>0)return e}return[]}(e),l=new Set(r.map(e=>e.function?.name).filter(Boolean)),a=new Map;return r.forEach(e=>{let t=e.function?.name;t&&a.set(t,{id:e.id,name:t,arguments:function(e){try{return JSON.parse(e)}catch{return{}}}(e.function?.arguments||"{}")})}),s.map((e,t)=>{let s=e.function?.name||e.name||`Tool ${t+1}`;return{index:t+1,name:s,description:e.function?.description||e.description||"",parameters:e.function?.parameters||e.input_schema||{},called:l.has(s),callData:a.get(s)}})}(e);if(0===s.length)return null;let r=s.length,l=s.filter(e=>e.called).length,a=s.slice(0,2).map(e=>e.name).join(", "),n=s.length>2;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Tools"}),(0,t.jsxs)(ti,{type:"secondary",style:{fontSize:14},children:[r," provided, ",l," called"]}),(0,t.jsxs)(ti,{type:"secondary",style:{fontSize:14},children:["• ",a,n&&"..."]})]}),children:(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:8},children:s.map(e=>(0,t.jsx)(tn,{tool:e},e.name))})}]})})}let td=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),tc=e=>"string"==typeof e?e:"",tm=["system","user","assistant","tool"],tx=(e,t)=>"developer"===e?"system":"function"===e?"tool":tm.includes(e)?e:t,tu=e=>td(e)?{role:tx(e.role,"user"),content:tf(e.content),toolCalls:tj(e.tool_calls),toolCallId:"string"==typeof e.tool_call_id?e.tool_call_id:void 0}:{role:"user",content:tf(e)},tp=e=>"string"==typeof e?[{role:"user",content:e}]:td(e)?"function_call"===e.type?[{role:"assistant",content:"",toolCalls:[tg(e)]}]:"function_call_output"===e.type?[{role:"tool",content:tf(e.output),toolCallId:tc(e.call_id)}]:"reasoning"===e.type?[]:"role"in e||"content"in e?[{role:tx(e.role,"user"),content:tf(e.content)}]:[]:[],th=e=>td(e)&&"function_call"===e.type,tg=e=>({id:tc(e.call_id)||tc(e.id),name:tc(e.name)||"unknown",arguments:tb(e.arguments)}),tf=e=>"string"==typeof e?e:null==e?"":Array.isArray(e)?e.map(ty).join("\n"):JSON.stringify(e),ty=e=>{if("string"==typeof e)return e;if(!td(e))return JSON.stringify(e);switch(e.type){case"text":case"input_text":case"output_text":return tc(e.text);case"refusal":return tc(e.refusal);case"image_url":case"input_image":return"[Image]";case"input_file":return"[File]";case"input_audio":return"[Audio]";default:return JSON.stringify(e)}},tj=e=>{if(Array.isArray(e))return e.map(e=>{let t=td(e)?e:{},s=td(t.function)?t.function:{};return{id:tc(t.id),name:tc(s.name)||"unknown",arguments:tb(s.arguments)}})},tb=e=>{if(!e)return{};if("string"==typeof e)try{let t=JSON.parse(e);return td(t)?t:{raw:e}}catch{return{raw:e}}return td(e)?e:{}};var tv=e.i(888259);e.i(247167);var tN=e.i(931067);let t_={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"}}]},name:"message",theme:"outlined"};var tw=e.i(9583),tk=s.forwardRef(function(e,t){return s.createElement(tw.default,(0,tN.default)({},e,{ref:t,icon:t_}))}),_=_;let{Text:tS}=v.Typography;function tC({type:e,tokens:s,cost:l,onCopy:a,isCollapsed:n,onToggleCollapse:o,turnCount:d}){return(0,t.jsxs)("div",{onClick:o,style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",borderBottom:n?"none":"1px solid #f0f0f0",background:"#fafafa",cursor:o?"pointer":"default",transition:"background 0.15s ease"},onMouseEnter:e=>{o&&(e.currentTarget.style.background="#f5f5f5")},onMouseLeave:e=>{e.currentTarget.style.background="#fafafa"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16},children:[o&&(0,t.jsx)("div",{style:{display:"flex",alignItems:"center"},children:n?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(_.default,{style:{fontSize:10,color:"#8c8c8c"}})}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:["input"===e?(0,t.jsx)(tk,{style:{color:"#8c8c8c",fontSize:14}}):(0,t.jsx)("span",{style:{fontSize:14,filter:"grayscale(1)",opacity:.6},children:"✨"}),(0,t.jsx)(tS,{style:{fontWeight:500,fontSize:14},children:"input"===e?"Input":"Output"})]}),void 0!==s&&(0,t.jsxs)(tS,{type:"secondary",style:{fontSize:12},children:["Tokens: ",s.toLocaleString()]}),void 0!==l&&(0,t.jsxs)(tS,{type:"secondary",style:{fontSize:12},children:["Cost: $",l.toFixed(6)]}),void 0!==d&&d>0&&(0,t.jsxs)(tS,{type:"secondary",style:{fontSize:12},children:["Turns: ",d]})]}),(0,t.jsx)(b.Tooltip,{title:"Copy",children:(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(i.CopyOutlined,{}),onClick:e=>{e.stopPropagation(),a()}})})]})}let{Text:tT}=v.Typography;function tA({label:e,content:r,defaultExpanded:l=!1}){let[a,n]=(0,s.useState)(l),[i,o]=(0,s.useState)(!1),c=r?.length||0;return r&&0!==c?(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{onClick:()=>n(!a),onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer",padding:"4px 0",borderRadius:4,background:i?"#f5f5f5":"transparent",transition:"background 0.15s ease",marginBottom:4*!!a},children:[a?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:10,color:"#8c8c8c"}}),(0,t.jsx)(tT,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:e}),(0,t.jsxs)(tT,{type:"secondary",style:{fontSize:10},children:["(",c.toLocaleString()," chars)"]})]}),(0,t.jsx)("div",{style:{maxHeight:a?"2000px":"0px",overflow:"hidden",transition:"max-height 0.2s ease-out, opacity 0.2s ease-out",opacity:+!!a},children:(0,t.jsx)("div",{style:{paddingLeft:16,fontSize:13,lineHeight:1.7,color:"#262626",borderLeft:"1px solid #f0f0f0",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:r})})]}):null}let{Text:tL}=v.Typography;function tM({tool:e,compact:s=!1}){return(0,t.jsxs)("div",{style:{background:"#f8f9fa",border:"1px solid #e9ecef",borderRadius:6,padding:s?"6px 10px":"10px 14px",marginTop:8,fontFamily:"monospace",fontSize:12,position:"relative"},children:[(0,t.jsx)("div",{style:{position:"absolute",top:-8,left:12,background:"#fff",padding:"0 6px",fontSize:10,color:"#8c8c8c",border:"1px solid #e9ecef",borderRadius:3},children:"function"}),(0,t.jsx)(tL,{strong:!0,style:{fontSize:13,display:"block",marginBottom:6},children:e.name}),Object.keys(e.arguments).length>0&&(0,t.jsx)("div",{children:Object.entries(e.arguments).map(([e,s])=>(0,t.jsxs)("div",{style:{marginBottom:2},children:[(0,t.jsxs)(tL,{type:"secondary",style:{fontSize:12},children:[e,":"," "]}),(0,t.jsx)(tL,{style:{fontSize:12},children:JSON.stringify(s)})]},e))})]})}let{Text:tI}=v.Typography;function tE({label:e,content:s,toolCalls:r,isCompact:l=!1}){let a=s&&"null"!==s&&s.length>0?s:null,n=r&&r.length>0;return a||n?(0,t.jsxs)("div",{style:{marginBottom:8*!!l},children:[(0,t.jsx)(tI,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:3},children:e}),a&&(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.7,color:"#262626",whiteSpace:"pre-wrap",wordBreak:"break-word",marginBottom:6*!!n},children:a}),n&&(0,t.jsx)("div",{children:r.map((e,s)=>(0,t.jsx)(tM,{tool:e,compact:l},e.id||s))})]}):null}let{Text:tz}=v.Typography;function tD({messages:e}){let[r,l]=(0,s.useState)(!1),[a,n]=(0,s.useState)(!1);return 0===e.length?null:(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{onClick:()=>l(!r),onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer",padding:"4px 0",borderRadius:4,background:a?"#f5f5f5":"transparent",transition:"background 0.15s ease",marginBottom:4*!!r},children:[r?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(d.RightOutlined,{style:{fontSize:10,color:"#8c8c8c"}}),(0,t.jsxs)(tz,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:["HISTORY (",e.length," message",1!==e.length?"s":"",")"]})]}),(0,t.jsx)("div",{style:{maxHeight:r?"2000px":"0px",overflow:"hidden",transition:"max-height 0.2s ease-out, opacity 0.2s ease-out",opacity:+!!r},children:(0,t.jsx)("div",{style:{paddingLeft:16,borderLeft:"1px solid #f0f0f0"},children:e.map((e,s)=>(0,t.jsx)(tE,{label:e.role.toUpperCase(),content:e.content,toolCalls:e.toolCalls,isCompact:!0},s))})})]})}function tO({messages:e,promptTokens:r,inputCost:l}){let[a,n]=(0,s.useState)(!1);if(0===e.length)return null;let i=e.find(e=>"system"===e.role),o=e.filter(e=>"system"!==e.role),d=o.length>0?o[o.length-1]:null,c=o.slice(0,-1);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,marginBottom:8,overflow:"hidden"},children:[(0,t.jsx)(tC,{type:"input",tokens:r,cost:l,onCopy:()=>{let e=d?.content||"";navigator.clipboard.writeText(e),tv.default.success("Input copied")},isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsxs)("div",{style:{padding:"12px 16px"},children:[i&&(0,t.jsx)(tA,{label:"SYSTEM",content:i.content,defaultExpanded:!!(i.content&&i.content.length<200)}),c.length>0&&(0,t.jsx)(tD,{messages:c}),d&&(0,t.jsx)(tE,{label:d.role.toUpperCase(),content:d.content,toolCalls:d.toolCalls})]})})]})}let{Text:tB}=v.Typography;function tR({message:e,completionTokens:r,outputCost:l}){let[a,n]=(0,s.useState)(!1),i=()=>{if(!e)return;let t=e.content||"";navigator.clipboard.writeText(t),tv.default.success("Output copied")};return e?(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tC,{type:"output",tokens:r,cost:l,onCopy:i,isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:(0,t.jsx)(tE,{label:"ASSISTANT",content:e.content,toolCalls:e.toolCalls})})})]}):(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tC,{type:"output",tokens:r,cost:l,onCopy:i,isCollapsed:a,onToggleCollapse:()=>n(!a)}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:(0,t.jsx)(tB,{type:"secondary",style:{fontSize:13,fontStyle:"italic"},children:"No response data available"})})})]})}var tF=e.i(782273),tP=e.i(313603),tq=e.i(793916),_=_;let{Text:t$}=v.Typography;function tW({response:e,metrics:s}){let r=e?.results||[],l=e?.usage,a=r.find(e=>"session.created"===e.type||"session.updated"===e.type),n=r.filter(e=>"response.done"===e.type);return(0,t.jsxs)("div",{children:[a?.session&&(0,t.jsx)(tJ,{session:a.session,turnCount:n.length}),n.length>0&&(0,t.jsx)(tH,{responses:n.map(e=>e.response).filter(Boolean),totalUsage:l,metrics:s}),!a&&0===n.length&&(0,t.jsx)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,padding:"16px",color:"#8c8c8c",fontStyle:"italic",fontSize:13},children:"No recognized realtime events found"})]})}function tJ({session:e,turnCount:r}){let[l,a]=(0,s.useState)(!0);return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,marginBottom:8,overflow:"hidden"},children:[(0,t.jsx)("div",{onClick:()=>a(!l),style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 16px",borderBottom:l?"none":"1px solid #f0f0f0",background:"#fafafa",cursor:"pointer",transition:"background 0.15s ease"},onMouseEnter:e=>{e.currentTarget.style.background="#f5f5f5"},onMouseLeave:e=>{e.currentTarget.style.background="#fafafa"},children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)("div",{style:{display:"flex",alignItems:"center"},children:l?(0,t.jsx)(w.DownOutlined,{style:{fontSize:10,color:"#8c8c8c"}}):(0,t.jsx)(_.default,{style:{fontSize:10,color:"#8c8c8c"}})}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,t.jsx)(tP.SettingOutlined,{style:{color:"#8c8c8c",fontSize:14}}),(0,t.jsx)(t$,{style:{fontWeight:500,fontSize:14},children:"Session"})]}),(0,t.jsx)(t$,{type:"secondary",style:{fontSize:12},children:e.model}),r>0&&(0,t.jsxs)(j.Tag,{color:"purple",style:{margin:0,fontWeight:500},children:[r," ",1===r?"turn":"turns"]}),e.voice&&(0,t.jsxs)(j.Tag,{color:"blue",style:{margin:0},children:[(0,t.jsx)(tF.SoundOutlined,{})," ",e.voice]}),e.modalities&&(0,t.jsx)("div",{style:{display:"flex",gap:4},children:e.modalities.map(e=>(0,t.jsxs)(j.Tag,{style:{margin:0},children:["audio"===e?(0,t.jsx)(tq.AudioOutlined,{}):(0,t.jsx)(tk,{})," ",e]},e))})]})}),(0,t.jsx)("div",{style:{maxHeight:l?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!l},children:(0,t.jsxs)("div",{style:{padding:"12px 16px"},children:[(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"8px 24px",fontSize:13},children:[(0,t.jsx)(tV,{label:"Model",value:e.model}),(0,t.jsx)(tV,{label:"Voice",value:e.voice}),(0,t.jsx)(tV,{label:"Temperature",value:e.temperature}),(0,t.jsx)(tV,{label:"Max Output Tokens",value:e.max_response_output_tokens}),(0,t.jsx)(tV,{label:"Input Audio Format",value:e.input_audio_format}),(0,t.jsx)(tV,{label:"Output Audio Format",value:e.output_audio_format}),e.turn_detection&&(0,t.jsx)(tV,{label:"Turn Detection",value:e.turn_detection.type}),e.tools&&e.tools.length>0&&(0,t.jsx)(tV,{label:"Tools",value:`${e.tools.length} tool(s)`})]}),e.instructions&&(0,t.jsxs)("div",{style:{marginTop:12},children:[(0,t.jsx)(t$,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:4},children:"Instructions"}),(0,t.jsx)("div",{style:{fontSize:12,lineHeight:1.6,color:"#595959",background:"#fafafa",padding:"8px 12px",borderRadius:4,border:"1px solid #f0f0f0",whiteSpace:"pre-wrap",wordBreak:"break-word",maxHeight:120,overflowY:"auto"},children:e.instructions})]})]})})]})}function tH({responses:e,totalUsage:r,metrics:l}){let[a,n]=(0,s.useState)(!1),i=r?.total_tokens,o=e.length;return(0,t.jsxs)("div",{style:{border:"1px solid #f0f0f0",borderRadius:6,overflow:"hidden"},children:[(0,t.jsx)(tC,{type:"output",tokens:l?.completion_tokens??i,cost:l?.output_cost,onCopy:()=>{let t=e.flatMap(e=>(e.output||[]).flatMap(e=>(e.content||[]).map(t=>`${e.role}: ${t.transcript||t.text||""}`))).join("\n");navigator.clipboard.writeText(t)},isCollapsed:a,onToggleCollapse:()=>n(!a),turnCount:o}),(0,t.jsx)("div",{style:{maxHeight:a?"0px":"10000px",overflow:"hidden",transition:"max-height 0.3s ease-out, opacity 0.3s ease-out",opacity:+!a},children:(0,t.jsx)("div",{style:{padding:"12px 16px"},children:e.map((e,s)=>(0,t.jsx)(tY,{response:e,index:s},e.id||s))})})]})}function tY({response:e,index:s}){let r=e.output||[],l=e.usage;return(0,t.jsxs)("div",{style:{marginBottom:12,paddingBottom:12,borderBottom:"1px solid #f5f5f5"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[(0,t.jsx)(j.Tag,{color:"completed"===e.status?"green":"orange",style:{margin:0},children:e.status||"unknown"}),l&&(0,t.jsxs)(t$,{type:"secondary",style:{fontSize:11},children:[l.input_tokens??0," in / ",l.output_tokens??0," out tokens"]}),e.conversation_id&&(0,t.jsx)(b.Tooltip,{title:e.conversation_id,children:(0,t.jsxs)(t$,{type:"secondary",style:{fontSize:11,cursor:"help"},children:["conv: ",e.conversation_id.slice(0,12),"..."]})})]}),r.map((e,s)=>(0,t.jsx)(tG,{output:e},e.id||s)),l?.input_token_details&&(0,t.jsx)(tU,{label:"Input",details:l.input_token_details}),l?.output_token_details&&(0,t.jsx)(tU,{label:"Output",details:l.output_token_details})]})}function tG({output:e}){let s=e.content||[];return s.some(e=>e.transcript||e.text)?(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsx)(t$,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase",display:"block",marginBottom:3},children:e.role?.toUpperCase()||"ASSISTANT"}),s.map((e,s)=>{let r=e.transcript||e.text;return r?(0,t.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",gap:8,marginBottom:4},children:["audio"===e.type&&(0,t.jsx)(tq.AudioOutlined,{style:{color:"#8c8c8c",fontSize:12,marginTop:3,flexShrink:0}}),"text"===e.type&&(0,t.jsx)(tk,{style:{color:"#8c8c8c",fontSize:12,marginTop:3,flexShrink:0}}),(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.7,color:"#262626",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:r})]},s):null})]}):null}function tU({label:e,details:s}){let r=Object.entries(s).filter(([,e])=>"number"==typeof e||"object"==typeof e&&null!==e);return 0===r.length?null:(0,t.jsxs)("div",{style:{marginTop:4},children:[(0,t.jsxs)(t$,{type:"secondary",style:{fontSize:10,letterSpacing:"0.5px",textTransform:"uppercase"},children:[e," Token Breakdown"]}),(0,t.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:4},children:r.map(([e,s])=>"number"==typeof s?(0,t.jsxs)(j.Tag,{style:{margin:0},children:[e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),": ",s.toLocaleString()]},e):null)})]})}function tV({label:e,value:s}){return null==s?null:(0,t.jsxs)("div",{children:[(0,t.jsx)(t$,{type:"secondary",style:{fontSize:11},children:e}),(0,t.jsx)("div",{style:{fontSize:13,color:"#262626"},children:String(s)})]})}function tK({request:e,response:s,metrics:r}){if(s&&s.results&&Array.isArray(s.results)&&0!==s.results.length&&s.results.some(e=>"session.created"===e.type||"session.updated"===e.type||"response.done"===e.type))return(0,t.jsx)(tW,{response:s,metrics:r});let{requestMessages:l,responseMessage:a}={requestMessages:(e=>{switch(e.kind){case"chat":return e.messages.map(tu);case"responses":return[...e.instructions?[{role:"system",content:e.instructions}]:[],..."string"==typeof e.input?[{role:"user",content:e.input}]:e.input.flatMap(tp)];case"unknown":return[]}})((e=>{if(Array.isArray(e))return{kind:"chat",messages:e};if(!td(e))return{kind:"unknown"};if(Array.isArray(e.messages))return{kind:"chat",messages:e.messages};let{input:t}=e;return"string"==typeof t||Array.isArray(t)?{kind:"responses",instructions:tc(e.instructions),input:t}:{kind:"unknown"}})(e)),responseMessage:(e=>{switch(e.kind){case"chat":{let t=e.choices[0],s=td(t)?t.message:void 0;if(!td(s))return null;return{role:tx(s.role,"assistant"),content:tf(s.content),toolCalls:tj(s.tool_calls)}}case"responses":{let t=e.output.filter(e=>td(e)&&"message"===e.type).map(e=>tf(e.content)).filter(e=>e.length>0).join("\n"),s=e.output.filter(th).map(tg);if(0===t.length&&0===s.length)return null;return{role:"assistant",content:t,toolCalls:s.length>0?s:void 0}}case"unknown":return null}})(td(s)?Array.isArray(s.choices)?{kind:"chat",choices:s.choices}:Array.isArray(s.output)?{kind:"responses",output:s.output}:{kind:"unknown"}:{kind:"unknown"})};return(0,t.jsxs)("div",{children:[(0,t.jsx)(tO,{messages:l,promptTokens:r?.prompt_tokens,inputCost:r?.input_cost}),(0,t.jsx)(tR,{message:a,completionTokens:r?.completion_tokens,outputCost:r?.output_cost})]})}let{Text:tQ}=v.Typography;function tX({logEntry:e,isLoadingDetails:s=!1,accessToken:r}){var l,a;let n=e.metadata||{},i="failure"===n.status,o=i?n.error_information:null,d=!!(l=e.messages)&&(Array.isArray(l)?l.length>0:"object"==typeof l&&Object.keys(l).length>0),c=!!(a=e.response)&&Object.keys(e3(a)).length>0,m=!d&&!c&&!i&&!s,x=n?.guardrail_information,u=e8(x),p=u.length>0,h=u.reduce((e,t)=>{let s=t?.masked_entity_count;return s?e+Object.values(s).reduce((e,t)=>"number"==typeof t?e+t:e,0):e},0),g=0===u.length?"-":1===u.length?u[0]?.guardrail_name??"-":`${u.length} guardrails`,f=n?.eval_information,y=n.vector_store_request_metadata&&Array.isArray(n.vector_store_request_metadata)&&n.vector_store_request_metadata.length>0;return(0,t.jsxs)("div",{style:{padding:`${C} ${C} 0`},children:[i&&o&&(0,t.jsx)(q.Alert,{type:"error",showIcon:!0,message:"Request Failed",description:(0,t.jsx)(tZ,{errorInfo:o}),className:"mb-6"}),e.request_tags&&Object.keys(e.request_tags).length>0&&(0,t.jsx)(t0,{tags:e.request_tags}),(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)(F.Card,{title:"Request Details",size:"small",bordered:!1,style:{marginBottom:0},children:(0,t.jsxs)(R.Descriptions,{column:2,size:"small",children:[(0,t.jsx)(R.Descriptions.Item,{label:"Model",children:e.model}),(0,t.jsx)(R.Descriptions.Item,{label:"Provider",children:e.custom_llm_provider||"-"}),(0,t.jsx)(R.Descriptions.Item,{label:"Call Type",children:e.call_type}),(0,t.jsx)(R.Descriptions.Item,{label:"Model ID",children:(0,t.jsx)(eq,{value:e.model_id})}),(0,t.jsx)(R.Descriptions.Item,{label:"API Base",children:(0,t.jsx)(eq,{value:e.api_base,maxWidth:200})}),e.requester_ip_address&&(0,t.jsx)(R.Descriptions.Item,{label:"IP Address",children:e.requester_ip_address}),p&&(0,t.jsx)(R.Descriptions.Item,{label:"Guardrail",children:(0,t.jsx)(t1,{label:g,maskedCount:h})})]})})}),(0,t.jsx)(e4.RoutingDecisionCard,{decision:n?.routing_decision}),(0,t.jsx)(t4,{logEntry:e,metadata:n}),(0,t.jsx)(eB,{costBreakdown:n?.cost_breakdown,totalSpend:e.spend??0,promptTokens:e.prompt_tokens,completionTokens:e.completion_tokens,cacheHit:e.cache_hit,rawInputTokens:n?.additional_usage_values?.prompt_tokens_details?.text_tokens,cacheReadTokens:n?.additional_usage_values?.cache_read_input_tokens,cacheCreationTokens:n?.additional_usage_values?.cache_creation_input_tokens}),(0,t.jsx)(to,{log:e}),m&&(0,t.jsx)("div",{className:"mb-6",children:(0,t.jsx)(eR,{show:m})}),s?(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6 p-8 text-center",children:[(0,t.jsx)(J.Spin,{size:"default"}),(0,t.jsx)("div",{style:{marginTop:8,color:"#999"},children:"Loading request & response data..."})]}):(0,t.jsx)(t6,{hasResponse:c,hasError:i,getRawRequest:()=>e3(e.proxy_server_request||e.messages),getFormattedResponse:()=>i&&o?{error:{message:o.error_message||"An error occurred",type:o.error_class||"error",code:o.error_code||"unknown",param:null}}:e3(e.response),logEntry:e}),p&&(0,t.jsx)("div",{id:"guardrail-section",children:(0,t.jsx)(eC,{data:x,accessToken:r??null,logEntry:{request_id:e.request_id,user:e.user,model:e.model,startTime:e.startTime,metadata:e.metadata}})}),null!=f&&(0,t.jsx)(eE,{data:f}),y&&(0,t.jsx)(eF,{data:n.vector_store_request_metadata}),e.metadata&&Object.keys(e.metadata).length>0&&(0,t.jsx)(t8,{metadata:e.metadata}),(0,t.jsx)("div",{style:{height:C}})]})}function tZ({errorInfo:e}){return(0,t.jsxs)("div",{children:[e.error_code&&(0,t.jsxs)("div",{children:[(0,t.jsx)(tQ,{strong:!0,children:"Error Code:"})," ",e.error_code]}),e.error_message&&(0,t.jsxs)("div",{children:[(0,t.jsx)(tQ,{strong:!0,children:"Message:"})," ",e.error_message]})]})}function t0({tags:e}){return(0,t.jsxs)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden p-4 mb-6",children:[(0,t.jsx)(tQ,{strong:!0,style:{display:"block",marginBottom:8,fontSize:16},children:"Tags"}),(0,t.jsx)(y.Space,{size:8,wrap:!0,children:Object.entries(e).map(([e,s])=>(0,t.jsxs)(j.Tag,{children:[e,": ",String(s)]},e))})]})}function t1({label:e,maskedCount:s}){return(0,t.jsxs)(y.Space,{size:8,children:[(0,t.jsx)("a",{onClick:()=>{let e=document.getElementById("guardrail-section");e&&e.scrollIntoView({behavior:"smooth"})},style:{cursor:"pointer"},children:e}),s>0&&(0,t.jsxs)(j.Tag,{color:"blue",children:[s," masked"]})]})}let t2="https://docs.litellm.ai/docs/completion/prompt_caching";function t5({label:e,tooltip:s,docsUrl:r}){return(0,t.jsxs)(y.Space,{size:4,children:[e,(0,t.jsx)(b.Tooltip,{title:(0,t.jsxs)(t.Fragment,{children:[s," ",(0,t.jsx)("a",{href:r,target:"_blank",rel:"noreferrer",style:{color:"#91caff",textDecoration:"underline"},children:"Docs"})]}),children:(0,t.jsx)(H.InfoCircleOutlined,{style:{color:"#8c8c8c"}})})]})}function t4({logEntry:e,metadata:s}){let r=e.completionStartTime,l=r&&r!==e.endTime?new Date(r).getTime()-new Date(e.startTime).getTime():null,a=String(e.cache_hit??"").toLowerCase(),n="true"===a,i=Number(s?.additional_usage_values?.cache_read_input_tokens)||0,o=Number(s?.additional_usage_values?.cache_creation_input_tokens)||0,d=function(e){let t=e?.additional_usage_values?.prompt_tokens_details?.text_tokens??e?.usage_object?.prompt_tokens_details?.text_tokens;if(null==t)return;let s=Number(t);return Number.isFinite(s)?s:void 0}(s),c="anthropic_messages"===e.call_type&&void 0!==d;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)(F.Card,{title:"Metrics",size:"small",style:{marginBottom:0},children:(0,t.jsxs)(R.Descriptions,{column:2,size:"small",children:[c?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(R.Descriptions.Item,{label:"Input Tokens",children:(0,Y.formatNumberWithCommas)(d)}),(0,t.jsx)(R.Descriptions.Item,{label:"Output Tokens",children:(0,Y.formatNumberWithCommas)(e.completion_tokens)})]}):(0,t.jsx)(R.Descriptions.Item,{label:"Tokens",children:(0,t.jsx)(eW,{prompt:e.prompt_tokens,completion:e.completion_tokens,total:e.total_tokens})}),(0,t.jsxs)(R.Descriptions.Item,{label:"Cost",children:["$",(0,Y.formatNumberWithCommas)(e.spend||0,8)]}),(0,t.jsxs)(R.Descriptions.Item,{label:"Duration",children:[null!=e.request_duration_ms?(e.request_duration_ms/1e3).toFixed(3):"-"," s"]}),null!=l&&l>0&&(0,t.jsxs)(R.Descriptions.Item,{label:"Time to First Token",children:[(l/1e3).toFixed(3)," s"]}),(n||"false"===a)&&(0,t.jsx)(R.Descriptions.Item,{label:(0,t.jsx)(t5,{label:"Response Cache",tooltip:"Whether this request was served from LiteLLM's response cache (e.g. Redis / in-memory), skipping the LLM provider call entirely. This is separate from provider prompt caching; a Miss here does not mean prompt caching failed.",docsUrl:"https://docs.litellm.ai/docs/proxy/caching"}),children:(0,t.jsx)(j.Tag,{color:n?"green":"default",children:n?"Hit":"Miss"})}),i>0&&(0,t.jsx)(R.Descriptions.Item,{label:(0,t.jsx)(t5,{label:"Prompt Cache Read Tokens",tooltip:"Input tokens read from the LLM provider's prompt cache (e.g. Anthropic / OpenAI), billed at a discounted rate. Reported by the provider.",docsUrl:t2}),children:(0,Y.formatNumberWithCommas)(i)}),o>0&&(0,t.jsx)(R.Descriptions.Item,{label:(0,t.jsx)(t5,{label:"Prompt Cache Creation Tokens",tooltip:"Input tokens written to the LLM provider's prompt cache for reuse by later requests.",docsUrl:t2}),children:(0,Y.formatNumberWithCommas)(o)}),s?.litellm_overhead_time_ms!==void 0&&null!==s.litellm_overhead_time_ms&&(0,t.jsxs)(R.Descriptions.Item,{label:"LiteLLM Overhead",children:[s.litellm_overhead_time_ms.toFixed(2)," ms"]}),(0,t.jsx)(R.Descriptions.Item,{label:"Retries",children:s?.attempted_retries!==void 0&&s?.attempted_retries!==null?s.attempted_retries>0?(0,t.jsxs)(t.Fragment,{children:[s.attempted_retries,void 0!==s.max_retries&&null!==s.max_retries?` / ${s.max_retries}`:""]}):(0,t.jsx)(j.Tag,{color:"green",children:"None"}):"-"}),(0,t.jsx)(R.Descriptions.Item,{label:"Start Time",children:(0,k.default)(e.startTime).format("YYYY-MM-DDTHH:mm:ss.SSS[Z]")}),(0,t.jsx)(R.Descriptions.Item,{label:"End Time",children:(0,k.default)(e.endTime).format("YYYY-MM-DDTHH:mm:ss.SSS[Z]")})]})})})}function t6({hasResponse:e,hasError:r,getRawRequest:l,getFormattedResponse:a,logEntry:n}){let[i,o]=(0,s.useState)(T),[d,c]=(0,s.useState)("pretty"),m=n.spend??0,x=n.prompt_tokens||0,u=n.completion_tokens||0,p=x+u,h=n.metadata?.cost_breakdown,g=h?.input_cost!==void 0&&h?.output_cost!==void 0,f=g?h.input_cost??0:p>0?m*x/p:0,y=g?h.output_cost??0:p>0?m*u/p:0;return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%"},onClick:e=>{e.target.closest(".ant-radio-group")&&e.stopPropagation()},children:[(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",style:{margin:0},children:"Request & Response"}),(0,t.jsxs)(W.Radio.Group,{size:"small",value:d,onChange:e=>c(e.target.value),children:[(0,t.jsx)(W.Radio.Button,{value:"pretty",children:"Pretty"}),(0,t.jsx)(W.Radio.Button,{value:"json",children:"JSON"})]})]}),children:(0,t.jsx)("div",{children:"pretty"===d?(0,t.jsx)(tK,{request:l(),response:a(),metrics:{prompt_tokens:x,completion_tokens:u,input_cost:f,output_cost:y}}):(0,t.jsx)(P.Tabs,{activeKey:i,onChange:e=>o(e),tabBarExtraContent:(0,t.jsx)(tQ,{copyable:{text:JSON.stringify(i===T?l():a(),null,2),tooltips:["Copy JSON","Copied!"]},disabled:i===A&&!e&&!r}),items:[{key:T,label:"Request",children:(0,t.jsx)("div",{style:{paddingTop:16,paddingBottom:16},children:(0,t.jsx)(e5,{data:l(),mode:"formatted"})})},{key:A,label:"Response",children:(0,t.jsx)("div",{style:{paddingTop:16,paddingBottom:16},children:e||r?(0,t.jsx)(e5,{data:a(),mode:"formatted"}):(0,t.jsx)("div",{style:{textAlign:"center",padding:20,color:"#999",fontStyle:"italic"},children:"Response data not available"})})}]})})}]})})}function t3({guardrailEntries:e}){let s=e.every(e=>{let t=e?.guardrail_status||e?.status;return"pass"===t||"passed"===t||"success"===t});return(0,t.jsx)("div",{style:{textAlign:"left",marginBottom:12},children:(0,t.jsxs)("div",{onClick:()=>{let e=document.getElementById("guardrail-section");e&&e.scrollIntoView({behavior:"smooth"})},style:{display:"inline-flex",alignItems:"center",gap:6,padding:"4px 12px",borderRadius:16,cursor:"pointer",fontSize:13,fontWeight:500,backgroundColor:s?"#f0fdf4":"#fef2f2",color:s?"#15803d":"#b91c1c",border:`1px solid ${s?"#bbf7d0":"#fecaca"}`},children:[s?"✓":"✗"," ",e.length," guardrail",1!==e.length?"s":""," ","evaluated",(0,t.jsx)("span",{style:{fontSize:11,opacity:.7},children:"↓"})]})})}function t8({metadata:e}){return(0,t.jsx)("div",{className:"bg-white rounded-lg shadow-sm w-full max-w-full overflow-hidden mb-6",children:(0,t.jsx)($.Collapse,{defaultActiveKey:["1"],expandIconPosition:"start",items:[{key:"1",label:(0,t.jsx)("h3",{className:"text-lg font-medium text-gray-900",children:"Metadata"}),children:(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:(0,t.jsx)(tQ,{copyable:{text:JSON.stringify(e,null,2),tooltips:["Copy Metadata","Copied!"]}})}),(0,t.jsx)("pre",{style:{maxHeight:300,overflowY:"auto",fontSize:12,fontFamily:L,whiteSpace:"pre-wrap",wordBreak:"break-all",margin:0},children:JSON.stringify(e,null,2)})]})}]})})}var t9=e.i(266027),t7=e.i(135214);let se="text-slate-500 shrink-0";function st({callType:e,isAutoRouted:s}){return p.MCP_CALL_TYPES.includes(e)?(0,t.jsx)(x.Wrench,{size:12,className:se}):p.AGENT_CALL_TYPES.includes(e)?(0,t.jsx)(c.Bot,{size:12,className:se}):s?(0,t.jsx)(u.AutoRouterIcon,{size:12,className:se}):(0,t.jsx)(m.Sparkles,{size:12,className:se})}function ss({row:e,isSelected:s,onClick:r}){let l=(0,u.useIsAutoRoutedModelGroup)(e.model_group),a=null!=e.request_duration_ms?(e.request_duration_ms/1e3).toFixed(3):e.startTime&&e.endTime?((Date.parse(e.endTime)-Date.parse(e.startTime))/1e3).toFixed(3):"-";return(0,t.jsxs)("button",{type:"button",className:`w-full text-left pl-8 pr-2 py-1 transition-colors ${s?"bg-blue-50":"hover:bg-slate-100"}`,onClick:r,children:[(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(st,{callType:e.call_type,isAutoRouted:l}),(0,t.jsx)("span",{className:"text-xs font-medium text-slate-900 truncate",children:function(e,t){let s=(t||"").trim();if(p.MCP_CALL_TYPES.includes(e))return s.replace(/^mcp:\s*/i,"").split("/").pop()||s||"mcp_tool";let r=(s.split("/").pop()||s).replace(/-20\d{6}.*$/i,"").replace(/:.*$/,""),l=r.match(/claude-[a-z0-9-]+/i);return l?l[0]:r||"llm_call"}(e.call_type,e.model)}),(0,t.jsx)(f,{origin:e.metadata?.internal_call_origin,className:"ml-auto"})]}),(0,t.jsxs)("div",{className:"text-[10px] text-slate-500 mt-0 flex items-center gap-1.5 font-mono",children:[(0,t.jsxs)("span",{children:[a,"s"]}),e.spend?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{children:"·"}),(0,t.jsx)("span",{children:(0,Y.getSpendString)(e.spend)})]}):null,e.total_tokens?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{children:"·"}),(0,t.jsxs)("span",{children:[e.total_tokens," tok"]})]}):null]})]})}e.s(["LogDetailsDrawer",0,function({open:e,onClose:c,logEntry:m,sessionId:x,accessToken:u,allLogs:h=[],onSelectLog:g,startTime:f}){let y=!!x,[j,b]=(0,s.useState)(null),[v,N]=(0,s.useState)("duration"),[_,w]=(0,s.useState)(!1),[k,S]=(0,s.useState)(!1),{data:C}=(0,t9.useQuery)({queryKey:["sessionLogs",x],queryFn:async()=>{if(!x||!u)return{logs:[],total:0};let e=await (0,ea.sessionSpendLogsCall)(u,x,1,100),t=e.data||e||[],s=Math.min(e.total_pages??1,50);if(s>1){let e=[];for(let t=2;t<=s;t+=5){let r=Math.min(t+5-1,s),l=await Promise.all(Array.from({length:r-t+1},(e,s)=>(0,ea.sessionSpendLogsCall)(u,x,t+s,100)));e.push(...l)}for(let s of e)t=t.concat(s.data||[])}let r=e.total??t.length;return{logs:t.map(e=>({...e,request_duration_ms:e.request_duration_ms??Date.parse(e.endTime)-Date.parse(e.startTime)})),total:r}},enabled:!!(e&&y&&x&&u)}),T=(0,s.useMemo)(()=>{var e;return e=C?.logs??[],"start_time"===v?[...e].sort((e,t)=>new Date(e.startTime).getTime()-new Date(t.startTime).getTime()):[...e].sort((e,t)=>e6(t)-e6(e))},[C,v]),A=C?.total??T.length,L=A>T.length,M=(0,s.useMemo)(()=>T.reduce((e,t)=>!e||new Date(t.startTime).getTime()>new Date(e.startTime).getTime()?t:e,null),[T]),I=(0,s.useMemo)(()=>{if(!y)return m;if(!T.length)return null;let e=M??T[0];return j?T.find(e=>e.request_id===j)||e:m?.request_id&&T.find(e=>e.request_id===m.request_id)||e},[y,m,j,T,M]);(0,s.useEffect)(()=>{y&&T.length&&(j&&T.some(e=>e.request_id===j)||b(m?.request_id&&T.some(e=>e.request_id===m.request_id)?m.request_id:(M??T[0]).request_id))},[y,m,j,T,M]),(0,s.useEffect)(()=>{e?w(!1):(y&&b(null),N("duration"),S(!1))},[e,y]);let{selectNextLog:z,selectPreviousLog:D}=function({isOpen:e,currentLog:t,allLogs:r,onClose:l,onSelectLog:a}){(0,s.useEffect)(()=>{let t=t=>{var s;if(!((s=t.target)instanceof HTMLInputElement||s instanceof HTMLTextAreaElement)&&e)switch(t.key){case"Escape":l();break;case"j":case"J":n();break;case"k":case"K":i()}};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,t,r]);let n=()=>{if(!t||!r.length||!a)return;let e=r.findIndex(e=>e.request_id===t.request_id);e{if(!t||!r.length||!a)return;let e=r.findIndex(e=>e.request_id===t.request_id);e>0&&a(r[e-1])};return{selectNextLog:n,selectPreviousLog:i}}({isOpen:e,currentLog:I,allLogs:y?T:h,onClose:c,onSelectLog:e=>{y&&b(e.request_id),g?.(e)}}),O=((e,t,s)=>{let{accessToken:r}=(0,t7.default)();return(0,t9.useQuery)({queryKey:["logDetails",e,t,r],queryFn:async()=>r&&e&&t?await (0,ea.uiSpendLogDetailsCall)(r,e,t):null,enabled:s&&!!r&&!!e&&!!t,staleTime:6e5,gcTime:6e5})})(I?.request_id,f,e&&!!I?.request_id),B=O.data,R=O.isLoading,F=(0,s.useMemo)(()=>I?{...I,messages:B?.messages||I.messages,response:B?.response||I.response,proxy_server_request:B?.proxy_server_request||I.proxy_server_request}:null,[I,B]),P=I?.metadata||{},q="failure"===P.status?"Failure":"Success",$="failure"===P.status?"error":"success",W=P?.user_api_key_team_alias||"default",J=T.reduce((e,t)=>e+(t.spend||0),0),H=T.length>0?new Date(Math.min(...T.map(e=>new Date(e.startTime).getTime()))):null,G=T.length>0?new Date(Math.max(...T.map(e=>new Date(e.endTime).getTime()))):null,U=H&&G?((G.getTime()-H.getTime())/1e3).toFixed(2):"0.00",V=T.filter(e=>!p.MCP_CALL_TYPES.includes(e.call_type)&&!p.AGENT_CALL_TYPES.includes(e.call_type)).length,K=T.filter(e=>p.AGENT_CALL_TYPES.includes(e.call_type)).length,Q=T.filter(e=>p.MCP_CALL_TYPES.includes(e.call_type)).length,X=y?T:I?[I]:[],Z=y?x||"":I?.request_id||"",ee=Z.length>14?`${Z.slice(0,11)}...`:Z,et=async()=>{if(Z)try{await navigator.clipboard.writeText(Z),S(!0),setTimeout(()=>S(!1),1200)}catch{}};return I&&F?(0,t.jsx)(l.Drawer,{title:null,placement:"right",onClose:c,open:e,width:"60%",closable:!1,mask:!0,maskClosable:!0,styles:{body:{padding:0,overflow:"hidden"},header:{display:"none"}},children:(0,t.jsxs)("div",{style:{height:"100%"},className:"flex relative",children:[_?(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(d.RightOutlined,{}),onClick:()=>w(!1),className:"absolute top-2 left-2 z-20 bg-white! border! border-slate-200! rounded-md!","aria-label":"Expand trace sidebar"}):(0,t.jsx)(r.Button,{type:"text",size:"small",icon:(0,t.jsx)(o.LeftOutlined,{}),onClick:()=>w(!0),className:"absolute top-2 left-2 z-20 bg-white! border! border-slate-200! rounded-md!","aria-label":"Collapse trace sidebar"}),!_&&(0,t.jsxs)("div",{className:"border-r border-slate-200 bg-slate-50 flex flex-col",style:{width:224},children:[(0,t.jsxs)("div",{className:"pl-12 pr-3 py-2 border-b border-slate-200 bg-white",children:[(0,t.jsx)("div",{className:"flex items-start justify-between gap-2",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:y?"Session":"Trace"}),(0,t.jsxs)("div",{className:"font-mono text-[12px] text-slate-900 leading-tight flex items-center gap-1",children:[(0,t.jsx)("span",{className:"truncate",children:ee}),(0,t.jsx)("button",{type:"button",onClick:et,className:"text-slate-400 hover:text-slate-600","aria-label":"Copy trace id",children:k?(0,t.jsx)(n.CheckOutlined,{className:"text-[11px]"}):(0,t.jsx)(i.CopyOutlined,{className:"text-[11px]"})})]})]})}),(0,t.jsxs)("div",{className:"mt-1 text-[11px] text-slate-500 font-mono",children:[X.length," req",[y?V:X.filter(e=>!p.MCP_CALL_TYPES.includes(e.call_type)&&!p.AGENT_CALL_TYPES.includes(e.call_type)).length,y?K:X.filter(e=>p.AGENT_CALL_TYPES.includes(e.call_type)).length,y?Q:X.filter(e=>p.MCP_CALL_TYPES.includes(e.call_type)).length].map((e,s)=>{let r=[" LLM"," Agent"," MCP"][s];return e>0?(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),e,r]},r):null}),(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),y?(0,Y.getSpendString)(J):(0,Y.getSpendString)(I.spend||0),y&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"mx-1.5",children:"·"}),U,"s"]})]}),y&&L&&(0,t.jsxs)("div",{className:"mt-1 text-[11px] text-amber-600 font-mono",children:["Showing most recent ",X.length," of ",A]}),y&&(0,t.jsx)(a.Segmented,{block:!0,size:"small",className:"mt-1.5 [&_.ant-segmented-item-label]:text-[11px]",options:[{label:"Duration",value:"duration"},{label:"Start time",value:"start_time"}],value:v,onChange:e=>N(e)})]}),(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto",children:[e8(P?.guardrail_information).length>0&&(0,t.jsx)("div",{className:"px-3 pt-2",children:(0,t.jsx)(t3,{guardrailEntries:e8(P?.guardrail_information)})}),y?(0,t.jsx)("div",{className:"py-1",children:(0,t.jsxs)("div",{className:"relative pl-2",children:[(0,t.jsx)("div",{className:"absolute left-4 top-1 bottom-1 border-l border-slate-300"}),X.map((e,s)=>{let r=s===X.length-1;return(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("div",{className:"absolute left-4 top-3 w-3 border-t border-slate-300"}),r&&(0,t.jsx)("div",{className:"absolute left-4 top-3 bottom-0 w-px bg-slate-50"}),(0,t.jsx)(ss,{row:e,isSelected:e.request_id===I.request_id,onClick:()=>{b(e.request_id),g?.(e)}})]},e.request_id)})]})}):(0,t.jsx)("div",{className:"py-1",children:X.map(e=>(0,t.jsx)(ss,{row:e,isSelected:e.request_id===I.request_id,onClick:()=>g?.(e)},e.request_id))})]})]}),(0,t.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden",children:[(0,t.jsx)(E,{log:I,onClose:c,onPrevious:D,onNext:z,statusLabel:q,statusColor:$,environment:W}),(0,t.jsx)("div",{className:"flex-1 overflow-y-auto",children:(0,t.jsx)(tX,{logEntry:F,isLoadingDetails:R,accessToken:u??null})})]})]})}):null}],502626),e.s([],3565)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/11td9c6ktfxjm.js b/litellm/proxy/_experimental/out/_next/static/chunks/11td9c6ktfxjm.js new file mode 100644 index 00000000000..701b4f8f993 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/11td9c6ktfxjm.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,793479,e=>{"use strict";var t=e.i(843476),n=e.i(271645),r=e.i(115504);let i=n.forwardRef(({className:e,type:n,...i},o)=>(0,t.jsx)("input",{type:n,"data-slot":"input",className:(0,r.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,...i}));i.displayName="Input",e.s(["Input",0,i])},73364,e=>{"use strict";var t=e.i(343084),n=e.i(229315);e.s(["getCssDimensions",0,function(e){let r=(0,n.getComputedStyle)(e),i=parseFloat(r.width)||0,o=parseFloat(r.height)||0,s=(0,n.isHTMLElement)(e),a=s?e.offsetWidth:i,l=s?e.offsetHeight:o;return((0,t.round)(i)!==a||(0,t.round)(o)!==l)&&(i=a,o=l),{width:i,height:o}}])},872855,e=>{"use strict";var t=e.i(271645);let n=t.createContext(void 0);e.s(["useDirection",0,function(){let e=t.useContext(n);return e?.direction??"ltr"}])},172410,e=>{"use strict";var t=e.i(271645);let n=t.createContext(void 0),r={disableStyleElements:!1};e.s(["useCSPContext",0,function(){return t.useContext(n)??r}])},951437,e=>{"use strict";var t=e.i(271645);e.s(["useControlled",0,function({controlled:e,default:n,name:r,state:i="value"}){let{current:o}=t.useRef(void 0!==e),[s,a]=t.useState(n),l=t.useCallback(e=>{o||a(e)},[]);return[o?e:s,l]}])},545356,e=>{"use strict";var t=e.i(271645);let n=t.createContext({register:()=>{},unregister:()=>{},subscribeMapChange:()=>()=>{},elementsRef:{current:[]},nextIndexRef:{current:0}});e.s(["CompositeListContext",0,n,"useCompositeListContext",0,function(){return t.useContext(n)}])},53687,e=>{"use strict";var t=e.i(271645),n=e.i(921374),r=e.i(667865),i=e.i(146376),o=e.i(545356),s=e.i(843476);function a(){return new Map}function l(){return new Set}function u(e,t){let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING||n&Node.DOCUMENT_POSITION_CONTAINED_BY?-1:n&Node.DOCUMENT_POSITION_PRECEDING||n&Node.DOCUMENT_POSITION_CONTAINS?1:0}e.s(["CompositeList",0,function(e){let{children:c,elementsRef:d,labelsRef:f,onMapChange:p}=e,g=(0,r.useStableCallback)(p),m=t.useRef(0),h=(0,n.useRefWithInit)(l).current,v=(0,n.useRefWithInit)(a).current,[b,x]=t.useState(0),E=t.useRef(b),y=(0,r.useStableCallback)((e,t)=>{v.set(e,t??null),E.current+=1,x(E.current)}),w=(0,r.useStableCallback)(e=>{v.delete(e),E.current+=1,x(E.current)}),R=t.useMemo(()=>{let e=new Map;return Array.from(v.keys()).filter(e=>e.isConnected).sort(u).forEach((t,n)=>{let r=v.get(t)??{};e.set(t,{...r,index:n})}),e},[v,b]);(0,i.useIsoLayoutEffect)(()=>{if("function"!=typeof MutationObserver||0===R.size)return;let e=new MutationObserver(e=>{let t=new Set,n=e=>t.has(e)?t.delete(e):t.add(e);e.forEach(e=>{e.removedNodes.forEach(n),e.addedNodes.forEach(n)}),0===t.size&&(E.current+=1,x(E.current))});return R.forEach((t,n)=>{n.parentElement&&e.observe(n.parentElement,{childList:!0})}),()=>{e.disconnect()}},[R]),(0,i.useIsoLayoutEffect)(()=>{E.current===b&&(d.current.length!==R.size&&(d.current.length=R.size),f&&f.current.length!==R.size&&(f.current.length=R.size),m.current=R.size),g(R)},[g,R,d,f,b]),(0,i.useIsoLayoutEffect)(()=>()=>{d.current=[]},[d]),(0,i.useIsoLayoutEffect)(()=>()=>{f&&(f.current=[])},[f]);let T=(0,r.useStableCallback)(e=>(h.add(e),()=>{h.delete(e)}));(0,i.useIsoLayoutEffect)(()=>{h.forEach(e=>e(R))},[h,R]);let C=t.useMemo(()=>({register:y,unregister:w,subscribeMapChange:T,elementsRef:d,labelsRef:f,nextIndexRef:m}),[y,w,T,d,f,m]);return(0,s.jsx)(o.CompositeListContext.Provider,{value:C,children:c})}])},673553,e=>{"use strict";var t,n=e.i(271645),r=e.i(146376),i=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:s,textRef:a,indexGuessBehavior:l,index:u}=e,{register:c,unregister:d,subscribeMapChange:f,elementsRef:p,labelsRef:g,nextIndexRef:m}=(0,i.useCompositeListContext)(),h=n.useRef(-1),[v,b]=n.useState(u??(l===o.GuessFromOrder?()=>{if(-1===h.current){let e=m.current;m.current+=1,h.current=e}return h.current}:-1)),x=n.useRef(null),E=n.useCallback(e=>{if(x.current=e,-1!==v&&null!==e&&(p.current[v]=e,g)){let n=void 0!==t;g.current[v]=n?t:a?.current?.textContent??e.textContent}},[v,p,g,t,a]);return(0,r.useIsoLayoutEffect)(()=>{if(null!=u)return;let e=x.current;if(e)return c(e,s),()=>{d(e)}},[u,c,d,s]),(0,r.useIsoLayoutEffect)(()=>{if(null==u)return f(e=>{let t=x.current?e.get(x.current)?.index:null;null!=t&&b(t)})},[u,f,b]),{ref:E,index:v}}])},590803,e=>{"use strict";e.s(["isElementDisabled",0,function(e){return null==e||e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled")}])},395530,e=>{"use strict";var t=e.i(271645),n=e.i(828918),r=e.i(838452),i=e.i(673553);e.s(["useCompositeItem",0,function(e={}){let{highlightItemOnHover:o,highlightedIndex:s,onHighlightedIndexChange:a}=(0,r.useCompositeRootContext)(),{ref:l,index:u}=(0,i.useCompositeListItem)(e),c=s===u,d=t.useRef(null),f=(0,n.useMergedRefs)(l,d);return{compositeProps:{tabIndex:c?0:-1,onFocus(){a(u)},onMouseMove(){let e=d.current;if(!o||!e)return;let t=e.hasAttribute("disabled")||"true"===e.ariaDisabled;c||t||e.focus()}},compositeRef:f,index:u}}])},540886,838452,e=>{"use strict";e.i(247167);var t=e.i(271645),n=e.i(229315),r=e.i(667865),i=e.i(146376),o=e.i(176782),s=e.i(733332);let a=t.createContext(void 0);function l(e=!1){let n=t.useContext(a);if(void 0===n&&!e)throw Error((0,s.default)(16));return n}function u(e){return(0,n.isHTMLElement)(e)&&"BUTTON"===e.tagName}e.s(["CompositeRootContext",0,a,"useCompositeRootContext",0,l],838452),e.s(["useButton",0,function(e={}){let{disabled:n=!1,focusableWhenDisabled:s,tabIndex:a=0,native:c=!0,composite:d}=e,f=t.useRef(null),p=l(!0),g=d??void 0!==p,{props:m}=function(e){let{focusableWhenDisabled:n,disabled:r,composite:i=!1,tabIndex:o=0,isNativeButton:s}=e,a=i&&!1!==n,l=i&&!1===n;return{props:t.useMemo(()=>{let e={onKeyDown(e){r&&n&&"Tab"!==e.key&&e.preventDefault()}};return i||(e.tabIndex=o,!s&&r&&(e.tabIndex=n?o:-1)),(s&&(n||a)||!s&&r)&&(e["aria-disabled"]=r),s&&(!n||l)&&(e.disabled=r),e},[i,r,n,a,l,s,o])}}({focusableWhenDisabled:s,disabled:n,composite:g,tabIndex:a,isNativeButton:c}),h=t.useCallback(()=>{let e=f.current;u(e)&&g&&n&&void 0===m.disabled&&e.disabled&&(e.disabled=!1)},[n,m.disabled,g]);return(0,i.useIsoLayoutEffect)(h,[h]),{getButtonProps:t.useCallback((e={})=>{let{onClick:t,onMouseDown:r,onKeyUp:i,onKeyDown:s,onPointerDown:a,...l}=e;return(0,o.mergeProps)({onClick(e){n?e.preventDefault():t?.(e)},onMouseDown(e){n||r?.(e)},onKeyDown(e){var r;if(n||((0,o.makeEventPreventable)(e),s?.(e),e.baseUIHandlerPrevented))return;let i=e.target===e.currentTarget,a=e.currentTarget,l=u(a),d=!c&&(r=a,!!(r?.tagName==="A"&&r?.href)),f=i&&(c?l:!d),p="Enter"===e.key,m=" "===e.key,h=a.getAttribute("role"),v=h?.startsWith("menuitem")||"option"===h||"gridcell"===h;if(i&&g&&m){if(e.defaultPrevented&&v)return;e.preventDefault(),d||c&&l?(a.click(),e.preventBaseUIHandler()):f&&(t?.(e),e.preventBaseUIHandler());return}f&&(!c&&(m||p)&&e.preventDefault(),!c&&p&&t?.(e))},onKeyUp(e){n||(((0,o.makeEventPreventable)(e),i?.(e),e.target===e.currentTarget&&c&&g&&u(e.currentTarget)&&" "===e.key)?e.preventDefault():!e.baseUIHandlerPrevented&&(e.target!==e.currentTarget||c||g||" "!==e.key||t?.(e)))},onPointerDown(e){n?e.preventDefault():a?.(e)}},c?{type:"button"}:{role:"button"},m,l)},[n,m,g,c]),buttonRef:(0,r.useStableCallback)(e=>{f.current=e,h()})}}],540886)},519455,527930,e=>{"use strict";var t=e.i(843476),n=e.i(271645);e.i(247167);var r=e.i(540886),i=e.i(552245);let o=n.forwardRef(function(e,t){let{render:n,className:o,disabled:s=!1,focusableWhenDisabled:a=!1,nativeButton:l=!0,style:u,...c}=e,{getButtonProps:d,buttonRef:f}=(0,r.useButton)({disabled:s,focusableWhenDisabled:a,native:l});return(0,i.useRenderElement)("button",e,{state:{disabled:s},ref:[t,f],props:[c,d]})});e.s(["Button",0,o],527930);var s=e.i(115504);let a=(0,s.cva)({base:"group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 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",variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}}),l=n.forwardRef(({className:e,variant:n="default",size:r="default",...i},l)=>(0,t.jsx)(o,{ref:l,"data-slot":"button",className:(0,s.cn)(a({variant:n,size:r,className:e})),...i}));l.displayName="Button",e.s(["Button",0,l,"buttonVariants",0,a],519455)},229315,e=>{"use strict";let t;function n(){return"u">typeof window}function r(e){return s(e)?(e.nodeName||"").toLowerCase():"#document"}function i(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function o(e){var t;return null==(t=(s(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function s(e){return!!n()&&(e instanceof Node||e instanceof i(e).Node)}function a(e){return!!n()&&(e instanceof Element||e instanceof i(e).Element)}function l(e){return!!n()&&(e instanceof HTMLElement||e instanceof i(e).HTMLElement)}function u(e){return!(!n()||"u"!!e&&"none"!==e;function m(e){let t=a(e)?b(e):e;return g(t.transform)||g(t.translate)||g(t.scale)||g(t.rotate)||g(t.perspective)||!h()&&(g(t.backdropFilter)||g(t.filter))||f.test(t.willChange||"")||p.test(t.contain||"")}function h(){return null==t&&(t="u">typeof CSS&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),t}function v(e){return/^(html|body|#document)$/.test(r(e))}function b(e){return i(e).getComputedStyle(e)}function x(e){if("html"===r(e))return e;let t=e.assignedSlot||e.parentNode||u(e)&&e.host||o(e);return u(t)?t.host:t}function E(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}e.s(["getComputedStyle",0,b,"getContainingBlock",0,function(e){let t=x(e);for(;l(t)&&!v(t);){if(m(t))return t;if(d(t))break;t=x(t)}return null},"getDocumentElement",0,o,"getFrameElement",0,E,"getNodeName",0,r,"getNodeScroll",0,function(e){return a(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}},"getOverflowAncestors",0,function e(t,n,r){var o;void 0===n&&(n=[]),void 0===r&&(r=!0);let s=function e(t){let n=x(t);return v(n)?t.ownerDocument?t.ownerDocument.body:t.body:l(n)&&c(n)?n:e(n)}(t),a=s===(null==(o=t.ownerDocument)?void 0:o.body),u=i(s);if(!a)return n.concat(s,e(s,[],r));{let t=E(u);return n.concat(u,u.visualViewport||[],c(s)?s:[],t&&r?e(t):[])}},"getParentNode",0,x,"getWindow",0,i,"isContainingBlock",0,m,"isElement",0,a,"isHTMLElement",0,l,"isLastTraversableNode",0,v,"isNode",0,s,"isOverflowElement",0,c,"isShadowRoot",0,u,"isTableElement",0,function(e){return/^(table|td|th)$/.test(r(e))},"isTopLayer",0,d,"isWebKit",0,h])},343084,e=>{"use strict";let t=["top","right","bottom","left"],n=t.reduce((e,t)=>e.concat(t,t+"-start",t+"-end"),[]),r=Math.min,i=Math.max,o=Math.round,s=Math.floor,a={left:"right",right:"left",bottom:"top",top:"bottom"};function l(e){return e.split("-")[0]}function u(e){return e.split("-")[1]}function c(e){return"x"===e?"y":"x"}function d(e){return"y"===e?"height":"width"}function f(e){let t=e[0];return"t"===t||"b"===t?"y":"x"}function p(e){return c(f(e))}function g(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}let m=["left","right"],h=["right","left"],v=["top","bottom"],b=["bottom","top"];function x(e){let t=l(e);return a[t]+e.slice(t.length)}e.s(["clamp",0,function(e,t,n){return i(e,r(t,n))},"createCoords",0,e=>({x:e,y:e}),"evaluate",0,function(e,t){return"function"==typeof e?e(t):e},"floor",0,s,"getAlignment",0,u,"getAlignmentAxis",0,p,"getAlignmentSides",0,function(e,t,n){void 0===n&&(n=!1);let r=u(e),i=p(e),o=d(i),s="x"===i?r===(n?"end":"start")?"right":"left":"start"===r?"bottom":"top";return t.reference[o]>t.floating[o]&&(s=x(s)),[s,x(s)]},"getAxisLength",0,d,"getExpandedPlacements",0,function(e){let t=x(e);return[g(e),t,g(t)]},"getOppositeAlignmentPlacement",0,g,"getOppositeAxis",0,c,"getOppositeAxisPlacements",0,function(e,t,n,r){let i=u(e),o=function(e,t,n){switch(e){case"top":case"bottom":if(n)return t?h:m;return t?m:h;case"left":case"right":return t?v:b;default:return[]}}(l(e),"start"===n,r);return i&&(o=o.map(e=>e+"-"+i),t&&(o=o.concat(o.map(g)))),o},"getOppositePlacement",0,x,"getPaddingObject",0,function(e){return"number"!=typeof e?{top:0,right:0,bottom:0,left:0,...e}:{top:e,right:e,bottom:e,left:e}},"getSide",0,l,"getSideAxis",0,f,"max",0,i,"min",0,r,"placements",0,n,"rectToClientRect",0,function(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}},"round",0,o,"sides",0,t])},755838,(e,t,n)=>{"use strict";var r=e.r(271645),i="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,s=r.useEffect,a=r.useLayoutEffect,l=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch(e){return!0}}var c="u"{"use strict";t.exports=e.r(755838)},675606,e=>{"use strict";var t=e.i(956789);e.s(["createChangeEventDetails",0,function(e,n,r,i){let o=!1,s=!1,a=i??t.EMPTY_OBJECT;return{reason:e,event:n??new Event("base-ui"),cancel(){o=!0},allowPropagation(){s=!0},get isCanceled(){return o},get isPropagationAllowed(){return s},trigger:r,...a}},"createGenericEventDetails",0,function(e,n,r){let i=r??t.EMPTY_OBJECT;return{reason:e,event:n??new Event("base-ui"),...i}}])},56434,e=>{"use strict";e.s(["cancelOpen",0,"cancel-open","chipRemovePress",0,"chip-remove-press","clearPress",0,"clear-press","closePress",0,"close-press","closeWatcher",0,"close-watcher","decrementPress",0,"decrement-press","disabled",0,"disabled","drag",0,"drag","escapeKey",0,"escape-key","focusOut",0,"focus-out","imperativeAction",0,"imperative-action","incrementPress",0,"increment-press","initial",0,"initial","inputBlur",0,"input-blur","inputChange",0,"input-change","inputClear",0,"input-clear","inputPaste",0,"input-paste","inputPress",0,"input-press","itemPress",0,"item-press","keyboard",0,"keyboard","linkPress",0,"link-press","listNavigation",0,"list-navigation","missing",0,"missing","none",0,"none","outsidePress",0,"outside-press","pointer",0,"pointer","scrub",0,"scrub","siblingOpen",0,"sibling-open","swipe",0,"swipe","trackPress",0,"track-press","triggerFocus",0,"trigger-focus","triggerHover",0,"trigger-hover","triggerPress",0,"trigger-press","wheel",0,"wheel","windowResize",0,"window-resize"],216856);var t=e.i(216856);e.s(["REASONS",0,t],56434)},108868,e=>{"use strict";e.s(["ownerDocument",0,function(e){return e?.ownerDocument||document}])},883977,e=>{"use strict";var t=e.i(271645),n=e.i(214553);let r=0,i=n.SafeReact.useId;e.s(["useId",0,function(e,n){if(void 0!==i){let t=i();return e??(n?`${n}-${t}`:t)}return function(e,n="mui"){let[i,o]=t.useState(e),s=e||i;return t.useEffect(()=>{null==i&&(r+=1,o(`${n}-${r}`))},[i,n]),s}(e,n)}])},788015,e=>{"use strict";var t=e.i(883977);e.s(["useBaseUiId",0,function(e){return(0,t.useId)(e,"base-ui")}])},647554,e=>{"use strict";var t=e.i(229315);e.s(["activeElement",0,function(e){let t=e.activeElement;for(;t?.shadowRoot?.activeElement!=null;)t=t.shadowRoot.activeElement;return t},"contains",0,function(e,n){if(!e||!n)return!1;let r=n.getRootNode?.();if(e.contains(n))return!0;if(r&&(0,t.isShadowRoot)(r)){let t=n;for(;t;){if(e===t)return!0;t=t.parentNode||t.host}}return!1},"getTarget",0,function(e){return"composedPath"in e?e.composedPath()[0]:e.target}])},144394,e=>{"use strict";var t=e.i(958321);e.s(["inertValue",0,function(e){return(0,t.isReactVersionAtLeast)(19)?e:e?"true":void 0}])},328744,e=>{"use strict";e.s([],564949),e.i(564949),e.i(247167);let{userAgent:t,platform:n,maxTouchPoints:r}="u"1,a="android",l=o===a||i.includes(a),u=!s&&o.startsWith("mac"),c=o.startsWith("win"),d=!l&&/^(linux|chrome os)/.test(o),f=u||s;e.s(["android",0,l,"apple",0,f,"ios",0,s,"linux",0,d,"mac",0,u,"windows",0,c],503720);var p=e.i(503720);let g="u">typeof CSS&&!!CSS.supports?.("-webkit-backdrop-filter:none"),m=!g&&i.includes("firefox"),h=!g&&i.includes("chrom");e.s(["blink",0,h,"gecko",0,m,"webkit",0,g],879850);var v=e.i(879850);e.s(["voiceOver",0,f],999170);var b=e.i(999170);let x=/jsdom|happydom/.test(i);e.s(["jsdom",0,x],736174);var E=e.i(736174);e.s(["engine",0,v,"env",0,E,"os",0,p,"screenReader",0,b],179214);var y=e.i(179214);e.s(["platform",0,y],328744)},157940,e=>{"use strict";var t=e.i(328744);e.s(["isClickLikeEvent",0,function(e){let t=e.type;return"click"===t||"mousedown"===t||"keydown"===t||"keyup"===t},"isMouseLikePointerType",0,function(e,t){let n=["mouse","pen"];return t||n.push("",void 0),n.includes(e)},"isReactEvent",0,function(e){return"nativeEvent"in e},"isVirtualClick",0,function(e){return""===e.pointerType&&!!e.isTrusted||(t.platform.os.android&&e.pointerType?"click"===e.type&&1===e.buttons:0===e.detail&&!e.pointerType)},"isVirtualPointerEvent",0,function(e){return!t.platform.env.jsdom&&(!t.platform.os.android&&0===e.width&&0===e.height||t.platform.os.android&&1===e.width&&1===e.height&&0===e.pressure&&0===e.detail&&"mouse"===e.pointerType||e.width<1&&e.height<1&&0===e.pressure&&0===e.detail&&"touch"===e.pointerType)},"stopEvent",0,function(e){e.preventDefault(),e.stopPropagation()}])},449055,e=>{"use strict";e.s(["ARROW_DOWN",0,"ArrowDown","ARROW_LEFT",0,"ArrowLeft","ARROW_RIGHT",0,"ArrowRight","ARROW_UP",0,"ArrowUp","FOCUSABLE_ATTRIBUTE",0,"data-base-ui-focusable","TYPEABLE_SELECTOR",0,"input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])"])},621082,e=>{"use strict";var t=e.i(343084),n=e.i(229315),r=e.i(157940),i=e.i(449055);function o(e,t,n){return Math.floor(e/t)!==n}function s(e,t){return t<0||t>=e.length}function a(e,{startingIndex:t=-1,decrement:n=!1,disabledIndices:r,amount:i=1}={}){let o=t;do o+=n?-i:i;while(o>=0&&o<=e.length-1&&l(e,o,r))return o}function l(e,t,n){if("function"==typeof n?n(t):n?.includes(t)??!1)return!0;let r=e[t];return!!r&&(!u(r)||!n&&(r.hasAttribute("disabled")||"true"===r.getAttribute("aria-disabled")))}function u(e,t=e?(0,n.getComputedStyle)(e):null){var r;return!!e&&!!e.isConnected&&!!t&&"hidden"!==(r=t).visibility&&"collapse"!==r.visibility&&("function"==typeof e.checkVisibility?e.checkVisibility():"none"!==t.display&&"contents"!==t.display)}e.s(["findNonDisabledListIndex",0,a,"getGridNavigatedIndex",0,function(e,{event:n,orientation:u,loopFocus:c,onLoop:d,rtl:f,cols:p,disabledIndices:g,minIndex:m,maxIndex:h,prevIndex:v,stopEvent:b=!1}){let x,E=v;if(n.key===i.ARROW_UP?x="up":n.key===i.ARROW_DOWN&&(x="down"),x){let i=[],o=[],u=!1,f=0;{let t=null,n=-1;e.forEach((e,r)=>{if(null==e)return;f+=1;let s=e.closest('[role="row"]');s&&(u=!0),(s!==t||-1===n)&&(t=s,i[n+=1]=[]),i[n].push(r),o[r]=n})}let y=!1,w=0;if(u)for(let e of i){let t=e.length;t>w&&(w=t),t!==p&&(y=!0)}let R=y&&f{if(!y||-1===v)return;let r=o[v];if(null==r)return;let s=i[r].indexOf(v),a="up"===t?-1:1;for(let t=r+a,u=0;u=i.length){if(!c||R)return;if(t=t<0?i.length-1:0,d){let e=Math.min(s,i[t].length-1);t=o[d(n,v,i[t][e]??i[t][0])]??t}}let r=i[t];for(let t=Math.min(s,r.length-1);t>=0;t-=1){let n=r[t];if(!l(e,n,g))return n}}})(x)??(n=>{if(!R||-1===v)return;let r=v%T,i="up"===n?-T:T,o=h-h%T,s=(0,t.floor)(h/T)+1;for(let t=v-r+i,n=0;nh){if(!c)return;t=t<0?o:0}let n=Math.min(t+T-1,h);for(let i=Math.min(t+r,n);i>=t;i-=1)if(!l(e,i,g))return i}})(x);if(void 0!==C)E=C;else if(-1===v)E="up"===x?h:m;else if(E=a(e,{startingIndex:v,amount:T,decrement:"up"===x,disabledIndices:g}),c){if("up"===x&&(v-Te?r:r-T,d&&(E=d(n,v,E))}"down"===x&&v+T>h&&(E=a(e,{startingIndex:v%T-T,amount:T,disabledIndices:g}),d&&(E=d(n,v,E)))}s(e,E)&&(E=v)}if("both"===u){let l=(0,t.floor)(v/p);n.key===(f?i.ARROW_LEFT:i.ARROW_RIGHT)&&(b&&(0,r.stopEvent)(n),v%p!=p-1?(E=a(e,{startingIndex:v,disabledIndices:g}),c&&o(E,p,l)&&(E=a(e,{startingIndex:v-v%p-1,disabledIndices:g}),d&&(E=d(n,v,E)))):c&&(E=a(e,{startingIndex:v-v%p-1,disabledIndices:g}),d&&(E=d(n,v,E))),o(E,p,l)&&(E=v)),n.key===(f?i.ARROW_RIGHT:i.ARROW_LEFT)&&(b&&(0,r.stopEvent)(n),v%p!=0?(E=a(e,{startingIndex:v,decrement:!0,disabledIndices:g}),c&&o(E,p,l)&&(E=a(e,{startingIndex:v+(p-v%p),decrement:!0,disabledIndices:g}),d&&(E=d(n,v,E)))):c&&(E=a(e,{startingIndex:v+(p-v%p),decrement:!0,disabledIndices:g}),d&&(E=d(n,v,E))),o(E,p,l)&&(E=v));let u=(0,t.floor)(h/p)===l;s(e,E)&&(c&&u?(E=n.key===(f?i.ARROW_RIGHT:i.ARROW_LEFT)?h:a(e,{startingIndex:v-v%p-1,disabledIndices:g}),d&&(E=d(n,v,E))):E=v)}return E},"getMaxListIndex",0,function(e,t){return a(e.current,{decrement:!0,startingIndex:e.current.length,disabledIndices:t})},"getMinListIndex",0,function(e,t){return a(e.current,{disabledIndices:t})},"isElementVisible",0,u,"isIndexOutOfListBounds",0,s,"isListIndexDisabled",0,l])},673327,e=>{"use strict";var t=e.i(229315);let n="ArrowUp",r="ArrowDown",i="ArrowLeft",o="ArrowRight",s="Home",a=new Set([i,o]),l=new Set([i,o,s,"End"]),u=new Set([n,r]),c=new Set([n,r,s,"End"]),d=new Set([...a,...u]),f=new Set([...d,s,"End"]),p="Shift",g=new Set([p,"Control","Alt","Meta"]);function m(e,t,n){let r="left"===n?"offsetLeft":"offsetTop",i=0;for(;t.offsetParent&&(i+=t[r],t.offsetParent!==e);)t=t.offsetParent;return i}function h(e){let t=getComputedStyle(e);return{scrollMarginTop:parseFloat(t.scrollMarginTop)||0,scrollMarginRight:parseFloat(t.scrollMarginRight)||0,scrollMarginBottom:parseFloat(t.scrollMarginBottom)||0,scrollMarginLeft:parseFloat(t.scrollMarginLeft)||0,scrollPaddingTop:parseFloat(t.scrollPaddingTop)||0,scrollPaddingRight:parseFloat(t.scrollPaddingRight)||0,scrollPaddingBottom:parseFloat(t.scrollPaddingBottom)||0,scrollPaddingLeft:parseFloat(t.scrollPaddingLeft)||0}}e.s(["ARROW_DOWN",0,r,"ARROW_KEYS",0,d,"ARROW_LEFT",0,i,"ARROW_RIGHT",0,o,"ARROW_UP",0,n,"COMPOSITE_KEYS",0,f,"END",0,"End","HOME",0,s,"HORIZONTAL_KEYS",0,a,"HORIZONTAL_KEYS_WITH_EXTRA_KEYS",0,l,"MODIFIER_KEYS",0,g,"SHIFT",0,p,"VERTICAL_KEYS",0,u,"VERTICAL_KEYS_WITH_EXTRA_KEYS",0,c,"isNativeInput",0,function(e){return!!((0,t.isHTMLElement)(e)&&"INPUT"===e.tagName&&null!=e.selectionStart||(0,t.isHTMLElement)(e)&&"TEXTAREA"===e.tagName)},"scrollIntoViewIfNeeded",0,function(e,t,n,r){if(!e||!t||!t.scrollTo)return;let i=e.scrollLeft,o=e.scrollTop,s=e.clientWidthe.scrollLeft+e.clientWidth-o.scrollPaddingRight?i=r+t.offsetWidth+s.scrollMarginRight-e.clientWidth+o.scrollPaddingRight:r-s.scrollMarginLefte.scrollLeft+e.clientWidth-o.scrollPaddingRight&&(i=r+t.offsetWidth+s.scrollMarginRight-e.clientWidth+o.scrollPaddingRight))}if(a&&"horizontal"!==r){let n=m(e,t,"top"),r=h(e),i=h(t);n-i.scrollMarginTope.scrollTop+e.clientHeight-r.scrollPaddingBottom&&(o=n+t.offsetHeight+i.scrollMarginBottom-e.clientHeight+r.scrollPaddingBottom)}e.scrollTo({left:i,top:o,behavior:"auto"})}])},302747,e=>{"use strict";var t=e.i(843476),n=e.i(271645),r=e.i(115504);let i=n.forwardRef(({className:e,...n},i)=>(0,t.jsx)("div",{ref:i,"data-slot":"skeleton",className:(0,r.cn)("animate-pulse rounded-md bg-accent",e),...n}));i.displayName="Skeleton",e.s(["Skeleton",0,i])},463059,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],246349),e.s(["ChevronRight",0,t],463059)},555436,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],54943),e.s(["Search",0,t],555436)}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/12-bl9aesgwlz.js b/litellm/proxy/_experimental/out/_next/static/chunks/12-bl9aesgwlz.js deleted file mode 100644 index 0dc49b01d68..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/12-bl9aesgwlz.js +++ /dev/null @@ -1,7 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,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])},952571,e=>{"use strict";var t=e.i(879664);e.s(["Info",()=>t.default])},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])},166406,e=>{"use strict";var t=e.i(190144);e.s(["CopyOutlined",()=>t.default])},447566,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let n={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M872 474H286.9l350.2-304c5.6-4.9 2.2-14-5.2-14h-88.5c-3.9 0-7.6 1.4-10.5 3.9L155 487.8a31.96 31.96 0 000 48.3L535.1 866c1.5 1.3 3.3 2 5.2 2h91.5c7.4 0 10.8-9.2 5.2-14L286.9 550H872c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"arrow-left",theme:"outlined"};var r=e.i(9583),o=i.forwardRef(function(e,o){return i.createElement(r.default,(0,t.default)({},e,{ref:o,icon:n}))});e.s(["ArrowLeftOutlined",0,o],447566)},278587,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",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"}))});e.s(["RefreshIcon",0,i],278587)},871943,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"}))});e.s(["ChevronDownIcon",0,i],871943)},502547,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"}))});e.s(["ChevronRightIcon",0,i],502547)},389083,e=>{"use strict";var t=e.i(290571),i=e.i(271645),n=e.i(829087),r=e.i(480731),o=e.i(95779),a=e.i(444755),l=e.i(673706);let c={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"}},s={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,l.makeClassName)("Badge"),u=i.default.forwardRef((e,u)=>{let{color:m,icon:g,size:p=r.Sizes.SM,tooltip:h,className:f,children:b}=e,$=(0,t.__rest)(e,["color","icon","size","tooltip","className","children"]),v=g||null,{tooltipProps:C,getReferenceProps:w}=(0,n.useTooltip)();return i.default.createElement("span",Object.assign({ref:(0,l.mergeRefs)([u,C.refs.setReference]),className:(0,a.tremorTwMerge)(d("root"),"w-max shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-small ring-1 ring-inset",m?(0,a.tremorTwMerge)((0,l.getColorClassNames)(m,o.colorPalette.background).bgColor,(0,l.getColorClassNames)(m,o.colorPalette.iconText).textColor,(0,l.getColorClassNames)(m,o.colorPalette.iconRing).ringColor,"bg-opacity-10 ring-opacity-20","dark:bg-opacity-5 dark:ring-opacity-60"):(0,a.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"),c[p].paddingX,c[p].paddingY,c[p].fontSize,f)},w,$),i.default.createElement(n.default,Object.assign({text:h},C)),v?i.default.createElement(v,{className:(0,a.tremorTwMerge)(d("icon"),"shrink-0 -ml-1 mr-1.5",s[p].height,s[p].width)}):null,i.default.createElement("span",{className:(0,a.tremorTwMerge)(d("text"),"whitespace-nowrap")},b))});u.displayName="Badge",e.s(["Badge",0,u],389083)},91874,681216,e=>{"use strict";var t=e.i(931067),i=e.i(209428),n=e.i(211577),r=e.i(392221),o=e.i(703923),a=e.i(343794),l=e.i(914949),c=e.i(271645),s=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],d=(0,c.forwardRef)(function(e,d){var u=e.prefixCls,m=void 0===u?"rc-checkbox":u,g=e.className,p=e.style,h=e.checked,f=e.disabled,b=e.defaultChecked,$=e.type,v=void 0===$?"checkbox":$,C=e.title,w=e.onChange,x=(0,o.default)(e,s),k=(0,c.useRef)(null),S=(0,c.useRef)(null),y=(0,l.default)(void 0!==b&&b,{value:h}),I=(0,r.default)(y,2),E=I[0],O=I[1];(0,c.useImperativeHandle)(d,function(){return{focus:function(e){var t;null==(t=k.current)||t.focus(e)},blur:function(){var e;null==(e=k.current)||e.blur()},input:k.current,nativeElement:S.current}});var N=(0,a.default)(m,g,(0,n.default)((0,n.default)({},"".concat(m,"-checked"),E),"".concat(m,"-disabled"),f));return c.createElement("span",{className:N,title:C,style:p,ref:S},c.createElement("input",(0,t.default)({},x,{className:"".concat(m,"-input"),ref:k,onChange:function(t){f||("checked"in e||O(t.target.checked),null==w||w({target:(0,i.default)((0,i.default)({},e),{},{type:v,checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},disabled:f,checked:!!E,type:v})),c.createElement("span",{className:"".concat(m,"-inner")}))});e.s(["default",0,d],91874);var u=e.i(963188);e.s(["default",0,function(e){let t=c.default.useRef(null),i=()=>{u.default.cancel(t.current),t.current=null};return[()=>{i(),t.current=(0,u.default)(()=>{t.current=null})},n=>{t.current&&(n.stopPropagation(),i()),null==e||e(n)}]}],681216)},374276,236836,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(343794),n=e.i(91874),r=e.i(611935),o=e.i(121872),a=e.i(26905),l=e.i(242064),c=e.i(937328),s=e.i(321883),d=e.i(62139);let u=t.default.createContext(null);e.i(296059);var m=e.i(915654),g=e.i(183293),p=e.i(246422),h=e.i(838378);function f(e,t){return(e=>{let{checkboxCls:t}=e,i=`${t}-wrapper`;return[{[`${t}-group`]:Object.assign(Object.assign({},(0,g.resetComponent)(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[i]:Object.assign(Object.assign({},(0,g.resetComponent)(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${i}`]:{marginInlineStart:0},[`&${i}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[t]:Object.assign(Object.assign({},(0,g.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,g.genFocusOutline)(e)},[`${t}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${(0,m.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,m.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}})},{[` - ${i}:not(${i}-disabled), - ${t}:not(${t}-disabled) - `]:{[`&:hover ${t}-inner`]:{borderColor:e.colorPrimary}},[`${i}:not(${i}-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}`}}},[` - ${i}-checked:not(${i}-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}`}}}}},{[`${i}-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,h.mergeToken)(t,{checkboxCls:`.${e}`,checkboxSize:t.controlInteractiveSize}))}let b=(0,p.genStyleHooks)("Checkbox",(e,{prefixCls:t})=>[f(t,e)]);e.s(["default",0,b,"getStyle",0,f],236836);var $=e.i(681216),v=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 r=0,n=Object.getOwnPropertySymbols(e);rt.indexOf(n[r])&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(i[n[r]]=e[n[r]]);return i};let C=t.forwardRef((e,m)=>{var g;let{prefixCls:p,className:h,rootClassName:f,children:C,indeterminate:w=!1,style:x,onMouseEnter:k,onMouseLeave:S,skipGroup:y=!1,disabled:I}=e,E=v(e,["prefixCls","className","rootClassName","children","indeterminate","style","onMouseEnter","onMouseLeave","skipGroup","disabled"]),{getPrefixCls:O,direction:N,checkbox:j}=t.useContext(l.ConfigContext),z=t.useContext(u),{isFormItemInput:T}=t.useContext(d.FormItemInputContext),M=t.useContext(c.default),q=null!=(g=(null==z?void 0:z.disabled)||I)?g:M,P=t.useRef(E.value),H=t.useRef(null),B=(0,r.composeRef)(m,H);t.useEffect(()=>{null==z||z.registerValue(E.value)},[]),t.useEffect(()=>{if(!y)return E.value!==P.current&&(null==z||z.cancelValue(P.current),null==z||z.registerValue(E.value),P.current=E.value),()=>null==z?void 0:z.cancelValue(E.value)},[E.value]),t.useEffect(()=>{var e;(null==(e=H.current)?void 0:e.input)&&(H.current.input.indeterminate=w)},[w]);let R=O("checkbox",p),L=(0,s.default)(R),[W,X,D]=b(R,L),A=Object.assign({},E);z&&!y&&(A.onChange=(...e)=>{E.onChange&&E.onChange.apply(E,e),z.toggleOption&&z.toggleOption({label:C,value:E.value})},A.name=z.name,A.checked=z.value.includes(E.value));let G=(0,i.default)(`${R}-wrapper`,{[`${R}-rtl`]:"rtl"===N,[`${R}-wrapper-checked`]:A.checked,[`${R}-wrapper-disabled`]:q,[`${R}-wrapper-in-form-item`]:T},null==j?void 0:j.className,h,f,D,L,X),Y=(0,i.default)({[`${R}-indeterminate`]:w},a.TARGET_CLS,X),[F,_]=(0,$.default)(A.onClick);return W(t.createElement(o.default,{component:"Checkbox",disabled:q},t.createElement("label",{className:G,style:Object.assign(Object.assign({},null==j?void 0:j.style),x),onMouseEnter:k,onMouseLeave:S,onClick:F},t.createElement(n.default,Object.assign({},A,{onClick:_,prefixCls:R,className:Y,disabled:q,ref:B})),null!=C&&t.createElement("span",{className:`${R}-label`},C))))});var w=e.i(8211),x=e.i(529681),k=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 r=0,n=Object.getOwnPropertySymbols(e);rt.indexOf(n[r])&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(i[n[r]]=e[n[r]]);return i};let S=t.forwardRef((e,n)=>{let{defaultValue:r,children:o,options:a=[],prefixCls:c,className:d,rootClassName:m,style:g,onChange:p}=e,h=k(e,["defaultValue","children","options","prefixCls","className","rootClassName","style","onChange"]),{getPrefixCls:f,direction:$}=t.useContext(l.ConfigContext),[v,S]=t.useState(h.value||r||[]),[y,I]=t.useState([]);t.useEffect(()=>{"value"in h&&S(h.value||[])},[h.value]);let E=t.useMemo(()=>a.map(e=>"string"==typeof e||"number"==typeof e?{label:e,value:e}:e),[a]),O=e=>{I(t=>t.filter(t=>t!==e))},N=e=>{I(t=>[].concat((0,w.default)(t),[e]))},j=e=>{let t=v.indexOf(e.value),i=(0,w.default)(v);-1===t?i.push(e.value):i.splice(t,1),"value"in h||S(i),null==p||p(i.filter(e=>y.includes(e)).sort((e,t)=>E.findIndex(t=>t.value===e)-E.findIndex(e=>e.value===t)))},z=f("checkbox",c),T=`${z}-group`,M=(0,s.default)(z),[q,P,H]=b(z,M),B=(0,x.default)(h,["value","disabled"]),R=a.length?E.map(e=>t.createElement(C,{prefixCls:z,key:e.value.toString(),disabled:"disabled"in e?e.disabled:h.disabled,value:e.value,checked:v.includes(e.value),onChange:e.onChange,className:(0,i.default)(`${T}-item`,e.className),style:e.style,title:e.title,id:e.id,required:e.required},e.label)):o,L=t.useMemo(()=>({toggleOption:j,value:v,disabled:h.disabled,name:h.name,registerValue:N,cancelValue:O}),[j,v,h.disabled,h.name,N,O]),W=(0,i.default)(T,{[`${T}-rtl`]:"rtl"===$},d,m,H,M,P);return q(t.createElement("div",Object.assign({className:W,style:g},B,{ref:n}),t.createElement(u.Provider,{value:L},R)))});C.Group=S,C.__ANT_CHECKBOX=!0,e.s(["default",0,C],374276)},536916,e=>{"use strict";var t=e.i(374276);e.s(["Checkbox",()=>t.default])},250980,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"}))});e.s(["PlusCircleIcon",0,i],250980)},360820,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 15l7-7 7 7"}))});e.s(["ChevronUpIcon",0,i],360820)},728889,e=>{"use strict";var t=e.i(290571),i=e.i(271645),n=e.i(829087),r=e.i(480731),o=e.i(444755),a=e.i(673706),l=e.i(95779);let c={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"}},s={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"}},d={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,a.makeClassName)("Icon"),m=i.default.forwardRef((e,m)=>{let{icon:g,variant:p="simple",tooltip:h,size:f=r.Sizes.SM,color:b,className:$}=e,v=(0,t.__rest)(e,["icon","variant","tooltip","size","color","className"]),C=((e,t)=>{switch(e){case"simple":return{textColor:t?(0,a.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,a.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,o.tremorTwMerge)((0,a.getColorClassNames)(t,l.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,a.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,o.tremorTwMerge)((0,a.getColorClassNames)(t,l.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,a.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,o.tremorTwMerge)((0,a.getColorClassNames)(t,l.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,a.getColorClassNames)(t,l.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,o.tremorTwMerge)((0,a.getColorClassNames)(t,l.colorPalette.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,a.getColorClassNames)(t,l.colorPalette.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,o.tremorTwMerge)((0,a.getColorClassNames)(t,l.colorPalette.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}})(p,b),{tooltipProps:w,getReferenceProps:x}=(0,n.useTooltip)();return i.default.createElement("span",Object.assign({ref:(0,a.mergeRefs)([m,w.refs.setReference]),className:(0,o.tremorTwMerge)(u("root"),"inline-flex shrink-0 items-center justify-center",C.bgColor,C.textColor,C.borderColor,C.ringColor,d[p].rounded,d[p].border,d[p].shadow,d[p].ring,c[f].paddingX,c[f].paddingY,$)},x,v),i.default.createElement(n.default,Object.assign({text:h},w)),i.default.createElement(g,{className:(0,o.tremorTwMerge)(u("icon"),"shrink-0",s[f].height,s[f].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 i=t.forwardRef(function(e,i){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:i},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,i],591935)},122577,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},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,i],122577)},618566,(e,t,i)=>{t.exports=e.r(976562)},100486,e=>{"use strict";e.i(247167);var t=e.i(931067),i=e.i(271645);let n={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 r=e.i(9583),o=i.forwardRef(function(e,o){return i.createElement(r.default,(0,t.default)({},e,{ref:o,icon:n}))});e.s(["CrownOutlined",0,o],100486)},434626,e=>{"use strict";var t=e.i(271645);let i=t.forwardRef(function(e,i){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:i},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,i],434626)},902555,e=>{"use strict";var t=e.i(843476),i=e.i(591935),n=e.i(122577),r=e.i(278587),o=e.i(68155),a=e.i(360820),l=e.i(871943),c=e.i(434626),s=e.i(271645);let d=s.forwardRef(function(e,t){return s.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),s.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"}))});var u=e.i(592968),m=e.i(115504),g=e.i(752978);function p({icon:e,onClick:i,className:n,disabled:r,dataTestId:o}){return r?(0,t.jsx)(g.Icon,{icon:e,size:"sm",className:"opacity-50 cursor-not-allowed","data-testid":o}):(0,t.jsx)(g.Icon,{icon:e,size:"sm",onClick:i,className:(0,m.cx)("cursor-pointer",n),"data-testid":o})}let h={Edit:{icon:i.PencilAltIcon,className:"hover:text-blue-600"},Delete:{icon:o.TrashIcon,className:"hover:text-red-600"},Test:{icon:n.PlayIcon,className:"hover:text-blue-600"},Regenerate:{icon:r.RefreshIcon,className:"hover:text-green-600"},Up:{icon:a.ChevronUpIcon,className:"hover:text-blue-600"},Down:{icon:l.ChevronDownIcon,className:"hover:text-blue-600"},Open:{icon:c.ExternalLinkIcon,className:"hover:text-green-600"},Copy:{icon:d,className:"hover:text-blue-600"}};e.s(["default",0,function({onClick:e,tooltipText:i,disabled:n=!1,disabledTooltipText:r,dataTestId:o,variant:a}){let{icon:l,className:c}=h[a];return(0,t.jsx)(u.Tooltip,{title:n?r:i,children:(0,t.jsx)("span",{children:(0,t.jsx)(p,{icon:l,onClick:e,className:c,disabled:n,dataTestId:o})})})}],902555)},280898,e=>{"use strict";e.i(247167);var t=e.i(271645),i=e.i(121229),n=e.i(864517),r=e.i(343794),o=e.i(931067),a=e.i(209428),l=e.i(211577),c=e.i(703923),s=e.i(404948),d=["className","prefixCls","style","active","status","iconPrefix","icon","wrapperStyle","stepNumber","disabled","description","title","subTitle","progressDot","stepIcon","tailContent","icons","stepIndex","onStepClick","onClick","render"];function u(e){return"string"==typeof e}let m=function(e){var i,n,m,g,p,h=e.className,f=e.prefixCls,b=e.style,$=e.active,v=e.status,C=e.iconPrefix,w=e.icon,x=(e.wrapperStyle,e.stepNumber),k=e.disabled,S=e.description,y=e.title,I=e.subTitle,E=e.progressDot,O=e.stepIcon,N=e.tailContent,j=e.icons,z=e.stepIndex,T=e.onStepClick,M=e.onClick,q=e.render,P=(0,c.default)(e,d),H={};T&&!k&&(H.role="button",H.tabIndex=0,H.onClick=function(e){null==M||M(e),T(z)},H.onKeyDown=function(e){var t=e.which;(t===s.default.ENTER||t===s.default.SPACE)&&T(z)});var B=v||"wait",R=(0,r.default)("".concat(f,"-item"),"".concat(f,"-item-").concat(B),h,(p={},(0,l.default)(p,"".concat(f,"-item-custom"),w),(0,l.default)(p,"".concat(f,"-item-active"),$),(0,l.default)(p,"".concat(f,"-item-disabled"),!0===k),p)),L=(0,a.default)({},b),W=t.createElement("div",(0,o.default)({},P,{className:R,style:L}),t.createElement("div",(0,o.default)({onClick:M},H,{className:"".concat(f,"-item-container")}),t.createElement("div",{className:"".concat(f,"-item-tail")},N),t.createElement("div",{className:"".concat(f,"-item-icon")},(m=(0,r.default)("".concat(f,"-icon"),"".concat(C,"icon"),(i={},(0,l.default)(i,"".concat(C,"icon-").concat(w),w&&u(w)),(0,l.default)(i,"".concat(C,"icon-check"),!w&&"finish"===v&&(j&&!j.finish||!j)),(0,l.default)(i,"".concat(C,"icon-cross"),!w&&"error"===v&&(j&&!j.error||!j)),i)),g=t.createElement("span",{className:"".concat(f,"-icon-dot")}),n=E?"function"==typeof E?t.createElement("span",{className:"".concat(f,"-icon")},E(g,{index:x-1,status:v,title:y,description:S})):t.createElement("span",{className:"".concat(f,"-icon")},g):w&&!u(w)?t.createElement("span",{className:"".concat(f,"-icon")},w):j&&j.finish&&"finish"===v?t.createElement("span",{className:"".concat(f,"-icon")},j.finish):j&&j.error&&"error"===v?t.createElement("span",{className:"".concat(f,"-icon")},j.error):w||"finish"===v||"error"===v?t.createElement("span",{className:m}):t.createElement("span",{className:"".concat(f,"-icon")},x),O&&(n=O({index:x-1,status:v,title:y,description:S,node:n})),n)),t.createElement("div",{className:"".concat(f,"-item-content")},t.createElement("div",{className:"".concat(f,"-item-title")},y,I&&t.createElement("div",{title:"string"==typeof I?I:void 0,className:"".concat(f,"-item-subtitle")},I)),S&&t.createElement("div",{className:"".concat(f,"-item-description")},S))));return q&&(W=q(W)||null),W};var g=["prefixCls","style","className","children","direction","type","labelPlacement","iconPrefix","status","size","current","progressDot","stepIcon","initial","icons","onChange","itemRender","items"];function p(e){var i,n=e.prefixCls,s=void 0===n?"rc-steps":n,d=e.style,u=void 0===d?{}:d,p=e.className,h=(e.children,e.direction),f=e.type,b=void 0===f?"default":f,$=e.labelPlacement,v=e.iconPrefix,C=void 0===v?"rc":v,w=e.status,x=void 0===w?"process":w,k=e.size,S=e.current,y=void 0===S?0:S,I=e.progressDot,E=e.stepIcon,O=e.initial,N=void 0===O?0:O,j=e.icons,z=e.onChange,T=e.itemRender,M=e.items,q=(0,c.default)(e,g),P="inline"===b,H=P||void 0!==I&&I,B=P||void 0===h?"horizontal":h,R=P?void 0:k,L=(0,r.default)(s,"".concat(s,"-").concat(B),p,(i={},(0,l.default)(i,"".concat(s,"-").concat(R),R),(0,l.default)(i,"".concat(s,"-label-").concat(H?"vertical":void 0===$?"horizontal":$),"horizontal"===B),(0,l.default)(i,"".concat(s,"-dot"),!!H),(0,l.default)(i,"".concat(s,"-navigation"),"navigation"===b),(0,l.default)(i,"".concat(s,"-inline"),P),i)),W=function(e){z&&y!==e&&z(e)};return t.default.createElement("div",(0,o.default)({className:L,style:u},q),(void 0===M?[]:M).filter(function(e){return e}).map(function(e,i){var n=(0,a.default)({},e),r=N+i;return"error"===x&&i===y-1&&(n.className="".concat(s,"-next-error")),n.status||(r===y?n.status=x:r{let i=`${t.componentCls}-item`,n=`${e}IconColor`,r=`${e}TitleColor`,o=`${e}DescriptionColor`,a=`${e}TailColor`,l=`${e}IconBgColor`,c=`${e}IconBorderColor`,s=`${e}DotColor`;return{[`${i}-${e} ${i}-icon`]:{backgroundColor:t[l],borderColor:t[c],[`> ${t.componentCls}-icon`]:{color:t[n],[`${t.componentCls}-icon-dot`]:{background:t[s]}}},[`${i}-${e}${i}-custom ${i}-icon`]:{[`> ${t.componentCls}-icon`]:{color:t[s]}},[`${i}-${e} > ${i}-container > ${i}-content > ${i}-title`]:{color:t[r],"&::after":{backgroundColor:t[a]}},[`${i}-${e} > ${i}-container > ${i}-content > ${i}-description`]:{color:t[o]},[`${i}-${e} > ${i}-container > ${i}-tail::after`]:{backgroundColor:t[a]}}},y=(0,x.genStyleHooks)("Steps",e=>{let{colorTextDisabled:t,controlHeightLG:i,colorTextLightSolid:n,colorText:r,colorPrimary:o,colorTextDescription:a,colorTextQuaternary:l,colorError:c,colorBorderSecondary:s,colorSplit:d}=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(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},(0,w.resetComponent)(e)),{display:"flex",width:"100%",fontSize:0,textAlign:"initial"}),(e=>{let{componentCls:t,motionDurationSlow:i}=e,n=`${t}-item`,r=`${n}-icon`;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[n]:{position:"relative",display:"inline-block",flex:1,overflow:"hidden",verticalAlign:"top","&:last-child":{flex:"none",[`> ${n}-container > ${n}-tail, > ${n}-container > ${n}-content > ${n}-title::after`]:{display:"none"}}},[`${n}-container`]:{outline:"none",[`&:focus-visible ${r}`]:(0,w.genFocusOutline)(e)},[`${r}, ${n}-content`]:{display:"inline-block",verticalAlign:"top"},[r]:{width:e.iconSize,height:e.iconSize,marginTop:0,marginBottom:0,marginInlineStart:0,marginInlineEnd:e.marginXS,fontSize:e.iconFontSize,fontFamily:e.fontFamily,lineHeight:(0,C.unit)(e.iconSize),textAlign:"center",borderRadius:e.iconSize,border:`${(0,C.unit)(e.lineWidth)} ${e.lineType} transparent`,transition:`background-color ${i}, border-color ${i}`,[`${t}-icon`]:{position:"relative",top:e.iconTop,color:e.colorPrimary,lineHeight:1}},[`${n}-tail`]:{position:"absolute",top:e.calc(e.iconSize).div(2).equal(),insetInlineStart:0,width:"100%","&::after":{display:"inline-block",width:"100%",height:e.lineWidth,background:e.colorSplit,borderRadius:e.lineWidth,transition:`background ${i}`,content:'""'}},[`${n}-title`]:{position:"relative",display:"inline-block",paddingInlineEnd:e.padding,color:e.colorText,fontSize:e.fontSizeLG,lineHeight:(0,C.unit)(e.titleLineHeight),"&::after":{position:"absolute",top:e.calc(e.titleLineHeight).div(2).equal(),insetInlineStart:"100%",display:"block",width:9999,height:e.lineWidth,background:e.processTailColor,content:'""'}},[`${n}-subtitle`]:{display:"inline",marginInlineStart:e.marginXS,color:e.colorTextDescription,fontWeight:"normal",fontSize:e.fontSize},[`${n}-description`]:{color:e.colorTextDescription,fontSize:e.fontSize}},S("wait",e)),S("process",e)),{[`${n}-process > ${n}-container > ${n}-title`]:{fontWeight:e.fontWeightStrong}}),S("finish",e)),S("error",e)),{[`${n}${t}-next-error > ${t}-item-title::after`]:{background:e.colorError},[`${n}-disabled`]:{cursor:"not-allowed"}})})(e)),(e=>{let{componentCls:t,motionDurationSlow:i}=e;return{[`& ${t}-item`]:{[`&:not(${t}-item-active)`]:{[`& > ${t}-item-container[role='button']`]:{cursor:"pointer",[`${t}-item`]:{[`&-title, &-subtitle, &-description, &-icon ${t}-icon`]:{transition:`color ${i}`}},"&:hover":{[`${t}-item`]:{"&-title, &-subtitle, &-description":{color:e.colorPrimary}}}},[`&:not(${t}-item-process)`]:{[`& > ${t}-item-container[role='button']:hover`]:{[`${t}-item`]:{"&-icon":{borderColor:e.colorPrimary,[`${t}-icon`]:{color:e.colorPrimary}}}}}}},[`&${t}-horizontal:not(${t}-label-vertical)`]:{[`${t}-item`]:{paddingInlineStart:e.padding,whiteSpace:"nowrap","&:first-child":{paddingInlineStart:0},[`&:last-child ${t}-item-title`]:{paddingInlineEnd:0},"&-tail":{display:"none"},"&-description":{maxWidth:e.descriptionMaxWidth,whiteSpace:"normal"}}}}})(e)),(e=>{let{componentCls:t,customIconTop:i,customIconSize:n,customIconFontSize:r}=e;return{[`${t}-item-custom`]:{[`> ${t}-item-container > ${t}-item-icon`]:{height:"auto",background:"none",border:0,[`> ${t}-icon`]:{top:i,width:n,height:n,fontSize:r,lineHeight:(0,C.unit)(n)}}},[`&:not(${t}-vertical)`]:{[`${t}-item-custom`]:{[`${t}-item-icon`]:{width:"auto",background:"none"}}}}})(e)),(e=>{let{componentCls:t,iconSizeSM:i,fontSizeSM:n,fontSize:r,colorTextDescription:o}=e;return{[`&${t}-small`]:{[`&${t}-horizontal:not(${t}-label-vertical) ${t}-item`]:{paddingInlineStart:e.paddingSM,"&:first-child":{paddingInlineStart:0}},[`${t}-item-icon`]:{width:i,height:i,marginTop:0,marginBottom:0,marginInline:`0 ${(0,C.unit)(e.marginXS)}`,fontSize:n,lineHeight:(0,C.unit)(i),textAlign:"center",borderRadius:i},[`${t}-item-title`]:{paddingInlineEnd:e.paddingSM,fontSize:r,lineHeight:(0,C.unit)(i),"&::after":{top:e.calc(i).div(2).equal()}},[`${t}-item-description`]:{color:o,fontSize:r},[`${t}-item-tail`]:{top:e.calc(i).div(2).sub(e.paddingXXS).equal()},[`${t}-item-custom ${t}-item-icon`]:{width:"inherit",height:"inherit",lineHeight:"inherit",background:"none",border:0,borderRadius:0,[`> ${t}-icon`]:{fontSize:i,lineHeight:(0,C.unit)(i),transform:"none"}}}}})(e)),(e=>{let{componentCls:t,iconSizeSM:i,iconSize:n}=e;return{[`&${t}-vertical`]:{display:"flex",flexDirection:"column",[`> ${t}-item`]:{display:"block",flex:"1 0 auto",paddingInlineStart:0,overflow:"visible",[`${t}-item-icon`]:{float:"left",marginInlineEnd:e.margin},[`${t}-item-content`]:{display:"block",minHeight:e.calc(e.controlHeight).mul(1.5).equal(),overflow:"hidden"},[`${t}-item-title`]:{lineHeight:(0,C.unit)(n)},[`${t}-item-description`]:{paddingBottom:e.paddingSM}},[`> ${t}-item > ${t}-item-container > ${t}-item-tail`]:{position:"absolute",top:0,insetInlineStart:e.calc(n).div(2).sub(e.lineWidth).equal(),width:e.lineWidth,height:"100%",padding:`${(0,C.unit)(e.calc(e.marginXXS).mul(1.5).add(n).equal())} 0 ${(0,C.unit)(e.calc(e.marginXXS).mul(1.5).equal())}`,"&::after":{width:e.lineWidth,height:"100%"}},[`> ${t}-item:not(:last-child) > ${t}-item-container > ${t}-item-tail`]:{display:"block"},[` > ${t}-item > ${t}-item-container > ${t}-item-content > ${t}-item-title`]:{"&::after":{display:"none"}},[`&${t}-small ${t}-item-container`]:{[`${t}-item-tail`]:{position:"absolute",top:0,insetInlineStart:e.calc(i).div(2).sub(e.lineWidth).equal(),padding:`${(0,C.unit)(e.calc(e.marginXXS).mul(1.5).add(i).equal())} 0 ${(0,C.unit)(e.calc(e.marginXXS).mul(1.5).equal())}`},[`${t}-item-title`]:{lineHeight:(0,C.unit)(i)}}}}})(e)),(e=>{let{componentCls:t}=e,i=`${t}-item`;return{[`${t}-horizontal`]:{[`${i}-tail`]:{transform:"translateY(-50%)"}}}})(e)),(e=>{let{componentCls:t,iconSize:i,lineHeight:n,iconSizeSM:r}=e;return{[`&${t}-label-vertical`]:{[`${t}-item`]:{overflow:"visible","&-tail":{marginInlineStart:e.calc(i).div(2).add(e.controlHeightLG).equal(),padding:`0 ${(0,C.unit)(e.paddingLG)}`},"&-content":{display:"block",width:e.calc(i).div(2).add(e.controlHeightLG).mul(2).equal(),marginTop:e.marginSM,textAlign:"center"},"&-icon":{display:"inline-block",marginInlineStart:e.controlHeightLG},"&-title":{paddingInlineEnd:0,paddingInlineStart:0,"&::after":{display:"none"}},"&-subtitle":{display:"block",marginBottom:e.marginXXS,marginInlineStart:0,lineHeight:n}},[`&${t}-small:not(${t}-dot)`]:{[`${t}-item`]:{"&-icon":{marginInlineStart:e.calc(i).sub(r).div(2).add(e.controlHeightLG).equal()}}}}}})(e)),(e=>{let{componentCls:t,descriptionMaxWidth:i,lineHeight:n,dotCurrentSize:r,dotSize:o,motionDurationSlow:a}=e;return{[`&${t}-dot, &${t}-dot${t}-small`]:{[`${t}-item`]:{"&-title":{lineHeight:n},"&-tail":{top:e.calc(e.dotSize).sub(e.calc(e.lineWidth).mul(3).equal()).div(2).equal(),width:"100%",marginTop:0,marginBottom:0,marginInline:`${(0,C.unit)(e.calc(i).div(2).equal())} 0`,padding:0,"&::after":{width:`calc(100% - ${(0,C.unit)(e.calc(e.marginSM).mul(2).equal())})`,height:e.calc(e.lineWidth).mul(3).equal(),marginInlineStart:e.marginSM}},"&-icon":{width:o,height:o,marginInlineStart:e.calc(e.descriptionMaxWidth).sub(o).div(2).equal(),paddingInlineEnd:0,lineHeight:(0,C.unit)(o),background:"transparent",border:0,[`${t}-icon-dot`]:{position:"relative",float:"left",width:"100%",height:"100%",borderRadius:100,transition:`all ${a}`,"&::after":{position:"absolute",top:e.calc(e.marginSM).mul(-1).equal(),insetInlineStart:e.calc(o).sub(e.calc(e.controlHeightLG).mul(1.5).equal()).div(2).equal(),width:e.calc(e.controlHeightLG).mul(1.5).equal(),height:e.controlHeight,background:"transparent",content:'""'}}},"&-content":{width:i},[`&-process ${t}-item-icon`]:{position:"relative",top:e.calc(o).sub(r).div(2).equal(),width:r,height:r,lineHeight:(0,C.unit)(r),background:"none",marginInlineStart:e.calc(e.descriptionMaxWidth).sub(r).div(2).equal()},[`&-process ${t}-icon`]:{[`&:first-child ${t}-icon-dot`]:{insetInlineStart:0}}}},[`&${t}-vertical${t}-dot`]:{[`${t}-item-icon`]:{marginTop:e.calc(e.controlHeight).sub(o).div(2).equal(),marginInlineStart:0,background:"none"},[`${t}-item-process ${t}-item-icon`]:{marginTop:e.calc(e.controlHeight).sub(r).div(2).equal(),top:0,insetInlineStart:e.calc(o).sub(r).div(2).equal(),marginInlineStart:0},[`${t}-item > ${t}-item-container > ${t}-item-tail`]:{top:e.calc(e.controlHeight).sub(o).div(2).equal(),insetInlineStart:0,margin:0,padding:`${(0,C.unit)(e.calc(o).add(e.paddingXS).equal())} 0 ${(0,C.unit)(e.paddingXS)}`,"&::after":{marginInlineStart:e.calc(o).sub(e.lineWidth).div(2).equal()}},[`&${t}-small`]:{[`${t}-item-icon`]:{marginTop:e.calc(e.controlHeightSM).sub(o).div(2).equal()},[`${t}-item-process ${t}-item-icon`]:{marginTop:e.calc(e.controlHeightSM).sub(r).div(2).equal()},[`${t}-item > ${t}-item-container > ${t}-item-tail`]:{top:e.calc(e.controlHeightSM).sub(o).div(2).equal()}},[`${t}-item:first-child ${t}-icon-dot`]:{insetInlineStart:0},[`${t}-item-content`]:{width:"inherit"}}}})(e)),(e=>{let{componentCls:t,navContentMaxWidth:i,navArrowColor:n,stepsNavActiveColor:r,motionDurationSlow:o}=e;return{[`&${t}-navigation`]:{paddingTop:e.paddingSM,[`&${t}-small`]:{[`${t}-item`]:{"&-container":{marginInlineStart:e.calc(e.marginSM).mul(-1).equal()}}},[`${t}-item`]:{overflow:"visible",textAlign:"center","&-container":{display:"inline-block",height:"100%",marginInlineStart:e.calc(e.margin).mul(-1).equal(),paddingBottom:e.paddingSM,textAlign:"start",transition:`opacity ${o}`,[`${t}-item-content`]:{maxWidth:i},[`${t}-item-title`]:Object.assign(Object.assign({maxWidth:"100%",paddingInlineEnd:0},w.textEllipsis),{"&::after":{display:"none"}})},[`&:not(${t}-item-active)`]:{[`${t}-item-container[role='button']`]:{cursor:"pointer","&:hover":{opacity:.85}}},"&:last-child":{flex:1,"&::after":{display:"none"}},"&::after":{position:"absolute",top:`calc(50% - ${(0,C.unit)(e.calc(e.paddingSM).div(2).equal())})`,insetInlineStart:"100%",display:"inline-block",width:e.fontSizeIcon,height:e.fontSizeIcon,borderTop:`${(0,C.unit)(e.lineWidth)} ${e.lineType} ${n}`,borderBottom:"none",borderInlineStart:"none",borderInlineEnd:`${(0,C.unit)(e.lineWidth)} ${e.lineType} ${n}`,transform:"translateY(-50%) translateX(-50%) rotate(45deg)",content:'""'},"&::before":{position:"absolute",bottom:0,insetInlineStart:"50%",display:"inline-block",width:0,height:e.lineWidthBold,backgroundColor:r,transition:`width ${o}, inset-inline-start ${o}`,transitionTimingFunction:"ease-out",content:'""'}},[`${t}-item${t}-item-active::before`]:{insetInlineStart:0,width:"100%"}},[`&${t}-navigation${t}-vertical`]:{[`> ${t}-item`]:{marginInlineEnd:0,"&::before":{display:"none"},[`&${t}-item-active::before`]:{top:0,insetInlineEnd:0,insetInlineStart:"unset",display:"block",width:e.calc(e.lineWidth).mul(3).equal(),height:`calc(100% - ${(0,C.unit)(e.marginLG)})`},"&::after":{position:"relative",insetInlineStart:"50%",display:"block",width:e.calc(e.controlHeight).mul(.25).equal(),height:e.calc(e.controlHeight).mul(.25).equal(),marginBottom:e.marginXS,textAlign:"center",transform:"translateY(-50%) translateX(-50%) rotate(135deg)"},"&:last-child":{"&::after":{display:"none"}},[`> ${t}-item-container > ${t}-item-tail`]:{visibility:"hidden"}}},[`&${t}-navigation${t}-horizontal`]:{[`> ${t}-item > ${t}-item-container > ${t}-item-tail`]:{visibility:"hidden"}}}})(e)),(e=>{let{componentCls:t}=e;return{[`&${t}-rtl`]:{direction:"rtl",[`${t}-item`]:{"&-subtitle":{float:"left"}},[`&${t}-navigation`]:{[`${t}-item::after`]:{transform:"rotate(-45deg)"}},[`&${t}-vertical`]:{[`> ${t}-item`]:{"&::after":{transform:"rotate(225deg)"},[`${t}-item-icon`]:{float:"right"}}},[`&${t}-dot`]:{[`${t}-item-icon ${t}-icon-dot, &${t}-small ${t}-item-icon ${t}-icon-dot`]:{float:"right"}}}}})(e)),(e=>{let{antCls:t,componentCls:i,iconSize:n,iconSizeSM:r,processIconColor:o,marginXXS:a,lineWidthBold:l,lineWidth:c,paddingXXS:s}=e,d=e.calc(n).add(e.calc(l).mul(4).equal()).equal(),u=e.calc(r).add(e.calc(e.lineWidth).mul(4).equal()).equal();return{[`&${i}-with-progress`]:{[`${i}-item`]:{paddingTop:s,[`&-process ${i}-item-container ${i}-item-icon ${i}-icon`]:{color:o}},[`&${i}-vertical > ${i}-item `]:{paddingInlineStart:s,[`> ${i}-item-container > ${i}-item-tail`]:{top:a,insetInlineStart:e.calc(n).div(2).sub(c).add(s).equal()}},[`&, &${i}-small`]:{[`&${i}-horizontal ${i}-item:first-child`]:{paddingBottom:s,paddingInlineStart:s}},[`&${i}-small${i}-vertical > ${i}-item > ${i}-item-container > ${i}-item-tail`]:{insetInlineStart:e.calc(r).div(2).sub(c).add(s).equal()},[`&${i}-label-vertical ${i}-item ${i}-item-tail`]:{top:e.calc(n).div(2).add(s).equal()},[`${i}-item-icon`]:{position:"relative",[`${t}-progress`]:{position:"absolute",insetInlineStart:"50%",top:"50%",transform:"translate(-50%, -50%)","&-inner":{width:`${(0,C.unit)(d)} !important`,height:`${(0,C.unit)(d)} !important`}}},[`&${i}-small`]:{[`&${i}-label-vertical ${i}-item ${i}-item-tail`]:{top:e.calc(r).div(2).add(s).equal()},[`${i}-item-icon ${t}-progress-inner`]:{width:`${(0,C.unit)(u)} !important`,height:`${(0,C.unit)(u)} !important`}}}}})(e)),(e=>{let{componentCls:t,inlineDotSize:i,inlineTitleColor:n,inlineTailColor:r}=e,o=e.calc(e.paddingXS).add(e.lineWidth).equal(),a={[`${t}-item-container ${t}-item-content ${t}-item-title`]:{color:n}};return{[`&${t}-inline`]:{width:"auto",display:"inline-flex",[`${t}-item`]:{flex:"none","&-container":{padding:`${(0,C.unit)(o)} ${(0,C.unit)(e.paddingXXS)} 0`,margin:`0 ${(0,C.unit)(e.calc(e.marginXXS).div(2).equal())}`,borderRadius:e.borderRadiusSM,cursor:"pointer",transition:`background-color ${e.motionDurationMid}`,"&:hover":{background:e.controlItemBgHover},"&[role='button']:hover":{opacity:1}},"&-icon":{width:i,height:i,marginInlineStart:`calc(50% - ${(0,C.unit)(e.calc(i).div(2).equal())})`,[`> ${t}-icon`]:{top:0},[`${t}-icon-dot`]:{borderRadius:e.calc(e.fontSizeSM).div(4).equal(),"&::after":{display:"none"}}},"&-content":{width:"auto",marginTop:e.calc(e.marginXS).sub(e.lineWidth).equal()},"&-title":{color:n,fontSize:e.fontSizeSM,lineHeight:e.lineHeightSM,fontWeight:"normal",marginBottom:e.calc(e.marginXXS).div(2).equal()},"&-description":{display:"none"},"&-tail":{marginInlineStart:0,top:e.calc(i).div(2).add(o).equal(),transform:"translateY(-50%)","&:after":{width:"100%",height:e.lineWidth,borderRadius:0,marginInlineStart:0,background:r}},[`&:first-child ${t}-item-tail`]:{width:"50%",marginInlineStart:"50%"},[`&:last-child ${t}-item-tail`]:{display:"block",width:"50%"},"&-wait":Object.assign({[`${t}-item-icon ${t}-icon ${t}-icon-dot`]:{backgroundColor:e.colorBorderBg,border:`${(0,C.unit)(e.lineWidth)} ${e.lineType} ${r}`}},a),"&-finish":Object.assign({[`${t}-item-tail::after`]:{backgroundColor:r},[`${t}-item-icon ${t}-icon ${t}-icon-dot`]:{backgroundColor:r,border:`${(0,C.unit)(e.lineWidth)} ${e.lineType} ${r}`}},a),"&-error":a,"&-active, &-process":Object.assign({[`${t}-item-icon`]:{width:i,height:i,marginInlineStart:`calc(50% - ${(0,C.unit)(e.calc(i).div(2).equal())})`,top:0}},a),[`&:not(${t}-item-active) > ${t}-item-container[role='button']:hover`]:{[`${t}-item-title`]:{color:n}}}}}})(e))}})((0,k.mergeToken)(e,{processIconColor:n,processTitleColor:r,processDescriptionColor:r,processIconBgColor:o,processIconBorderColor:o,processDotColor:o,processTailColor:d,waitTitleColor:a,waitDescriptionColor:a,waitTailColor:d,waitDotColor:t,finishIconColor:o,finishTitleColor:r,finishDescriptionColor:a,finishTailColor:o,finishDotColor:o,errorIconColor:n,errorTitleColor:c,errorDescriptionColor:c,errorTailColor:d,errorIconBgColor:c,errorIconBorderColor:c,errorDotColor:c,stepsNavActiveColor:o,stepsProgressSize:i,inlineDotSize:6,inlineTitleColor:l,inlineTailColor:s}))},e=>({titleLineHeight:e.controlHeight,customIconSize:e.controlHeight,customIconTop:0,customIconFontSize:e.controlHeightSM,iconSize:e.controlHeight,iconTop:-.5,iconFontSize:e.fontSize,iconSizeSM:e.fontSizeHeading3,dotSize:e.controlHeight/4,dotCurrentSize:e.controlHeightLG/4,navArrowColor:e.colorTextDisabled,navContentMaxWidth:"unset",descriptionMaxWidth:140,waitIconColor:e.wireframe?e.colorTextDisabled:e.colorTextLabel,waitIconBgColor:e.wireframe?e.colorBgContainer:e.colorFillContent,waitIconBorderColor:e.wireframe?e.colorTextDisabled:"transparent",finishIconBgColor:e.wireframe?e.colorBgContainer:e.controlItemBgActive,finishIconBorderColor:e.wireframe?e.colorPrimary:e.controlItemBgActive}));var I=e.i(876556),E=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 r=0,n=Object.getOwnPropertySymbols(e);rt.indexOf(n[r])&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(i[n[r]]=e[n[r]]);return i};let O=e=>{var o,a;let{percent:l,size:c,className:s,rootClassName:d,direction:u,items:m,responsive:g=!0,current:C=0,children:w,style:x}=e,k=E(e,["percent","size","className","rootClassName","direction","items","responsive","current","children","style"]),{xs:S}=(0,b.default)(g),{getPrefixCls:O,direction:N,className:j,style:z}=(0,h.useComponentConfig)("steps"),T=t.useMemo(()=>g&&S?"vertical":u,[g,S,u]),M=(0,f.default)(c),q=O("steps",e.prefixCls),[P,H,B]=y(q),R="inline"===e.type,L=O("",e.iconPrefix),W=(o=m,a=w,o?o:(0,I.default)(a).map(e=>{if(t.isValidElement(e)){let{props:t}=e;return Object.assign({},t)}return null}).filter(e=>e)),X=R?void 0:l,D=Object.assign(Object.assign({},z),x),A=(0,r.default)(j,{[`${q}-rtl`]:"rtl"===N,[`${q}-with-progress`]:void 0!==X},s,d,H,B),G={finish:t.createElement(i.default,{className:`${q}-finish-icon`}),error:t.createElement(n.default,{className:`${q}-error-icon`})};return P(t.createElement(p,Object.assign({icons:G},k,{style:D,current:C,size:M,items:W,itemRender:R?(e,i)=>e.description?t.createElement(v.default,{title:e.description},i):i:void 0,stepIcon:({node:e,status:i})=>"process"===i&&void 0!==X?t.createElement("div",{className:`${q}-progress-icon`},t.createElement($.default,{type:"circle",percent:X,size:"small"===M?32:40,strokeWidth:4,format:()=>null}),e):e,direction:T,prefixCls:q,iconPrefix:L,className:A})))};O.Step=p.Step,e.s(["Steps",0,O],280898)},86408,e=>{"use strict";var t=e.i(843476),i=e.i(271645),n=e.i(618566),r=e.i(934879);function o(){let e=(0,n.useSearchParams)().get("key"),[o,a]=(0,i.useState)(null);return(0,i.useEffect)(()=>{e&&a(e)},[e]),(0,t.jsx)(r.default,{accessToken:o,publicPage:!0,premiumUser:!1,userRole:null})}e.s(["default",0,function(){return(0,t.jsx)(i.Suspense,{fallback:(0,t.jsx)("div",{className:"flex items-center justify-center min-h-screen",children:"Loading..."}),children:(0,t.jsx)(o,{})})}])}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/3gj-m4kjq0tei.js b/litellm/proxy/_experimental/out/_next/static/chunks/1269ecu-v6ly2.js similarity index 70% rename from litellm/proxy/_experimental/out/_next/static/chunks/3gj-m4kjq0tei.js rename to litellm/proxy/_experimental/out/_next/static/chunks/1269ecu-v6ly2.js index f71d77ce4cc..706fbb5de28 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/3gj-m4kjq0tei.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/1269ecu-v6ly2.js @@ -1,2 +1,2 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95779,e=>{"use strict";var t=e.i(480731);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}])},599724,936325,e=>{"use strict";var t=e.i(95779),r=e.i(444755),o=e.i(673706),n=e.i(271645);let l=n.default.forwardRef((e,l)=>{let{color:a,className:s,children:i}=e;return n.default.createElement("p",{ref:l,className:(0,r.tremorTwMerge)("text-tremor-default",a?(0,o.getColorClassNames)(a,t.colorPalette.text).textColor:(0,r.tremorTwMerge)("text-tremor-content","dark:text-dark-tremor-content"),s)},i)});l.displayName="Text",e.s(["default",0,l],936325),e.s(["Text",0,l],599724)},994388,e=>{"use strict";var t=e.i(290571),r=e.i(829087),o=e.i(271645);let n=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],l=e=>({_s:e,status:n[e],isEnter:e<3,isMounted:6!==e,isResolved:2===e||e>4}),a=e=>e?6:5,s=(e,t,r,o,n)=>{clearTimeout(o.current);let a=l(e);t(a),r.current=a,n&&n({current:a})};var i=e.i(480731),u=e.i(444755),d=e.i(673706);let c=e=>{var r=(0,t.__rest)(e,[]);return o.default.createElement("svg",Object.assign({},r,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),o.default.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}),o.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 m=e.i(95779);let f={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,d.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",hoverTextColor:t?(0,d.getColorClassNames)("white").textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,d.getColorClassNames)(t,m.colorPalette.background).bgColor:"bg-tremor-brand dark:bg-dark-tremor-brand",hoverBgColor:t?(0,d.getColorClassNames)(t,m.colorPalette.darkBackground).hoverBgColor:"hover:bg-tremor-brand-emphasis dark:hover:bg-dark-tremor-brand-emphasis",borderColor:t?(0,d.getColorClassNames)(t,m.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand",hoverBorderColor:t?(0,d.getColorClassNames)(t,m.colorPalette.darkBorder).hoverBorderColor:"hover:border-tremor-brand-emphasis dark:hover:border-dark-tremor-brand-emphasis"};case"secondary":return{textColor:t?(0,d.getColorClassNames)(t,m.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,d.getColorClassNames)(t,m.colorPalette.text).textColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,d.getColorClassNames)("transparent").bgColor,hoverBgColor:t?(0,u.tremorTwMerge)((0,d.getColorClassNames)(t,m.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,d.getColorClassNames)(t,m.colorPalette.border).borderColor:"border-tremor-brand dark:border-dark-tremor-brand"};case"light":return{textColor:t?(0,d.getColorClassNames)(t,m.colorPalette.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",hoverTextColor:t?(0,d.getColorClassNames)(t,m.colorPalette.darkText).hoverTextColor:"hover:text-tremor-brand-emphasis dark:hover:text-dark-tremor-brand-emphasis",bgColor:(0,d.getColorClassNames)("transparent").bgColor,borderColor:"",hoverBorderColor:""}}},g=(0,d.makeClassName)("Button"),h=({loading:e,iconSize:t,iconPosition:r,Icon:n,needMargin:l,transitionStatus:a})=>{let s=l?r===i.HorizontalPositions.Left?(0,u.tremorTwMerge)("-ml-1","mr-1.5"):(0,u.tremorTwMerge)("-mr-1","ml-1.5"):"",d=(0,u.tremorTwMerge)("w-0 h-0"),m={default:d,entering:d,entered:t,exiting:t,exited:d};return e?o.default.createElement(c,{className:(0,u.tremorTwMerge)(g("icon"),"animate-spin shrink-0",s,m.default,m[a]),style:{transition:"width 150ms"}}):o.default.createElement(n,{className:(0,u.tremorTwMerge)(g("icon"),"shrink-0",t,s)})},v=o.default.forwardRef((e,n)=>{let{icon:c,iconPosition:m=i.HorizontalPositions.Left,size:v=i.Sizes.SM,color:b,variant:C="primary",disabled:x,loading:E=!1,loadingText:y,children:k,tooltip:S,className:w}=e,T=(0,t.__rest)(e,["icon","iconPosition","size","color","variant","disabled","loading","loadingText","children","tooltip","className"]),N=E||x,P=void 0!==c||E,F=E&&y,B=!(!k&&!F),I=(0,u.tremorTwMerge)(f[v].height,f[v].width),M="light"!==C?(0,u.tremorTwMerge)("rounded-tremor-default border","shadow-tremor-input","dark:shadow-dark-tremor-input"):"",A=p(C,b),R=("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"}})[v],{tooltipProps:O,getReferenceProps:D}=(0,r.useTooltip)(300),[L,H]=(({enter:e=!0,exit:t=!0,preEnter:r,preExit:n,timeout:i,initialEntered:u,mountOnEnter:d,unmountOnExit:c,onStateChange:m}={})=>{let[f,p]=(0,o.useState)(()=>l(u?2:a(d))),g=(0,o.useRef)(f),h=(0,o.useRef)(0),[v,b]="object"==typeof i?[i.enter,i.exit]:[i,i],C=(0,o.useCallback)(()=>{let e=((e,t)=>{switch(e){case 1:case 0:return 2;case 4:case 3:return a(t)}})(g.current._s,c);e&&s(e,p,g,h,m)},[m,c]);return[f,(0,o.useCallback)(o=>{let l=e=>{switch(s(e,p,g,h,m),e){case 1:v>=0&&(h.current=((...e)=>setTimeout(...e))(C,v));break;case 4:b>=0&&(h.current=((...e)=>setTimeout(...e))(C,b));break;case 0:case 3:h.current=((...e)=>setTimeout(...e))(()=>{isNaN(document.body.offsetTop)||l(e+1)},0)}},i=g.current.isEnter;"boolean"!=typeof o&&(o=!i),o?i||l(e?+!r:2):i&&l(t?n?3:4:a(c))},[C,m,e,t,r,n,v,b,c]),C]})({timeout:50});return(0,o.useEffect)(()=>{H(E)},[E]),o.default.createElement("button",Object.assign({ref:(0,d.mergeRefs)([n,O.refs.setReference]),className:(0,u.tremorTwMerge)(g("root"),"shrink-0 inline-flex justify-center items-center group font-medium outline-none",M,R.paddingX,R.paddingY,R.fontSize,A.textColor,A.bgColor,A.borderColor,A.hoverBorderColor,N?"opacity-50 cursor-not-allowed":(0,u.tremorTwMerge)(p(C,b).hoverTextColor,p(C,b).hoverBgColor,p(C,b).hoverBorderColor),w),disabled:N},D,T),o.default.createElement(r.default,Object.assign({text:S},O)),P&&m!==i.HorizontalPositions.Right?o.default.createElement(h,{loading:E,iconSize:I,iconPosition:m,Icon:c,transitionStatus:L.status,needMargin:B}):null,F||k?o.default.createElement("span",{className:(0,u.tremorTwMerge)(g("text"),"text-tremor-default whitespace-nowrap")},F?y:k):null,P&&m===i.HorizontalPositions.Right?o.default.createElement(h,{loading:E,iconSize:I,iconPosition:m,Icon:c,transitionStatus:L.status,needMargin:B}):null)});v.displayName="Button",e.s(["Button",0,v],994388)},2788,e=>{"use strict";let t;var r=e.i(700020),o=((t=o||{})[t.None=1]="None",t[t.Focusable=2]="Focusable",t[t.Hidden=4]="Hidden",t);let n=(0,r.forwardRefWithAs)(function(e,t){var o;let{features:n=1,...l}=e,a={ref:t,"aria-hidden":(2&n)==2||(null!=(o=l["aria-hidden"])?o:void 0),hidden:(4&n)==4||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(4&n)==4&&(2&n)!=2&&{display:"none"}}};return(0,r.useRender)()({ourProps:a,theirProps:l,slot:{},defaultTag:"span",name:"Hidden"})});e.s(["Hidden",0,n,"HiddenFeatures",0,o])},652265,e=>{"use strict";let t,r,o,n,l;e.i(544508);var a=e.i(397701),s=e.i(402155);let i=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(","),u=["[data-autofocus]"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var d=((t=d||{})[t.First=1]="First",t[t.Previous=2]="Previous",t[t.Next=4]="Next",t[t.Last=8]="Last",t[t.WrapAround=16]="WrapAround",t[t.NoScroll=32]="NoScroll",t[t.AutoFocus=64]="AutoFocus",t),c=((r=c||{})[r.Error=0]="Error",r[r.Overflow=1]="Overflow",r[r.Success=2]="Success",r[r.Underflow=3]="Underflow",r),m=((o=m||{})[o.Previous=-1]="Previous",o[o.Next=1]="Next",o);function f(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(i)).sort((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER)))}var p=((n=p||{})[n.Strict=0]="Strict",n[n.Loose=1]="Loose",n),g=((l=g||{})[l.Keyboard=0]="Keyboard",l[l.Mouse=1]="Mouse",l);function h(e,t=e=>e){return e.slice().sort((e,r)=>{let o=t(e),n=t(r);if(null===o||null===n)return 0;let l=o.compareDocumentPosition(n);return l&Node.DOCUMENT_POSITION_FOLLOWING?-1:l&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function v(e,t,{sorted:r=!0,relativeTo:o=null,skipElements:n=[]}={}){var l,a,s;let i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,d=Array.isArray(e)?r?h(e):e:64&t?function(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(u)).sort((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER)))}(e):f(e);n.length>0&&d.length>1&&(d=d.filter(e=>!n.some(t=>null!=t&&"current"in t?(null==t?void 0:t.current)===e:t===e))),o=null!=o?o:i.activeElement;let c=(()=>{if(5&t)return 1;if(10&t)return -1;throw Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),m=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,d.indexOf(o))-1;if(4&t)return Math.max(0,d.indexOf(o))+1;if(8&t)return d.length-1;throw Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),p=32&t?{preventScroll:!0}:{},g=0,b=d.length,C;do{if(g>=b||g+b<=0)return 0;let e=m+g;if(16&t)e=(e+b)%b;else{if(e<0)return 3;if(e>=b)return 1}null==(C=d[e])||C.focus(p),g+=c}while(C!==i.activeElement)return 6&t&&null!=(s=null==(a=null==(l=C)?void 0:l.matches)?void 0:a.call(l,"textarea,input"))&&s&&C.select(),2}"u">typeof window&&"u">typeof document&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{1===e.detail?delete document.documentElement.dataset.headlessuiFocusVisible:0===e.detail&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0)),e.s(["Focus",0,d,"FocusResult",0,c,"FocusableMode",0,p,"focusFrom",0,function(e,t){return v(f(),t,{relativeTo:e})},"focusIn",0,v,"getFocusableElements",0,f,"isFocusableElement",0,function(e,t=0){var r;return e!==(null==(r=(0,s.getOwnerDocument)(e))?void 0:r.body)&&(0,a.match)(t,{0:()=>e.matches(i),1(){let t=e;for(;null!==t;){if(t.matches(i))return!0;t=t.parentElement}return!1}})},"sortByDomNode",0,h])},553521,e=>{"use strict";var t=e.i(271645),r=e.i(835696);e.s(["useIsMounted",0,function(){let e=(0,t.useRef)(!1);return(0,r.useIsoMorphicEffect)(()=>(e.current=!0,()=>{e.current=!1}),[]),e}])},695411,e=>{"use strict";var t=e.i(602869);let r=async e=>{try{let r=await (0,t.modelHubCall)(e);if(r?.data.length>0){let e=r.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,r])},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,o,n){let[l,a]=(0,t.useState)(n),s=void 0!==e,i=(0,t.useRef)(s),u=(0,t.useRef)(!1),d=(0,t.useRef)(!1);return!s||i.current||u.current?s||!i.current||d.current||(d.current=!0,i.current=s,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.")):(u.current=!0,i.current=s,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.")),[s?e:l,(0,r.useEvent)(e=>(s||a(e),null==o?void 0:o(e)))]}],503269),e.s(["useDefaultValue",0,function(e){let[r]=(0,t.useState)(e);return r}],214520);let o=(0,t.createContext)(void 0);function n(){return(0,t.useContext)(o)}e.s(["useDisabled",0,n],601893);var l=e.i(174080),a=e.i(746725);function s(e={},t=null,r=[]){for(let[o,n]of Object.entries(e))!function e(t,r,o){if(Array.isArray(o))for(let[n,l]of o.entries())e(t,i(r,n.toString()),l);else o instanceof Date?t.push([r,o.toISOString()]):"boolean"==typeof o?t.push([r,o?"1":"0"]):"string"==typeof o?t.push([r,o]):"number"==typeof o?t.push([r,`${o}`]):null==o?t.push([r,""]):s(o,r,t)}(r,i(t,o),n);return r}function i(e,t){return e?e+"["+t+"]":t}e.s(["attemptSubmit",0,function(e){var t,r;let o=null!=(t=null==e?void 0:e.form)?t:e.closest("form");if(o){for(let t of o.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=o.requestSubmit)||r.call(o)}},"objectToFormEntries",0,s],694421);var u=e.i(700020),d=e.i(2788);let c=(0,t.createContext)(null);function m({children:e}){let r=(0,t.useContext)(c);if(!r)return t.default.createElement(t.default.Fragment,null,e);let{target:o}=r;return o?(0,l.createPortal)(t.default.createElement(t.default.Fragment,null,e),o):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(d.Hidden,{features:d.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:o,onReset:n,overrides:l}){let[i,c]=(0,t.useState)(null),p=(0,a.useDisposables)();return(0,t.useEffect)(()=>{if(n&&i)return p.addEventListener(i,"reset",n)},[i,r,n]),t.default.createElement(m,null,t.default.createElement(f,{setForm:c,formId:r}),s(e).map(([e,n])=>t.default.createElement(d.Hidden,{features:d.HiddenFeatures.Hidden,...(0,u.compact)({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,form:r,disabled:o,name:e,value:n,...l})})))}],140721);let p=(0,t.createContext)(void 0);function g(){return(0,t.useContext)(p)}e.s(["useProvidedId",0,g],942803);var h=e.i(835696),v=e.i(294316);let b=(0,t.createContext)(null);b.displayName="DescriptionContext";let C=Object.assign((0,u.forwardRefWithAs)(function(e,r){let o=(0,t.useId)(),l=n(),{id:a=`headlessui-description-${o}`,...s}=e,i=function e(){let r=(0,t.useContext)(b);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}(),d=(0,v.useSyncRefs)(r);(0,h.useIsoMorphicEffect)(()=>i.register(a),[a,i.register]);let c=l||!1,m=(0,t.useMemo)(()=>({...i.slot,disabled:c}),[i.slot,c]),f={ref:d,...i.props,id:a};return(0,u.useRender)()({ourProps:f,theirProps:s,slot:m,defaultTag:"p",name:i.name||"Description"})}),{});e.s(["Description",0,C,"useDescribedBy",0,function(){var e,r;return null!=(r=null==(e=(0,t.useContext)(b))?void 0:e.value)?r:void 0},"useDescriptions",0,function(){let[e,o]=(0,t.useState)([]);return[e.length>0?e.join(" "):void 0,(0,t.useMemo)(()=>function(e){let n=(0,r.useEvent)(e=>(o(t=>[...t,e]),()=>o(t=>{let r=t.slice(),o=r.indexOf(e);return -1!==o&&r.splice(o,1),r}))),l=(0,t.useMemo)(()=>({register:n,slot:e.slot,name:e.name,props:e.props,value:e.value}),[n,e.slot,e.name,e.props,e.value]);return t.default.createElement(b.Provider,{value:l},e.children)},[o])]}],35889);let x=(0,t.createContext)(null);function E(e){var r,o,n;let l=null!=(o=null==(r=(0,t.useContext)(x))?void 0:r.value)?o:void 0;return(null!=(n=null==e?void 0:e.length)?n:0)>0?[l,...e].filter(Boolean).join(" "):l}x.displayName="LabelContext";let y=Object.assign((0,u.forwardRefWithAs)(function(e,o){var l;let a=(0,t.useId)(),s=function e(){let r=(0,t.useContext)(x);if(null===r){let t=Error("You used a