From ee5a9d0aa0588821bce3bb8575ab1989bec24238 Mon Sep 17 00:00:00 2001 From: Din Date: Thu, 11 Sep 2025 14:53:37 +0100 Subject: [PATCH 01/29] propagate execution context into logging tasks --- litellm/litellm_core_utils/logging_worker.py | 81 ++++++++++++------- .../test_litellm_logging.py | 70 ++++++++++++++++ .../litellm_core_utils/test_logging_worker.py | 79 ++++++++++++++++++ 3 files changed, 202 insertions(+), 28 deletions(-) diff --git a/litellm/litellm_core_utils/logging_worker.py b/litellm/litellm_core_utils/logging_worker.py index 3f83719dd32..16860ad6852 100644 --- a/litellm/litellm_core_utils/logging_worker.py +++ b/litellm/litellm_core_utils/logging_worker.py @@ -1,10 +1,21 @@ import asyncio import contextlib -from typing import Coroutine, Optional +import contextvars +from typing import Coroutine, Optional, TypedDict from litellm._logging import verbose_logger +class LoggingTask(TypedDict): + """ + A logging task with its associated context to ensure logging is executed in + the original task's context. + """ + + coroutine: Coroutine + context: contextvars.Context + + class LoggingWorker: """ A simple, async logging worker that processes log coroutines in the background. @@ -13,77 +24,84 @@ class LoggingWorker: This leads to a +200 RPS performance improvement when using LiteLLM Python SDK or Proxy Server. - Use this to queue coroutine tasks that are not critical to the main flow of the application. e.g Success/Error callbacks, logging, etc. """ + LOGGING_WORKER_MAX_QUEUE_SIZE = 50_000 LOGGING_WORKER_MAX_TIME_PER_COROUTINE = 20.0 MAX_ITERATIONS_TO_CLEAR_QUEUE = 200 MAX_TIME_TO_CLEAR_QUEUE = 5.0 - + def __init__( - self, - timeout: float = LOGGING_WORKER_MAX_TIME_PER_COROUTINE, + self, + timeout: float = LOGGING_WORKER_MAX_TIME_PER_COROUTINE, max_queue_size: int = LOGGING_WORKER_MAX_QUEUE_SIZE, ): self.timeout = timeout self.max_queue_size = max_queue_size - self._queue: Optional[asyncio.Queue] = None + self._queue: Optional[asyncio.Queue[LoggingTask]] = None self._worker_task: Optional[asyncio.Task] = None - + def _ensure_queue(self) -> None: """Initialize the queue if it doesn't exist.""" if self._queue is None: self._queue = asyncio.Queue(maxsize=self.max_queue_size) - + def start(self) -> None: """Start the logging worker. Idempotent - safe to call multiple times.""" self._ensure_queue() if self._worker_task is None or self._worker_task.done(): self._worker_task = asyncio.create_task(self._worker_loop()) - + async def _worker_loop(self) -> None: """Main worker loop that processes log coroutines sequentially.""" try: if self._queue is None: return - + while True: # Process one coroutine at a time to keep event loop load predictable - coroutine = await self._queue.get() + task = await self._queue.get() try: - await asyncio.wait_for(coroutine, timeout=self.timeout) + # Run the coroutine in its original context + await asyncio.wait_for( + task["context"].run(asyncio.create_task, task["coroutine"]), + timeout=self.timeout, + ) except Exception as e: verbose_logger.exception(f"LoggingWorker error: {e}") pass finally: self._queue.task_done() - + except asyncio.CancelledError: verbose_logger.debug("LoggingWorker cancelled during shutdown") # Attempt to clear remaining items to prevent "never awaited" warnings await self.clear_queue() - + def enqueue(self, coroutine: Coroutine) -> None: """ - Add a coroutine to the logging queue. + Add a coroutine to the logging queue. Hot path: never blocks, drops logs if queue is full. """ if self._queue is None: return - + try: - self._queue.put_nowait(coroutine) + # Capture the current context when enqueueing + task = LoggingTask(coroutine=coroutine, context=contextvars.copy_context()) + self._queue.put_nowait(task) except asyncio.QueueFull as e: verbose_logger.exception(f"LoggingWorker queue is full: {e}") # Drop logs on overload to protect request throughput pass - + def ensure_initialized_and_enqueue(self, async_coroutine: Coroutine): """ Ensure the logging worker is initialized and enqueue the coroutine. """ self.start() self.enqueue(async_coroutine) - + async def stop(self) -> None: """Stop the logging worker and clean up resources.""" if self._worker_task: @@ -91,34 +109,42 @@ class LoggingWorker: with contextlib.suppress(Exception): await self._worker_task self._worker_task = None - + async def flush(self) -> None: """Flush the logging queue.""" if self._queue is None: return while not self._queue.empty(): await self._queue.join() - + async def clear_queue(self): """ Clear the queue with a maximum time limit. """ if self._queue is None: return - + start_time = asyncio.get_event_loop().time() - + for _ in range(self.MAX_ITERATIONS_TO_CLEAR_QUEUE): # Check if we've exceeded the maximum time - if asyncio.get_event_loop().time() - start_time >= self.MAX_TIME_TO_CLEAR_QUEUE: - verbose_logger.warning(f"clear_queue exceeded max_time of {self.MAX_TIME_TO_CLEAR_QUEUE}s, stopping early") + if ( + asyncio.get_event_loop().time() - start_time + >= self.MAX_TIME_TO_CLEAR_QUEUE + ): + verbose_logger.warning( + f"clear_queue exceeded max_time of {self.MAX_TIME_TO_CLEAR_QUEUE}s, stopping early" + ) break - + try: - coroutine = self._queue.get_nowait() + task = self._queue.get_nowait() # Await the coroutine to properly execute and avoid "never awaited" warnings try: - await asyncio.wait_for(coroutine, timeout=self.timeout) + await asyncio.wait_for( + task["context"].run(asyncio.create_task, task["coroutine"]), + timeout=self.timeout, + ) except Exception: # Suppress errors during cleanup pass @@ -129,4 +155,3 @@ class LoggingWorker: # Global instance for backward compatibility GLOBAL_LOGGING_WORKER = LoggingWorker() - 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 48a22dcc8af..fa5164b9c16 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -467,3 +467,73 @@ async def test_e2e_generate_cold_storage_object_key_not_configured(): assert result is None +@pytest.mark.asyncio +async def test_logging_opentelemetry_context_propagation(): + """ + Test that OpenTelemtry context propagation works with async completion. + """ + import asyncio + import litellm + + from litellm.integrations.custom_logger import CustomLogger + from opentelemetry import trace + from opentelemetry.sdk.trace import TracerProvider + from opentelemetry.sdk.trace.export import SimpleSpanProcessor + from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter + + provider = TracerProvider() + exporter = InMemorySpanExporter() + provider.add_span_processor(SimpleSpanProcessor(exporter)) + trace.set_tracer_provider(provider) + tracer = trace.get_tracer(__name__) + + class MockOpenTelemetryLogger(CustomLogger): + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): + span = tracer.start_span(start_time=start_time.timestamp() * 1e9, name="async_log_success_event") + span.end(end_time=end_time) + + + mock_logging_obj = MockOpenTelemetryLogger() + + litellm.callbacks = [mock_logging_obj] + + with tracer.start_as_current_span("span_1") as span: + span_1_id = span.get_span_context().span_id + await litellm.acompletion( + max_tokens=100, + messages=[{"role": "user", "content": "Hey"}], + model="openai/codex-mini-latest", + mock_response="Hello, world!", + ) + + + with tracer.start_as_current_span("span_2") as span: + span_2_id = span.get_span_context().span_id + await litellm.acompletion( + max_tokens=100, + messages=[{"role": "user", "content": "Hey"}], + model="openai/codex-mini-latest", + mock_response="Hello, world!", + ) + + await asyncio.sleep(1) + spans = exporter.get_finished_spans() + assert len(spans) == 4 + assert span_1_id != span_2_id + sorted_spans = sorted(list(spans), key=lambda x: x.start_time or 0) + + assert sorted_spans[0].name == "span_1" + assert sorted_spans[1].name == "async_log_success_event" + assert sorted_spans[2].name == "span_2" + assert sorted_spans[3].name == "async_log_success_event" + + first_span_context = sorted_spans[0].get_span_context() + assert first_span_context is not None and first_span_context.span_id == span_1_id + second_span_context = sorted_spans[2].get_span_context() + assert second_span_context is not None and second_span_context.span_id == span_2_id + first_completion_span_parent = sorted_spans[1].parent + assert first_completion_span_parent is not None and first_completion_span_parent.span_id == span_1_id + + # This check would fail without the proper context propagation, and span[3] would end up with span_1_id as the parent + second_completion_span_parent = sorted_spans[3].parent + assert second_completion_span_parent is not None and second_completion_span_parent.span_id == span_2_id diff --git a/tests/test_litellm/litellm_core_utils/test_logging_worker.py b/tests/test_litellm/litellm_core_utils/test_logging_worker.py index 24c77339025..47e626e04af 100644 --- a/tests/test_litellm/litellm_core_utils/test_logging_worker.py +++ b/tests/test_litellm/litellm_core_utils/test_logging_worker.py @@ -2,6 +2,7 @@ Tests for the LoggingWorker class to ensure graceful shutdown handling. """ import asyncio +import contextvars import pytest from unittest.mock import AsyncMock, patch @@ -139,3 +140,81 @@ class TestLoggingWorker: # Should have logged queue full exceptions exception_calls = [call for call in mock_logger.exception.call_args_list if "queue is full" in str(call)] assert len(exception_calls) > 0 + + @pytest.mark.asyncio + async def test_context_propagation(self, logging_worker): + """Test that enqueued tasks execute in their original context.""" + # Create a context variable for testing + test_context_var: contextvars.ContextVar[str] = contextvars.ContextVar('test_context_var') + + # Track results from multiple tasks + task_results = [] + + async def test_task(task_id: str): + """A test coroutine that checks if it can access the context variable.""" + # Sleep a bit to simulate real work and ensure context persists + await asyncio.sleep(0.1) + + try: + # Try to get the context variable value + value = test_context_var.get() + task_results.append({ + 'task_id': task_id, + 'context_value': value, + 'context_accessible': True + }) + except LookupError: + # Context variable not found + task_results.append({ + 'task_id': task_id, + 'context_accessible': False, + 'context_value': None + }) + + # Start the logging worker + logging_worker.start() + + # Create two separate contexts and enqueue tasks from each + + # Context 1: Set context var to "context_1" + ctx1 = contextvars.copy_context() + ctx1.run(test_context_var.set, "context_1") + ctx1.run(logging_worker.enqueue, test_task("task_1")) + + # Context 2: Set context var to "context_2" + ctx2 = contextvars.copy_context() + ctx2.run(test_context_var.set, "context_2") + ctx2.run(logging_worker.enqueue, test_task("task_2")) + + # Context 3: No context variable set (should get LookupError) + ctx3 = contextvars.copy_context() + ctx3.run(logging_worker.enqueue, test_task("task_3")) + + # Wait for all tasks to be processed + await asyncio.sleep(0.5) + + # Stop the worker + await logging_worker.stop() + + # Sort results by task_id for consistent testing + task_results.sort(key=lambda x: x['task_id']) + + # Verify that each task saw its own context + assert len(task_results) == 3, f"Expected 3 results, got {len(task_results)}" + + # Task 1 should see "context_1" + task1_result = next((r for r in task_results if r['task_id'] == 'task_1'), None) + assert task1_result is not None, "Task 1 result not found" + assert task1_result['context_accessible'] is True, "Task 1 should have access to context variable" + assert task1_result['context_value'] == "context_1", f"Task 1 should see 'context_1', got: {task1_result['context_value']}" + + # Task 2 should see "context_2" + task2_result = next((r for r in task_results if r['task_id'] == 'task_2'), None) + assert task2_result is not None, "Task 2 result not found" + assert task2_result['context_accessible'] is True, "Task 2 should have access to context variable" + assert task2_result['context_value'] == "context_2", f"Task 2 should see 'context_2', got: {task2_result['context_value']}" + + # Task 3 should not have access to the context variable + task3_result = next((r for r in task_results if r['task_id'] == 'task_3'), None) + assert task3_result is not None, "Task 3 result not found" + assert task3_result['context_accessible'] is False, "Task 3 should not have access to context variable" From 090e0fddf4d1b51cdd19afb839393eb41ed25105 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 11 Sep 2025 22:20:54 +0530 Subject: [PATCH 02/29] fix vertex ai file upload --- .../openai_files_endpoints/files_endpoints.py | 23 ++ .../test_files_endpoint.py | 173 +++++++++++ .../test_vertex_ai_files_regression.py | 271 ++++++++++++++++++ 3 files changed, 467 insertions(+) create mode 100644 tests/test_litellm/proxy/openai_files_endpoint/test_vertex_ai_files_regression.py diff --git a/litellm/proxy/openai_files_endpoints/files_endpoints.py b/litellm/proxy/openai_files_endpoints/files_endpoints.py index f2a7ccccdf9..143e208a94b 100644 --- a/litellm/proxy/openai_files_endpoints/files_endpoints.py +++ b/litellm/proxy/openai_files_endpoints/files_endpoints.py @@ -69,6 +69,29 @@ def get_files_provider_config( ): global files_config if custom_llm_provider == "vertex_ai": + # For Vertex AI, extract config from model_list instead of files_config + from litellm.proxy.proxy_server import proxy_config + + if hasattr(proxy_config, "config") and "model_list" in proxy_config.config: + for model in proxy_config.config["model_list"]: + if isinstance(model, dict) and "litellm_params" in model: + litellm_params = model["litellm_params"] + if litellm_params.get("model", "").startswith("vertex_ai/"): + # Extract vertex_ai specific parameters + vertex_config = {} + if "vertex_project" in litellm_params: + vertex_config["vertex_project"] = litellm_params[ + "vertex_project" + ] + if "vertex_location" in litellm_params: + vertex_config["vertex_location"] = litellm_params[ + "vertex_location" + ] + if "vertex_credentials" in litellm_params: + vertex_config["vertex_credentials"] = litellm_params[ + "vertex_credentials" + ] + return vertex_config return None if files_config is None: raise ValueError("files_settings is not set, set it on your config.yaml file.") 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 710e4265013..73c5c51ab91 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 @@ -476,3 +476,176 @@ def test_create_file_for_each_model( openai_call_found = True break assert openai_call_found, "OpenAI call not found with expected parameters" + + +def test_get_files_provider_config_vertex_ai_with_model_list(): + """ + Test that get_files_provider_config correctly extracts Vertex AI config from model_list + This test verifies the fix for the proxy file upload issue + """ + from litellm.proxy.openai_files_endpoints.files_endpoints import get_files_provider_config, files_config + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with a model_list containing Vertex AI configuration + mock_config = { + 'model_list': [ + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'test-project-123', + 'vertex_location': 'us-central1', + 'vertex_credentials': '/path/to/service_account.json' + } + }, + { + 'model_name': 'gpt-3.5-turbo', + 'litellm_params': { + 'model': 'openai/gpt-3.5-turbo', + 'api_key': 'test-key' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + # Mock files_config to avoid ValueError for non-vertex_ai providers + original_files_config = files_config + import litellm.proxy.openai_files_endpoints.files_endpoints + litellm.proxy.openai_files_endpoints.files_endpoints.files_config = [] + + try: + # Test that vertex_ai provider returns the correct config + result = get_files_provider_config('vertex_ai') + + assert result is not None, "get_files_provider_config should return config for vertex_ai" + assert result['vertex_project'] == 'test-project-123' + assert result['vertex_location'] == 'us-central1' + assert result['vertex_credentials'] == '/path/to/service_account.json' + + # Test that non-vertex_ai providers still work as before + result_openai = get_files_provider_config('openai') + assert result_openai is None # Should return None when files_config is empty + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + # Restore original files_config + litellm.proxy.openai_files_endpoints.files_endpoints.files_config = original_files_config + + +def test_get_files_provider_config_vertex_ai_no_model_list(): + """ + Test that get_files_provider_config returns None when no model_list is available + This ensures graceful handling when proxy_config is not properly initialized + """ + from litellm.proxy.openai_files_endpoints.files_endpoints import get_files_provider_config + from litellm.proxy.proxy_server import proxy_config + + # Mock proxy_config without model_list + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = {} + + try: + result = get_files_provider_config('vertex_ai') + assert result is None, "get_files_provider_config should return None when no model_list" + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_get_files_provider_config_vertex_ai_no_vertex_models(): + """ + Test that get_files_provider_config returns None when no vertex_ai models are in model_list + This ensures the function handles cases where only non-vertex models are configured + """ + from litellm.proxy.openai_files_endpoints.files_endpoints import get_files_provider_config + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with a model_list containing only non-Vertex AI models + mock_config = { + 'model_list': [ + { + 'model_name': 'gpt-3.5-turbo', + 'litellm_params': { + 'model': 'openai/gpt-3.5-turbo', + 'api_key': 'test-key' + } + }, + { + 'model_name': 'claude-3', + 'litellm_params': { + 'model': 'anthropic/claude-3', + 'api_key': 'test-key' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + assert result is None, "get_files_provider_config should return None when no vertex_ai models in model_list" + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_get_files_provider_config_vertex_ai_partial_config(): + """ + Test that get_files_provider_config handles partial Vertex AI configuration gracefully + This ensures the function works even when some vertex_ai parameters are missing + """ + from litellm.proxy.openai_files_endpoints.files_endpoints import get_files_provider_config + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with partial Vertex AI configuration + mock_config = { + 'model_list': [ + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'test-project-123', + # Missing vertex_location and vertex_credentials + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + assert result is not None, "get_files_provider_config should return config even with partial vertex_ai params" + assert result['vertex_project'] == 'test-project-123' + assert 'vertex_location' not in result + assert 'vertex_credentials' not in result + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_vertex_ai_files_regression.py b/tests/test_litellm/proxy/openai_files_endpoint/test_vertex_ai_files_regression.py new file mode 100644 index 00000000000..e67d70d7602 --- /dev/null +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_vertex_ai_files_regression.py @@ -0,0 +1,271 @@ +""" +Regression tests for Vertex AI file upload functionality in the proxy. + +This module contains tests to ensure that the fix for Vertex AI file uploads +in the proxy server continues to work and prevents regression of the issue +where get_files_provider_config returned None for vertex_ai provider. +""" + +import pytest +from unittest.mock import Mock, patch +from litellm.proxy.openai_files_endpoints.files_endpoints import get_files_provider_config + + +def test_vertex_ai_files_provider_config_never_returns_none_when_configured(): + """ + Regression test: Ensure that get_files_provider_config never returns None + for vertex_ai when properly configured in model_list. + + This test prevents regression of the bug where vertex_ai provider + always returned None, causing "Could not resolve project_id" errors. + """ + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with a proper Vertex AI configuration + mock_config = { + 'model_list': [ + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'test-project-123', + 'vertex_location': 'us-central1', + 'vertex_credentials': '/path/to/service_account.json' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + # This should NEVER be None when vertex_ai is properly configured + assert result is not None, ( + "CRITICAL REGRESSION: get_files_provider_config returned None for vertex_ai " + "when it should return configuration. This would cause 'Could not resolve project_id' errors." + ) + + # Verify all expected parameters are present + assert 'vertex_project' in result + assert 'vertex_location' in result + assert 'vertex_credentials' in result + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_vertex_ai_files_provider_config_handles_multiple_vertex_models(): + """ + Test that get_files_provider_config correctly handles multiple Vertex AI models + in the model_list and returns configuration from the first one found. + """ + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with multiple Vertex AI models + mock_config = { + 'model_list': [ + { + 'model_name': 'gemini-1.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-1.5-flash', + 'vertex_project': 'project-1', + 'vertex_location': 'us-east1', + 'vertex_credentials': '/path/to/creds1.json' + } + }, + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'project-2', + 'vertex_location': 'us-central1', + 'vertex_credentials': '/path/to/creds2.json' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + assert result is not None, "Should return config when multiple vertex_ai models are present" + + # Should return config from the first vertex_ai model found + assert result['vertex_project'] == 'project-1' + assert result['vertex_location'] == 'us-east1' + assert result['vertex_credentials'] == '/path/to/creds1.json' + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_vertex_ai_files_provider_config_ignores_non_vertex_models(): + """ + Test that get_files_provider_config correctly identifies vertex_ai models + and ignores other model types when searching for configuration. + """ + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with mixed model types + mock_config = { + 'model_list': [ + { + 'model_name': 'gpt-3.5-turbo', + 'litellm_params': { + 'model': 'openai/gpt-3.5-turbo', + 'api_key': 'test-key' + } + }, + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'test-project', + 'vertex_location': 'us-central1', + 'vertex_credentials': '/path/to/creds.json' + } + }, + { + 'model_name': 'claude-3', + 'litellm_params': { + 'model': 'anthropic/claude-3', + 'api_key': 'test-key' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + assert result is not None, "Should find vertex_ai config even with mixed model types" + assert result['vertex_project'] == 'test-project' + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_vertex_ai_files_provider_config_handles_malformed_model_list(): + """ + Test that get_files_provider_config gracefully handles malformed model_list entries + without crashing. + """ + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with malformed entries + mock_config = { + 'model_list': [ + # Missing litellm_params + { + 'model_name': 'gemini-2.5-flash' + }, + # Missing model field + { + 'model_name': 'gemini-1.5-flash', + 'litellm_params': { + 'vertex_project': 'test-project' + } + }, + # Valid vertex_ai model + { + 'model_name': 'gemini-2.0-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.0-flash', + 'vertex_project': 'test-project', + 'vertex_location': 'us-central1', + 'vertex_credentials': '/path/to/creds.json' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + # Should still work and find the valid vertex_ai model + assert result is not None, "Should handle malformed entries and find valid vertex_ai model" + assert result['vertex_project'] == 'test-project' + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') + + +def test_vertex_ai_files_provider_config_old_behavior_regression(): + """ + Regression test: Ensure that the old behavior of always returning None + for vertex_ai provider is completely eliminated. + + This test specifically checks that the function no longer has the old + hardcoded return None for vertex_ai. + """ + from litellm.proxy.proxy_server import proxy_config + + # Mock the proxy_config with a minimal but valid Vertex AI configuration + mock_config = { + 'model_list': [ + { + 'model_name': 'gemini-2.5-flash', + 'litellm_params': { + 'model': 'vertex_ai/gemini-2.5-flash', + 'vertex_project': 'minimal-project' + } + } + ] + } + + # Mock proxy_config.config + original_config = getattr(proxy_config, 'config', None) + proxy_config.config = mock_config + + try: + result = get_files_provider_config('vertex_ai') + + # The old behavior would always return None here + # The new behavior should return the configuration + assert result is not None, ( + "REGRESSION DETECTED: The old behavior of returning None for vertex_ai " + "has returned. This indicates the fix has been reverted." + ) + + # Verify we get the expected configuration + assert isinstance(result, dict), "Result should be a dictionary" + assert 'vertex_project' in result, "Should contain vertex_project" + + finally: + # Restore original config + if original_config is not None: + proxy_config.config = original_config + else: + delattr(proxy_config, 'config') From e9e548d797ed857e9ebbb9e0f6cde82ee0e98d6d Mon Sep 17 00:00:00 2001 From: Burt Holzman Date: Fri, 5 Sep 2025 16:47:12 -0500 Subject: [PATCH 03/29] Fix provider budgets --- .../spend_management_endpoints.py | 20 ++-- .../test_spend_management_endpoints.py | 94 +++++++++++++++++++ 2 files changed, 108 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/spend_tracking/spend_management_endpoints.py b/litellm/proxy/spend_tracking/spend_management_endpoints.py index 7376c3a402b..affffaeea09 100644 --- a/litellm/proxy/spend_tracking/spend_management_endpoints.py +++ b/litellm/proxy/spend_tracking/spend_management_endpoints.py @@ -10,6 +10,7 @@ from fastapi import APIRouter, Depends, HTTPException, status import litellm from litellm._logging import verbose_proxy_logger +from litellm.router_strategy.budget_limiter import RouterBudgetLimiting from litellm.proxy._types import * from litellm.proxy._types import ProviderBudgetResponse, ProviderBudgetResponseObject from litellm.proxy.auth.user_api_key_auth import user_api_key_auth @@ -2765,16 +2766,23 @@ async def provider_budgets() -> ProviderBudgetResponse: provider_budget_response_dict: Dict[str, ProviderBudgetResponseObject] = {} for _provider, _budget_info in provider_budget_config.items(): - if llm_router.router_budget_logger is None: + router_budget_logger = next( + ( + cb + for cb in (llm_router.optional_callbacks or []) + if isinstance(cb, RouterBudgetLimiting) + ), + None, + ) + if router_budget_logger is None: raise ValueError("No router budget logger found") _provider_spend = ( - await llm_router.router_budget_logger._get_current_provider_spend( + await router_budget_logger._get_current_provider_spend(_provider) or 0.0 + ) + _provider_budget_ttl = ( + await router_budget_logger._get_current_provider_budget_reset_at( _provider ) - or 0.0 - ) - _provider_budget_ttl = await llm_router.router_budget_logger._get_current_provider_budget_reset_at( - _provider ) provider_budget_response_object = ProviderBudgetResponseObject( budget_limit=_budget_info.max_budget, diff --git a/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py b/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py index d9ae0665ead..069896e9fb4 100644 --- a/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py +++ b/tests/test_litellm/proxy/spend_tracking/test_spend_management_endpoints.py @@ -18,7 +18,9 @@ import litellm from litellm.proxy._types import SpendLogsPayload from litellm.proxy.hooks.proxy_track_cost_callback import _ProxyDBLogger from litellm.proxy.proxy_server import app, prisma_client +from litellm.proxy.spend_tracking import spend_management_endpoints from litellm.router import Router +from litellm.types.utils import BudgetConfig ignored_keys = [ "request_id", @@ -32,6 +34,18 @@ ignored_keys = [ "metadata.cold_storage_object_key", ] +MODEL_LIST = [ + { + "model_name": "azure-gpt-4o", + "litellm_params": { + "model": "azure/gpt-4o-mini", + "mock_response": "Hello, world!", + "tags": ["default"], + "base_model": "gpt-4o-mini", + }, + }, +] + @pytest.fixture def client(): @@ -43,6 +57,19 @@ def add_anthropic_api_key_to_env(monkeypatch): monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-ant-api03-1234567890") +@pytest.fixture +def disable_budget_sync(monkeypatch): + """Disable periodic sync during tests""" + + async def noop(*a, **k): + return None + + monkeypatch.setattr( + "litellm.router_strategy.budget_limiter.RouterBudgetLimiting.periodic_sync_in_memory_spend_with_redis", + noop, + ) + + @pytest.mark.asyncio async def test_ui_view_spend_logs_with_user_id(client, monkeypatch): # Mock data for the test @@ -1318,3 +1345,70 @@ async def test_view_spend_tags_no_database(client, monkeypatch): # Check the actual error message structure assert "error" in data assert "Database not connected" in data["error"]["message"] + + +@pytest.mark.asyncio +async def test_provider_budget_under(disable_budget_sync): + """Test that router allows completion when under budget""" + provider_budget_config = { + "azure": BudgetConfig(max_budget=0.01, budget_duration="10d") + } + + router = Router( + enable_pre_call_checks=True, + provider_budget_config=provider_budget_config, + model_list=MODEL_LIST, + ) + + response = await router.acompletion( + model="azure-gpt-4o", + messages=[{"role": "user", "content": "Hello, world!"}], + ) + + assert response is not None + + +@pytest.mark.asyncio +async def test_provider_budget_over(disable_budget_sync): + """Test that router allows completion when over budget""" + provider_budget_config = { + "azure": BudgetConfig(max_budget=-0.01, budget_duration="10d") + } + + router = Router( + num_retries=0, + enable_pre_call_checks=True, + provider_budget_config=provider_budget_config, + model_list=MODEL_LIST, + ) + + with pytest.raises(Exception) as e: + response = await router.acompletion( + model="azure-gpt-4o", + messages=[{"role": "user", "content": "Hello, world!"}], + ) + assert "Exceeded budget for provider" in str(e.value) + + +@pytest.mark.asyncio +async def test_provider_budget_provider_budgets(disable_budget_sync): + """Test that provider_budgets() returns correct values""" + provider = "azure" + max_budget = -0.01 + budget_duration = "10d" + provider_budget_config = { + provider: BudgetConfig(max_budget=max_budget, budget_duration=budget_duration) + } + + router = Router( + num_retries=0, + enable_pre_call_checks=True, + provider_budget_config=provider_budget_config, + model_list=MODEL_LIST, + ) + + with patch("litellm.proxy.proxy_server.llm_router", router): + response = await spend_management_endpoints.provider_budgets() + provider_budget_response = response.providers[provider] + assert provider_budget_response.budget_limit == max_budget + assert provider_budget_response.time_period == budget_duration From 5c3d407b7a7764c85bd5304a8830cb30f1941858 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Thu, 11 Sep 2025 14:38:25 -0700 Subject: [PATCH 04/29] Revert "Add additionalProperties to vertex ai Schema definition" --- litellm/types/llms/vertex_ai.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/types/llms/vertex_ai.py b/litellm/types/llms/vertex_ai.py index 2687b79f727..f17a284ddfc 100644 --- a/litellm/types/llms/vertex_ai.py +++ b/litellm/types/llms/vertex_ai.py @@ -113,7 +113,6 @@ class Schema(TypedDict, total=False): pattern: str example: Any anyOf: List["Schema"] - additionalProperties: Any class FunctionDeclaration(TypedDict, total=False): From dda115cc6dc4298b0520f936f0bee1c1aa248550 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 18:14:39 -0700 Subject: [PATCH 05/29] [Feat] Cost Tracking - Add support for Tiered Cost Tracking for Qwen API (Dashscope) (#14471) * add dashscope logo * docs fix * docs fix * fix supports_batch_calling * fix naming * fix input_cost_per_audio_token * use output_cost_per_reasoning_token * add tiered_pricing in get_model_info * test fixes * fix cost calc * ruff fix --- docs/my-website/docs/providers/dashscope.md | 2 +- litellm/llms/dashscope/cost_calculator.py | 157 ++++++++- ...odel_prices_and_context_window_backup.json | 298 +++++++++++++++++- litellm/types/utils.py | 1 + litellm/utils.py | 1 + model_prices_and_context_window.json | 298 +++++++++++++++++- .../test_dashscope_cost_calculator.py | 159 ++++++++++ .../src/components/provider_info_helpers.tsx | 9 +- 8 files changed, 893 insertions(+), 32 deletions(-) create mode 100644 tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py diff --git a/docs/my-website/docs/providers/dashscope.md b/docs/my-website/docs/providers/dashscope.md index eb18fa32a47..565776d6c4c 100644 --- a/docs/my-website/docs/providers/dashscope.md +++ b/docs/my-website/docs/providers/dashscope.md @@ -1,4 +1,4 @@ -# Dashscope +# Dashscope (Qwen API) https://dashscope.console.aliyun.com/ **We support ALL Qwen models, just set `dashscope/` as a prefix when sending completion requests** diff --git a/litellm/llms/dashscope/cost_calculator.py b/litellm/llms/dashscope/cost_calculator.py index 0f4490cb3df..6f9ebe302f4 100644 --- a/litellm/llms/dashscope/cost_calculator.py +++ b/litellm/llms/dashscope/cost_calculator.py @@ -1,21 +1,158 @@ """ -Cost calculator for DeepSeek Chat models. +Cost calculator for Dashscope Chat models. -Handles prompt caching scenario. +Handles tiered pricing and prompt caching scenarios. """ -from typing import Tuple +from dataclasses import dataclass +from typing import List, Optional, Tuple -from litellm.litellm_core_utils.llm_cost_calc.utils import generic_cost_per_token -from litellm.types.utils import Usage +from litellm.types.utils import ModelInfo, Usage +from litellm.utils import get_model_info + + +@dataclass +class TokenBreakdown: + """Token breakdown for cost calculation.""" + text_tokens: int + cached_tokens: int + completion_tokens: int + reasoning_tokens: int + + +def _extract_token_breakdown(usage: Usage) -> TokenBreakdown: + """Extract token counts from usage, handling cached and reasoning tokens.""" + cached_tokens = 0 + if usage.prompt_tokens_details and hasattr(usage.prompt_tokens_details, "cached_tokens"): + cached_tokens = usage.prompt_tokens_details.cached_tokens or 0 + + text_tokens = usage.prompt_tokens - cached_tokens + + reasoning_tokens = 0 + if (hasattr(usage, "completion_tokens_details") and + usage.completion_tokens_details and + hasattr(usage.completion_tokens_details, "reasoning_tokens")): + reasoning_tokens = usage.completion_tokens_details.reasoning_tokens or 0 + + completion_tokens = (usage.completion_tokens or 0) - reasoning_tokens + + return TokenBreakdown(text_tokens, cached_tokens, completion_tokens, reasoning_tokens) + + +def _calculate_tiered_cost( + tokens: int, + tiered_pricing: List[dict], + cost_key: str, + fallback_cost_key: Optional[str] = None +) -> float: + """Calculate cost using tiered pricing structure.""" + if not tiered_pricing or tokens <= 0: + return 0.0 + + total_cost = 0.0 + tokens_processed = 0 + + for tier in tiered_pricing: + if tokens_processed >= tokens: + break + + tier_range = tier.get("range", []) + if len(tier_range) != 2: + continue + + range_start, range_end = tier_range + + if tokens <= range_start: + break + + tier_start = max(range_start, tokens_processed) + tier_end = min(range_end, tokens) + + if tier_end > tier_start: + tokens_in_tier = tier_end - tier_start + cost_per_token = tier.get(cost_key) or tier.get(fallback_cost_key, 0) + total_cost += tokens_in_tier * cost_per_token + tokens_processed = tier_end + + return total_cost + + +def _calculate_flat_cost(tokens: int, cost_per_token: float) -> float: + """Calculate cost using flat pricing.""" + return tokens * cost_per_token + + +def _calculate_prompt_cost(breakdown: TokenBreakdown, model_info: ModelInfo, tiered_pricing: Optional[List[dict]]) -> float: + """Calculate total prompt cost including cached tokens.""" + if tiered_pricing: + text_cost = _calculate_tiered_cost( + tokens=breakdown.text_tokens, + tiered_pricing=tiered_pricing, + cost_key="input_cost_per_token" + ) + cache_cost = _calculate_tiered_cost( + tokens=breakdown.cached_tokens, + tiered_pricing=tiered_pricing, + cost_key="cache_read_input_token_cost" + ) + return text_cost + cache_cost + + input_cost = model_info.get("input_cost_per_token", 0.0) + cache_cost = model_info.get("cache_read_input_token_cost", input_cost) or input_cost + + return (_calculate_flat_cost(tokens=breakdown.text_tokens, cost_per_token=input_cost) + + _calculate_flat_cost(tokens=breakdown.cached_tokens, cost_per_token=cache_cost)) + + +def _calculate_completion_cost(breakdown: TokenBreakdown, model_info: ModelInfo, tiered_pricing: Optional[List[dict]]) -> float: + """Calculate total completion cost including reasoning tokens.""" + if tiered_pricing: + completion_cost = _calculate_tiered_cost( + tokens=breakdown.completion_tokens, + tiered_pricing=tiered_pricing, + cost_key="output_cost_per_token" + ) + reasoning_cost = _calculate_tiered_cost( + tokens=breakdown.reasoning_tokens, + tiered_pricing=tiered_pricing, + cost_key="output_cost_per_reasoning_token", + fallback_cost_key="output_cost_per_token" + ) + return completion_cost + reasoning_cost + + output_cost = model_info.get("output_cost_per_token", 0.0) + reasoning_cost = model_info.get("output_cost_per_reasoning_token", output_cost) or output_cost + + return (_calculate_flat_cost(tokens=breakdown.completion_tokens, cost_per_token=output_cost) + + _calculate_flat_cost(tokens=breakdown.reasoning_tokens, cost_per_token=reasoning_cost)) def cost_per_token(model: str, usage: Usage) -> Tuple[float, float]: """ - Calculates the cost per token for a given model, prompt tokens, and completion tokens. - - Follows the same logic as Anthropic's cost per token calculation. + Calculate cost per token for Dashscope models. + + Supports both tiered and flat pricing with cached and reasoning tokens. + + Args: + model: Model name without provider prefix + usage: LiteLLM Usage block + + Returns: + Tuple[float, float] - (prompt_cost_in_usd, completion_cost_in_usd) """ - return generic_cost_per_token( - model=model, usage=usage, custom_llm_provider="deepseek" + model_info = get_model_info(model=model, custom_llm_provider="dashscope") + breakdown = _extract_token_breakdown(usage) + tiered_pricing = model_info.get("tiered_pricing") if isinstance(model_info.get("tiered_pricing"), list) else None + + prompt_cost = _calculate_prompt_cost( + breakdown=breakdown, + model_info=model_info, + tiered_pricing=tiered_pricing ) + completion_cost = _calculate_completion_cost( + breakdown=breakdown, + model_info=model_info, + tiered_pricing=tiered_pricing + ) + + return prompt_cost, completion_cost diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index c7fabb0ed9f..972e212e693 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -6,6 +6,7 @@ "input_cost_per_token": 0.0, "output_cost_per_token": 0.0, "output_cost_per_reasoning_token": 0.0, + "input_cost_per_audio_token": 0.0, "litellm_provider": "one of https://docs.litellm.ai/docs/providers", "mode": "one of: chat, embedding, completion, image_generation, audio_transcription, audio_speech, image_generation, moderation, rerank", "supports_function_calling": true, @@ -19045,34 +19046,43 @@ "max_tokens": 32768, "max_input_tokens": 30720, "max_output_tokens": 8192, + "input_cost_per_token": 1.6e-06, + "output_cost_per_token": 6.4e-06, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen-plus-latest": { - "max_tokens": 131072, - "max_input_tokens": 129024, - "max_output_tokens": 16384, + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen-turbo-latest": { - "max_tokens": 131072, - "max_input_tokens": 129024, + "max_tokens": 1000000, + "max_input_tokens": 1000000, "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen3-30b-a3b": { "max_tokens": 131072, @@ -19083,7 +19093,277 @@ "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-max-preview": { + "max_tokens": 262144, + "max_input_tokens": 258048, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 6e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 2.4e-06, "output_cost_per_token": 1.2e-05}, + {"range": [128e3, 252e3], "input_cost_per_token": 3.0e-06, "output_cost_per_token": 1.5e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-flash": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 2.5e-07, "output_cost_per_token": 2e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-coder": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.5e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-plus": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06, "cache_read_input_token_cost": 1e-07}, + {"range": [32e3, 128e3], "input_cost_per_token": 1.8e-06, "output_cost_per_token": 9e-06, "cache_read_input_token_cost": 1.8e-07}, + {"range": [128e3, 256e3], "input_cost_per_token": 3e-06, "output_cost_per_token": 1.5e-05, "cache_read_input_token_cost": 3e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 6e-06, "output_cost_per_token": 6e-05, "cache_read_input_token_cost": 6e-07} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-plus-2025-07-22": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 1.8e-06, "output_cost_per_token": 9e-06}, + {"range": [128e3, 256e3], "input_cost_per_token": 3e-06, "output_cost_per_token": 1.5e-05}, + {"range": [256e3, 1e6], "input_cost_per_token": 6e-06, "output_cost_per_token": 6e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-flash": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06, "cache_read_input_token_cost": 8e-08}, + {"range": [32e3, 128e3], "input_cost_per_token": 5e-07, "output_cost_per_token": 2.5e-06, "cache_read_input_token_cost": 1.2e-07}, + {"range": [128e3, 256e3], "input_cost_per_token": 8e-07, "output_cost_per_token": 4e-06, "cache_read_input_token_cost": 2e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.6e-06, "output_cost_per_token": 9.6e-06, "cache_read_input_token_cost": 4e-07} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-flash-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 5e-07, "output_cost_per_token": 2.5e-06}, + {"range": [128e3, 256e3], "input_cost_per_token": 8e-07, "output_cost_per_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.6e-06, "output_cost_per_token": 9.6e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-09-11": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-07-14": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "output_cost_per_reasoning_token": 4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-04-28": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "output_cost_per_reasoning_token": 4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-01-25": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 8192, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-flash-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 2.5e-07, "output_cost_per_token": 2e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo-2025-04-28": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo-2024-11-01": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwq-plus": { + "max_tokens": 131072, + "max_input_tokens": 98304, + "max_output_tokens": 8192, + "max_chain_of_thought_tokens": 32768, + "input_cost_per_token": 8e-07, + "output_cost_per_token": 2.4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "moonshot/moonshot-v1-8k": { "max_tokens": 8192, diff --git a/litellm/types/utils.py b/litellm/types/utils.py index c6f7098a1a7..e54516371e5 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -162,6 +162,7 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): SearchContextCostPerQuery ] # Cost for using web search tool citation_cost_per_token: Optional[float] # Cost per citation token for Perplexity + tiered_pricing: Optional[List[Dict[str, Any]]] # Tiered pricing structure for models like Dashscope litellm_provider: Required[str] mode: Required[ Literal[ diff --git a/litellm/utils.py b/litellm/utils.py index be26405b43b..84d86bea647 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4902,6 +4902,7 @@ def _get_model_info_helper( # noqa: PLR0915 citation_cost_per_token=_model_info.get( "citation_cost_per_token", None ), + tiered_pricing=_model_info.get("tiered_pricing", None), litellm_provider=_model_info.get( "litellm_provider", custom_llm_provider ), diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index c7fabb0ed9f..972e212e693 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -6,6 +6,7 @@ "input_cost_per_token": 0.0, "output_cost_per_token": 0.0, "output_cost_per_reasoning_token": 0.0, + "input_cost_per_audio_token": 0.0, "litellm_provider": "one of https://docs.litellm.ai/docs/providers", "mode": "one of: chat, embedding, completion, image_generation, audio_transcription, audio_speech, image_generation, moderation, rerank", "supports_function_calling": true, @@ -19045,34 +19046,43 @@ "max_tokens": 32768, "max_input_tokens": 30720, "max_output_tokens": 8192, + "input_cost_per_token": 1.6e-06, + "output_cost_per_token": 6.4e-06, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen-plus-latest": { - "max_tokens": 131072, - "max_input_tokens": 129024, - "max_output_tokens": 16384, + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen-turbo-latest": { - "max_tokens": 131072, - "max_input_tokens": 129024, + "max_tokens": 1000000, + "max_input_tokens": 1000000, "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, "litellm_provider": "dashscope", "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "dashscope/qwen3-30b-a3b": { "max_tokens": 131072, @@ -19083,7 +19093,277 @@ "supports_tool_choice": true, "supports_reasoning": true, "mode": "chat", - "source": "https://bailian.console.alibabacloud.com/?spm=a2c63.p38356.0.0.4a615d7bjSUCb4&tab=doc#/doc/?type=model&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Fdoc-detail%2F2840914.html" + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-max-preview": { + "max_tokens": 262144, + "max_input_tokens": 258048, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 6e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 2.4e-06, "output_cost_per_token": 1.2e-05}, + {"range": [128e3, 252e3], "input_cost_per_token": 3.0e-06, "output_cost_per_token": 1.5e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-flash": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 2.5e-07, "output_cost_per_token": 2e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-coder": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.5e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-plus": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06, "cache_read_input_token_cost": 1e-07}, + {"range": [32e3, 128e3], "input_cost_per_token": 1.8e-06, "output_cost_per_token": 9e-06, "cache_read_input_token_cost": 1.8e-07}, + {"range": [128e3, 256e3], "input_cost_per_token": 3e-06, "output_cost_per_token": 1.5e-05, "cache_read_input_token_cost": 3e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 6e-06, "output_cost_per_token": 6e-05, "cache_read_input_token_cost": 6e-07} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-plus-2025-07-22": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 1.8e-06, "output_cost_per_token": 9e-06}, + {"range": [128e3, 256e3], "input_cost_per_token": 3e-06, "output_cost_per_token": 1.5e-05}, + {"range": [256e3, 1e6], "input_cost_per_token": 6e-06, "output_cost_per_token": 6e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-flash": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06, "cache_read_input_token_cost": 8e-08}, + {"range": [32e3, 128e3], "input_cost_per_token": 5e-07, "output_cost_per_token": 2.5e-06, "cache_read_input_token_cost": 1.2e-07}, + {"range": [128e3, 256e3], "input_cost_per_token": 8e-07, "output_cost_per_token": 4e-06, "cache_read_input_token_cost": 2e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.6e-06, "output_cost_per_token": 9.6e-06, "cache_read_input_token_cost": 4e-07} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen3-coder-flash-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 65536, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06}, + {"range": [32e3, 128e3], "input_cost_per_token": 5e-07, "output_cost_per_token": 2.5e-06}, + {"range": [128e3, 256e3], "input_cost_per_token": 8e-07, "output_cost_per_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.6e-06, "output_cost_per_token": 9.6e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-09-11": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 4e-07, "output_cost_per_token": 1.2e-06, "output_cost_per_reasoning_token": 4e-06}, + {"range": [256e3, 1e6], "input_cost_per_token": 1.2e-06, "output_cost_per_token": 3.6e-06, "output_cost_per_reasoning_token": 1.2e-05} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-07-14": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "output_cost_per_reasoning_token": 4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-04-28": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "output_cost_per_reasoning_token": 4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-plus-2025-01-25": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 8192, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.2e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-flash-2025-07-28": { + "max_tokens": 1000000, + "max_input_tokens": 997952, + "max_output_tokens": 32768, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_caching": true, + "mode": "chat", + "tiered_pricing": [ + {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, + {"range": [256e3, 1e6], "input_cost_per_token": 2.5e-07, "output_cost_per_token": 2e-06} + ], + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo": { + "max_tokens": 131072, + "max_input_tokens": 129024, + "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo-2025-04-28": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 16384, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "output_cost_per_reasoning_token": 5e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwen-turbo-2024-11-01": { + "max_tokens": 1000000, + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "input_cost_per_token": 5e-08, + "output_cost_per_token": 2e-07, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" + }, + "dashscope/qwq-plus": { + "max_tokens": 131072, + "max_input_tokens": 98304, + "max_output_tokens": 8192, + "max_chain_of_thought_tokens": 32768, + "input_cost_per_token": 8e-07, + "output_cost_per_token": 2.4e-06, + "litellm_provider": "dashscope", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models" }, "moonshot/moonshot-v1-8k": { "max_tokens": 8192, diff --git a/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py b/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py new file mode 100644 index 00000000000..73e992e22d1 --- /dev/null +++ b/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py @@ -0,0 +1,159 @@ +""" +Test suite for Dashscope cost calculation functionality. + +Tests the cost calculation for Dashscope models including: +- Tiered pricing based on input token ranges +- Caching discounts +- Reasoning tokens +- Standard flat pricing fallback +""" + +import json +import math +import os +import sys + +import pytest + +# Add the project root to Python path +sys.path.insert(0, os.path.abspath("../../../..")) + +import litellm +from litellm.llms.dashscope.cost_calculator import ( + cost_per_token as dashscope_cost_per_token, +) +from litellm.types.utils import ( + CompletionTokensDetailsWrapper, + PromptTokensDetailsWrapper, + Usage, +) + + +class TestDashscopeCostCalculator: + """Test suite for Dashscope cost calculation functionality.""" + + @pytest.fixture(autouse=True) + def setup_model_cost_map(self): + """Set up the model cost map for testing.""" + # Ensure we use local model cost map for consistent testing + os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" + + # Find the project root directory and load model cost map + current_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = current_dir + while not os.path.exists(os.path.join(project_root, "model_prices_and_context_window.json")): + parent = os.path.dirname(project_root) + if parent == project_root: # Reached filesystem root + break + project_root = parent + + model_cost_path = os.path.join(project_root, "model_prices_and_context_window.json") + with open(model_cost_path, "r") as f: + model_cost_map = json.load(f) + litellm.model_cost = model_cost_map + + def test_flat_pricing_basic_cost_calculation(self): + """Test basic cost calculation for flat pricing models (qwen-max).""" + usage = Usage( + prompt_tokens=1000, + completion_tokens=500, + total_tokens=1500 + ) + + prompt_cost, completion_cost = dashscope_cost_per_token( + model="qwen-max", + usage=usage + ) + + # Expected costs for qwen-max: + # Input: 1000 tokens * $1.6e-6 = $0.0016 + # Output: 500 tokens * $6.4e-6 = $0.0032 + expected_prompt_cost = 1000 * 1.6e-6 + expected_completion_cost = 500 * 6.4e-6 + + assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) + assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) + + def test_tiered_pricing_single_tier(self): + """Test tiered pricing when all tokens fall within first tier.""" + usage = Usage( + prompt_tokens=20000, # Within first tier (0-32K) + completion_tokens=1000, + total_tokens=21000 + ) + + prompt_cost, completion_cost = dashscope_cost_per_token( + model="qwen3-coder-plus", + usage=usage + ) + + # Expected costs for qwen3-coder-plus (tier 1): + # Input: 20,000 tokens * $1e-6 = $0.02 + # Output: 1,000 tokens * $5e-6 = $0.005 + expected_prompt_cost = 20000 * 1e-6 + expected_completion_cost = 1000 * 5e-6 + + assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) + assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) + + def test_tiered_pricing_multiple_tiers(self): + """Test tiered pricing when tokens span multiple tiers.""" + usage = Usage( + prompt_tokens=150000, # Spans tiers 1 (0-32K), 2 (32K-128K), 3 (128K-256K) + completion_tokens=2000, + total_tokens=152000 + ) + + prompt_cost, completion_cost = dashscope_cost_per_token( + model="qwen3-coder-plus", + usage=usage + ) + + # Expected input cost calculation: + # Tier 1 (0-32K): 32,000 tokens * $1e-6 = $0.032 + # Tier 2 (32K-128K): 96,000 tokens * $1.8e-6 = $0.1728 + # Tier 3 (128K-256K): 22,000 tokens * $3e-6 = $0.066 + # Total input cost = $0.032 + $0.1728 + $0.066 = $0.2708 + + expected_prompt_cost = (32000 * 1e-6) + (96000 * 1.8e-6) + (22000 * 3e-6) + expected_completion_cost = 2000 * 5e-6 # All in tier 1 for output + + assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) + assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) + + def test_tiered_pricing_with_caching(self): + """Test tiered pricing with cached tokens.""" + prompt_tokens_details = PromptTokensDetailsWrapper( + cached_tokens=10000 # 10K cached tokens + ) + + usage = Usage( + prompt_tokens=50000, # 40K regular + 10K cached = 50K total + completion_tokens=1000, + total_tokens=51000, + prompt_tokens_details=prompt_tokens_details + ) + + prompt_cost, completion_cost = dashscope_cost_per_token( + model="qwen3-coder-plus", + usage=usage + ) + + # Expected cost calculation: + # Regular tokens: 40,000 (32K in tier 1 + 8K in tier 2) + # - Tier 1: 32,000 * $1e-6 = $0.032 + # - Tier 2: 8,000 * $1.8e-6 = $0.0144 + # Cached tokens: 10,000 in tier 1 at discounted rate + # - Tier 1 cached: 10,000 * $1e-7 = $0.001 + # Total input cost = $0.032 + $0.0144 + $0.001 = $0.0474 + + regular_tokens = 40000 + cached_tokens = 10000 + + expected_regular_cost = (32000 * 1e-6) + (8000 * 1.8e-6) + expected_cached_cost = cached_tokens * 1e-7 # Tier 1 cached rate + expected_prompt_cost = expected_regular_cost + expected_cached_cost + expected_completion_cost = 1000 * 5e-6 + + assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) + assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx index 31f5b10043b..17aa637af89 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -11,8 +11,9 @@ export enum Providers { Azure = "Azure", Azure_AI_Studio = "Azure AI Foundry (Studio)", Cerebras = "Cerebras", - Cohere = "Cohere", - Databricks = "Databricks", + Cohere = "Cohere", + Dashscope = "Dashscope", + Databricks = "Databricks (Qwen API)", DeepInfra = "DeepInfra", Deepgram = "Deepgram", Deepseek = "Deepseek", @@ -37,7 +38,7 @@ export enum Providers { Vertex_AI = "Vertex AI (Anthropic, Gemini, etc.)", VolcEngine = "VolcEngine", Voyage = "Voyage AI", - xAI = "xAI", + xAI = "xAI", } export const provider_map: Record = { @@ -56,6 +57,7 @@ export const provider_map: Record = { OpenAI_Text_Compatible: "text-completion-openai", Vertex_AI: "vertex_ai", Databricks: "databricks", + Dashscope: "dashscope", xAI: "xai", Deepseek: "deepseek", Ollama: "ollama", @@ -91,6 +93,7 @@ export const providerLogoMap: Record = { [Providers.Cerebras]: `${asset_logos_folder}cerebras.svg`, [Providers.Cohere]: `${asset_logos_folder}cohere.svg`, [Providers.Databricks]: `${asset_logos_folder}databricks.svg`, + [Providers.Dashscope]: `${asset_logos_folder}dashscope.svg`, [Providers.Deepseek]: `${asset_logos_folder}deepseek.svg`, [Providers.FireworksAI]: `${asset_logos_folder}fireworks.svg`, [Providers.Groq]: `${asset_logos_folder}groq.svg`, From 805069c287376cbc9ff82d08affb461bcbff36de Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 18:52:02 -0700 Subject: [PATCH 06/29] fix(adapters/streaming_iterator.py): Don't send content block after message delta block is sent Fixes https://github.com/BerriAI/litellm/issues/14315 --- litellm/constants.py | 10 +- .../adapters/streaming_iterator.py | 133 +++---- litellm/proxy/_new_secret_config.yaml | 3 + .../hooks/parallel_request_limiter_v3.py | 42 ++- .../test_content_after_stop_reason.py | 343 ++++++++++++++++++ 5 files changed, 448 insertions(+), 83 deletions(-) create mode 100644 tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_content_after_stop_reason.py diff --git a/litellm/constants.py b/litellm/constants.py index 75c25d9ea9e..c0ce0f265b5 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -15,7 +15,7 @@ DEFAULT_SQS_FLUSH_INTERVAL_SECONDS = int( os.getenv("DEFAULT_SQS_FLUSH_INTERVAL_SECONDS", 10) ) DEFAULT_NUM_WORKERS_LITELLM_PROXY = int( - os.getenv("DEFAULT_NUM_WORKERS_LITELLM_PROXY", os.cpu_count() or 4) + os.getenv("DEFAULT_NUM_WORKERS_LITELLM_PROXY", 1) ) DEFAULT_SQS_BATCH_SIZE = int(os.getenv("DEFAULT_SQS_BATCH_SIZE", 512)) SQS_SEND_MESSAGE_ACTION = "SendMessage" @@ -60,7 +60,9 @@ DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_PRO = int( os.getenv("DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_PRO", 128) ) DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE = int( - os.getenv("DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE", 512) + os.getenv( + "DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE", 512 + ) ) # Generic fallback for unknown models @@ -949,7 +951,9 @@ LITELLM_CLI_SESSION_TOKEN_PREFIX = "litellm-session-token" DB_SPEND_UPDATE_JOB_NAME = "db_spend_update_job" PROMETHEUS_EMIT_BUDGET_METRICS_JOB_NAME = "prometheus_emit_budget_metrics" CLOUDZERO_EXPORT_USAGE_DATA_JOB_NAME = "cloudzero_export_usage_data" -CLOUDZERO_MAX_FETCHED_DATA_RECORDS = int(os.getenv("CLOUDZERO_MAX_FETCHED_DATA_RECORDS", 50000)) +CLOUDZERO_MAX_FETCHED_DATA_RECORDS = int( + os.getenv("CLOUDZERO_MAX_FETCHED_DATA_RECORDS", 50000) +) SPEND_LOG_CLEANUP_JOB_NAME = "spend_log_cleanup" SPEND_LOG_RUN_LOOPS = int(os.getenv("SPEND_LOG_RUN_LOOPS", 500)) SPEND_LOG_CLEANUP_BATCH_SIZE = int(os.getenv("SPEND_LOG_CLEANUP_BATCH_SIZE", 1000)) diff --git a/litellm/llms/anthropic/experimental_pass_through/adapters/streaming_iterator.py b/litellm/llms/anthropic/experimental_pass_through/adapters/streaming_iterator.py index aa95183bb6c..e4191a945f3 100644 --- a/litellm/llms/anthropic/experimental_pass_through/adapters/streaming_iterator.py +++ b/litellm/llms/anthropic/experimental_pass_through/adapters/streaming_iterator.py @@ -28,10 +28,6 @@ class AnthropicStreamWrapper(AdapterCompletionStreamWrapper): TextBlock, ) - def __init__(self, completion_stream: Any, model: str): - super().__init__(completion_stream) - self.model = model - sent_first_chunk: bool = False sent_content_block_start: bool = False sent_content_block_finish: bool = False @@ -39,6 +35,7 @@ class AnthropicStreamWrapper(AdapterCompletionStreamWrapper): sent_last_message: bool = False holding_chunk: Optional[Any] = None holding_stop_reason_chunk: Optional[Any] = None + queued_usage_chunk: bool = False current_content_block_index: int = 0 current_content_block_start: ContentBlockContentBlockDict = TextBlock( type="text", @@ -47,6 +44,10 @@ class AnthropicStreamWrapper(AdapterCompletionStreamWrapper): pending_new_content_block: bool = False chunk_queue: deque = deque() # Queue for buffering multiple chunks + def __init__(self, completion_stream: Any, model: str): + super().__init__(completion_stream) + self.model = model + def __next__(self): from .transformation import LiteLLMAnthropicMessagesAdapter @@ -217,77 +218,83 @@ class AnthropicStreamWrapper(AdapterCompletionStreamWrapper): # Queue the merged chunk and reset self.chunk_queue.append(merged_chunk) + self.queued_usage_chunk = True self.holding_stop_reason_chunk = None return self.chunk_queue.popleft() # Check if this processed chunk has a stop_reason - hold it for next chunk - if should_start_new_block and not self.sent_content_block_finish: - # Queue the sequence: content_block_stop -> content_block_start -> current_chunk + if not self.queued_usage_chunk: + if should_start_new_block and not self.sent_content_block_finish: + # Queue the sequence: content_block_stop -> content_block_start -> current_chunk - # 1. Stop current content block - self.chunk_queue.append( - { - "type": "content_block_stop", - "index": max(self.current_content_block_index - 1, 0), - } - ) + # 1. Stop current content block + self.chunk_queue.append( + { + "type": "content_block_stop", + "index": max(self.current_content_block_index - 1, 0), + } + ) - # 2. Start new content block - self.chunk_queue.append( - { - "type": "content_block_start", - "index": self.current_content_block_index, - "content_block": self.current_content_block_start, - } - ) + # 2. Start new content block + self.chunk_queue.append( + { + "type": "content_block_start", + "index": self.current_content_block_index, + "content_block": self.current_content_block_start, + } + ) - # 3. Queue the current chunk (don't lose it!) - self.chunk_queue.append(processed_chunk) - - # Reset state for new block - self.sent_content_block_finish = False - - # Return the first queued item - return self.chunk_queue.popleft() - - if ( - processed_chunk["type"] == "message_delta" - and self.sent_content_block_finish is False - ): - # Queue both the content_block_stop and the holding chunk - self.chunk_queue.append( - { - "type": "content_block_stop", - "index": self.current_content_block_index, - } - ) - self.sent_content_block_finish = True - if processed_chunk.get("delta", {}).get("stop_reason") is not None: - - self.holding_stop_reason_chunk = processed_chunk - else: + # 3. Queue the current chunk (don't lose it!) self.chunk_queue.append(processed_chunk) - return self.chunk_queue.popleft() - elif self.holding_chunk is not None: - # Queue both chunks - self.chunk_queue.append(self.holding_chunk) - self.chunk_queue.append(processed_chunk) - self.holding_chunk = None - return self.chunk_queue.popleft() - else: - # Queue the current chunk - self.chunk_queue.append(processed_chunk) - return self.chunk_queue.popleft() + + # Reset state for new block + self.sent_content_block_finish = False + + # Return the first queued item + return self.chunk_queue.popleft() + + if ( + processed_chunk["type"] == "message_delta" + and self.sent_content_block_finish is False + ): + # Queue both the content_block_stop and the holding chunk + self.chunk_queue.append( + { + "type": "content_block_stop", + "index": self.current_content_block_index, + } + ) + self.sent_content_block_finish = True + if ( + processed_chunk.get("delta", {}).get("stop_reason") + is not None + ): + + self.holding_stop_reason_chunk = processed_chunk + else: + self.chunk_queue.append(processed_chunk) + return self.chunk_queue.popleft() + elif self.holding_chunk is not None: + # Queue both chunks + self.chunk_queue.append(self.holding_chunk) + self.chunk_queue.append(processed_chunk) + self.holding_chunk = None + return self.chunk_queue.popleft() + else: + # Queue the current chunk + self.chunk_queue.append(processed_chunk) + return self.chunk_queue.popleft() # Handle any remaining held chunks after stream ends - if self.holding_stop_reason_chunk is not None: - self.chunk_queue.append(self.holding_stop_reason_chunk) - self.holding_stop_reason_chunk = None + if not self.queued_usage_chunk: + if self.holding_stop_reason_chunk is not None: + self.chunk_queue.append(self.holding_stop_reason_chunk) + self.holding_stop_reason_chunk = None - if self.holding_chunk is not None: - self.chunk_queue.append(self.holding_chunk) - self.holding_chunk = None + if self.holding_chunk is not None: + self.chunk_queue.append(self.holding_chunk) + self.holding_chunk = None if not self.sent_last_message: self.sent_last_message = True diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml index c785dd05c40..691f67d5778 100644 --- a/litellm/proxy/_new_secret_config.yaml +++ b/litellm/proxy/_new_secret_config.yaml @@ -7,3 +7,6 @@ model_list: - model_name: wildcard_models/* litellm_params: model: openai/* + - model_name: xai-grok-3 + litellm_params: + model: xai/grok-3 diff --git a/litellm/proxy/hooks/parallel_request_limiter_v3.py b/litellm/proxy/hooks/parallel_request_limiter_v3.py index b3840761d2a..b3fa71a1c15 100644 --- a/litellm/proxy/hooks/parallel_request_limiter_v3.py +++ b/litellm/proxy/hooks/parallel_request_limiter_v3.py @@ -6,6 +6,7 @@ This is currently in development and not yet ready for production. import os from datetime import datetime +from math import floor from typing import ( TYPE_CHECKING, Any, @@ -17,7 +18,7 @@ from typing import ( Union, cast, ) -from math import floor + from fastapi import HTTPException from litellm import DualCache @@ -95,6 +96,7 @@ end return results """ + class RateLimitDescriptorRateLimitObject(TypedDict, total=False): requests_per_unit: Optional[int] tokens_per_unit: Optional[int] @@ -480,10 +482,15 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): }, ) ) - + # Team Member rate limits - if user_api_key_dict.user_id and (user_api_key_dict.team_member_rpm_limit is not None or user_api_key_dict.team_member_tpm_limit is not None): - team_member_value = f"{user_api_key_dict.team_id}:{user_api_key_dict.user_id}" + if user_api_key_dict.user_id and ( + user_api_key_dict.team_member_rpm_limit is not None + or user_api_key_dict.team_member_tpm_limit is not None + ): + team_member_value = ( + f"{user_api_key_dict.team_id}:{user_api_key_dict.user_id}" + ) descriptors.append( RateLimitDescriptor( key="team_member", @@ -557,13 +564,13 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): # Find which descriptor hit the limit for i, status in enumerate(response["statuses"]): if status["code"] == "OVER_LIMIT": - descriptor = descriptors[floor(i/2)] + descriptor = descriptors[floor(i / 2)] raise HTTPException( status_code=429, detail=f"Rate limit exceeded for {descriptor['key']}: {descriptor['value']}. Remaining: {status['limit_remaining']}", headers={ "retry-after": str(self.window_size), - "rate_limit_type": str(status["rate_limit_type"]) + "rate_limit_type": str(status["rate_limit_type"]), }, # Retry after 1 minute ) @@ -613,7 +620,9 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): # Check if script is available if self.token_increment_script is None: - verbose_proxy_logger.debug("TTL preservation script not available, using regular pipeline") + verbose_proxy_logger.debug( + "TTL preservation script not available, using regular pipeline" + ) await self.internal_usage_cache.dual_cache.async_increment_cache_pipeline( increment_list=pipeline_operations, litellm_parent_otel_span=parent_otel_span, @@ -628,7 +637,7 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): for op in pipeline_operations: # Convert None TTL to 0 for Lua script ttl_value = op["ttl"] if op["ttl"] is not None else 0 - + verbose_proxy_logger.debug( f"Executing TTL-preserving increment for key={op['key']}, " f"increment={op['increment_value']}, ttl={ttl_value}" @@ -693,16 +702,15 @@ class _PROXY_MaxParallelRequestsHandler_v3(CustomLogger): ) # Get metadata from kwargs - user_api_key = kwargs["litellm_params"]["metadata"].get("user_api_key") - user_api_key_user_id = kwargs["litellm_params"]["metadata"].get( - "user_api_key_user_id" + litellm_metadata = kwargs["litellm_params"]["metadata"] + if litellm_metadata is None: + return + user_api_key = litellm_metadata.get("user_api_key") + user_api_key_user_id = litellm_metadata.get("user_api_key_user_id") + user_api_key_team_id = litellm_metadata.get("user_api_key_team_id") + user_api_key_end_user_id = kwargs.get("user") or litellm_metadata.get( + "user_api_key_end_user_id" ) - user_api_key_team_id = kwargs["litellm_params"]["metadata"].get( - "user_api_key_team_id" - ) - user_api_key_end_user_id = kwargs.get("user") or kwargs["litellm_params"][ - "metadata" - ].get("user_api_key_end_user_id") model_group = get_model_group_from_litellm_kwargs(kwargs) # Get total tokens from response diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_content_after_stop_reason.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_content_after_stop_reason.py new file mode 100644 index 00000000000..4a170d666f5 --- /dev/null +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_content_after_stop_reason.py @@ -0,0 +1,343 @@ +""" +Test for AnthropicStreamWrapper handling content blocks that exist after message_delta with stop_reason and usage. + +This tests the scenario where a streaming response includes: +1. Initial content blocks +2. A message_delta chunk with stop_reason and usage +3. Additional content blocks after the stop_reason + +The wrapper should properly handle this by: +- Holding the stop_reason chunk until usage is available +- Merging usage into the stop_reason chunk +- Properly managing content_block_stop/start events for subsequent content +""" + +import os +import sys +from typing import List + +import pytest + +sys.path.insert(0, os.path.abspath("../../../../..")) + +from litellm.llms.anthropic.experimental_pass_through.adapters.streaming_iterator import ( + AnthropicStreamWrapper, +) +from litellm.types.utils import Delta, ModelResponse, StreamingChoices, Usage + + +class MockCompletionStreamWithContentAfterStopReason: + """Mock stream that simulates content blocks existing after message_delta with stop_reason and usage.""" + + def __init__(self): + self.responses = [ + # Initial text content + ModelResponse( + stream=True, + choices=[ + StreamingChoices( + delta=Delta(content="Hello"), index=0, finish_reason=None + ) + ], + ), + ModelResponse( + stream=True, + choices=[ + StreamingChoices( + delta=Delta(content=" world"), index=0, finish_reason=None + ) + ], + ), + # Message delta with stop_reason AND usage (this is how it actually comes from the API) + ModelResponse( + stream=True, + choices=[ + StreamingChoices( + delta=Delta(content=""), index=0, finish_reason="stop" + ) + ], + usage=Usage(prompt_tokens=230, completion_tokens=65, total_tokens=295), + ), + # Additional content after the stop_reason - this simulates the scenario + # where there might be additional content blocks after the main response + ModelResponse( + stream=True, + choices=[ + StreamingChoices( + delta=Delta(content=" Additional content"), + index=0, + finish_reason=None, + ) + ], + ), + ] + self.index = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.index >= len(self.responses): + raise StopIteration + response = self.responses[self.index] + self.index += 1 + return response + + def __aiter__(self): + return self + + async def __anext__(self): + if self.index >= len(self.responses): + raise StopAsyncIteration + response = self.responses[self.index] + self.index += 1 + return response + + +def test_anthropic_stream_wrapper_content_after_stop_reason(): + """Test that AnthropicStreamWrapper properly handles content blocks after message_delta with stop_reason.""" + + wrapper = AnthropicStreamWrapper( + completion_stream=MockCompletionStreamWithContentAfterStopReason(), + model="claude-3", + ) + + chunks = [] + chunk_types = [] + + # Collect all chunks + for chunk in wrapper: + chunks.append(chunk) + chunk_types.append(chunk.get("type")) + + # Verify the expected sequence of chunk types + expected_types = [ + "message_start", # Initial message start + "content_block_start", # Start of first content block + "content_block_delta", # "Hello" + "content_block_delta", # " world" + "content_block_stop", # End of first content block due to stop_reason + "message_delta", # Stop reason with merged usage + "message_stop", # Final message stop + ] + + print(f"Actual chunk types: {chunk_types}") + print(f"Expected chunk types: {expected_types}") + + # Verify we have the expected number of chunks + assert len(chunk_types) >= len( + expected_types + ), f"Expected at least {len(expected_types)} chunks, got {len(chunk_types)}" + + # Verify key chunk types are present + assert "message_start" in chunk_types + assert "content_block_start" in chunk_types + assert "content_block_delta" in chunk_types + assert "content_block_stop" in chunk_types + assert "message_delta" in chunk_types + assert "message_stop" in chunk_types + + # Find the message_delta chunk with stop_reason + message_delta_chunk = None + for chunk in chunks: + if chunk.get("type") == "message_delta": + message_delta_chunk = chunk + break + + assert message_delta_chunk is not None, "message_delta chunk not found" + + # Verify that the message_delta chunk has both stop_reason and usage + delta = message_delta_chunk.get("delta", {}) + usage = message_delta_chunk.get("usage", {}) + + assert ( + delta.get("stop_reason") == "end_turn" + ), f"Expected stop_reason 'end_turn', got {delta.get('stop_reason')}" + assert ( + usage.get("input_tokens") == 230 + ), f"Expected input_tokens 230, got {usage.get('input_tokens')}" + assert ( + usage.get("output_tokens") == 65 + ), f"Expected output_tokens 65, got {usage.get('output_tokens')}" + + # Verify content_block_stop comes before message_delta + content_block_stop_index = None + message_delta_index = None + + for i, chunk_type in enumerate(chunk_types): + if chunk_type == "content_block_stop" and content_block_stop_index is None: + content_block_stop_index = i + elif chunk_type == "message_delta": + message_delta_index = i + + assert content_block_stop_index is not None, "content_block_stop not found" + assert message_delta_index is not None, "message_delta not found" + assert ( + content_block_stop_index < message_delta_index + ), "content_block_stop should come before message_delta" + + +@pytest.mark.asyncio +async def test_async_anthropic_stream_wrapper_content_after_stop_reason(): + """Test async version of AnthropicStreamWrapper handling content blocks after message_delta with stop_reason.""" + + wrapper = AnthropicStreamWrapper( + completion_stream=MockCompletionStreamWithContentAfterStopReason(), + model="claude-3", + ) + + chunks = [] + chunk_types = [] + + # Collect all chunks asynchronously + async for chunk in wrapper: + chunks.append(chunk) + chunk_types.append(chunk.get("type")) + + print(f"Async - Actual chunk types: {chunk_types}") + + # Verify key chunk types are present + assert "message_start" in chunk_types + assert "content_block_start" in chunk_types + assert "content_block_delta" in chunk_types + assert "content_block_stop" in chunk_types + assert "message_delta" in chunk_types + assert "message_stop" in chunk_types + + # Find the message_delta chunk with stop_reason + message_delta_chunk = None + for chunk in chunks: + if chunk.get("type") == "message_delta": + message_delta_chunk = chunk + break + + assert message_delta_chunk is not None, "message_delta chunk not found" + + # Verify that the message_delta chunk has both stop_reason and usage + delta = message_delta_chunk.get("delta", {}) + usage = message_delta_chunk.get("usage", {}) + + assert ( + delta.get("stop_reason") == "end_turn" + ), f"Expected stop_reason 'end_turn', got {delta.get('stop_reason')}" + assert ( + usage.get("input_tokens") == 230 + ), f"Expected input_tokens 230, got {usage.get('input_tokens')}" + assert ( + usage.get("output_tokens") == 65 + ), f"Expected output_tokens 65, got {usage.get('output_tokens')}" + + +def test_usage_merging_behavior(): + """Test that usage information is properly merged with stop_reason chunk.""" + + wrapper = AnthropicStreamWrapper( + completion_stream=MockCompletionStreamWithContentAfterStopReason(), + model="claude-3", + ) + + # Process chunks and look specifically for the usage merging behavior + chunks = [] + for chunk in wrapper: + chunks.append(chunk) + # If this is a message_delta with stop_reason, verify it has usage + if ( + chunk.get("type") == "message_delta" + and chunk.get("delta", {}).get("stop_reason") is not None + ): + + usage = chunk.get("usage", {}) + assert ( + usage.get("input_tokens") is not None + ), "Usage should be merged with stop_reason chunk" + assert ( + usage.get("output_tokens") is not None + ), "Usage should be merged with stop_reason chunk" + break + + +def test_sse_wrapper_with_content_after_stop_reason(): + """Test SSE wrapper formatting for the content after stop_reason scenario.""" + + wrapper = AnthropicStreamWrapper( + completion_stream=MockCompletionStreamWithContentAfterStopReason(), + model="claude-3", + ) + + # Get SSE formatted chunks + sse_chunks = [] + for chunk in wrapper.anthropic_sse_wrapper(): + sse_chunks.append(chunk) + if len(sse_chunks) >= 10: # Limit to avoid infinite loops in tests + break + + # Verify all chunks are properly formatted as bytes + for chunk in sse_chunks: + assert isinstance(chunk, bytes), "SSE chunks should be bytes" + + # Decode and verify SSE format + chunk_str = chunk.decode("utf-8") + lines = chunk_str.split("\n") + + # Should have event and data lines + assert any( + line.startswith("event: ") for line in lines + ), f"Missing event line in: {chunk_str}" + assert any( + line.startswith("data: ") for line in lines + ), f"Missing data line in: {chunk_str}" + + +@pytest.mark.asyncio +async def test_async_sse_wrapper_with_content_after_stop_reason(): + """Test async SSE wrapper formatting for the content after stop_reason scenario.""" + + wrapper = AnthropicStreamWrapper( + completion_stream=MockCompletionStreamWithContentAfterStopReason(), + model="claude-3", + ) + + # Get SSE formatted chunks asynchronously + sse_chunks = [] + async for chunk in wrapper.async_anthropic_sse_wrapper(): + sse_chunks.append(chunk) + if len(sse_chunks) >= 10: # Limit to avoid infinite loops in tests + break + + # Verify all chunks are properly formatted as bytes + for chunk in sse_chunks: + assert isinstance(chunk, bytes), "Async SSE chunks should be bytes" + + # Decode and verify SSE format + chunk_str = chunk.decode("utf-8") + lines = chunk_str.split("\n") + + # Should have event and data lines + assert any( + line.startswith("event: ") for line in lines + ), f"Missing event line in: {chunk_str}" + assert any( + line.startswith("data: ") for line in lines + ), f"Missing data line in: {chunk_str}" + + +if __name__ == "__main__": + # Run a quick test + test_anthropic_stream_wrapper_content_after_stop_reason() + print("✅ Sync test passed") + + import asyncio + + asyncio.run(test_async_anthropic_stream_wrapper_content_after_stop_reason()) + print("✅ Async test passed") + + test_usage_merging_behavior() + print("✅ Usage merging test passed") + + test_sse_wrapper_with_content_after_stop_reason() + print("✅ SSE wrapper test passed") + + asyncio.run(test_async_sse_wrapper_with_content_after_stop_reason()) + print("✅ Async SSE wrapper test passed") + + print("🎉 All tests passed!") From 0f6898ad0a9d8769bb26038f80107b309c8fb91e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 19:10:00 -0700 Subject: [PATCH 07/29] fix(key_management_endpoints.py): check if key is a hashed token or sk key before lookup Fixes https://github.com/BerriAI/litellm/issues/13887 --- .../key_management_endpoints.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index bd8faf34be8..a7f15cc6c19 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -346,6 +346,7 @@ def handle_key_type(data: GenerateKeyRequest, data_json: dict) -> dict: data_json["allowed_routes"] = ["info_routes"] return data_json + async def validate_team_id_used_in_service_account_request( team_id: Optional[str], prisma_client: Optional[PrismaClient], @@ -358,13 +359,13 @@ async def validate_team_id_used_in_service_account_request( status_code=400, detail="team_id is required for service account keys. Please specify `team_id` in the request body.", ) - + if prisma_client is None: raise HTTPException( status_code=400, detail="prisma_client is required for service account keys. Please specify `prisma_client` in the request body.", ) - + # check if team_id exists in the database team = await prisma_client.db.litellm_teamtable.find_unique( where={"team_id": team_id}, @@ -376,6 +377,7 @@ async def validate_team_id_used_in_service_account_request( ) return True + async def _common_key_generation_helper( # noqa: PLR0915 data: GenerateKeyRequest, user_api_key_dict: UserAPIKeyAuth, @@ -557,7 +559,7 @@ async def _common_key_generation_helper( # noqa: PLR0915 status_code=400, detail={ "error": f"Invalid key format. LiteLLM Virtual Key must start with 'sk-'. Received: {data.key}" - } + }, ) response = await generate_key_helper_fn( @@ -2885,7 +2887,10 @@ async def unblock_key( param="key", code=status.HTTP_400_BAD_REQUEST, ) - hashed_token = hash_token(token=data.key) + if data.key.startswith("sk-"): + hashed_token = hash_token(token=data.key) + else: + hashed_token = data.key if litellm.store_audit_logs is True: # make an audit log for key update From 0c8b311155f01f5075ca4deb09ac3a5b390ad2c6 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 19:15:15 -0700 Subject: [PATCH 08/29] test: add unit testing for both flows on key unblock --- .../test_key_management_endpoints.py | 245 +++++++++++++++--- 1 file changed, 202 insertions(+), 43 deletions(-) diff --git a/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py index 3a597adef06..2747fab77fa 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py @@ -183,7 +183,9 @@ async def test_budget_reset_and_expires_at_first_of_month(monkeypatch): assert ( response_date.month == expected_month ), f"Expected month {expected_month}, got {response_date.month} for {key}" - assert response_date.day == 1, f"Expected day 1, got {response_date.day} for {key}" + assert ( + response_date.day == 1 + ), f"Expected day 1, got {response_date.day} for {key}" @pytest.mark.asyncio @@ -507,7 +509,6 @@ def test_get_new_token_with_invalid_key(): assert "New key must start with 'sk-'" in str(exc_info.value.detail) - @pytest.mark.asyncio async def test_generate_service_account_requires_team_id(): with pytest.raises(HTTPException): @@ -529,11 +530,12 @@ async def test_generate_service_account_works_with_team_id(): from unittest.mock import patch # Mock the database and router dependencies from proxy_server - with patch('litellm.proxy.proxy_server.prisma_client') as mock_prisma, \ - patch('litellm.proxy.proxy_server.llm_router') as mock_router, \ - patch('litellm.proxy.proxy_server.premium_user', False), \ - patch('litellm.proxy.management_endpoints.key_management_endpoints.generate_key_helper_fn') as mock_generate_key: - + with patch("litellm.proxy.proxy_server.prisma_client") as mock_prisma, patch( + "litellm.proxy.proxy_server.llm_router" + ) as mock_router, patch("litellm.proxy.proxy_server.premium_user", False), patch( + "litellm.proxy.management_endpoints.key_management_endpoints.generate_key_helper_fn" + ) as mock_generate_key: + # Configure mocks mock_prisma.return_value = AsyncMock() mock_router.return_value = None @@ -542,9 +544,9 @@ async def test_generate_service_account_works_with_team_id(): "key": "sk-test-key", "expires": None, "user_id": "test-user", - "team_id": "IJ" + "team_id": "IJ", } - + # This should not raise an exception since team_id is provided await _common_key_generation_helper( data=GenerateKeyRequest( @@ -559,7 +561,6 @@ async def test_generate_service_account_works_with_team_id(): ) - @pytest.mark.asyncio async def test_update_service_account_requires_team_id(): data = UpdateKeyRequest(key="sk-1", metadata={"service_account_id": "sa"}) @@ -571,7 +572,9 @@ async def test_update_service_account_requires_team_id(): @pytest.mark.asyncio async def test_update_service_account_works_with_team_id(): - data = UpdateKeyRequest(key="sk-1", metadata={"service_account_id": "sa"}, team_id="IJ") + data = UpdateKeyRequest( + key="sk-1", metadata={"service_account_id": "sa"}, team_id="IJ" + ) existing_key = LiteLLM_VerificationToken(token="hashed") await prepare_key_update_data(data=data, existing_key_row=existing_key) @@ -580,22 +583,22 @@ async def test_update_service_account_works_with_team_id(): @pytest.mark.asyncio async def test_validate_team_id_used_in_service_account_request_requires_team_id(): """ - Test that validate_team_id_used_in_service_account_request raises HTTPException + Test that validate_team_id_used_in_service_account_request raises HTTPException when team_id is None for service account key generation. """ from litellm.proxy.management_endpoints.key_management_endpoints import ( validate_team_id_used_in_service_account_request, ) - + mock_prisma_client = AsyncMock() - + # Test that HTTPException is raised when team_id is None with pytest.raises(HTTPException) as exc_info: await validate_team_id_used_in_service_account_request( team_id=None, prisma_client=mock_prisma_client, ) - + assert exc_info.value.status_code == 400 assert "team_id is required for service account keys" in str(exc_info.value.detail) @@ -603,7 +606,7 @@ async def test_validate_team_id_used_in_service_account_request_requires_team_id @pytest.mark.asyncio async def test_validate_team_id_used_in_service_account_request_requires_prisma_client(): """ - Test that validate_team_id_used_in_service_account_request raises HTTPException + Test that validate_team_id_used_in_service_account_request raises HTTPException when prisma_client is None for service account key generation. """ from litellm.proxy.management_endpoints.key_management_endpoints import ( @@ -616,78 +619,76 @@ async def test_validate_team_id_used_in_service_account_request_requires_prisma_ team_id="test-team-id", prisma_client=None, ) - + assert exc_info.value.status_code == 400 - assert "prisma_client is required for service account keys" in str(exc_info.value.detail) + assert "prisma_client is required for service account keys" in str( + exc_info.value.detail + ) @pytest.mark.asyncio async def test_validate_team_id_used_in_service_account_request_checks_team_exists(): """ - Test that validate_team_id_used_in_service_account_request validates that + Test that validate_team_id_used_in_service_account_request validates that the team_id exists in the database for service account key generation. """ from litellm.proxy.management_endpoints.key_management_endpoints import ( validate_team_id_used_in_service_account_request, ) - + mock_prisma_client = AsyncMock() - + # Mock the database query to return None (team doesn't exist) mock_find_unique = AsyncMock(return_value=None) mock_prisma_client.db.litellm_teamtable.find_unique = mock_find_unique - + # Test that HTTPException is raised when team doesn't exist in DB with pytest.raises(HTTPException) as exc_info: await validate_team_id_used_in_service_account_request( team_id="non-existent-team-id", prisma_client=mock_prisma_client, ) - + assert exc_info.value.status_code == 400 assert "team_id does not exist in the database" in str(exc_info.value.detail) - + # Verify the database was queried with the correct parameters - mock_find_unique.assert_called_once_with( - where={"team_id": "non-existent-team-id"} - ) + mock_find_unique.assert_called_once_with(where={"team_id": "non-existent-team-id"}) @pytest.mark.asyncio async def test_validate_team_id_used_in_service_account_request_success(): """ - Test that validate_team_id_used_in_service_account_request returns True + Test that validate_team_id_used_in_service_account_request returns True when team_id exists in the database for service account key generation. """ from litellm.proxy.management_endpoints.key_management_endpoints import ( validate_team_id_used_in_service_account_request, ) - + mock_prisma_client = AsyncMock() - + # Mock the database query to return a team object (team exists) mock_team = {"team_id": "existing-team-id", "team_name": "Test Team"} mock_find_unique = AsyncMock(return_value=mock_team) mock_prisma_client.db.litellm_teamtable.find_unique = mock_find_unique - + # Test that function returns True when team exists result = await validate_team_id_used_in_service_account_request( team_id="existing-team-id", prisma_client=mock_prisma_client, ) - + assert result is True - + # Verify the database was queried with the correct parameters - mock_find_unique.assert_called_once_with( - where={"team_id": "existing-team-id"} - ) + mock_find_unique.assert_called_once_with(where={"team_id": "existing-team-id"}) @pytest.mark.asyncio async def test_generate_service_account_key_endpoint_validation(): """ - Test that the /key/service-account/generate endpoint properly validates + Test that the /key/service-account/generate endpoint properly validates team_id requirement and team existence in database. """ from unittest.mock import patch @@ -705,16 +706,16 @@ async def test_generate_service_account_key_endpoint_validation(): ), litellm_changed_by=None, ) - + assert exc_info.value.status_code == 400 assert "team_id is required for service account keys" in str(exc_info.value.detail) - - # Test case 2: Team doesn't exist in database - with patch('litellm.proxy.proxy_server.prisma_client') as mock_prisma: + + # Test case 2: Team doesn't exist in database + with patch("litellm.proxy.proxy_server.prisma_client") as mock_prisma: # Mock team not found mock_find_unique = AsyncMock(return_value=None) mock_prisma.db.litellm_teamtable.find_unique = mock_find_unique - + with pytest.raises(HTTPException) as exc_info: await generate_service_account_key_fn( data=GenerateKeyRequest(team_id="non-existent-team"), @@ -723,7 +724,165 @@ async def test_generate_service_account_key_endpoint_validation(): ), litellm_changed_by=None, ) - + assert exc_info.value.status_code == 400 assert "team_id does not exist in the database" in str(exc_info.value.detail) + +@pytest.mark.asyncio +async def test_unblock_key_supports_both_sk_and_hashed_tokens(monkeypatch): + """ + Test that the unblock_key endpoint correctly handles both sk- prefixed tokens + and hashed tokens by properly converting sk- tokens to hashed format before + database operations. + """ + from unittest.mock import AsyncMock, MagicMock + + from litellm.proxy._types import BlockKeyRequest + from litellm.proxy.management_endpoints.key_management_endpoints import unblock_key + + # Mock dependencies + mock_prisma_client = AsyncMock() + mock_user_api_key_cache = MagicMock() + mock_proxy_logging_obj = MagicMock() + + # Use a proper 64-character hex hash for testing + test_hashed_token = ( + "a1b2c3d4e5f6789012345678901234567890123456789012345678901234abcd" + ) + + # Mock the key record that will be returned from database + mock_key_record = MagicMock() + mock_key_record.token = test_hashed_token + mock_key_record.blocked = False + mock_key_record.model_dump_json.return_value = ( + f'{{"token": "{test_hashed_token}", "blocked": false}}' + ) + + # Mock database operations + mock_prisma_client.db.litellm_verificationtoken.find_unique = AsyncMock( + return_value=mock_key_record + ) + mock_prisma_client.db.litellm_verificationtoken.update = AsyncMock( + return_value=mock_key_record + ) + + # Mock get_key_object and _cache_key_object functions + mock_key_object = MagicMock() + mock_key_object.blocked = True # Initially blocked + + # Mock hash_token function + def mock_hash_token(token): + if token == "sk-test123456789": + return test_hashed_token + return token + + # Apply monkeypatch + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + monkeypatch.setattr( + "litellm.proxy.proxy_server.user_api_key_cache", mock_user_api_key_cache + ) + monkeypatch.setattr( + "litellm.proxy.proxy_server.proxy_logging_obj", mock_proxy_logging_obj + ) + monkeypatch.setattr("litellm.proxy.proxy_server.hash_token", mock_hash_token) + monkeypatch.setattr( + "litellm.store_audit_logs", False + ) # Disable audit logs for simpler test + + # Mock get_key_object and _cache_key_object + async def mock_get_key_object(**kwargs): + return mock_key_object + + async def mock_cache_key_object(**kwargs): + pass + + monkeypatch.setattr( + "litellm.proxy.management_endpoints.key_management_endpoints.get_key_object", + mock_get_key_object, + ) + monkeypatch.setattr( + "litellm.proxy.management_endpoints.key_management_endpoints._cache_key_object", + mock_cache_key_object, + ) + + # Create mock request and user auth + mock_request = MagicMock() + user_api_key_dict = UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, api_key="sk-admin", user_id="admin_user" + ) + + # Test Case 1: Using sk- prefixed token + sk_token_request = BlockKeyRequest(key="sk-test123456789") + + result = await unblock_key( + data=sk_token_request, + http_request=mock_request, + user_api_key_dict=user_api_key_dict, + litellm_changed_by=None, + ) + + # Verify that the database update was called with hashed token + mock_prisma_client.db.litellm_verificationtoken.update.assert_called_with( + where={"token": test_hashed_token}, data={"blocked": False} + ) + + assert result == mock_key_record + assert mock_key_object.blocked == False # Should be updated to unblocked + + # Reset mocks for second test + mock_prisma_client.db.litellm_verificationtoken.update.reset_mock() + mock_key_object.blocked = True # Reset to blocked state + + # Test Case 2: Using already hashed token + hashed_token_request = BlockKeyRequest(key=test_hashed_token) + + result = await unblock_key( + data=hashed_token_request, + http_request=mock_request, + user_api_key_dict=user_api_key_dict, + litellm_changed_by=None, + ) + + # Verify that the database update was called with the same hashed token + mock_prisma_client.db.litellm_verificationtoken.update.assert_called_with( + where={"token": test_hashed_token}, data={"blocked": False} + ) + + assert result == mock_key_record + assert mock_key_object.blocked == False # Should be updated to unblocked + + +@pytest.mark.asyncio +async def test_unblock_key_invalid_key_format(monkeypatch): + """ + Test that unblock_key properly validates key format and raises appropriate errors + for invalid keys. + """ + from litellm.proxy._types import BlockKeyRequest + from litellm.proxy.management_endpoints.key_management_endpoints import unblock_key + from litellm.proxy.utils import ProxyException + + # Mock prisma_client to avoid DB connection error + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + # Mock request and user auth + mock_request = MagicMock() + user_api_key_dict = UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, api_key="sk-admin", user_id="admin_user" + ) + + # Test with invalid key format + invalid_key_request = BlockKeyRequest(key="invalid-key-format") + + with pytest.raises(ProxyException) as exc_info: + await unblock_key( + data=invalid_key_request, + http_request=mock_request, + user_api_key_dict=user_api_key_dict, + litellm_changed_by=None, + ) + + assert exc_info.value.code == "400" + assert "Invalid key format" in str(exc_info.value.message) From 51d5255452f7c49f01521b57189ea9ec8fbfd490 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 19:39:06 -0700 Subject: [PATCH 09/29] [Bug]: Azure OpenAI & AI Foundry Reject Image Generation Payload Due to extra_body Injection in LiteLLM v1.76.3 (#14475) * add request body azure img gen * fix test_get_optional_params_image_gen_filters_empty_values * test_azure_image_generation_request_body * test_azure_image_generation_request_body --- litellm/utils.py | 37 ++++++++++++------- .../request_payloads/azure_gpt_image_1.json | 4 ++ .../image_gen_tests/test_image_generation.py | 31 ++++++++++++++++ tests/test_litellm/test_utils.py | 9 +++++ 4 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 tests/image_gen_tests/request_payloads/azure_gpt_image_1.json diff --git a/litellm/utils.py b/litellm/utils.py index 84d86bea647..0d2fe5d4d64 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -2501,6 +2501,23 @@ def get_optional_params_transcription( return optional_params +def _map_openai_size_to_vertex_ai_aspect_ratio(size: Optional[str]) -> str: + """Map OpenAI size parameter to Vertex AI aspectRatio.""" + if size is None: + return "1:1" + + # Map OpenAI size strings to Vertex AI aspect ratio strings + # Vertex AI accepts: "1:1", "9:16", "16:9", "4:3", "3:4" + size_to_aspect_ratio = { + "256x256": "1:1", # Square + "512x512": "1:1", # Square + "1024x1024": "1:1", # Square (default) + "1792x1024": "16:9", # Landscape + "1024x1792": "9:16", # Portrait + } + return size_to_aspect_ratio.get(size, "1:1") # Default to square if size not recognized + + def get_optional_params_image_gen( model: Optional[str] = None, n: Optional[int] = None, @@ -2614,19 +2631,7 @@ def get_optional_params_image_gen( # Map OpenAI size parameter to Vertex AI aspectRatio if size is not None: - # Map OpenAI size strings to Vertex AI aspect ratio strings - # Vertex AI accepts: "1:1", "9:16", "16:9", "4:3", "3:4" - size_to_aspect_ratio = { - "256x256": "1:1", # Square - "512x512": "1:1", # Square - "1024x1024": "1:1", # Square (default) - "1792x1024": "16:9", # Landscape - "1024x1792": "9:16", # Portrait - } - aspect_ratio = size_to_aspect_ratio.get( - size, "1:1" - ) # Default to square if size not recognized - optional_params["aspectRatio"] = aspect_ratio + optional_params["aspectRatio"] = _map_openai_size_to_vertex_ai_aspect_ratio(size) openai_params: list[str] = list(default_params.keys()) if provider_config is not None: @@ -2642,6 +2647,12 @@ def get_optional_params_image_gen( openai_params=openai_params, additional_drop_params=additional_drop_params, ) + # remove keys with None or empty dict/list values to avoid sending empty payloads + optional_params = { + k: v + for k, v in optional_params.items() + if v is not None and (not isinstance(v, (dict, list)) or len(v) > 0) + } return optional_params diff --git a/tests/image_gen_tests/request_payloads/azure_gpt_image_1.json b/tests/image_gen_tests/request_payloads/azure_gpt_image_1.json new file mode 100644 index 00000000000..1ad57bc0d4c --- /dev/null +++ b/tests/image_gen_tests/request_payloads/azure_gpt_image_1.json @@ -0,0 +1,4 @@ +{ + "model": "gpt-image-1", + "prompt": "test prompt" +} diff --git a/tests/image_gen_tests/test_image_generation.py b/tests/image_gen_tests/test_image_generation.py index 61843d3151e..c3900342954 100644 --- a/tests/image_gen_tests/test_image_generation.py +++ b/tests/image_gen_tests/test_image_generation.py @@ -5,6 +5,7 @@ import logging import os import sys import traceback +from unittest.mock import AsyncMock, patch sys.path.insert( @@ -329,3 +330,33 @@ async def test_aiml_image_generation_with_dynamic_api_key(): assert captured_json_data is not None assert captured_json_data["prompt"] == "A cute baby sea otter" assert captured_json_data["model"] == "flux-pro/v1.1" + +@pytest.mark.asyncio +async def test_azure_image_generation_request_body(): + from litellm import aimage_generation + test_dir = os.path.dirname(__file__) + expected_path = os.path.join( + test_dir, "request_payloads", "azure_gpt_image_1.json" + ) + with open(expected_path, "r") as f: + expected_body = json.load(f) + + with patch( + "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.post", + new_callable=AsyncMock, + ) as mock_post: + mock_post.side_effect = Exception("test") + + with pytest.raises(Exception): + await aimage_generation( + model="azure/gpt-image-1", + prompt="test prompt", + api_base="https://example.azure.com", + api_key="test-key", + api_version="2025-04-01-preview", + ) + + mock_post.assert_called_once() + call_args = mock_post.call_args + request_json = call_args.kwargs.get("json", {}) + assert request_json == expected_body diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 2bf2935901e..f9f150b6234 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -84,6 +84,15 @@ def test_get_optional_params_image_gen_vertex_ai_size(): assert optional_params["sampleCount"] == 1 +def test_get_optional_params_image_gen_filters_empty_values(): + optional_params = get_optional_params_image_gen( + model="gpt-image-1", + custom_llm_provider="openai", + extra_body={}, + ) + assert optional_params == {} + + def test_all_model_configs(): from litellm.llms.vertex_ai.vertex_ai_partner_models.ai21.transformation import ( VertexAIAi21Config, From 69ef062f5565f9411e8648d758a52da878cc52c6 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 19:56:44 -0700 Subject: [PATCH 10/29] fix tiered_pricing test --- ...odel_prices_and_context_window_backup.json | 5 ----- model_prices_and_context_window.json | 5 ----- tests/test_litellm/test_utils.py | 20 +++++++++++++++++++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 972e212e693..46331c7cff7 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -19132,7 +19132,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, @@ -19161,7 +19160,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06, "cache_read_input_token_cost": 1e-07}, @@ -19196,7 +19194,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06, "cache_read_input_token_cost": 8e-08}, @@ -19302,7 +19299,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, @@ -19355,7 +19351,6 @@ "max_tokens": 131072, "max_input_tokens": 98304, "max_output_tokens": 8192, - "max_chain_of_thought_tokens": 32768, "input_cost_per_token": 8e-07, "output_cost_per_token": 2.4e-06, "litellm_provider": "dashscope", diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 972e212e693..46331c7cff7 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -19132,7 +19132,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, @@ -19161,7 +19160,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 32e3], "input_cost_per_token": 1e-06, "output_cost_per_token": 5e-06, "cache_read_input_token_cost": 1e-07}, @@ -19196,7 +19194,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 32e3], "input_cost_per_token": 3e-07, "output_cost_per_token": 1.5e-06, "cache_read_input_token_cost": 8e-08}, @@ -19302,7 +19299,6 @@ "supports_function_calling": true, "supports_tool_choice": true, "supports_reasoning": true, - "supports_caching": true, "mode": "chat", "tiered_pricing": [ {"range": [0, 256e3], "input_cost_per_token": 5e-08, "output_cost_per_token": 4e-07}, @@ -19355,7 +19351,6 @@ "max_tokens": 131072, "max_input_tokens": 98304, "max_output_tokens": 8192, - "max_chain_of_thought_tokens": 32768, "input_cost_per_token": 8e-07, "output_cost_per_token": 2.4e-06, "litellm_provider": "dashscope", diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index f9f150b6234..0c7aa527240 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -652,6 +652,26 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): }, }, "supports_native_streaming": {"type": "boolean"}, + "tiered_pricing": { + "type": "array", + "items": { + "type": "object", + "properties": { + "range": { + "type": "array", + "items": {"type": "number"}, + "minItems": 2, + "maxItems": 2 + }, + "input_cost_per_token": {"type": "number"}, + "output_cost_per_token": {"type": "number"}, + "cache_read_input_token_cost": {"type": "number"}, + "output_cost_per_reasoning_token": {"type": "number"} + }, + "required": ["range"], + "additionalProperties": False + } + }, }, "additionalProperties": False, }, From 94038108ad75dc25efc2bafbd1d9a7b0165aaa1e Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 20:00:54 -0700 Subject: [PATCH 11/29] fix dashscope api base --- .../add_model/provider_specific_fields.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx b/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx index ce19a248f83..a76d7b64ffe 100644 --- a/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx +++ b/ui/litellm-dashboard/src/components/add_model/provider_specific_fields.tsx @@ -206,6 +206,22 @@ const PROVIDER_CREDENTIAL_FIELDS: Record = required: true } ], + [Providers.Dashscope]: [ + { + key: "api_key", + label: "Dashscope API Key", + type: "password", + required: true + }, + { + key: "api_base", + label: "API Base", + placeholder: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + defaultValue: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + required: true, + tooltip: "The base URL for your Dashscope server. Defaults to https://dashscope-intl.aliyuncs.com/compatible-mode/v1 if not specified." + } + ], [Providers.OpenAI_Text_Compatible]: [ { key: "api_base", From d89152bb2ccce4ab7713091715dd0abc11dd9ce3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 20:04:24 -0700 Subject: [PATCH 12/29] feat(litellm_logging.py): support new litellm debug parameter - `litellm_request_debug` on requests enables printing raw request when flag is set to true on requests --- litellm/constants.py | 10 +++-- .../litellm_core_utils/get_litellm_params.py | 2 + litellm/litellm_core_utils/litellm_logging.py | 45 +++++++++++++------ litellm/main.py | 44 ++++++++++++------ litellm/types/utils.py | 3 +- 5 files changed, 73 insertions(+), 31 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 75c25d9ea9e..c0ce0f265b5 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -15,7 +15,7 @@ DEFAULT_SQS_FLUSH_INTERVAL_SECONDS = int( os.getenv("DEFAULT_SQS_FLUSH_INTERVAL_SECONDS", 10) ) DEFAULT_NUM_WORKERS_LITELLM_PROXY = int( - os.getenv("DEFAULT_NUM_WORKERS_LITELLM_PROXY", os.cpu_count() or 4) + os.getenv("DEFAULT_NUM_WORKERS_LITELLM_PROXY", 1) ) DEFAULT_SQS_BATCH_SIZE = int(os.getenv("DEFAULT_SQS_BATCH_SIZE", 512)) SQS_SEND_MESSAGE_ACTION = "SendMessage" @@ -60,7 +60,9 @@ DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_PRO = int( os.getenv("DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_PRO", 128) ) DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE = int( - os.getenv("DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE", 512) + os.getenv( + "DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE", 512 + ) ) # Generic fallback for unknown models @@ -949,7 +951,9 @@ LITELLM_CLI_SESSION_TOKEN_PREFIX = "litellm-session-token" DB_SPEND_UPDATE_JOB_NAME = "db_spend_update_job" PROMETHEUS_EMIT_BUDGET_METRICS_JOB_NAME = "prometheus_emit_budget_metrics" CLOUDZERO_EXPORT_USAGE_DATA_JOB_NAME = "cloudzero_export_usage_data" -CLOUDZERO_MAX_FETCHED_DATA_RECORDS = int(os.getenv("CLOUDZERO_MAX_FETCHED_DATA_RECORDS", 50000)) +CLOUDZERO_MAX_FETCHED_DATA_RECORDS = int( + os.getenv("CLOUDZERO_MAX_FETCHED_DATA_RECORDS", 50000) +) SPEND_LOG_CLEANUP_JOB_NAME = "spend_log_cleanup" SPEND_LOG_RUN_LOOPS = int(os.getenv("SPEND_LOG_RUN_LOOPS", 500)) SPEND_LOG_CLEANUP_BATCH_SIZE = int(os.getenv("SPEND_LOG_CLEANUP_BATCH_SIZE", 1000)) diff --git a/litellm/litellm_core_utils/get_litellm_params.py b/litellm/litellm_core_utils/get_litellm_params.py index c354dea0241..c167c202e5d 100644 --- a/litellm/litellm_core_utils/get_litellm_params.py +++ b/litellm/litellm_core_utils/get_litellm_params.py @@ -62,6 +62,7 @@ def get_litellm_params( use_litellm_proxy: Optional[bool] = None, api_version: Optional[str] = None, max_retries: Optional[int] = None, + litellm_request_debug: Optional[bool] = None, **kwargs, ) -> dict: litellm_params = { @@ -118,5 +119,6 @@ def get_litellm_params( "vertex_credentials": kwargs.get("vertex_credentials"), "vertex_project": kwargs.get("vertex_project"), "use_litellm_proxy": use_litellm_proxy, + "litellm_request_debug": litellm_request_debug, } return litellm_params diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 19d7c5512ba..59dd09f2728 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -245,6 +245,7 @@ class Logging(LiteLLMLoggingBaseClass): global supabaseClient, promptLayerLogger, weightsBiasesLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app custom_pricing: bool = False stream_options = None + litellm_request_debug: bool = False def __init__( self, @@ -470,6 +471,7 @@ class Logging(LiteLLMLoggingBaseClass): **self.litellm_params, **scrub_sensitive_keys_in_metadata(litellm_params), } + self.litellm_request_debug = litellm_params.get("litellm_request_debug", False) self.logger_fn = litellm_params.get("logger_fn", None) verbose_logger.debug(f"self.optional_params: {self.optional_params}") @@ -907,13 +909,19 @@ class Logging(LiteLLMLoggingBaseClass): Prints the RAW curl command sent from LiteLLM """ - if _is_debugging_on(): + if _is_debugging_on() or self.litellm_request_debug: if json_logs: masked_headers = self._get_masked_headers(headers) - verbose_logger.debug( - "POST Request Sent from LiteLLM", - extra={"api_base": {api_base}, **masked_headers}, - ) + if self.litellm_request_debug: + verbose_logger.warning( # .warning ensures this shows up in all environments + "POST Request Sent from LiteLLM", + extra={"api_base": {api_base}, **masked_headers}, + ) + else: + verbose_logger.debug( + "POST Request Sent from LiteLLM", + extra={"api_base": {api_base}, **masked_headers}, + ) else: headers = additional_args.get("headers", {}) if headers is None: @@ -926,7 +934,12 @@ class Logging(LiteLLMLoggingBaseClass): additional_args=additional_args, data=data, ) - verbose_logger.debug(f"\033[92m{curl_command}\033[0m\n") + if self.litellm_request_debug: + verbose_logger.warning( + f"\033[92m{curl_command}\033[0m\n" + ) # .warning ensures this shows up in all environments + else: + verbose_logger.debug(f"\033[92m{curl_command}\033[0m\n") def _get_request_body(self, data: dict) -> str: return str(data) @@ -1714,12 +1727,16 @@ class Logging(LiteLLMLoggingBaseClass): response_obj=result, start_time=start_time, end_time=end_time, - litellm_call_id=current_call_id - if ( - current_call_id := litellm_params.get("litellm_call_id") - ) - is not None - else str(uuid.uuid4()), + litellm_call_id=( + current_call_id + if ( + current_call_id := litellm_params.get( + "litellm_call_id" + ) + ) + is not None + else str(uuid.uuid4()) + ), print_verbose=print_verbose, ) if callback == "wandb" and weightsBiasesLogger is not None: @@ -3367,6 +3384,7 @@ def _init_custom_logger_compatible_class( # noqa: PLR0915 return galileo_logger # type: ignore elif logging_integration == "cloudzero": from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger + for callback in _in_memory_loggers: if isinstance(callback, CloudZeroLogger): return callback # type: ignore @@ -3594,6 +3612,7 @@ def get_custom_logger_compatible_class( # noqa: PLR0915 return callback elif logging_integration == "cloudzero": from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger + for callback in _in_memory_loggers: if isinstance(callback, CloudZeroLogger): return callback @@ -4504,7 +4523,7 @@ def get_standard_logging_object_payload( def emit_standard_logging_payload(payload: StandardLoggingPayload): if os.getenv("LITELLM_PRINT_STANDARD_LOGGING_PAYLOAD"): - print(json.dumps(payload, indent=4)) # noqa + print(json.dumps(payload, indent=4)) # noqa def get_standard_logging_metadata( diff --git a/litellm/main.py b/litellm/main.py index d7395eb1457..6c81d3eded9 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -150,9 +150,9 @@ from .llms.custom_httpx.llm_http_handler import BaseLLMHTTPHandler from .llms.custom_llm import CustomLLM, custom_chat_llm_router from .llms.databricks.embed.handler import DatabricksEmbeddingHandler from .llms.deprecated_providers import aleph_alpha, palm +from .llms.gemini.common_utils import get_api_key_from_env from .llms.groq.chat.handler import GroqChatCompletion from .llms.heroku.chat.transformation import HerokuChatConfig -from .llms.gemini.common_utils import get_api_key_from_env from .llms.huggingface.embedding.handler import HuggingFaceEmbedding from .llms.nlp_cloud.chat.handler import completion as nlp_cloud_chat_completion from .llms.oci.chat.transformation import OCIChatConfig @@ -358,7 +358,9 @@ async def acompletion( logprobs: Optional[bool] = None, top_logprobs: Optional[int] = None, deployment_id=None, - reasoning_effort: Optional[Literal["none", "minimal", "low", "medium", "high", "default"]] = None, + reasoning_effort: Optional[ + Literal["none", "minimal", "low", "medium", "high", "default"] + ] = None, safety_identifier: Optional[str] = None, # set api_base, api_version, api_key base_url: Optional[str] = None, @@ -504,7 +506,9 @@ async def acompletion( } if custom_llm_provider is None: _, custom_llm_provider, _, _ = get_llm_provider( - model=model, custom_llm_provider=custom_llm_provider, api_base=completion_kwargs.get("base_url", None) + model=model, + custom_llm_provider=custom_llm_provider, + api_base=completion_kwargs.get("base_url", None), ) fallbacks = fallbacks or litellm.model_fallbacks @@ -899,7 +903,9 @@ def completion( # type: ignore # noqa: PLR0915 logit_bias: Optional[dict] = None, user: Optional[str] = None, # openai v1.0+ new params - reasoning_effort: Optional[Literal["none", "minimal", "low", "medium", "high", "default"]] = None, + reasoning_effort: Optional[ + Literal["none", "minimal", "low", "medium", "high", "default"] + ] = None, response_format: Optional[Union[dict, Type[BaseModel]]] = None, seed: Optional[int] = None, tools: Optional[List] = None, @@ -1116,10 +1122,12 @@ def completion( # type: ignore # noqa: PLR0915 ) if provider_specific_header is not None: - headers.update(ProviderSpecificHeaderUtils.get_provider_specific_headers( - provider_specific_header=provider_specific_header, - custom_llm_provider=custom_llm_provider, - )) + headers.update( + ProviderSpecificHeaderUtils.get_provider_specific_headers( + provider_specific_header=provider_specific_header, + custom_llm_provider=custom_llm_provider, + ) + ) if model_response is not None and hasattr(model_response, "_hidden_params"): model_response._hidden_params["custom_llm_provider"] = custom_llm_provider @@ -1325,6 +1333,7 @@ def completion( # type: ignore # noqa: PLR0915 azure_scope=kwargs.get("azure_scope"), max_retries=max_retries, timeout=timeout, + litellm_request_debug=kwargs.get("litellm_request_debug", False), ) cast(LiteLLMLoggingObj, logging).update_environment_variables( model=model, @@ -2712,9 +2721,7 @@ def completion( # type: ignore # noqa: PLR0915 ) api_key = ( - api_key - or litellm.api_key - or get_secret("VERCEL_AI_GATEWAY_API_KEY") + api_key or litellm.api_key or get_secret("VERCEL_AI_GATEWAY_API_KEY") ) vercel_site_url = get_secret("VERCEL_SITE_URL") or "https://litellm.ai" @@ -2730,7 +2737,7 @@ def completion( # type: ignore # noqa: PLR0915 vercel_headers.update(_headers) headers = vercel_headers - + ## Load Config config = litellm.VercelAIGatewayConfig.get_config() for k, v in config.items(): @@ -3712,7 +3719,9 @@ async def aembedding(*args, **kwargs) -> EmbeddingResponse: func_with_context = partial(ctx.run, func) _, custom_llm_provider, _, _ = get_llm_provider( - model=model, custom_llm_provider=custom_llm_provider, api_base=kwargs.get("api_base", None) + model=model, + custom_llm_provider=custom_llm_provider, + api_base=kwargs.get("api_base", None), ) # Await normally @@ -5780,7 +5789,14 @@ async def ahealth_check( input=input or ["test"], ), "audio_speech": lambda: litellm.aspeech( - **{**_filter_model_params(model_params), **({"voice": "alloy"} if "voice" not in _filter_model_params(model_params) else {})}, + **{ + **_filter_model_params(model_params), + **( + {"voice": "alloy"} + if "voice" not in _filter_model_params(model_params) + else {} + ), + }, input=prompt or "test", ), "audio_transcription": lambda: litellm.atranscription( diff --git a/litellm/types/utils.py b/litellm/types/utils.py index c6f7098a1a7..6452254d11f 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -1995,7 +1995,7 @@ class StandardLoggingGuardrailInformation(TypedDict, total=False): ] guardrail_request: Optional[dict] guardrail_response: Optional[Union[dict, str, List[dict]]] - guardrail_status: Literal["success", "failure","blocked"] + guardrail_status: Literal["success", "failure", "blocked"] start_time: Optional[float] end_time: Optional[float] duration: Optional[float] @@ -2123,6 +2123,7 @@ all_litellm_params = [ "metadata", "litellm_metadata", "litellm_trace_id", + "litellm_request_debug", "guardrails", "tags", "acompletion", From 1e230e87e3d60fbe5bc7b51504244d68a36c1f3b Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 20:05:29 -0700 Subject: [PATCH 13/29] fixes for mypy --- litellm/responses/mcp/mcp_streaming_iterator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/responses/mcp/mcp_streaming_iterator.py b/litellm/responses/mcp/mcp_streaming_iterator.py index b0673880cec..8045d1c1dca 100644 --- a/litellm/responses/mcp/mcp_streaming_iterator.py +++ b/litellm/responses/mcp/mcp_streaming_iterator.py @@ -70,7 +70,8 @@ async def create_mcp_list_tools_events( mcp_tools_dict = [] for tool in filtered_mcp_tools: if hasattr(tool, 'model_dump') and callable(getattr(tool, 'model_dump')): - mcp_tools_dict.append(tool.model_dump()) + # Type cast to help mypy understand this is safe after hasattr check + mcp_tools_dict.append(cast(Any, tool).model_dump()) elif hasattr(tool, '__dict__'): mcp_tools_dict.append(tool.__dict__) else: From 48619f2b7bd6a71a86c4af57d151a21d1538d1ed Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 20:07:26 -0700 Subject: [PATCH 14/29] fix(litellm_logging.py): support emitting raw response on self.litellm_request_debug is true Addresses https://github.com/BerriAI/litellm/issues/13814 --- litellm/litellm_core_utils/litellm_logging.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 59dd09f2728..2f21d280899 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -996,8 +996,14 @@ class Logging(LiteLLMLoggingBaseClass): self.model_call_details["additional_args"] = additional_args self.model_call_details["log_event_type"] = "post_api_call" + if self.litellm_request_debug: + attr = "warning" + else: + attr = "debug" + if json_logs: - verbose_logger.debug( + callattr = getattr(verbose_logger, attr) + callattr( "RAW RESPONSE:\n{}\n\n".format( self.model_call_details.get( "original_response", self.model_call_details @@ -1005,7 +1011,8 @@ class Logging(LiteLLMLoggingBaseClass): ), ) else: - print_verbose( + callattr = getattr(verbose_logger, attr) + callattr( "RAW RESPONSE:\n{}\n\n".format( self.model_call_details.get( "original_response", self.model_call_details From 32d87c242bf6942de3ac738f90ebcae4e8ffab08 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 20:07:41 -0700 Subject: [PATCH 15/29] [Fixes] Using Qwen API Tiered Pricing (#14479) * fix: use dashscope cost calc * add qwen logo --- litellm/cost_calculator.py | 5 ++ litellm/llms/dashscope/cost_calculator.py | 33 +++++----- .../_experimental/out/assets/logos/qwen.png | Bin 0 -> 49453 bytes litellm/proxy/proxy_config.yaml | 4 +- .../test_dashscope_cost_calculator.py | 58 +++++++++++++----- .../out/assets/logos/qwen.png | Bin 0 -> 49453 bytes .../public/assets/logos/qwen.png | Bin 0 -> 49453 bytes 7 files changed, 63 insertions(+), 37 deletions(-) create mode 100644 litellm/proxy/_experimental/out/assets/logos/qwen.png create mode 100644 ui/litellm-dashboard/out/assets/logos/qwen.png create mode 100644 ui/litellm-dashboard/public/assets/logos/qwen.png diff --git a/litellm/cost_calculator.py b/litellm/cost_calculator.py index 01f3e2472f8..5d8f5faadf1 100644 --- a/litellm/cost_calculator.py +++ b/litellm/cost_calculator.py @@ -344,6 +344,11 @@ def cost_per_token( # noqa: PLR0915 return perplexity_cost_per_token(model=model, usage=usage_block) elif custom_llm_provider == "xai": return xai_cost_per_token(model=model, usage=usage_block) + elif custom_llm_provider == "dashscope": + from litellm.llms.dashscope.cost_calculator import ( + cost_per_token as dashscope_cost_per_token, + ) + return dashscope_cost_per_token(model=model, usage=usage_block) else: model_info = _cached_get_model_info_helper( model=model, custom_llm_provider=custom_llm_provider diff --git a/litellm/llms/dashscope/cost_calculator.py b/litellm/llms/dashscope/cost_calculator.py index 6f9ebe302f4..107eb7f5adf 100644 --- a/litellm/llms/dashscope/cost_calculator.py +++ b/litellm/llms/dashscope/cost_calculator.py @@ -45,36 +45,33 @@ def _calculate_tiered_cost( cost_key: str, fallback_cost_key: Optional[str] = None ) -> float: - """Calculate cost using tiered pricing structure.""" + """Calculate cost using tiered pricing structure. + + Finds the appropriate tier based on token count and applies that tier's rate to all tokens. + """ if not tiered_pricing or tokens <= 0: return 0.0 - total_cost = 0.0 - tokens_processed = 0 - + # Find the appropriate tier for the token count for tier in tiered_pricing: - if tokens_processed >= tokens: - break - tier_range = tier.get("range", []) if len(tier_range) != 2: continue range_start, range_end = tier_range - if tokens <= range_start: - break - - tier_start = max(range_start, tokens_processed) - tier_end = min(range_end, tokens) - - if tier_end > tier_start: - tokens_in_tier = tier_end - tier_start + # Check if tokens fall within this tier's range + if range_start <= tokens <= range_end: cost_per_token = tier.get(cost_key) or tier.get(fallback_cost_key, 0) - total_cost += tokens_in_tier * cost_per_token - tokens_processed = tier_end + return tokens * cost_per_token - return total_cost + # If no tier matches, use the last tier (highest tier) + if tiered_pricing: + last_tier = tiered_pricing[-1] + cost_per_token = last_tier.get(cost_key) or last_tier.get(fallback_cost_key, 0) + return tokens * cost_per_token + + return 0.0 def _calculate_flat_cost(tokens: int, cost_per_token: float) -> float: diff --git a/litellm/proxy/_experimental/out/assets/logos/qwen.png b/litellm/proxy/_experimental/out/assets/logos/qwen.png new file mode 100644 index 0000000000000000000000000000000000000000..d9feba46a28e64110d309b027a932328c62e5d95 GIT binary patch literal 49453 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 WSdSYrJr;`iChYdxTa{UOT=)&NoEbF$ literal 0 HcmV?d00001 diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 54bfdac55f9..918e11eea62 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -9,9 +9,9 @@ model_list: - model_name: openai/* litellm_params: model: openai/* - - model_name: gemini/* + - model_name: dashscope/* litellm_params: - model: gemini/* + model: dashscope/* litellm_settings: diff --git a/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py b/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py index 73e992e22d1..8adc793ae74 100644 --- a/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py +++ b/tests/test_litellm/llms/dashscope/test_dashscope_cost_calculator.py @@ -96,10 +96,10 @@ class TestDashscopeCostCalculator: assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) - def test_tiered_pricing_multiple_tiers(self): - """Test tiered pricing when tokens span multiple tiers.""" + def test_tiered_pricing_higher_tier(self): + """Test tiered pricing when tokens fall in higher tier (tier 3).""" usage = Usage( - prompt_tokens=150000, # Spans tiers 1 (0-32K), 2 (32K-128K), 3 (128K-256K) + prompt_tokens=150000, # Falls in tier 3 (128K-256K) completion_tokens=2000, total_tokens=152000 ) @@ -110,13 +110,13 @@ class TestDashscopeCostCalculator: ) # Expected input cost calculation: - # Tier 1 (0-32K): 32,000 tokens * $1e-6 = $0.032 - # Tier 2 (32K-128K): 96,000 tokens * $1.8e-6 = $0.1728 - # Tier 3 (128K-256K): 22,000 tokens * $3e-6 = $0.066 - # Total input cost = $0.032 + $0.1728 + $0.066 = $0.2708 + # 150,000 tokens falls in tier 3 (128K-256K), so all tokens are charged at tier 3 rate + # Input: 150,000 tokens * $3e-6 = $0.45 + # Output: 2,000 tokens falls in tier 1 (0-32K), so charged at tier 1 rate + # Output: 2,000 tokens * $5e-6 = $0.01 - expected_prompt_cost = (32000 * 1e-6) + (96000 * 1.8e-6) + (22000 * 3e-6) - expected_completion_cost = 2000 * 5e-6 # All in tier 1 for output + expected_prompt_cost = 150000 * 3e-6 # All tokens at tier 3 rate + expected_completion_cost = 2000 * 5e-6 # All tokens at tier 1 rate assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) @@ -140,20 +140,44 @@ class TestDashscopeCostCalculator: ) # Expected cost calculation: - # Regular tokens: 40,000 (32K in tier 1 + 8K in tier 2) - # - Tier 1: 32,000 * $1e-6 = $0.032 - # - Tier 2: 8,000 * $1.8e-6 = $0.0144 - # Cached tokens: 10,000 in tier 1 at discounted rate - # - Tier 1 cached: 10,000 * $1e-7 = $0.001 - # Total input cost = $0.032 + $0.0144 + $0.001 = $0.0474 + # Regular tokens: 40,000 falls in tier 2 (32K-128K), so all charged at tier 2 rate + # - Regular: 40,000 * $1.8e-6 = $0.072 + # Cached tokens: 10,000 falls in tier 1 (0-32K), so charged at tier 1 cached rate + # - Cached: 10,000 * $1e-7 = $0.001 + # Total input cost = $0.072 + $0.001 = $0.073 regular_tokens = 40000 cached_tokens = 10000 - expected_regular_cost = (32000 * 1e-6) + (8000 * 1.8e-6) + expected_regular_cost = regular_tokens * 1.8e-6 # Tier 2 rate expected_cached_cost = cached_tokens * 1e-7 # Tier 1 cached rate expected_prompt_cost = expected_regular_cost + expected_cached_cost - expected_completion_cost = 1000 * 5e-6 + expected_completion_cost = 1000 * 5e-6 # Tier 1 rate + + assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) + assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) + + def test_tiered_pricing_highest_tier(self): + """Test tiered pricing when tokens exceed highest tier range.""" + usage = Usage( + prompt_tokens=2000000, # Exceeds tier 4 max (1M), should use tier 4 rate + completion_tokens=5000, + total_tokens=2005000 + ) + + prompt_cost, completion_cost = dashscope_cost_per_token( + model="qwen3-coder-plus", + usage=usage + ) + + # Expected cost calculation: + # 2,000,000 tokens exceeds tier 4 (256K-1M), so use tier 4 rate for all tokens + # Input: 2,000,000 tokens * $6e-6 = $12.0 + # Output: 5,000 tokens falls in tier 1 (0-32K), so charged at tier 1 rate + # Output: 5,000 tokens * $5e-6 = $0.025 + + expected_prompt_cost = 2000000 * 6e-6 # Tier 4 rate (highest tier) + expected_completion_cost = 5000 * 5e-6 # Tier 1 rate assert math.isclose(prompt_cost, expected_prompt_cost, rel_tol=1e-10) assert math.isclose(completion_cost, expected_completion_cost, rel_tol=1e-10) \ No newline at end of file diff --git a/ui/litellm-dashboard/out/assets/logos/qwen.png b/ui/litellm-dashboard/out/assets/logos/qwen.png new file mode 100644 index 0000000000000000000000000000000000000000..d9feba46a28e64110d309b027a932328c62e5d95 GIT binary patch literal 49453 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 WSdSYrJr;`iChYdxTa{UOT=)&NoEbF$ literal 0 HcmV?d00001 diff --git a/ui/litellm-dashboard/public/assets/logos/qwen.png b/ui/litellm-dashboard/public/assets/logos/qwen.png new file mode 100644 index 0000000000000000000000000000000000000000..d9feba46a28e64110d309b027a932328c62e5d95 GIT binary patch literal 49453 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 WSdSYrJr;`iChYdxTa{UOT=)&NoEbF$ literal 0 HcmV?d00001 From 698a2dd382f59face841ba387ae9d40ed41f47bc Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 20:12:01 -0700 Subject: [PATCH 16/29] fix: convert_anthropic_tool_to_databricks_tool --- litellm/llms/databricks/chat/transformation.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/litellm/llms/databricks/chat/transformation.py b/litellm/llms/databricks/chat/transformation.py index 4852f2e7106..a1370074238 100644 --- a/litellm/llms/databricks/chat/transformation.py +++ b/litellm/llms/databricks/chat/transformation.py @@ -169,18 +169,20 @@ class DatabricksConfig(DatabricksBase, OpenAILikeChatConfig, AnthropicConfig): if tool is None: return None - kwags: dict = { + # Build DatabricksFunction explicitly to avoid parameter conflicts + function_params: DatabricksFunction = { "name": tool["name"], "parameters": cast(dict, tool.get("input_schema") or {}) } - + + # Only add description if it exists description = tool.get("description") if description is not None: - kwags["description"] = cast(Union[dict, str], description) + function_params["description"] = cast(Union[dict, str], description) return DatabricksTool( type="function", - function=DatabricksFunction(name=tool["name"], **kwags), + function=function_params, ) def _map_openai_to_dbrx_tool(self, model: str, tools: List) -> List[DatabricksTool]: From c802c472b5598de67126d3c93b75ac08ca498c86 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 11 Sep 2025 20:17:39 -0700 Subject: [PATCH 17/29] docs(debugging.md): document new feature Closes https://github.com/BerriAI/litellm/issues/13814 --- docs/my-website/docs/proxy/debugging.md | 68 +++++++++++++++++++------ 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/docs/my-website/docs/proxy/debugging.md b/docs/my-website/docs/proxy/debugging.md index 5cca6541763..fbcac24a4d6 100644 --- a/docs/my-website/docs/proxy/debugging.md +++ b/docs/my-website/docs/proxy/debugging.md @@ -11,13 +11,13 @@ The proxy also supports json logs. [See here](#json-logs) **via cli** -```bash +```bash showLineNumbers $ litellm --debug ``` **via env** -```python +```python showLineNumbers os.environ["LITELLM_LOG"] = "INFO" ``` @@ -25,25 +25,25 @@ os.environ["LITELLM_LOG"] = "INFO" **via cli** -```bash +```bash showLineNumbers $ litellm --detailed_debug ``` **via env** -```python +```python showLineNumbers os.environ["LITELLM_LOG"] = "DEBUG" ``` ### Debug Logs Run the proxy with `--detailed_debug` to view detailed debug logs -```shell +```shell showLineNumbers litellm --config /path/to/config.yaml --detailed_debug ``` When making requests you should see the POST request sent by LiteLLM to the LLM on the Terminal output -```shell +```shell showLineNumbers POST Request Sent from LiteLLM: curl -X POST \ https://api.openai.com/v1/chat/completions \ @@ -51,25 +51,63 @@ https://api.openai.com/v1/chat/completions \ -d '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "this is a test request, write a short poem"}]}' ``` +## Debug single request + +Pass in `litellm_request_debug=True` in the request body + +```bash showLineNumbers +curl -L -X POST 'http://0.0.0.0:4000/chat/completions' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer sk-1234' \ +-d '{ + "model":"fake-openai-endpoint", + "messages": [{"role": "user","content": "How many r in the word strawberry?"}], + "litellm_request_debug": true +}' +``` + +This will emit the raw request sent by LiteLLM to the API Provider and raw response received from the API Provider for **just** this request in the logs. + + +```bash showLineNumbers +INFO: Uvicorn running on http://0.0.0.0:4000 (Press CTRL+C to quit) +20:14:06 - LiteLLM:WARNING: litellm_logging.py:938 - + +POST Request Sent from LiteLLM: +curl -X POST \ +https://exampleopenaiendpoint-production.up.railway.app/chat/completions \ +-H 'Authorization: Be****ey' -H 'Content-Type: application/json' \ +-d '{'model': 'fake', 'messages': [{'role': 'user', 'content': 'How many r in the word strawberry?'}], 'stream': False}' + + +20:14:06 - LiteLLM:WARNING: litellm_logging.py:1015 - RAW RESPONSE: +{"id":"chatcmpl-817fc08f0d6c451485d571dab39b26a1","object":"chat.completion","created":1677652288,"model":"gpt-3.5-turbo-0301","system_fingerprint":"fp_44709d6fcb","choices":[{"index":0,"message":{"role":"assistant","content":"\n\nHello there, how may I assist you today?"},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":9,"completion_tokens":12,"total_tokens":21}} + + +INFO: 127.0.0.1:56155 - "POST /chat/completions HTTP/1.1" 200 OK + +``` + + ## JSON LOGS Set `JSON_LOGS="True"` in your env: -```bash +```bash showLineNumbers export JSON_LOGS="True" ``` **OR** Set `json_logs: true` in your yaml: -```yaml +```yaml showLineNumbers litellm_settings: json_logs: true ``` Start proxy -```bash +```bash showLineNumbers $ litellm ``` @@ -80,7 +118,7 @@ The proxy will now all logs in json format. Turn off fastapi's default 'INFO' logs 1. Turn on 'json logs' -```yaml +```yaml showLineNumbers litellm_settings: json_logs: true ``` @@ -89,20 +127,20 @@ litellm_settings: Only get logs if an error occurs. -```bash +```bash showLineNumbers LITELLM_LOG="ERROR" ``` 3. Start proxy -```bash +```bash showLineNumbers $ litellm ``` Expected Output: -```bash +```bash showLineNumbers # no info statements ``` @@ -119,14 +157,14 @@ This can be caused due to all your models hitting rate limit errors, causing the How to control this? - Adjust the cooldown time -```yaml +```yaml showLineNumbers router_settings: cooldown_time: 0 # 👈 KEY CHANGE ``` - Disable Cooldowns [NOT RECOMMENDED] -```yaml +```yaml showLineNumbers router_settings: disable_cooldowns: True ``` From f374103c46ad2c4d8f24b427ed956b8f37cc6935 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 11 Sep 2025 20:20:52 -0700 Subject: [PATCH 18/29] UI new build --- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/162-4e7640b4d68e1ae4.js | 1 + .../out/_next/static/chunks/162-714ca0ed10a07f66.js | 1 - .../out/_next/static/chunks/220-5061c4cea850d728.js | 8 ++++---- .../out/_next/static/chunks/866-9e1803a09e9ae8da.js | 2 +- .../out/_next/static/chunks/app/page-127adcf8da2b5294.js | 1 + .../out/_next/static/chunks/app/page-8dc8d9524a1f3965.js | 1 - .../out/_next/static/css/060d5ddee53e45ce.css | 3 --- .../out/_next/static/css/c528590c6415a94c.css | 3 +++ litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 4 ++-- litellm/proxy/_experimental/out/model_hub.txt | 4 ++-- .../{model_hub_table/index.html => model_hub_table.html} | 2 +- litellm/proxy/_experimental/out/model_hub_table.txt | 4 ++-- litellm/proxy/_experimental/out/onboarding.html | 1 + litellm/proxy/_experimental/out/onboarding.txt | 2 +- ui/litellm-dashboard/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/162-4e7640b4d68e1ae4.js | 1 + .../out/_next/static/chunks/162-714ca0ed10a07f66.js | 1 - .../out/_next/static/chunks/220-5061c4cea850d728.js | 8 ++++---- .../out/_next/static/chunks/866-9e1803a09e9ae8da.js | 2 +- .../out/_next/static/chunks/app/page-127adcf8da2b5294.js | 1 + .../out/_next/static/chunks/app/page-8dc8d9524a1f3965.js | 1 - .../out/_next/static/css/060d5ddee53e45ce.css | 3 --- .../out/_next/static/css/c528590c6415a94c.css | 3 +++ ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 4 ++-- ui/litellm-dashboard/out/model_hub.html | 2 +- ui/litellm-dashboard/out/model_hub.txt | 4 ++-- ui/litellm-dashboard/out/model_hub_table.html | 2 +- ui/litellm-dashboard/out/model_hub_table.txt | 4 ++-- ui/litellm-dashboard/out/onboarding.html | 2 +- ui/litellm-dashboard/out/onboarding.txt | 2 +- 36 files changed, 42 insertions(+), 41 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{0GF-OyXnYlAPMWfyPAZSs => FMlZjJYLUentCU02Wj6R_}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{0GF-OyXnYlAPMWfyPAZSs => FMlZjJYLUentCU02Wj6R_}/_ssgManifest.js (100%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/162-4e7640b4d68e1ae4.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/162-714ca0ed10a07f66.js rename ui/litellm-dashboard/out/_next/static/chunks/220-1c8d82f7ce7658c4.js => litellm/proxy/_experimental/out/_next/static/chunks/220-5061c4cea850d728.js (71%) rename ui/litellm-dashboard/out/_next/static/chunks/866-3523e0e07cf314f6.js => litellm/proxy/_experimental/out/_next/static/chunks/866-9e1803a09e9ae8da.js (99%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-127adcf8da2b5294.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-8dc8d9524a1f3965.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/css/060d5ddee53e45ce.css create mode 100644 litellm/proxy/_experimental/out/_next/static/css/c528590c6415a94c.css rename litellm/proxy/_experimental/out/{model_hub_table/index.html => model_hub_table.html} (92%) create mode 100644 litellm/proxy/_experimental/out/onboarding.html rename ui/litellm-dashboard/out/_next/static/{0GF-OyXnYlAPMWfyPAZSs => FMlZjJYLUentCU02Wj6R_}/_buildManifest.js (100%) rename ui/litellm-dashboard/out/_next/static/{0GF-OyXnYlAPMWfyPAZSs => FMlZjJYLUentCU02Wj6R_}/_ssgManifest.js (100%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/162-4e7640b4d68e1ae4.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/162-714ca0ed10a07f66.js rename litellm/proxy/_experimental/out/_next/static/chunks/220-1c8d82f7ce7658c4.js => ui/litellm-dashboard/out/_next/static/chunks/220-5061c4cea850d728.js (71%) rename litellm/proxy/_experimental/out/_next/static/chunks/866-3523e0e07cf314f6.js => ui/litellm-dashboard/out/_next/static/chunks/866-9e1803a09e9ae8da.js (99%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-127adcf8da2b5294.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-8dc8d9524a1f3965.js delete mode 100644 ui/litellm-dashboard/out/_next/static/css/060d5ddee53e45ce.css create mode 100644 ui/litellm-dashboard/out/_next/static/css/c528590c6415a94c.css diff --git a/litellm/proxy/_experimental/out/_next/static/0GF-OyXnYlAPMWfyPAZSs/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/FMlZjJYLUentCU02Wj6R_/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/0GF-OyXnYlAPMWfyPAZSs/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/FMlZjJYLUentCU02Wj6R_/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/0GF-OyXnYlAPMWfyPAZSs/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/FMlZjJYLUentCU02Wj6R_/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/0GF-OyXnYlAPMWfyPAZSs/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/FMlZjJYLUentCU02Wj6R_/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/162-4e7640b4d68e1ae4.js b/litellm/proxy/_experimental/out/_next/static/chunks/162-4e7640b4d68e1ae4.js new file mode 100644 index 00000000000..e9bbcb3d1f6 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/162-4e7640b4d68e1ae4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[162],{36724:function(e,t,n){n.d(t,{Dx:function(){return i.Z},Zb:function(){return s.Z},xv:function(){return r.Z},zx:function(){return a.Z}});var a=n(20831),s=n(12514),r=n(84264),i=n(96761)},19130:function(e,t,n){n.d(t,{RM:function(){return s.Z},SC:function(){return l.Z},iA:function(){return a.Z},pj:function(){return r.Z},ss:function(){return i.Z},xs:function(){return o.Z}});var a=n(21626),s=n(97214),r=n(28241),i=n(58834),o=n(69552),l=n(71876)},88658:function(e,t,n){n.d(t,{L:function(){return s}});var a=n(49817);let s=e=>{let t;let{apiKeySource:n,accessToken:s,apiKey:r,inputMessage:i,chatHistory:o,selectedTags:l,selectedVectorStores:c,selectedGuardrails:d,selectedMCPTools:m,endpointType:p,selectedModel:u,selectedSdk:g}=e,x="session"===n?s:r,h=window.location.origin,f=i||"Your prompt here",_=f.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n"),b=o.filter(e=>!e.isImage).map(e=>{let{role:t,content:n}=e;return{role:t,content:n}}),v={};l.length>0&&(v.tags=l),c.length>0&&(v.vector_stores=c),d.length>0&&(v.guardrails=d);let j=u||"your-model-name",y="azure"===g?'import openai\n\nclient = openai.AzureOpenAI(\n api_key="'.concat(x||"YOUR_LITELLM_API_KEY",'",\n azure_endpoint="').concat(h,'",\n api_version="2024-02-01"\n)'):'import openai\n\nclient = openai.OpenAI(\n api_key="'.concat(x||"YOUR_LITELLM_API_KEY",'",\n base_url="').concat(h,'"\n)');switch(p){case a.KP.CHAT:{let e=Object.keys(v).length>0,n="";if(e){let e=JSON.stringify({metadata:v},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();n=",\n extra_body=".concat(e)}let a=b.length>0?b:[{role:"user",content:f}];t='\nimport base64\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# Example with text only\nresponse = client.chat.completions.create(\n model="'.concat(j,'",\n messages=').concat(JSON.stringify(a,null,4)).concat(n,'\n)\n\nprint(response)\n\n# Example with image or PDF (uncomment and provide file path to use)\n# base64_file = encode_image("path/to/your/file.jpg") # or .pdf\n# response_with_file = client.chat.completions.create(\n# model="').concat(j,'",\n# messages=[\n# {\n# "role": "user",\n# "content": [\n# {\n# "type": "text",\n# "text": "').concat(_,'"\n# },\n# {\n# "type": "image_url",\n# "image_url": {\n# "url": f"data:image/jpeg;base64,{base64_file}" # or data:application/pdf;base64,{base64_file}\n# }\n# }\n# ]\n# }\n# ]').concat(n,"\n# )\n# print(response_with_file)\n");break}case a.KP.RESPONSES:{let e=Object.keys(v).length>0,n="";if(e){let e=JSON.stringify({metadata:v},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();n=",\n extra_body=".concat(e)}let a=b.length>0?b:[{role:"user",content:f}];t='\nimport base64\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# Example with text only\nresponse = client.responses.create(\n model="'.concat(j,'",\n input=').concat(JSON.stringify(a,null,4)).concat(n,'\n)\n\nprint(response.output_text)\n\n# Example with image or PDF (uncomment and provide file path to use)\n# base64_file = encode_image("path/to/your/file.jpg") # or .pdf\n# response_with_file = client.responses.create(\n# model="').concat(j,'",\n# input=[\n# {\n# "role": "user",\n# "content": [\n# {"type": "input_text", "text": "').concat(_,'"},\n# {\n# "type": "input_image",\n# "image_url": f"data:image/jpeg;base64,{base64_file}", # or data:application/pdf;base64,{base64_file}\n# },\n# ],\n# }\n# ]').concat(n,"\n# )\n# print(response_with_file.output_text)\n");break}case a.KP.IMAGE:t="azure"===g?"\n# NOTE: The Azure SDK does not have a direct equivalent to the multi-modal 'responses.create' method shown for OpenAI.\n# This snippet uses 'client.images.generate' and will create a new image based on your prompt.\n# It does not use the uploaded image, as 'client.images.generate' does not support image inputs in this context.\nimport os\nimport requests\nimport json\nimport time\nfrom PIL import Image\n\nresult = client.images.generate(\n model=\"".concat(j,'",\n prompt="').concat(i,'",\n n=1\n)\n\njson_response = json.loads(result.model_dump_json())\n\n# Set the directory for the stored image\nimage_dir = os.path.join(os.curdir, \'images\')\n\n# If the directory doesn\'t exist, create it\nif not os.path.isdir(image_dir):\n os.mkdir(image_dir)\n\n# Initialize the image path\nimage_filename = f"generated_image_{int(time.time())}.png"\nimage_path = os.path.join(image_dir, image_filename)\n\ntry:\n # Retrieve the generated image\n if json_response.get("data") && len(json_response["data"]) > 0 && json_response["data"][0].get("url"):\n image_url = json_response["data"][0]["url"]\n generated_image = requests.get(image_url).content\n with open(image_path, "wb") as image_file:\n image_file.write(generated_image)\n\n print(f"Image saved to {image_path}")\n # Display the image\n image = Image.open(image_path)\n image.show()\n else:\n print("Could not find image URL in response.")\n print("Full response:", json_response)\nexcept Exception as e:\n print(f"An error occurred: {e}")\n print("Full response:", json_response)\n'):"\nimport base64\nimport os\nimport time\nimport json\nfrom PIL import Image\nimport requests\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, \"rb\") as image_file:\n return base64.b64encode(image_file.read()).decode('utf-8')\n\n# Helper function to create a file (simplified for this example)\ndef create_file(image_path):\n # In a real implementation, this would upload the file to OpenAI\n # For this example, we'll just return a placeholder ID\n return f\"file_{os.path.basename(image_path).replace('.', '_')}\"\n\n# The prompt entered by the user\nprompt = \"".concat(_,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(j,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n');break;case a.KP.IMAGE_EDITS:t="azure"===g?'\nimport base64\nimport os\nimport time\nimport json\nfrom PIL import Image\nimport requests\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# The prompt entered by the user\nprompt = "'.concat(_,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(j,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n'):"\nimport base64\nimport os\nimport time\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, \"rb\") as image_file:\n return base64.b64encode(image_file.read()).decode('utf-8')\n\n# Helper function to create a file (simplified for this example)\ndef create_file(image_path):\n # In a real implementation, this would upload the file to OpenAI\n # For this example, we'll just return a placeholder ID\n return f\"file_{os.path.basename(image_path).replace('.', '_')}\"\n\n# The prompt entered by the user\nprompt = \"".concat(_,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(j,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n');break;default:t="\n# Code generation for this endpoint is not implemented yet."}return"".concat(y,"\n").concat(t)}},49817:function(e,t,n){var a,s,r,i;n.d(t,{KP:function(){return s},vf:function(){return l}}),(r=a||(a={})).IMAGE_GENERATION="image_generation",r.CHAT="chat",r.RESPONSES="responses",r.IMAGE_EDITS="image_edits",r.ANTHROPIC_MESSAGES="anthropic_messages",(i=s||(s={})).IMAGE="image",i.CHAT="chat",i.RESPONSES="responses",i.IMAGE_EDITS="image_edits",i.ANTHROPIC_MESSAGES="anthropic_messages";let o={image_generation:"image",chat:"chat",responses:"responses",image_edits:"image_edits",anthropic_messages:"anthropic_messages"},l=e=>{if(console.log("getEndpointType:",e),Object.values(a).includes(e)){let t=o[e];return console.log("endpointType:",t),t}return"chat"}},29488:function(e,t,n){n.d(t,{Hc:function(){return i},Ui:function(){return r},e4:function(){return o},xd:function(){return l}});let a="litellm_mcp_auth_tokens",s=()=>{try{let e=localStorage.getItem(a);return e?JSON.parse(e):{}}catch(e){return console.error("Error reading MCP auth tokens from localStorage:",e),{}}},r=(e,t)=>{try{let n=s()[e];if(n&&n.serverAlias===t||n&&!t&&!n.serverAlias)return n.authValue;return null}catch(e){return console.error("Error getting MCP auth token:",e),null}},i=(e,t,n,r)=>{try{let i=s();i[e]={serverId:e,serverAlias:r,authValue:t,authType:n,timestamp:Date.now()},localStorage.setItem(a,JSON.stringify(i))}catch(e){console.error("Error storing MCP auth token:",e)}},o=e=>{try{let t=s();delete t[e],localStorage.setItem(a,JSON.stringify(t))}catch(e){console.error("Error removing MCP auth token:",e)}},l=()=>{try{localStorage.removeItem(a)}catch(e){console.error("Error clearing MCP auth tokens:",e)}}},8048:function(e,t,n){n.d(t,{C:function(){return m}});var a=n(57437),s=n(71594),r=n(24525),i=n(2265),o=n(19130),l=n(44633),c=n(86462),d=n(49084);function m(e){let{data:t=[],columns:n,isLoading:m=!1,table:p,defaultSorting:u=[]}=e,[g,x]=i.useState(u),[h]=i.useState("onChange"),[f,_]=i.useState({}),[b,v]=i.useState({}),j=(0,s.b7)({data:t,columns:n,state:{sorting:g,columnSizing:f,columnVisibility:b},columnResizeMode:h,onSortingChange:x,onColumnSizingChange:_,onColumnVisibilityChange:v,getCoreRowModel:(0,r.sC)(),getSortedRowModel:(0,r.tj)(),enableSorting:!0,enableColumnResizing:!0,defaultColumn:{minSize:40,maxSize:500}});return i.useEffect(()=>{p&&(p.current=j)},[j,p]),(0,a.jsx)("div",{className:"rounded-lg custom-border relative",children:(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsx)("div",{className:"relative min-w-full",children:(0,a.jsxs)(o.iA,{className:"[&_td]:py-2 [&_th]:py-2 w-full",children:[(0,a.jsx)(o.ss,{children:j.getHeaderGroups().map(e=>(0,a.jsx)(o.SC,{children:e.headers.map(e=>{var t;return(0,a.jsxs)(o.xs,{className:"py-1 h-8 relative ".concat("actions"===e.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] z-20 w-[120px] ml-8":""," ").concat((null===(t=e.column.columnDef.meta)||void 0===t?void 0:t.className)||""),style:{width:"actions"===e.id?120:e.getSize(),position:"actions"===e.id?"sticky":"relative",right:"actions"===e.id?0:"auto"},onClick:e.column.getCanSort()?e.column.getToggleSortingHandler():void 0,children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsx)("div",{className:"flex items-center",children:e.isPlaceholder?null:(0,s.ie)(e.column.columnDef.header,e.getContext())}),"actions"!==e.id&&e.column.getCanSort()&&(0,a.jsx)("div",{className:"w-4",children:e.column.getIsSorted()?({asc:(0,a.jsx)(l.Z,{className:"h-4 w-4 text-blue-500"}),desc:(0,a.jsx)(c.Z,{className:"h-4 w-4 text-blue-500"})})[e.column.getIsSorted()]:(0,a.jsx)(d.Z,{className:"h-4 w-4 text-gray-400"})})]}),e.column.getCanResize()&&(0,a.jsx)("div",{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),className:"absolute right-0 top-0 h-full w-2 cursor-col-resize select-none touch-none ".concat(e.column.getIsResizing()?"bg-blue-500":"hover:bg-blue-200")})]},e.id)})},e.id))}),(0,a.jsx)(o.RM,{children:m?(0,a.jsx)(o.SC,{children:(0,a.jsx)(o.pj,{colSpan:n.length,className:"h-8 text-center",children:(0,a.jsx)("div",{className:"text-center text-gray-500",children:(0,a.jsx)("p",{children:"\uD83D\uDE85 Loading models..."})})})}):j.getRowModel().rows.length>0?j.getRowModel().rows.map(e=>(0,a.jsx)(o.SC,{children:e.getVisibleCells().map(e=>{var t;return(0,a.jsx)(o.pj,{className:"py-0.5 ".concat("actions"===e.column.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] z-20 w-[120px] ml-8":""," ").concat((null===(t=e.column.columnDef.meta)||void 0===t?void 0:t.className)||""),style:{width:"actions"===e.column.id?120:e.column.getSize(),position:"actions"===e.column.id?"sticky":"relative",right:"actions"===e.column.id?0:"auto"},children:(0,s.ie)(e.column.columnDef.cell,e.getContext())},e.id)})},e.id)):(0,a.jsx)(o.SC,{children:(0,a.jsx)(o.pj,{colSpan:n.length,className:"h-8 text-center",children:(0,a.jsx)("div",{className:"text-center text-gray-500",children:(0,a.jsx)("p",{children:"No models found"})})})})})]})})})})}},65373:function(e,t,n){n.d(t,{Z:function(){return v}});var a=n(57437),s=n(27648),r=n(2265),i=n(89970),o=n(80795),l=n(19250),c=n(15883),d=n(46346),m=n(57400),p=n(91870),u=n(40428),g=n(83884),x=n(45524),h=n(3914);let f=async e=>{if(!e)return null;try{return await (0,l.getProxyUISettings)(e)}catch(e){return console.error("Error fetching proxy settings:",e),null}};var _=n(69734),b=n(29488),v=e=>{let{userID:t,userEmail:n,userRole:v,premiumUser:j,proxySettings:y,setProxySettings:N,accessToken:w,isPublicPage:A=!1,sidebarCollapsed:I=!1,onToggleSidebar:S}=e,k=(0,l.getProxyBaseUrl)(),[C,E]=(0,r.useState)(""),{logoUrl:M}=(0,_.F)();(0,r.useEffect)(()=>{(async()=>{if(w){let e=await f(w);console.log("response from fetchProxySettings",e),e&&N(e)}})()},[w]),(0,r.useEffect)(()=>{E((null==y?void 0:y.PROXY_LOGOUT_URL)||"")},[y]);let O=[{key:"user-info",label:(0,a.jsxs)("div",{className:"px-3 py-3 border-b border-gray-100",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(c.Z,{className:"mr-2 text-gray-700"}),(0,a.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:t})]}),j?(0,a.jsx)(i.Z,{title:"Premium User",placement:"left",children:(0,a.jsxs)("div",{className:"flex items-center bg-gradient-to-r from-amber-500 to-yellow-500 text-white px-2 py-0.5 rounded-full cursor-help",children:[(0,a.jsx)(d.Z,{className:"mr-1 text-xs"}),(0,a.jsx)("span",{className:"text-xs font-medium",children:"Premium"})]})}):(0,a.jsx)(i.Z,{title:"Upgrade to Premium for advanced features",placement:"left",children:(0,a.jsxs)("div",{className:"flex items-center bg-gray-100 text-gray-500 px-2 py-0.5 rounded-full cursor-help",children:[(0,a.jsx)(d.Z,{className:"mr-1 text-xs"}),(0,a.jsx)("span",{className:"text-xs font-medium",children:"Standard"})]})})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex items-center text-sm",children:[(0,a.jsx)(m.Z,{className:"mr-2 text-gray-400 text-xs"}),(0,a.jsx)("span",{className:"text-gray-500 text-xs",children:"Role"}),(0,a.jsx)("span",{className:"ml-auto text-gray-700 font-medium",children:v})]}),(0,a.jsxs)("div",{className:"flex items-center text-sm",children:[(0,a.jsx)(p.Z,{className:"mr-2 text-gray-400 text-xs"}),(0,a.jsx)("span",{className:"text-gray-500 text-xs",children:"Email"}),(0,a.jsx)("span",{className:"ml-auto text-gray-700 font-medium truncate max-w-[150px]",title:n||"Unknown",children:n||"Unknown"})]})]})]})},{key:"logout",label:(0,a.jsxs)("div",{className:"flex items-center py-2 px-3 hover:bg-gray-50 rounded-md mx-1 my-1",onClick:()=>{(0,h.b)(),(0,b.xd)(),window.location.href=C},children:[(0,a.jsx)(u.Z,{className:"mr-3 text-gray-600"}),(0,a.jsx)("span",{className:"text-gray-800",children:"Logout"})]})}];return(0,a.jsx)("nav",{className:"bg-white border-b border-gray-200 sticky top-0 z-10",children:(0,a.jsx)("div",{className:"w-full",children:(0,a.jsxs)("div",{className:"flex items-center h-14 px-4",children:[" ",(0,a.jsxs)("div",{className:"flex items-center flex-shrink-0",children:[S&&(0,a.jsx)("button",{onClick:S,className:"flex items-center justify-center w-10 h-10 mr-2 text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded transition-colors",title:I?"Expand sidebar":"Collapse sidebar",children:(0,a.jsx)("span",{className:"text-lg",children:I?(0,a.jsx)(g.Z,{}):(0,a.jsx)(x.Z,{})})}),(0,a.jsx)(s.default,{href:"/",className:"flex items-center",children:(0,a.jsx)("img",{src:M||"".concat(k,"/get_image"),alt:"LiteLLM Brand",className:"h-10 w-auto"})})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-5 ml-auto",children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/",target:"_blank",rel:"noopener noreferrer",className:"text-sm text-gray-600 hover:text-gray-900 transition-colors",children:"Docs"}),!A&&(0,a.jsx)(o.Z,{menu:{items:O,className:"min-w-[200px]",style:{padding:"8px",marginTop:"8px",borderRadius:"12px",boxShadow:"0 4px 24px rgba(0, 0, 0, 0.08)"}},overlayStyle:{minWidth:"200px"},children:(0,a.jsxs)("button",{className:"inline-flex items-center text-sm text-gray-600 hover:text-gray-900 transition-colors",children:["User",(0,a.jsx)("svg",{className:"ml-1 w-5 h-5 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M19 9l-7 7-7-7"})})]})})]})]})})})}},42673:function(e,t,n){var a,s;n.d(t,{Cl:function(){return a},bK:function(){return d},cd:function(){return o},dr:function(){return l},fK:function(){return r},ph:function(){return c}}),n(2265),(s=a||(a={})).AIML="AI/ML API",s.Bedrock="Amazon Bedrock",s.Anthropic="Anthropic",s.AssemblyAI="AssemblyAI",s.SageMaker="AWS SageMaker",s.Azure="Azure",s.Azure_AI_Studio="Azure AI Foundry (Studio)",s.Cerebras="Cerebras",s.Cohere="Cohere",s.Dashscope="Dashscope",s.Databricks="Databricks (Qwen API)",s.DeepInfra="DeepInfra",s.Deepgram="Deepgram",s.Deepseek="Deepseek",s.ElevenLabs="ElevenLabs",s.FireworksAI="Fireworks AI",s.Google_AI_Studio="Google AI Studio",s.GradientAI="GradientAI",s.Groq="Groq",s.Hosted_Vllm="vllm",s.JinaAI="Jina AI",s.MistralAI="Mistral AI",s.Ollama="Ollama",s.OpenAI="OpenAI",s.OpenAI_Compatible="OpenAI-Compatible Endpoints (Together AI, etc.)",s.OpenAI_Text="OpenAI Text Completion",s.OpenAI_Text_Compatible="OpenAI-Compatible Text Completion Models (Together AI, etc.)",s.Openrouter="Openrouter",s.Perplexity="Perplexity",s.Sambanova="Sambanova",s.TogetherAI="TogetherAI",s.Triton="Triton",s.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",s.VolcEngine="VolcEngine",s.Voyage="Voyage AI",s.xAI="xAI";let r={AIML:"aiml",OpenAI:"openai",OpenAI_Text:"text-completion-openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",Groq:"groq",MistralAI:"mistral",Cohere:"cohere",OpenAI_Compatible:"openai",OpenAI_Text_Compatible:"text-completion-openai",Vertex_AI:"vertex_ai",Databricks:"databricks",Dashscope:"dashscope",xAI:"xai",Deepseek:"deepseek",Ollama:"ollama",AssemblyAI:"assemblyai",Cerebras:"cerebras",Sambanova:"sambanova",Perplexity:"perplexity",TogetherAI:"together_ai",Openrouter:"openrouter",FireworksAI:"fireworks_ai",GradientAI:"gradient_ai",Triton:"triton",Deepgram:"deepgram",ElevenLabs:"elevenlabs",SageMaker:"sagemaker_chat",Voyage:"voyage",JinaAI:"jina_ai",VolcEngine:"volcengine",DeepInfra:"deepinfra",Hosted_Vllm:"hosted_vllm"},i="/ui/assets/logos/",o={"AI/ML API":"".concat(i,"aiml_api.svg"),Anthropic:"".concat(i,"anthropic.svg"),AssemblyAI:"".concat(i,"assemblyai_small.png"),Azure:"".concat(i,"microsoft_azure.svg"),"Azure AI Foundry (Studio)":"".concat(i,"microsoft_azure.svg"),"Amazon Bedrock":"".concat(i,"bedrock.svg"),"AWS SageMaker":"".concat(i,"bedrock.svg"),Cerebras:"".concat(i,"cerebras.svg"),Cohere:"".concat(i,"cohere.svg"),"Databricks (Qwen API)":"".concat(i,"databricks.svg"),Dashscope:"".concat(i,"dashscope.svg"),Deepseek:"".concat(i,"deepseek.svg"),"Fireworks AI":"".concat(i,"fireworks.svg"),Groq:"".concat(i,"groq.svg"),"Google AI Studio":"".concat(i,"google.svg"),vllm:"".concat(i,"vllm.png"),"Mistral AI":"".concat(i,"mistral.svg"),Ollama:"".concat(i,"ollama.svg"),OpenAI:"".concat(i,"openai_small.svg"),"OpenAI Text Completion":"".concat(i,"openai_small.svg"),"OpenAI-Compatible Text Completion Models (Together AI, etc.)":"".concat(i,"openai_small.svg"),"OpenAI-Compatible Endpoints (Together AI, etc.)":"".concat(i,"openai_small.svg"),Openrouter:"".concat(i,"openrouter.svg"),Perplexity:"".concat(i,"perplexity-ai.svg"),Sambanova:"".concat(i,"sambanova.svg"),TogetherAI:"".concat(i,"togetherai.svg"),"Vertex AI (Anthropic, Gemini, etc.)":"".concat(i,"google.svg"),xAI:"".concat(i,"xai.svg"),GradientAI:"".concat(i,"gradientai.svg"),Triton:"".concat(i,"nvidia_triton.png"),Deepgram:"".concat(i,"deepgram.png"),ElevenLabs:"".concat(i,"elevenlabs.png"),"Voyage AI":"".concat(i,"voyage.webp"),"Jina AI":"".concat(i,"jina.png"),VolcEngine:"".concat(i,"volcengine.png"),DeepInfra:"".concat(i,"deepinfra.png")},l=e=>{if(!e)return{logo:"",displayName:"-"};if("gemini"===e.toLowerCase()){let e="Google AI Studio";return{logo:o[e],displayName:e}}let t=Object.keys(r).find(t=>r[t].toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let n=a[t];return{logo:o[n],displayName:n}},c=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||"Amazon Bedrock"==e)return"claude-3-opus";if("AWS SageMaker"==e)return"sagemaker/jumpstart-dft-meta-textgeneration-llama-2-7b";if("Google AI Studio"==e)return"gemini-pro";if("Azure AI Foundry (Studio)"==e)return"azure_ai/command-r-plus";else if("Azure"==e)return"azure/my-deployment";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 return"gpt-3.5-turbo"},d=(e,t)=>{console.log("Provider key: ".concat(e));let n=r[e];console.log("Provider mapped to: ".concat(n));let a=[];return e&&"object"==typeof t&&(Object.entries(t).forEach(e=>{let[t,s]=e;null!==s&&"object"==typeof s&&"litellm_provider"in s&&(s.litellm_provider===n||s.litellm_provider.includes(n))&&a.push(t)}),"Cohere"==e&&(console.log("Adding cohere chat models"),Object.entries(t).forEach(e=>{let[t,n]=e;null!==n&&"object"==typeof n&&"litellm_provider"in n&&"cohere_chat"===n.litellm_provider&&a.push(t)})),"AWS SageMaker"==e&&(console.log("Adding sagemaker chat models"),Object.entries(t).forEach(e=>{let[t,n]=e;null!==n&&"object"==typeof n&&"litellm_provider"in n&&"sagemaker_chat"===n.litellm_provider&&a.push(t)}))),a}},72162:function(e,t,n){var a=n(57437),s=n(2265),r=n(19250),i=n(8048),o=n(36724),l=n(89970),c=n(3810),d=n(52787),m=n(82680),p=n(3477),u=n(17732),g=n(33245),x=n(78867),h=n(88658),f=n(49817),_=n(42673),b=n(65373),v=n(69734),j=n(9114);t.Z=e=>{var t,n;let{accessToken:y}=e,[N,w]=(0,s.useState)(null),[A,I]=(0,s.useState)("LiteLLM Gateway"),[S,k]=(0,s.useState)(null),[C,E]=(0,s.useState)(""),[M,O]=(0,s.useState)({}),[D,T]=(0,s.useState)(!0),[P,z]=(0,s.useState)(""),[L,Z]=(0,s.useState)([]),[G,R]=(0,s.useState)([]),[H,F]=(0,s.useState)([]),[K,V]=(0,s.useState)("I'm alive! ✓"),[U,W]=(0,s.useState)(!1),[q,J]=(0,s.useState)(null),[B,Y]=(0,s.useState)({}),$=(0,s.useRef)(null);(0,s.useEffect)(()=>{let e=async()=>{try{T(!0);let e=await (0,r.modelHubPublicModelsCall)();console.log("ModelHubData:",e),w(e)}catch(e){console.error("There was an error fetching the public model data",e),V("Service unavailable")}finally{T(!1)}};(async()=>{let e=await (0,r.getPublicModelHubInfo)();console.log("Public Model Hub Info:",e),I(e.docs_title),k(e.custom_docs_description),E(e.litellm_version),O(e.useful_links||{})})(),e()},[]),(0,s.useEffect)(()=>{},[P,L,G,H]);let Q=(0,s.useMemo)(()=>{if(!N)return[];let e=N;if(P.trim()){let t=P.toLowerCase(),n=t.split(/\s+/),a=N.filter(e=>{let a=e.model_group.toLowerCase();return!!a.includes(t)||n.every(e=>a.includes(e))});a.length>0&&(e=a.sort((e,n)=>{let a=e.model_group.toLowerCase(),s=n.model_group.toLowerCase(),r=a===t?1e3:0,i=s===t?1e3:0,o=a.startsWith(t)?100:0,l=s.startsWith(t)?100:0,c=t.split(/\s+/).every(e=>a.includes(e))?50:0,d=t.split(/\s+/).every(e=>s.includes(e))?50:0,m=a.length;return i+l+d+(1e3-s.length)-(r+o+c+(1e3-m))}))}return e.filter(e=>{let t=0===L.length||L.some(t=>e.providers.includes(t)),n=0===G.length||G.includes(e.mode||""),a=0===H.length||Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).some(e=>{let[t]=e,n=t.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ");return H.includes(n)});return t&&n&&a})},[N,P,L,G,H]),X=e=>{J(e),W(!0)},ee=e=>{navigator.clipboard.writeText(e),j.Z.success("Copied to clipboard!")},et=e=>e.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" "),en=e=>Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).map(e=>{let[t]=e;return t}),ea=e=>"$".concat((1e6*e).toFixed(4)),es=e=>e?e>=1e3?"".concat((e/1e3).toFixed(0),"K"):e.toString():"N/A",er=(e,t)=>{let n=[];return e&&n.push("RPM: ".concat(e.toLocaleString())),t&&n.push("TPM: ".concat(t.toLocaleString())),n.length>0?n.join(", "):"N/A"};return(0,a.jsx)(v.f,{accessToken:y,children:(0,a.jsxs)("div",{className:"min-h-screen bg-white",children:[(0,a.jsx)(b.Z,{userID:null,userEmail:null,userRole:null,premiumUser:!1,setProxySettings:Y,proxySettings:B,accessToken:y||null,isPublicPage:!0}),(0,a.jsxs)("div",{className:"w-full px-8 py-12",children:[(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"About"}),(0,a.jsx)("p",{className:"text-gray-700 mb-6 text-base leading-relaxed",children:S||"Proxy Server to call 100+ LLMs in the OpenAI format."}),(0,a.jsx)("div",{className:"flex items-center space-x-3 text-sm text-gray-600",children:(0,a.jsxs)("span",{className:"flex items-center",children:[(0,a.jsx)("span",{className:"w-4 h-4 mr-2",children:"\uD83D\uDD27"}),"Built with litellm: v",C]})})]}),M&&Object.keys(M).length>0&&(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"Useful Links"}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:Object.entries(M||{}).map(e=>{let[t,n]=e;return(0,a.jsxs)("button",{onClick:()=>window.open(n,"_blank"),className:"flex items-center space-x-3 text-blue-600 hover:text-blue-800 transition-colors p-3 rounded-lg hover:bg-blue-50 border border-gray-200",children:[(0,a.jsx)(p.Z,{className:"w-4 h-4"}),(0,a.jsx)(o.xv,{className:"text-sm font-medium",children:t})]},t)})})]}),(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"Health and Endpoint Status"}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:(0,a.jsxs)(o.xv,{className:"text-green-600 font-medium text-sm",children:["Service status: ",K]})})]}),(0,a.jsxs)(o.Zb,{className:"p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)("div",{className:"flex justify-between items-center mb-8",children:(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold text-gray-900",children:"Available Models"})}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8 p-6 bg-gray-50 rounded-lg border border-gray-200",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2 mb-3",children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium text-gray-700",children:"Search Models:"}),(0,a.jsx)(l.Z,{title:"Smart search with relevance ranking - finds models containing your search terms, ranked by relevance. Try searching 'xai grok-4', 'claude-4', 'gpt-4', or 'sonnet'",placement:"top",children:(0,a.jsx)(g.Z,{className:"w-4 h-4 text-gray-400 cursor-help"})})]}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)(u.Z,{className:"w-4 h-4 text-gray-400 absolute left-3 top-1/2 transform -translate-y-1/2"}),(0,a.jsx)("input",{type:"text",placeholder:"Search model names... (smart search enabled)",value:P,onChange:e=>z(e.target.value),className:"border border-gray-300 rounded-lg pl-10 pr-4 py-2 w-full text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white"})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Provider:"}),(0,a.jsx)(d.default,{mode:"multiple",value:L,onChange:e=>Z(e),placeholder:"Select providers",className:"w-full",size:"large",allowClear:!0,optionRender:e=>{let{logo:t}=(0,_.dr)(e.value);return(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[t&&(0,a.jsx)("img",{src:t,alt:e.label,className:"w-5 h-5 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e.label})]})},children:N&&(e=>{let t=new Set;return e.forEach(e=>{e.providers.forEach(e=>t.add(e))}),Array.from(t)})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Mode:"}),(0,a.jsx)(d.default,{mode:"multiple",value:G,onChange:e=>R(e),placeholder:"Select modes",className:"w-full",size:"large",allowClear:!0,children:N&&(e=>{let t=new Set;return e.forEach(e=>{e.mode&&t.add(e.mode)}),Array.from(t)})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Features:"}),(0,a.jsx)(d.default,{mode:"multiple",value:H,onChange:e=>F(e),placeholder:"Select features",className:"w-full",size:"large",allowClear:!0,children:N&&(e=>{let t=new Set;return e.forEach(e=>{Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).forEach(e=>{let[n]=e,a=n.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ");t.add(a)})}),Array.from(t).sort()})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]})]}),(0,a.jsx)(i.C,{columns:[{header:"Model Name",accessorKey:"model_group",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)("div",{className:"overflow-hidden",children:(0,a.jsx)(l.Z,{title:t.original.model_group,children:(0,a.jsx)(o.zx,{size:"xs",variant:"light",className:"font-mono text-blue-500 bg-blue-50 hover:bg-blue-100 text-xs font-normal px-2 py-0.5 text-left",onClick:()=>X(t.original),children:t.original.model_group})})})},size:150},{header:"Providers",accessorKey:"providers",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.providers;return(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:n.map(e=>{let{logo:t}=(0,_.dr)(e);return(0,a.jsxs)("div",{className:"flex items-center space-x-1 px-2 py-1 bg-gray-100 rounded text-xs",children:[t&&(0,a.jsx)("img",{src:t,alt:e,className:"w-3 h-3 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e})]},e)})})},size:120},{header:"Mode",accessorKey:"mode",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.mode;return(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("span",{children:(e=>{switch(null==e?void 0:e.toLowerCase()){case"chat":return"\uD83D\uDCAC";case"rerank":return"\uD83D\uDD04";case"embedding":return"\uD83D\uDCC4";default:return"\uD83E\uDD16"}})(n||"")}),(0,a.jsx)(o.xv,{children:n||"Chat"})]})},size:100},{header:"Max Input",accessorKey:"max_input_tokens",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)(o.xv,{className:"text-center",children:es(t.original.max_input_tokens)})},size:100,meta:{className:"text-center"}},{header:"Max Output",accessorKey:"max_output_tokens",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)(o.xv,{className:"text-center",children:es(t.original.max_output_tokens)})},size:100,meta:{className:"text-center"}},{header:"Input $/1M",accessorKey:"input_cost_per_token",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.input_cost_per_token;return(0,a.jsx)(o.xv,{className:"text-center",children:n?ea(n):"Free"})},size:100,meta:{className:"text-center"}},{header:"Output $/1M",accessorKey:"output_cost_per_token",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.output_cost_per_token;return(0,a.jsx)(o.xv,{className:"text-center",children:n?ea(n):"Free"})},size:100,meta:{className:"text-center"}},{header:"Features",accessorKey:"supports_vision",enableSorting:!1,cell:e=>{let{row:t}=e,n=Object.entries(t.original).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).map(e=>{let[t]=e;return et(t)});return 0===n.length?(0,a.jsx)(o.xv,{className:"text-gray-400",children:"-"}):1===n.length?(0,a.jsx)("div",{className:"h-6 flex items-center",children:(0,a.jsx)(c.Z,{color:"blue",className:"text-xs",children:n[0]})}):(0,a.jsxs)("div",{className:"h-6 flex items-center space-x-1",children:[(0,a.jsx)(c.Z,{color:"blue",className:"text-xs",children:n[0]}),(0,a.jsx)(l.Z,{title:(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsx)("div",{className:"font-medium",children:"All Features:"}),n.map((e,t)=>(0,a.jsxs)("div",{className:"text-xs",children:["• ",e]},t))]}),trigger:"click",placement:"topLeft",children:(0,a.jsxs)("span",{className:"text-xs text-blue-600 cursor-pointer hover:text-blue-800 hover:underline",onClick:e=>e.stopPropagation(),children:["+",n.length-1]})})]})},size:120},{header:"Limits",accessorKey:"rpm",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original;return(0,a.jsx)(o.xv,{className:"text-xs text-gray-600",children:er(n.rpm,n.tpm)})},size:150}],data:Q,isLoading:D,table:$,defaultSorting:[{id:"model_group",desc:!1}]}),(0,a.jsx)("div",{className:"mt-8 text-center",children:(0,a.jsxs)(o.xv,{className:"text-sm text-gray-600",children:["Showing ",Q.length," of ",(null==N?void 0:N.length)||0," models"]})})]})]}),(0,a.jsx)(m.Z,{title:(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("span",{children:(null==q?void 0:q.model_group)||"Model Details"}),q&&(0,a.jsx)(l.Z,{title:"Copy model name",children:(0,a.jsx)(x.Z,{onClick:()=>ee(q.model_group),className:"cursor-pointer text-gray-500 hover:text-blue-500 w-4 h-4"})})]}),width:1e3,open:U,footer:null,onOk:()=>{W(!1),J(null)},onCancel:()=>{W(!1),J(null)},children:q&&(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Model Overview"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4 mb-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Model Name:"}),(0,a.jsx)(o.xv,{children:q.model_group})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Mode:"}),(0,a.jsx)(o.xv,{children:q.mode||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Providers:"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1 mt-1",children:q.providers.map(e=>{let{logo:t}=(0,_.dr)(e);return(0,a.jsx)(c.Z,{color:"blue",children:(0,a.jsxs)("div",{className:"flex items-center space-x-1",children:[t&&(0,a.jsx)("img",{src:t,alt:e,className:"w-3 h-3 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e})]})},e)})})]})]}),q.model_group.includes("*")&&(0,a.jsx)("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-4",children:(0,a.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,a.jsx)(g.Z,{className:"w-4 h-4 text-blue-600 mt-0.5 flex-shrink-0"}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium text-blue-900 mb-2",children:"Wildcard Routing"}),(0,a.jsxs)(o.xv,{className:"text-sm text-blue-800 mb-2",children:["This model uses wildcard routing. You can pass any value where you see the ",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:"*"})," symbol."]}),(0,a.jsxs)(o.xv,{className:"text-sm text-blue-800",children:["For example, with ",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:q.model_group}),", you can use any string (",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:q.model_group.replace("*","my-custom-value")}),") that matches this pattern."]})]})]})})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Token & Cost Information"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Max Input Tokens:"}),(0,a.jsx)(o.xv,{children:(null===(t=q.max_input_tokens)||void 0===t?void 0:t.toLocaleString())||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Max Output Tokens:"}),(0,a.jsx)(o.xv,{children:(null===(n=q.max_output_tokens)||void 0===n?void 0:n.toLocaleString())||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Input Cost per 1M Tokens:"}),(0,a.jsx)(o.xv,{children:q.input_cost_per_token?ea(q.input_cost_per_token):"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Output Cost per 1M Tokens:"}),(0,a.jsx)(o.xv,{children:q.output_cost_per_token?ea(q.output_cost_per_token):"Not specified"})]})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Capabilities"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:(()=>{let e=en(q),t=["green","blue","purple","orange","red","yellow"];return 0===e.length?(0,a.jsx)(o.xv,{className:"text-gray-500",children:"No special capabilities listed"}):e.map((e,n)=>(0,a.jsx)(c.Z,{color:t[n%t.length],children:et(e)},e))})()})]}),(q.tpm||q.rpm)&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Rate Limits"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[q.tpm&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Tokens per Minute:"}),(0,a.jsx)(o.xv,{children:q.tpm.toLocaleString()})]}),q.rpm&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Requests per Minute:"}),(0,a.jsx)(o.xv,{children:q.rpm.toLocaleString()})]})]})]}),q.supported_openai_params&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Supported OpenAI Parameters"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:q.supported_openai_params.map(e=>(0,a.jsx)(c.Z,{color:"green",children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Usage Example"}),(0,a.jsx)("div",{className:"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto",children:(0,a.jsx)("pre",{className:"text-sm",children:(0,h.L)({apiKeySource:"custom",accessToken:null,apiKey:"your_api_key",inputMessage:"Hello, how are you?",chatHistory:[{role:"user",content:"Hello, how are you?",isImage:!1}],selectedTags:[],selectedVectorStores:[],selectedGuardrails:[],selectedMCPTools:[],endpointType:(0,f.vf)(q.mode||"chat"),selectedModel:q.model_group,selectedSdk:"openai"})})}),(0,a.jsx)("div",{className:"mt-2 text-right",children:(0,a.jsx)("button",{onClick:()=>{ee((0,h.L)({apiKeySource:"custom",accessToken:null,apiKey:"your_api_key",inputMessage:"Hello, how are you?",chatHistory:[{role:"user",content:"Hello, how are you?",isImage:!1}],selectedTags:[],selectedVectorStores:[],selectedGuardrails:[],selectedMCPTools:[],endpointType:(0,f.vf)(q.mode||"chat"),selectedModel:q.model_group,selectedSdk:"openai"}))},className:"text-sm text-blue-600 hover:text-blue-800 cursor-pointer",children:"Copy to clipboard"})})]})]})})]})})}},69734:function(e,t,n){n.d(t,{F:function(){return o},f:function(){return l}});var a=n(57437),s=n(2265),r=n(19250);let i=(0,s.createContext)(void 0),o=()=>{let e=(0,s.useContext)(i);if(!e)throw Error("useTheme must be used within a ThemeProvider");return e},l=e=>{let{children:t,accessToken:n}=e,[o,l]=(0,s.useState)(null);return(0,s.useEffect)(()=>{(async()=>{if(n)try{let t=(0,r.getProxyBaseUrl)(),a=await fetch(t?"".concat(t,"/get/ui_theme_settings"):"/get/ui_theme_settings",{method:"GET",headers:{Authorization:"Bearer ".concat(n),"Content-Type":"application/json"}});if(a.ok){var e;let t=await a.json();(null===(e=t.values)||void 0===e?void 0:e.logo_url)&&l(t.values.logo_url)}}catch(e){console.warn("Failed to load logo settings from backend:",e)}})()},[n]),(0,a.jsx)(i.Provider,{value:{logoUrl:o,setLogoUrl:l},children:t})}}}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/162-714ca0ed10a07f66.js b/litellm/proxy/_experimental/out/_next/static/chunks/162-714ca0ed10a07f66.js deleted file mode 100644 index be51aa66580..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/162-714ca0ed10a07f66.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[162],{36724:function(e,t,n){n.d(t,{Dx:function(){return i.Z},Zb:function(){return s.Z},xv:function(){return r.Z},zx:function(){return a.Z}});var a=n(20831),s=n(12514),r=n(84264),i=n(96761)},19130:function(e,t,n){n.d(t,{RM:function(){return s.Z},SC:function(){return l.Z},iA:function(){return a.Z},pj:function(){return r.Z},ss:function(){return i.Z},xs:function(){return o.Z}});var a=n(21626),s=n(97214),r=n(28241),i=n(58834),o=n(69552),l=n(71876)},88658:function(e,t,n){n.d(t,{L:function(){return s}});var a=n(49817);let s=e=>{let t;let{apiKeySource:n,accessToken:s,apiKey:r,inputMessage:i,chatHistory:o,selectedTags:l,selectedVectorStores:c,selectedGuardrails:d,endpointType:m,selectedModel:p,selectedSdk:u}=e,g="session"===n?s:r,x=window.location.origin,h=i||"Your prompt here",f=h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n"),_=o.filter(e=>!e.isImage).map(e=>{let{role:t,content:n}=e;return{role:t,content:n}}),b={};l.length>0&&(b.tags=l),c.length>0&&(b.vector_stores=c),d.length>0&&(b.guardrails=d);let v=p||"your-model-name",j="azure"===u?'import openai\n\nclient = openai.AzureOpenAI(\n api_key="'.concat(g||"YOUR_LITELLM_API_KEY",'",\n azure_endpoint="').concat(x,'",\n api_version="2024-02-01"\n)'):'import openai\n\nclient = openai.OpenAI(\n api_key="'.concat(g||"YOUR_LITELLM_API_KEY",'",\n base_url="').concat(x,'"\n)');switch(m){case a.KP.CHAT:{let e=Object.keys(b).length>0,n="";if(e){let e=JSON.stringify({metadata:b},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();n=",\n extra_body=".concat(e)}let a=_.length>0?_:[{role:"user",content:h}];t='\nimport base64\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# Example with text only\nresponse = client.chat.completions.create(\n model="'.concat(v,'",\n messages=').concat(JSON.stringify(a,null,4)).concat(n,'\n)\n\nprint(response)\n\n# Example with image or PDF (uncomment and provide file path to use)\n# base64_file = encode_image("path/to/your/file.jpg") # or .pdf\n# response_with_file = client.chat.completions.create(\n# model="').concat(v,'",\n# messages=[\n# {\n# "role": "user",\n# "content": [\n# {\n# "type": "text",\n# "text": "').concat(f,'"\n# },\n# {\n# "type": "image_url",\n# "image_url": {\n# "url": f"data:image/jpeg;base64,{base64_file}" # or data:application/pdf;base64,{base64_file}\n# }\n# }\n# ]\n# }\n# ]').concat(n,"\n# )\n# print(response_with_file)\n");break}case a.KP.RESPONSES:{let e=Object.keys(b).length>0,n="";if(e){let e=JSON.stringify({metadata:b},null,2).split("\n").map(e=>" ".repeat(4)+e).join("\n").trim();n=",\n extra_body=".concat(e)}let a=_.length>0?_:[{role:"user",content:h}];t='\nimport base64\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# Example with text only\nresponse = client.responses.create(\n model="'.concat(v,'",\n input=').concat(JSON.stringify(a,null,4)).concat(n,'\n)\n\nprint(response.output_text)\n\n# Example with image or PDF (uncomment and provide file path to use)\n# base64_file = encode_image("path/to/your/file.jpg") # or .pdf\n# response_with_file = client.responses.create(\n# model="').concat(v,'",\n# input=[\n# {\n# "role": "user",\n# "content": [\n# {"type": "input_text", "text": "').concat(f,'"},\n# {\n# "type": "input_image",\n# "image_url": f"data:image/jpeg;base64,{base64_file}", # or data:application/pdf;base64,{base64_file}\n# },\n# ],\n# }\n# ]').concat(n,"\n# )\n# print(response_with_file.output_text)\n");break}case a.KP.IMAGE:t="azure"===u?"\n# NOTE: The Azure SDK does not have a direct equivalent to the multi-modal 'responses.create' method shown for OpenAI.\n# This snippet uses 'client.images.generate' and will create a new image based on your prompt.\n# It does not use the uploaded image, as 'client.images.generate' does not support image inputs in this context.\nimport os\nimport requests\nimport json\nimport time\nfrom PIL import Image\n\nresult = client.images.generate(\n model=\"".concat(v,'",\n prompt="').concat(i,'",\n n=1\n)\n\njson_response = json.loads(result.model_dump_json())\n\n# Set the directory for the stored image\nimage_dir = os.path.join(os.curdir, \'images\')\n\n# If the directory doesn\'t exist, create it\nif not os.path.isdir(image_dir):\n os.mkdir(image_dir)\n\n# Initialize the image path\nimage_filename = f"generated_image_{int(time.time())}.png"\nimage_path = os.path.join(image_dir, image_filename)\n\ntry:\n # Retrieve the generated image\n if json_response.get("data") && len(json_response["data"]) > 0 && json_response["data"][0].get("url"):\n image_url = json_response["data"][0]["url"]\n generated_image = requests.get(image_url).content\n with open(image_path, "wb") as image_file:\n image_file.write(generated_image)\n\n print(f"Image saved to {image_path}")\n # Display the image\n image = Image.open(image_path)\n image.show()\n else:\n print("Could not find image URL in response.")\n print("Full response:", json_response)\nexcept Exception as e:\n print(f"An error occurred: {e}")\n print("Full response:", json_response)\n'):"\nimport base64\nimport os\nimport time\nimport json\nfrom PIL import Image\nimport requests\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, \"rb\") as image_file:\n return base64.b64encode(image_file.read()).decode('utf-8')\n\n# Helper function to create a file (simplified for this example)\ndef create_file(image_path):\n # In a real implementation, this would upload the file to OpenAI\n # For this example, we'll just return a placeholder ID\n return f\"file_{os.path.basename(image_path).replace('.', '_')}\"\n\n# The prompt entered by the user\nprompt = \"".concat(f,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(v,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n');break;case a.KP.IMAGE_EDITS:t="azure"===u?'\nimport base64\nimport os\nimport time\nimport json\nfrom PIL import Image\nimport requests\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, "rb") as image_file:\n return base64.b64encode(image_file.read()).decode(\'utf-8\')\n\n# The prompt entered by the user\nprompt = "'.concat(f,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(v,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n'):"\nimport base64\nimport os\nimport time\n\n# Helper function to encode images to base64\ndef encode_image(image_path):\n with open(image_path, \"rb\") as image_file:\n return base64.b64encode(image_file.read()).decode('utf-8')\n\n# Helper function to create a file (simplified for this example)\ndef create_file(image_path):\n # In a real implementation, this would upload the file to OpenAI\n # For this example, we'll just return a placeholder ID\n return f\"file_{os.path.basename(image_path).replace('.', '_')}\"\n\n# The prompt entered by the user\nprompt = \"".concat(f,'"\n\n# Encode images to base64\nbase64_image1 = encode_image("body-lotion.png")\nbase64_image2 = encode_image("soap.png")\n\n# Create file IDs\nfile_id1 = create_file("body-lotion.png")\nfile_id2 = create_file("incense-kit.png")\n\nresponse = client.responses.create(\n model="').concat(v,'",\n input=[\n {\n "role": "user",\n "content": [\n {"type": "input_text", "text": prompt},\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image1}",\n },\n {\n "type": "input_image",\n "image_url": f"data:image/jpeg;base64,{base64_image2}",\n },\n {\n "type": "input_image",\n "file_id": file_id1,\n },\n {\n "type": "input_image",\n "file_id": file_id2,\n }\n ],\n }\n ],\n tools=[{"type": "image_generation"}],\n)\n\n# Process the response\nimage_generation_calls = [\n output\n for output in response.output\n if output.type == "image_generation_call"\n]\n\nimage_data = [output.result for output in image_generation_calls]\n\nif image_data:\n image_base64 = image_data[0]\n image_filename = f"edited_image_{int(time.time())}.png"\n with open(image_filename, "wb") as f:\n f.write(base64.b64decode(image_base64))\n print(f"Image saved to {image_filename}")\nelse:\n # If no image is generated, there might be a text response with an explanation\n text_response = [output.text for output in response.output if hasattr(output, \'text\')]\n if text_response:\n print("No image generated. Model response:")\n print("\\n".join(text_response))\n else:\n print("No image data found in response.")\n print("Full response for debugging:")\n print(response)\n');break;default:t="\n# Code generation for this endpoint is not implemented yet."}return"".concat(j,"\n").concat(t)}},49817:function(e,t,n){var a,s,r,i;n.d(t,{KP:function(){return s},vf:function(){return l}}),(r=a||(a={})).IMAGE_GENERATION="image_generation",r.CHAT="chat",r.RESPONSES="responses",r.IMAGE_EDITS="image_edits",r.ANTHROPIC_MESSAGES="anthropic_messages",(i=s||(s={})).IMAGE="image",i.CHAT="chat",i.RESPONSES="responses",i.IMAGE_EDITS="image_edits",i.ANTHROPIC_MESSAGES="anthropic_messages";let o={image_generation:"image",chat:"chat",responses:"responses",image_edits:"image_edits",anthropic_messages:"anthropic_messages"},l=e=>{if(console.log("getEndpointType:",e),Object.values(a).includes(e)){let t=o[e];return console.log("endpointType:",t),t}return"chat"}},29488:function(e,t,n){n.d(t,{Hc:function(){return i},Ui:function(){return r},e4:function(){return o},xd:function(){return l}});let a="litellm_mcp_auth_tokens",s=()=>{try{let e=localStorage.getItem(a);return e?JSON.parse(e):{}}catch(e){return console.error("Error reading MCP auth tokens from localStorage:",e),{}}},r=(e,t)=>{try{let n=s()[e];if(n&&n.serverAlias===t||n&&!t&&!n.serverAlias)return n.authValue;return null}catch(e){return console.error("Error getting MCP auth token:",e),null}},i=(e,t,n,r)=>{try{let i=s();i[e]={serverId:e,serverAlias:r,authValue:t,authType:n,timestamp:Date.now()},localStorage.setItem(a,JSON.stringify(i))}catch(e){console.error("Error storing MCP auth token:",e)}},o=e=>{try{let t=s();delete t[e],localStorage.setItem(a,JSON.stringify(t))}catch(e){console.error("Error removing MCP auth token:",e)}},l=()=>{try{localStorage.removeItem(a)}catch(e){console.error("Error clearing MCP auth tokens:",e)}}},8048:function(e,t,n){n.d(t,{C:function(){return m}});var a=n(57437),s=n(71594),r=n(24525),i=n(2265),o=n(19130),l=n(44633),c=n(86462),d=n(49084);function m(e){let{data:t=[],columns:n,isLoading:m=!1,table:p,defaultSorting:u=[]}=e,[g,x]=i.useState(u),[h]=i.useState("onChange"),[f,_]=i.useState({}),[b,v]=i.useState({}),j=(0,s.b7)({data:t,columns:n,state:{sorting:g,columnSizing:f,columnVisibility:b},columnResizeMode:h,onSortingChange:x,onColumnSizingChange:_,onColumnVisibilityChange:v,getCoreRowModel:(0,r.sC)(),getSortedRowModel:(0,r.tj)(),enableSorting:!0,enableColumnResizing:!0,defaultColumn:{minSize:40,maxSize:500}});return i.useEffect(()=>{p&&(p.current=j)},[j,p]),(0,a.jsx)("div",{className:"rounded-lg custom-border relative",children:(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsx)("div",{className:"relative min-w-full",children:(0,a.jsxs)(o.iA,{className:"[&_td]:py-2 [&_th]:py-2 w-full",children:[(0,a.jsx)(o.ss,{children:j.getHeaderGroups().map(e=>(0,a.jsx)(o.SC,{children:e.headers.map(e=>{var t;return(0,a.jsxs)(o.xs,{className:"py-1 h-8 relative ".concat("actions"===e.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] z-20 w-[120px] ml-8":""," ").concat((null===(t=e.column.columnDef.meta)||void 0===t?void 0:t.className)||""),style:{width:"actions"===e.id?120:e.getSize(),position:"actions"===e.id?"sticky":"relative",right:"actions"===e.id?0:"auto"},onClick:e.column.getCanSort()?e.column.getToggleSortingHandler():void 0,children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsx)("div",{className:"flex items-center",children:e.isPlaceholder?null:(0,s.ie)(e.column.columnDef.header,e.getContext())}),"actions"!==e.id&&e.column.getCanSort()&&(0,a.jsx)("div",{className:"w-4",children:e.column.getIsSorted()?({asc:(0,a.jsx)(l.Z,{className:"h-4 w-4 text-blue-500"}),desc:(0,a.jsx)(c.Z,{className:"h-4 w-4 text-blue-500"})})[e.column.getIsSorted()]:(0,a.jsx)(d.Z,{className:"h-4 w-4 text-gray-400"})})]}),e.column.getCanResize()&&(0,a.jsx)("div",{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),className:"absolute right-0 top-0 h-full w-2 cursor-col-resize select-none touch-none ".concat(e.column.getIsResizing()?"bg-blue-500":"hover:bg-blue-200")})]},e.id)})},e.id))}),(0,a.jsx)(o.RM,{children:m?(0,a.jsx)(o.SC,{children:(0,a.jsx)(o.pj,{colSpan:n.length,className:"h-8 text-center",children:(0,a.jsx)("div",{className:"text-center text-gray-500",children:(0,a.jsx)("p",{children:"\uD83D\uDE85 Loading models..."})})})}):j.getRowModel().rows.length>0?j.getRowModel().rows.map(e=>(0,a.jsx)(o.SC,{children:e.getVisibleCells().map(e=>{var t;return(0,a.jsx)(o.pj,{className:"py-0.5 ".concat("actions"===e.column.id?"sticky right-0 bg-white shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.1)] z-20 w-[120px] ml-8":""," ").concat((null===(t=e.column.columnDef.meta)||void 0===t?void 0:t.className)||""),style:{width:"actions"===e.column.id?120:e.column.getSize(),position:"actions"===e.column.id?"sticky":"relative",right:"actions"===e.column.id?0:"auto"},children:(0,s.ie)(e.column.columnDef.cell,e.getContext())},e.id)})},e.id)):(0,a.jsx)(o.SC,{children:(0,a.jsx)(o.pj,{colSpan:n.length,className:"h-8 text-center",children:(0,a.jsx)("div",{className:"text-center text-gray-500",children:(0,a.jsx)("p",{children:"No models found"})})})})})]})})})})}},65373:function(e,t,n){n.d(t,{Z:function(){return v}});var a=n(57437),s=n(27648),r=n(2265),i=n(89970),o=n(80795),l=n(19250),c=n(15883),d=n(46346),m=n(57400),p=n(91870),u=n(40428),g=n(83884),x=n(45524),h=n(3914);let f=async e=>{if(!e)return null;try{return await (0,l.getProxyUISettings)(e)}catch(e){return console.error("Error fetching proxy settings:",e),null}};var _=n(69734),b=n(29488),v=e=>{let{userID:t,userEmail:n,userRole:v,premiumUser:j,proxySettings:y,setProxySettings:N,accessToken:w,isPublicPage:A=!1,sidebarCollapsed:I=!1,onToggleSidebar:S}=e,k=(0,l.getProxyBaseUrl)(),[C,E]=(0,r.useState)(""),{logoUrl:M}=(0,_.F)();(0,r.useEffect)(()=>{(async()=>{if(w){let e=await f(w);console.log("response from fetchProxySettings",e),e&&N(e)}})()},[w]),(0,r.useEffect)(()=>{E((null==y?void 0:y.PROXY_LOGOUT_URL)||"")},[y]);let O=[{key:"user-info",label:(0,a.jsxs)("div",{className:"px-3 py-3 border-b border-gray-100",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(c.Z,{className:"mr-2 text-gray-700"}),(0,a.jsx)("span",{className:"text-sm font-semibold text-gray-900",children:t})]}),j?(0,a.jsx)(i.Z,{title:"Premium User",placement:"left",children:(0,a.jsxs)("div",{className:"flex items-center bg-gradient-to-r from-amber-500 to-yellow-500 text-white px-2 py-0.5 rounded-full cursor-help",children:[(0,a.jsx)(d.Z,{className:"mr-1 text-xs"}),(0,a.jsx)("span",{className:"text-xs font-medium",children:"Premium"})]})}):(0,a.jsx)(i.Z,{title:"Upgrade to Premium for advanced features",placement:"left",children:(0,a.jsxs)("div",{className:"flex items-center bg-gray-100 text-gray-500 px-2 py-0.5 rounded-full cursor-help",children:[(0,a.jsx)(d.Z,{className:"mr-1 text-xs"}),(0,a.jsx)("span",{className:"text-xs font-medium",children:"Standard"})]})})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex items-center text-sm",children:[(0,a.jsx)(m.Z,{className:"mr-2 text-gray-400 text-xs"}),(0,a.jsx)("span",{className:"text-gray-500 text-xs",children:"Role"}),(0,a.jsx)("span",{className:"ml-auto text-gray-700 font-medium",children:v})]}),(0,a.jsxs)("div",{className:"flex items-center text-sm",children:[(0,a.jsx)(p.Z,{className:"mr-2 text-gray-400 text-xs"}),(0,a.jsx)("span",{className:"text-gray-500 text-xs",children:"Email"}),(0,a.jsx)("span",{className:"ml-auto text-gray-700 font-medium truncate max-w-[150px]",title:n||"Unknown",children:n||"Unknown"})]})]})]})},{key:"logout",label:(0,a.jsxs)("div",{className:"flex items-center py-2 px-3 hover:bg-gray-50 rounded-md mx-1 my-1",onClick:()=>{(0,h.b)(),(0,b.xd)(),window.location.href=C},children:[(0,a.jsx)(u.Z,{className:"mr-3 text-gray-600"}),(0,a.jsx)("span",{className:"text-gray-800",children:"Logout"})]})}];return(0,a.jsx)("nav",{className:"bg-white border-b border-gray-200 sticky top-0 z-10",children:(0,a.jsx)("div",{className:"w-full",children:(0,a.jsxs)("div",{className:"flex items-center h-14 px-4",children:[" ",(0,a.jsxs)("div",{className:"flex items-center flex-shrink-0",children:[S&&(0,a.jsx)("button",{onClick:S,className:"flex items-center justify-center w-10 h-10 mr-2 text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded transition-colors",title:I?"Expand sidebar":"Collapse sidebar",children:(0,a.jsx)("span",{className:"text-lg",children:I?(0,a.jsx)(g.Z,{}):(0,a.jsx)(x.Z,{})})}),(0,a.jsx)(s.default,{href:"/",className:"flex items-center",children:(0,a.jsx)("img",{src:M||"".concat(k,"/get_image"),alt:"LiteLLM Brand",className:"h-10 w-auto"})})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-5 ml-auto",children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/",target:"_blank",rel:"noopener noreferrer",className:"text-sm text-gray-600 hover:text-gray-900 transition-colors",children:"Docs"}),!A&&(0,a.jsx)(o.Z,{menu:{items:O,className:"min-w-[200px]",style:{padding:"8px",marginTop:"8px",borderRadius:"12px",boxShadow:"0 4px 24px rgba(0, 0, 0, 0.08)"}},overlayStyle:{minWidth:"200px"},children:(0,a.jsxs)("button",{className:"inline-flex items-center text-sm text-gray-600 hover:text-gray-900 transition-colors",children:["User",(0,a.jsx)("svg",{className:"ml-1 w-5 h-5 text-gray-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M19 9l-7 7-7-7"})})]})})]})]})})})}},42673:function(e,t,n){var a,s;n.d(t,{Cl:function(){return a},bK:function(){return d},cd:function(){return o},dr:function(){return l},fK:function(){return r},ph:function(){return c}}),n(2265),(s=a||(a={})).AIML="AI/ML API",s.Bedrock="Amazon Bedrock",s.Anthropic="Anthropic",s.AssemblyAI="AssemblyAI",s.SageMaker="AWS SageMaker",s.Azure="Azure",s.Azure_AI_Studio="Azure AI Foundry (Studio)",s.Cerebras="Cerebras",s.Cohere="Cohere",s.Databricks="Databricks",s.DeepInfra="DeepInfra",s.Deepgram="Deepgram",s.Deepseek="Deepseek",s.ElevenLabs="ElevenLabs",s.FireworksAI="Fireworks AI",s.Google_AI_Studio="Google AI Studio",s.GradientAI="GradientAI",s.Groq="Groq",s.Hosted_Vllm="vllm",s.JinaAI="Jina AI",s.MistralAI="Mistral AI",s.Ollama="Ollama",s.OpenAI="OpenAI",s.OpenAI_Compatible="OpenAI-Compatible Endpoints (Together AI, etc.)",s.OpenAI_Text="OpenAI Text Completion",s.OpenAI_Text_Compatible="OpenAI-Compatible Text Completion Models (Together AI, etc.)",s.Openrouter="Openrouter",s.Perplexity="Perplexity",s.Sambanova="Sambanova",s.TogetherAI="TogetherAI",s.Triton="Triton",s.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",s.VolcEngine="VolcEngine",s.Voyage="Voyage AI",s.xAI="xAI";let r={AIML:"aiml",OpenAI:"openai",OpenAI_Text:"text-completion-openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",Groq:"groq",MistralAI:"mistral",Cohere:"cohere",OpenAI_Compatible:"openai",OpenAI_Text_Compatible:"text-completion-openai",Vertex_AI:"vertex_ai",Databricks:"databricks",xAI:"xai",Deepseek:"deepseek",Ollama:"ollama",AssemblyAI:"assemblyai",Cerebras:"cerebras",Sambanova:"sambanova",Perplexity:"perplexity",TogetherAI:"together_ai",Openrouter:"openrouter",FireworksAI:"fireworks_ai",GradientAI:"gradient_ai",Triton:"triton",Deepgram:"deepgram",ElevenLabs:"elevenlabs",SageMaker:"sagemaker_chat",Voyage:"voyage",JinaAI:"jina_ai",VolcEngine:"volcengine",DeepInfra:"deepinfra",Hosted_Vllm:"hosted_vllm"},i="/ui/assets/logos/",o={"AI/ML API":"".concat(i,"aiml_api.svg"),Anthropic:"".concat(i,"anthropic.svg"),AssemblyAI:"".concat(i,"assemblyai_small.png"),Azure:"".concat(i,"microsoft_azure.svg"),"Azure AI Foundry (Studio)":"".concat(i,"microsoft_azure.svg"),"Amazon Bedrock":"".concat(i,"bedrock.svg"),"AWS SageMaker":"".concat(i,"bedrock.svg"),Cerebras:"".concat(i,"cerebras.svg"),Cohere:"".concat(i,"cohere.svg"),Databricks:"".concat(i,"databricks.svg"),Deepseek:"".concat(i,"deepseek.svg"),"Fireworks AI":"".concat(i,"fireworks.svg"),Groq:"".concat(i,"groq.svg"),"Google AI Studio":"".concat(i,"google.svg"),vllm:"".concat(i,"vllm.png"),"Mistral AI":"".concat(i,"mistral.svg"),Ollama:"".concat(i,"ollama.svg"),OpenAI:"".concat(i,"openai_small.svg"),"OpenAI Text Completion":"".concat(i,"openai_small.svg"),"OpenAI-Compatible Text Completion Models (Together AI, etc.)":"".concat(i,"openai_small.svg"),"OpenAI-Compatible Endpoints (Together AI, etc.)":"".concat(i,"openai_small.svg"),Openrouter:"".concat(i,"openrouter.svg"),Perplexity:"".concat(i,"perplexity-ai.svg"),Sambanova:"".concat(i,"sambanova.svg"),TogetherAI:"".concat(i,"togetherai.svg"),"Vertex AI (Anthropic, Gemini, etc.)":"".concat(i,"google.svg"),xAI:"".concat(i,"xai.svg"),GradientAI:"".concat(i,"gradientai.svg"),Triton:"".concat(i,"nvidia_triton.png"),Deepgram:"".concat(i,"deepgram.png"),ElevenLabs:"".concat(i,"elevenlabs.png"),"Voyage AI":"".concat(i,"voyage.webp"),"Jina AI":"".concat(i,"jina.png"),VolcEngine:"".concat(i,"volcengine.png"),DeepInfra:"".concat(i,"deepinfra.png")},l=e=>{if(!e)return{logo:"",displayName:"-"};if("gemini"===e.toLowerCase()){let e="Google AI Studio";return{logo:o[e],displayName:e}}let t=Object.keys(r).find(t=>r[t].toLowerCase()===e.toLowerCase());if(!t)return{logo:"",displayName:e};let n=a[t];return{logo:o[n],displayName:n}},c=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||"Amazon Bedrock"==e)return"claude-3-opus";if("AWS SageMaker"==e)return"sagemaker/jumpstart-dft-meta-textgeneration-llama-2-7b";if("Google AI Studio"==e)return"gemini-pro";if("Azure AI Foundry (Studio)"==e)return"azure_ai/command-r-plus";else if("Azure"==e)return"azure/my-deployment";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 return"gpt-3.5-turbo"},d=(e,t)=>{console.log("Provider key: ".concat(e));let n=r[e];console.log("Provider mapped to: ".concat(n));let a=[];return e&&"object"==typeof t&&(Object.entries(t).forEach(e=>{let[t,s]=e;null!==s&&"object"==typeof s&&"litellm_provider"in s&&(s.litellm_provider===n||s.litellm_provider.includes(n))&&a.push(t)}),"Cohere"==e&&(console.log("Adding cohere chat models"),Object.entries(t).forEach(e=>{let[t,n]=e;null!==n&&"object"==typeof n&&"litellm_provider"in n&&"cohere_chat"===n.litellm_provider&&a.push(t)})),"AWS SageMaker"==e&&(console.log("Adding sagemaker chat models"),Object.entries(t).forEach(e=>{let[t,n]=e;null!==n&&"object"==typeof n&&"litellm_provider"in n&&"sagemaker_chat"===n.litellm_provider&&a.push(t)}))),a}},72162:function(e,t,n){var a=n(57437),s=n(2265),r=n(19250),i=n(8048),o=n(36724),l=n(89970),c=n(3810),d=n(52787),m=n(82680),p=n(3477),u=n(17732),g=n(33245),x=n(78867),h=n(88658),f=n(49817),_=n(42673),b=n(65373),v=n(69734),j=n(9114);t.Z=e=>{var t,n;let{accessToken:y}=e,[N,w]=(0,s.useState)(null),[A,I]=(0,s.useState)("LiteLLM Gateway"),[S,k]=(0,s.useState)(null),[C,E]=(0,s.useState)(""),[M,O]=(0,s.useState)({}),[T,D]=(0,s.useState)(!0),[z,P]=(0,s.useState)(""),[L,Z]=(0,s.useState)([]),[G,R]=(0,s.useState)([]),[H,F]=(0,s.useState)([]),[K,V]=(0,s.useState)("I'm alive! ✓"),[U,W]=(0,s.useState)(!1),[q,J]=(0,s.useState)(null),[B,Y]=(0,s.useState)({}),$=(0,s.useRef)(null);(0,s.useEffect)(()=>{let e=async()=>{try{D(!0);let e=await (0,r.modelHubPublicModelsCall)();console.log("ModelHubData:",e),w(e)}catch(e){console.error("There was an error fetching the public model data",e),V("Service unavailable")}finally{D(!1)}};(async()=>{let e=await (0,r.getPublicModelHubInfo)();console.log("Public Model Hub Info:",e),I(e.docs_title),k(e.custom_docs_description),E(e.litellm_version),O(e.useful_links||{})})(),e()},[]),(0,s.useEffect)(()=>{},[z,L,G,H]);let X=(0,s.useMemo)(()=>{if(!N)return[];let e=N;if(z.trim()){let t=z.toLowerCase(),n=t.split(/\s+/),a=N.filter(e=>{let a=e.model_group.toLowerCase();return!!a.includes(t)||n.every(e=>a.includes(e))});a.length>0&&(e=a.sort((e,n)=>{let a=e.model_group.toLowerCase(),s=n.model_group.toLowerCase(),r=a===t?1e3:0,i=s===t?1e3:0,o=a.startsWith(t)?100:0,l=s.startsWith(t)?100:0,c=t.split(/\s+/).every(e=>a.includes(e))?50:0,d=t.split(/\s+/).every(e=>s.includes(e))?50:0,m=a.length;return i+l+d+(1e3-s.length)-(r+o+c+(1e3-m))}))}return e.filter(e=>{let t=0===L.length||L.some(t=>e.providers.includes(t)),n=0===G.length||G.includes(e.mode||""),a=0===H.length||Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).some(e=>{let[t]=e,n=t.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ");return H.includes(n)});return t&&n&&a})},[N,z,L,G,H]),Q=e=>{J(e),W(!0)},ee=e=>{navigator.clipboard.writeText(e),j.Z.success("Copied to clipboard!")},et=e=>e.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" "),en=e=>Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).map(e=>{let[t]=e;return t}),ea=e=>"$".concat((1e6*e).toFixed(4)),es=e=>e?e>=1e3?"".concat((e/1e3).toFixed(0),"K"):e.toString():"N/A",er=(e,t)=>{let n=[];return e&&n.push("RPM: ".concat(e.toLocaleString())),t&&n.push("TPM: ".concat(t.toLocaleString())),n.length>0?n.join(", "):"N/A"};return(0,a.jsx)(v.f,{accessToken:y,children:(0,a.jsxs)("div",{className:"min-h-screen bg-white",children:[(0,a.jsx)(b.Z,{userID:null,userEmail:null,userRole:null,premiumUser:!1,setProxySettings:Y,proxySettings:B,accessToken:y||null,isPublicPage:!0}),(0,a.jsxs)("div",{className:"w-full px-8 py-12",children:[(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"About"}),(0,a.jsx)("p",{className:"text-gray-700 mb-6 text-base leading-relaxed",children:S||"Proxy Server to call 100+ LLMs in the OpenAI format."}),(0,a.jsx)("div",{className:"flex items-center space-x-3 text-sm text-gray-600",children:(0,a.jsxs)("span",{className:"flex items-center",children:[(0,a.jsx)("span",{className:"w-4 h-4 mr-2",children:"\uD83D\uDD27"}),"Built with litellm: v",C]})})]}),M&&Object.keys(M).length>0&&(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"Useful Links"}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:Object.entries(M||{}).map(e=>{let[t,n]=e;return(0,a.jsxs)("button",{onClick:()=>window.open(n,"_blank"),className:"flex items-center space-x-3 text-blue-600 hover:text-blue-800 transition-colors p-3 rounded-lg hover:bg-blue-50 border border-gray-200",children:[(0,a.jsx)(p.Z,{className:"w-4 h-4"}),(0,a.jsx)(o.xv,{className:"text-sm font-medium",children:t})]},t)})})]}),(0,a.jsxs)(o.Zb,{className:"mb-10 p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold mb-6 text-gray-900",children:"Health and Endpoint Status"}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:(0,a.jsxs)(o.xv,{className:"text-green-600 font-medium text-sm",children:["Service status: ",K]})})]}),(0,a.jsxs)(o.Zb,{className:"p-8 bg-white border border-gray-200 rounded-lg shadow-sm",children:[(0,a.jsx)("div",{className:"flex justify-between items-center mb-8",children:(0,a.jsx)(o.Dx,{className:"text-2xl font-semibold text-gray-900",children:"Available Models"})}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8 p-6 bg-gray-50 rounded-lg border border-gray-200",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2 mb-3",children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium text-gray-700",children:"Search Models:"}),(0,a.jsx)(l.Z,{title:"Smart search with relevance ranking - finds models containing your search terms, ranked by relevance. Try searching 'xai grok-4', 'claude-4', 'gpt-4', or 'sonnet'",placement:"top",children:(0,a.jsx)(g.Z,{className:"w-4 h-4 text-gray-400 cursor-help"})})]}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)(u.Z,{className:"w-4 h-4 text-gray-400 absolute left-3 top-1/2 transform -translate-y-1/2"}),(0,a.jsx)("input",{type:"text",placeholder:"Search model names... (smart search enabled)",value:z,onChange:e=>P(e.target.value),className:"border border-gray-300 rounded-lg pl-10 pr-4 py-2 w-full text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white"})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Provider:"}),(0,a.jsx)(d.default,{mode:"multiple",value:L,onChange:e=>Z(e),placeholder:"Select providers",className:"w-full",size:"large",allowClear:!0,optionRender:e=>{let{logo:t}=(0,_.dr)(e.value);return(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[t&&(0,a.jsx)("img",{src:t,alt:e.label,className:"w-5 h-5 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e.label})]})},children:N&&(e=>{let t=new Set;return e.forEach(e=>{e.providers.forEach(e=>t.add(e))}),Array.from(t)})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Mode:"}),(0,a.jsx)(d.default,{mode:"multiple",value:G,onChange:e=>R(e),placeholder:"Select modes",className:"w-full",size:"large",allowClear:!0,children:N&&(e=>{let t=new Set;return e.forEach(e=>{e.mode&&t.add(e.mode)}),Array.from(t)})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-sm font-medium mb-3 text-gray-700",children:"Features:"}),(0,a.jsx)(d.default,{mode:"multiple",value:H,onChange:e=>F(e),placeholder:"Select features",className:"w-full",size:"large",allowClear:!0,children:N&&(e=>{let t=new Set;return e.forEach(e=>{Object.entries(e).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).forEach(e=>{let[n]=e,a=n.replace(/^supports_/,"").split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ");t.add(a)})}),Array.from(t).sort()})(N).map(e=>(0,a.jsx)(d.default.Option,{value:e,children:e},e))})]})]}),(0,a.jsx)(i.C,{columns:[{header:"Model Name",accessorKey:"model_group",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)("div",{className:"overflow-hidden",children:(0,a.jsx)(l.Z,{title:t.original.model_group,children:(0,a.jsx)(o.zx,{size:"xs",variant:"light",className:"font-mono text-blue-500 bg-blue-50 hover:bg-blue-100 text-xs font-normal px-2 py-0.5 text-left",onClick:()=>Q(t.original),children:t.original.model_group})})})},size:150},{header:"Providers",accessorKey:"providers",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.providers;return(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:n.map(e=>{let{logo:t}=(0,_.dr)(e);return(0,a.jsxs)("div",{className:"flex items-center space-x-1 px-2 py-1 bg-gray-100 rounded text-xs",children:[t&&(0,a.jsx)("img",{src:t,alt:e,className:"w-3 h-3 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e})]},e)})})},size:120},{header:"Mode",accessorKey:"mode",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.mode;return(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("span",{children:(e=>{switch(null==e?void 0:e.toLowerCase()){case"chat":return"\uD83D\uDCAC";case"rerank":return"\uD83D\uDD04";case"embedding":return"\uD83D\uDCC4";default:return"\uD83E\uDD16"}})(n||"")}),(0,a.jsx)(o.xv,{children:n||"Chat"})]})},size:100},{header:"Max Input",accessorKey:"max_input_tokens",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)(o.xv,{className:"text-center",children:es(t.original.max_input_tokens)})},size:100,meta:{className:"text-center"}},{header:"Max Output",accessorKey:"max_output_tokens",enableSorting:!0,cell:e=>{let{row:t}=e;return(0,a.jsx)(o.xv,{className:"text-center",children:es(t.original.max_output_tokens)})},size:100,meta:{className:"text-center"}},{header:"Input $/1M",accessorKey:"input_cost_per_token",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.input_cost_per_token;return(0,a.jsx)(o.xv,{className:"text-center",children:n?ea(n):"Free"})},size:100,meta:{className:"text-center"}},{header:"Output $/1M",accessorKey:"output_cost_per_token",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original.output_cost_per_token;return(0,a.jsx)(o.xv,{className:"text-center",children:n?ea(n):"Free"})},size:100,meta:{className:"text-center"}},{header:"Features",accessorKey:"supports_vision",enableSorting:!1,cell:e=>{let{row:t}=e,n=Object.entries(t.original).filter(e=>{let[t,n]=e;return t.startsWith("supports_")&&!0===n}).map(e=>{let[t]=e;return et(t)});return 0===n.length?(0,a.jsx)(o.xv,{className:"text-gray-400",children:"-"}):1===n.length?(0,a.jsx)("div",{className:"h-6 flex items-center",children:(0,a.jsx)(c.Z,{color:"blue",className:"text-xs",children:n[0]})}):(0,a.jsxs)("div",{className:"h-6 flex items-center space-x-1",children:[(0,a.jsx)(c.Z,{color:"blue",className:"text-xs",children:n[0]}),(0,a.jsx)(l.Z,{title:(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsx)("div",{className:"font-medium",children:"All Features:"}),n.map((e,t)=>(0,a.jsxs)("div",{className:"text-xs",children:["• ",e]},t))]}),trigger:"click",placement:"topLeft",children:(0,a.jsxs)("span",{className:"text-xs text-blue-600 cursor-pointer hover:text-blue-800 hover:underline",onClick:e=>e.stopPropagation(),children:["+",n.length-1]})})]})},size:120},{header:"Limits",accessorKey:"rpm",enableSorting:!0,cell:e=>{let{row:t}=e,n=t.original;return(0,a.jsx)(o.xv,{className:"text-xs text-gray-600",children:er(n.rpm,n.tpm)})},size:150}],data:X,isLoading:T,table:$,defaultSorting:[{id:"model_group",desc:!1}]}),(0,a.jsx)("div",{className:"mt-8 text-center",children:(0,a.jsxs)(o.xv,{className:"text-sm text-gray-600",children:["Showing ",X.length," of ",(null==N?void 0:N.length)||0," models"]})})]})]}),(0,a.jsx)(m.Z,{title:(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("span",{children:(null==q?void 0:q.model_group)||"Model Details"}),q&&(0,a.jsx)(l.Z,{title:"Copy model name",children:(0,a.jsx)(x.Z,{onClick:()=>ee(q.model_group),className:"cursor-pointer text-gray-500 hover:text-blue-500 w-4 h-4"})})]}),width:1e3,open:U,footer:null,onOk:()=>{W(!1),J(null)},onCancel:()=>{W(!1),J(null)},children:q&&(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Model Overview"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4 mb-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Model Name:"}),(0,a.jsx)(o.xv,{children:q.model_group})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Mode:"}),(0,a.jsx)(o.xv,{children:q.mode||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Providers:"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1 mt-1",children:q.providers.map(e=>{let{logo:t}=(0,_.dr)(e);return(0,a.jsx)(c.Z,{color:"blue",children:(0,a.jsxs)("div",{className:"flex items-center space-x-1",children:[t&&(0,a.jsx)("img",{src:t,alt:e,className:"w-3 h-3 flex-shrink-0 object-contain",onError:e=>{e.target.style.display="none"}}),(0,a.jsx)("span",{className:"capitalize",children:e})]})},e)})})]})]}),q.model_group.includes("*")&&(0,a.jsx)("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-4",children:(0,a.jsxs)("div",{className:"flex items-start space-x-2",children:[(0,a.jsx)(g.Z,{className:"w-4 h-4 text-blue-600 mt-0.5 flex-shrink-0"}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium text-blue-900 mb-2",children:"Wildcard Routing"}),(0,a.jsxs)(o.xv,{className:"text-sm text-blue-800 mb-2",children:["This model uses wildcard routing. You can pass any value where you see the ",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:"*"})," symbol."]}),(0,a.jsxs)(o.xv,{className:"text-sm text-blue-800",children:["For example, with ",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:q.model_group}),", you can use any string (",(0,a.jsx)("code",{className:"bg-blue-100 px-1 py-0.5 rounded text-xs",children:q.model_group.replace("*","my-custom-value")}),") that matches this pattern."]})]})]})})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Token & Cost Information"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Max Input Tokens:"}),(0,a.jsx)(o.xv,{children:(null===(t=q.max_input_tokens)||void 0===t?void 0:t.toLocaleString())||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Max Output Tokens:"}),(0,a.jsx)(o.xv,{children:(null===(n=q.max_output_tokens)||void 0===n?void 0:n.toLocaleString())||"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Input Cost per 1M Tokens:"}),(0,a.jsx)(o.xv,{children:q.input_cost_per_token?ea(q.input_cost_per_token):"Not specified"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Output Cost per 1M Tokens:"}),(0,a.jsx)(o.xv,{children:q.output_cost_per_token?ea(q.output_cost_per_token):"Not specified"})]})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Capabilities"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:(()=>{let e=en(q),t=["green","blue","purple","orange","red","yellow"];return 0===e.length?(0,a.jsx)(o.xv,{className:"text-gray-500",children:"No special capabilities listed"}):e.map((e,n)=>(0,a.jsx)(c.Z,{color:t[n%t.length],children:et(e)},e))})()})]}),(q.tpm||q.rpm)&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Rate Limits"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[q.tpm&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Tokens per Minute:"}),(0,a.jsx)(o.xv,{children:q.tpm.toLocaleString()})]}),q.rpm&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"font-medium",children:"Requests per Minute:"}),(0,a.jsx)(o.xv,{children:q.rpm.toLocaleString()})]})]})]}),q.supported_openai_params&&(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Supported OpenAI Parameters"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:q.supported_openai_params.map(e=>(0,a.jsx)(c.Z,{color:"green",children:e},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(o.xv,{className:"text-lg font-semibold mb-4",children:"Usage Example"}),(0,a.jsx)("div",{className:"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto",children:(0,a.jsx)("pre",{className:"text-sm",children:(0,h.L)({apiKeySource:"custom",accessToken:null,apiKey:"your_api_key",inputMessage:"Hello, how are you?",chatHistory:[{role:"user",content:"Hello, how are you?",isImage:!1}],selectedTags:[],selectedVectorStores:[],selectedGuardrails:[],endpointType:(0,f.vf)(q.mode||"chat"),selectedModel:q.model_group,selectedSdk:"openai"})})}),(0,a.jsx)("div",{className:"mt-2 text-right",children:(0,a.jsx)("button",{onClick:()=>{ee((0,h.L)({apiKeySource:"custom",accessToken:null,apiKey:"your_api_key",inputMessage:"Hello, how are you?",chatHistory:[{role:"user",content:"Hello, how are you?",isImage:!1}],selectedTags:[],selectedVectorStores:[],selectedGuardrails:[],endpointType:(0,f.vf)(q.mode||"chat"),selectedModel:q.model_group,selectedSdk:"openai"}))},className:"text-sm text-blue-600 hover:text-blue-800 cursor-pointer",children:"Copy to clipboard"})})]})]})})]})})}},69734:function(e,t,n){n.d(t,{F:function(){return o},f:function(){return l}});var a=n(57437),s=n(2265),r=n(19250);let i=(0,s.createContext)(void 0),o=()=>{let e=(0,s.useContext)(i);if(!e)throw Error("useTheme must be used within a ThemeProvider");return e},l=e=>{let{children:t,accessToken:n}=e,[o,l]=(0,s.useState)(null);return(0,s.useEffect)(()=>{(async()=>{if(n)try{let t=(0,r.getProxyBaseUrl)(),a=await fetch(t?"".concat(t,"/get/ui_theme_settings"):"/get/ui_theme_settings",{method:"GET",headers:{Authorization:"Bearer ".concat(n),"Content-Type":"application/json"}});if(a.ok){var e;let t=await a.json();(null===(e=t.values)||void 0===e?void 0:e.logo_url)&&l(t.values.logo_url)}}catch(e){console.warn("Failed to load logo settings from backend:",e)}})()},[n]),(0,a.jsx)(i.Provider,{value:{logoUrl:o,setLogoUrl:l},children:t})}}}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/220-1c8d82f7ce7658c4.js b/litellm/proxy/_experimental/out/_next/static/chunks/220-5061c4cea850d728.js similarity index 71% rename from ui/litellm-dashboard/out/_next/static/chunks/220-1c8d82f7ce7658c4.js rename to litellm/proxy/_experimental/out/_next/static/chunks/220-5061c4cea850d728.js index 206acc40d24..870b249e205 100644 --- a/ui/litellm-dashboard/out/_next/static/chunks/220-1c8d82f7ce7658c4.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/220-5061c4cea850d728.js @@ -1,12 +1,12 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[220],{12660:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},88009:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},79276:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},37527:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},9775:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},11429:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M766.4 744.3c43.7 0 79.4-36.2 79.4-80.5 0-53.5-79.4-140.8-79.4-140.8S687 610.3 687 663.8c0 44.3 35.7 80.5 79.4 80.5zm-377.1-44.1c7.1 7.1 18.6 7.1 25.6 0l256.1-256c7.1-7.1 7.1-18.6 0-25.6l-256-256c-.6-.6-1.3-1.2-2-1.7l-78.2-78.2a9.11 9.11 0 00-12.8 0l-48 48a9.11 9.11 0 000 12.8l67.2 67.2-207.8 207.9c-7.1 7.1-7.1 18.6 0 25.6l255.9 256zm12.9-448.6l178.9 178.9H223.4l178.8-178.9zM904 816H120c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8z"}}]},name:"bg-colors",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},68208:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M856 376H648V168c0-8.8-7.2-16-16-16H168c-8.8 0-16 7.2-16 16v464c0 8.8 7.2 16 16 16h208v208c0 8.8 7.2 16 16 16h464c8.8 0 16-7.2 16-16V392c0-8.8-7.2-16-16-16zm-480 16v188H220V220h360v156H392c-8.8 0-16 7.2-16 16zm204 52v136H444V444h136zm224 360H444V648h188c8.8 0 16-7.2 16-16V444h156v360z"}}]},name:"block",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},83322:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},49634:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},83669:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},26430:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},5540:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},11894:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},44625:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},26349:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},62670:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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 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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},73879:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},29271:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"}},{tag:"path",attrs:{d:"M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"}}]},name:"exclamation-circle",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},41169:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},11741:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},34310:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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 42h216v494zM472 744a40 40 0 1080 0 40 40 0 10-80 0zm16-104h48c4.4 0 8-3.6 8-8V448c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v184c0 4.4 3.6 8 8 8z"}}]},name:"file-exclamation",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},50010:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},38434:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},10798:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},71282:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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 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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},92403:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},48231:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},62272:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},45246:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},16601:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},53508:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z"}}]},name:"paper-clip",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},99890:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},28595:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},34419:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},96473:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"}},{tag:"path",attrs:{d:"M192 474h672q8 0 8 8v60q0 8-8 8H160q-8 0-8-8v-60q0-8 8-8z"}}]},name:"plus",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},89245:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},69993:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M300 328a60 60 0 10120 0 60 60 0 10-120 0zM852 64H172c-17.7 0-32 14.3-32 32v660c0 17.7 14.3 32 32 32h680c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-32 660H204V128h616v596zM604 328a60 60 0 10120 0 60 60 0 10-120 0zm250.2 556H169.8c-16.5 0-29.8 14.3-29.8 32v36c0 4.4 3.3 8 7.4 8h729.1c4.1 0 7.4-3.6 7.4-8v-36c.1-17.7-13.2-32-29.7-32zM664 508H360c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"robot",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},78355:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},23907:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},55322:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},8881:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},71891:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},41361:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},58630:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},3632:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),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"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},35291:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(1119),o=n(2265),i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 720a48 48 0 1096 0 48 48 0 10-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"}}]},name:"warning",theme:"outlined"},a=n(55015),l=o.forwardRef(function(e,t){return o.createElement(a.Z,(0,r.Z)({},e,{ref:t,icon:i}))})},58747:function(e,t,n){"use strict";n.d(t,{Z:function(){return i}});var r=n(5853),o=n(2265);let i=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.createElement("path",{d:"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"}))}},4537:function(e,t,n){"use strict";n.d(t,{Z:function(){return i}});var r=n(5853),o=n(2265);let i=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.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"}))}},75105:function(e,t,n){"use strict";n.d(t,{Z:function(){return et}});var r=n(5853),o=n(2265),i=n(47625),a=n(93765),l=n(87602),s=n(59221),c=n(86757),u=n.n(c),d=n(95645),f=n.n(d),p=n(77571),h=n.n(p),m=n(82559),g=n.n(m),v=n(21652),y=n.n(v),b=n(57165),x=n(81889),w=n(9841),k=n(58772),S=n(34067),E=n(16630),O=n(85355),C=n(82944),j=["layout","type","stroke","connectNulls","isRange","ref"];function _(e){return(_="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 P(){return(P=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(i,j));return o.createElement(w.m,{clipPath:n?"url(#clipPath-".concat(r,")"):null},o.createElement(b.H,P({},(0,C.L6)(d,!0),{points:e,connectNulls:c,type:l,baseLine:t,layout:a,stroke:"none",className:"recharts-area-area"})),"none"!==s&&o.createElement(b.H,P({},(0,C.L6)(this.props,!1),{className:"recharts-area-curve",layout:a,type:l,connectNulls:c,fill:"none",points:e})),"none"!==s&&u&&o.createElement(b.H,P({},(0,C.L6)(this.props,!1),{className:"recharts-area-curve",layout:a,type:l,connectNulls:c,fill:"none",points:t})))}},{key:"renderAreaWithAnimation",value:function(e,t){var n=this,r=this.props,i=r.points,a=r.baseLine,l=r.isAnimationActive,c=r.animationBegin,u=r.animationDuration,d=r.animationEasing,f=r.animationId,p=this.state,m=p.prevPoints,v=p.prevBaseLine;return o.createElement(s.ZP,{begin:c,duration:u,isActive:l,easing:d,from:{t:0},to:{t:1},key:"area-".concat(f),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(r){var l=r.t;if(m){var s,c=m.length/i.length,u=i.map(function(e,t){var n=Math.floor(t*c);if(m[n]){var r=m[n],o=(0,E.k4)(r.x,e.x),i=(0,E.k4)(r.y,e.y);return M(M({},e),{},{x:o(l),y:i(l)})}return e});return s=(0,E.hj)(a)&&"number"==typeof a?(0,E.k4)(v,a)(l):h()(a)||g()(a)?(0,E.k4)(v,0)(l):a.map(function(e,t){var n=Math.floor(t*c);if(v[n]){var r=v[n],o=(0,E.k4)(r.x,e.x),i=(0,E.k4)(r.y,e.y);return M(M({},e),{},{x:o(l),y:i(l)})}return e}),n.renderAreaStatically(u,s,e,t)}return o.createElement(w.m,null,o.createElement("defs",null,o.createElement("clipPath",{id:"animationClipPath-".concat(t)},n.renderClipRect(l))),o.createElement(w.m,{clipPath:"url(#animationClipPath-".concat(t,")")},n.renderAreaStatically(i,a,e,t)))})}},{key:"renderArea",value:function(e,t){var n=this.props,r=n.points,o=n.baseLine,i=n.isAnimationActive,a=this.state,l=a.prevPoints,s=a.prevBaseLine,c=a.totalLength;return i&&r&&r.length&&(!l&&c>0||!y()(l,r)||!y()(s,o))?this.renderAreaWithAnimation(e,t):this.renderAreaStatically(r,o,e,t)}},{key:"render",value:function(){var e,t=this.props,n=t.hide,r=t.dot,i=t.points,a=t.className,s=t.top,c=t.left,u=t.xAxis,d=t.yAxis,f=t.width,p=t.height,m=t.isAnimationActive,g=t.id;if(n||!i||!i.length)return null;var v=this.state.isAnimationFinished,y=1===i.length,b=(0,l.Z)("recharts-area",a),x=u&&u.allowDataOverflow,S=d&&d.allowDataOverflow,E=x||S,O=h()(g)?this.id:g,j=null!==(e=(0,C.L6)(r,!1))&&void 0!==e?e:{r:3,strokeWidth:2},_=j.r,P=j.strokeWidth,T=((0,C.$k)(r)?r:{}).clipDot,M=void 0===T||T,N=2*(void 0===_?3:_)+(void 0===P?2:P);return o.createElement(w.m,{className:b},x||S?o.createElement("defs",null,o.createElement("clipPath",{id:"clipPath-".concat(O)},o.createElement("rect",{x:x?c:c-f/2,y:S?s:s-p/2,width:x?f:2*f,height:S?p:2*p})),!M&&o.createElement("clipPath",{id:"clipPath-dots-".concat(O)},o.createElement("rect",{x:c-N/2,y:s-N/2,width:f+N,height:p+N}))):null,y?null:this.renderArea(E,O),(r||y)&&this.renderDots(E,M,O),(!m||v)&&k.e.renderCallByParent(this.props,i))}}],r=[{key:"getDerivedStateFromProps",value:function(e,t){return e.animationId!==t.prevAnimationId?{prevAnimationId:e.animationId,curPoints:e.points,curBaseLine:e.baseLine,prevPoints:t.curPoints,prevBaseLine:t.curBaseLine}:e.points!==t.curPoints||e.baseLine!==t.curBaseLine?{curPoints:e.points,curBaseLine:e.baseLine}:null}}],n&&N(a.prototype,n),r&&N(a,r),Object.defineProperty(a,"prototype",{writable:!1}),a}(o.PureComponent);D(z,"displayName","Area"),D(z,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!S.x.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"}),D(z,"getBaseValue",function(e,t,n,r){var o=e.layout,i=e.baseValue,a=t.props.baseValue,l=null!=a?a:i;if((0,E.hj)(l)&&"number"==typeof l)return l;var s="horizontal"===o?r:n,c=s.scale.domain();if("number"===s.type){var u=Math.max(c[0],c[1]),d=Math.min(c[0],c[1]);return"dataMin"===l?d:"dataMax"===l?u:u<0?u:Math.max(Math.min(c[0],c[1]),0)}return"dataMin"===l?c[0]:"dataMax"===l?c[1]:c[0]}),D(z,"getComposedData",function(e){var t,n=e.props,r=e.item,o=e.xAxis,i=e.yAxis,a=e.xAxisTicks,l=e.yAxisTicks,s=e.bandSize,c=e.dataKey,u=e.stackedData,d=e.dataStartIndex,f=e.displayedData,p=e.offset,h=n.layout,m=u&&u.length,g=z.getBaseValue(n,r,o,i),v="horizontal"===h,y=!1,b=f.map(function(e,t){m?n=u[d+t]:Array.isArray(n=(0,O.F$)(e,c))?y=!0:n=[g,n];var n,r=null==n[1]||m&&null==(0,O.F$)(e,c);return v?{x:(0,O.Hv)({axis:o,ticks:a,bandSize:s,entry:e,index:t}),y:r?null:i.scale(n[1]),value:n,payload:e}:{x:r?null:o.scale(n[1]),y:(0,O.Hv)({axis:i,ticks:l,bandSize:s,entry:e,index:t}),value:n,payload:e}});return t=m||y?b.map(function(e){var t=Array.isArray(e.value)?e.value[0]:null;return v?{x:e.x,y:null!=t&&null!=e.y?i.scale(t):null}:{x:null!=t?o.scale(t):null,y:e.y}}):v?i.scale(g):o.scale(g),M({points:b,baseLine:t,layout:h,isRange:y},p)}),D(z,"renderDotItem",function(e,t){return o.isValidElement(e)?o.cloneElement(e,t):u()(e)?e(t):o.createElement(x.o,P({},t,{className:"recharts-area-dot"}))});var Z=n(97059),B=n(62994),F=n(25311),H=(0,a.z)({chartName:"AreaChart",GraphicalChild:z,axisComponents:[{axisType:"xAxis",AxisComp:Z.K},{axisType:"yAxis",AxisComp:B.B}],formatAxisMap:F.t9}),q=n(56940),U=n(8147),W=n(22190),K=n(54061),V=n(65278),$=n(98593),X=n(69448),G=n(32644),Y=n(7084),Q=n(26898),J=n(97324),ee=n(1153);let et=o.forwardRef((e,t)=>{let{data:n=[],categories:a=[],index:l,stack:s=!1,colors:c=Q.s,valueFormatter:u=ee.Cj,startEndOnly:d=!1,showXAxis:f=!0,showYAxis:p=!0,yAxisWidth:h=56,intervalType:m="equidistantPreserveStart",showAnimation:g=!1,animationDuration:v=900,showTooltip:y=!0,showLegend:b=!0,showGridLines:w=!0,showGradient:k=!0,autoMinValue:S=!1,curveType:E="linear",minValue:O,maxValue:C,connectNulls:j=!1,allowDecimals:_=!0,noDataText:P,className:T,onValueChange:M,enableLegendSlider:N=!1,customTooltip:A,rotateLabelX:I,tickGap:R=5}=e,D=(0,r._T)(e,["data","categories","index","stack","colors","valueFormatter","startEndOnly","showXAxis","showYAxis","yAxisWidth","intervalType","showAnimation","animationDuration","showTooltip","showLegend","showGridLines","showGradient","autoMinValue","curveType","minValue","maxValue","connectNulls","allowDecimals","noDataText","className","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap"]),L=(f||p)&&(!d||p)?20:0,[F,et]=(0,o.useState)(60),[en,er]=(0,o.useState)(void 0),[eo,ei]=(0,o.useState)(void 0),ea=(0,G.me)(a,c),el=(0,G.i4)(S,O,C),es=!!M;function ec(e){es&&(e===eo&&!en||(0,G.FB)(n,e)&&en&&en.dataKey===e?(ei(void 0),null==M||M(null)):(ei(e),null==M||M({eventType:"category",categoryClicked:e})),er(void 0))}return o.createElement("div",Object.assign({ref:t,className:(0,J.q)("w-full h-80",T)},D),o.createElement(i.h,{className:"h-full w-full"},(null==n?void 0:n.length)?o.createElement(H,{data:n,onClick:es&&(eo||en)?()=>{er(void 0),ei(void 0),null==M||M(null)}:void 0},w?o.createElement(q.q,{className:(0,J.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:!0,vertical:!1}):null,o.createElement(Z.K,{padding:{left:L,right:L},hide:!f,dataKey:l,tick:{transform:"translate(0, 6)"},ticks:d?[n[0][l],n[n.length-1][l]]:void 0,fill:"",stroke:"",className:(0,J.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),interval:d?"preserveStartEnd":m,tickLine:!1,axisLine:!1,minTickGap:R,angle:null==I?void 0:I.angle,dy:null==I?void 0:I.verticalShift,height:null==I?void 0:I.xAxisHeight}),o.createElement(B.B,{width:h,hide:!p,axisLine:!1,tickLine:!1,type:"number",domain:el,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,J.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:u,allowDecimals:_}),o.createElement(U.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{stroke:"#d1d5db",strokeWidth:1},content:y?e=>{let{active:t,payload:n,label:r}=e;return A?o.createElement(A,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=ea.get(e.dataKey))&&void 0!==t?t:Y.fr.Gray})}),active:t,label:r}):o.createElement($.ZP,{active:t,payload:n,label:r,valueFormatter:u,categoryColors:ea})}:o.createElement(o.Fragment,null),position:{y:0}}),b?o.createElement(W.D,{verticalAlign:"top",height:F,content:e=>{let{payload:t}=e;return(0,V.Z)({payload:t},ea,et,eo,es?e=>ec(e):void 0,N)}}):null,a.map(e=>{var t,n;return o.createElement("defs",{key:e},k?o.createElement("linearGradient",{className:(0,ee.bM)(null!==(t=ea.get(e))&&void 0!==t?t:Y.fr.Gray,Q.K.text).textColor,id:ea.get(e),x1:"0",y1:"0",x2:"0",y2:"1"},o.createElement("stop",{offset:"5%",stopColor:"currentColor",stopOpacity:en||eo&&eo!==e?.15:.4}),o.createElement("stop",{offset:"95%",stopColor:"currentColor",stopOpacity:0})):o.createElement("linearGradient",{className:(0,ee.bM)(null!==(n=ea.get(e))&&void 0!==n?n:Y.fr.Gray,Q.K.text).textColor,id:ea.get(e),x1:"0",y1:"0",x2:"0",y2:"1"},o.createElement("stop",{stopColor:"currentColor",stopOpacity:en||eo&&eo!==e?.1:.3})))}),a.map(e=>{var t;return o.createElement(z,{className:(0,ee.bM)(null!==(t=ea.get(e))&&void 0!==t?t:Y.fr.Gray,Q.K.text).strokeColor,strokeOpacity:en||eo&&eo!==e?.3:1,activeDot:e=>{var t;let{cx:r,cy:i,stroke:a,strokeLinecap:l,strokeLinejoin:s,strokeWidth:c,dataKey:u}=e;return o.createElement(x.o,{className:(0,J.q)("stroke-tremor-background dark:stroke-dark-tremor-background",M?"cursor-pointer":"",(0,ee.bM)(null!==(t=ea.get(u))&&void 0!==t?t:Y.fr.Gray,Q.K.text).fillColor),cx:r,cy:i,r:5,fill:"",stroke:a,strokeLinecap:l,strokeLinejoin:s,strokeWidth:c,onClick:(t,r)=>{r.stopPropagation(),es&&(e.index===(null==en?void 0:en.index)&&e.dataKey===(null==en?void 0:en.dataKey)||(0,G.FB)(n,e.dataKey)&&eo&&eo===e.dataKey?(ei(void 0),er(void 0),null==M||M(null)):(ei(e.dataKey),er({index:e.index,dataKey:e.dataKey}),null==M||M(Object.assign({eventType:"dot",categoryClicked:e.dataKey},e.payload))))}})},dot:t=>{var r;let{stroke:i,strokeLinecap:a,strokeLinejoin:l,strokeWidth:s,cx:c,cy:u,dataKey:d,index:f}=t;return(0,G.FB)(n,e)&&!(en||eo&&eo!==e)||(null==en?void 0:en.index)===f&&(null==en?void 0:en.dataKey)===e?o.createElement(x.o,{key:f,cx:c,cy:u,r:5,stroke:i,fill:"",strokeLinecap:a,strokeLinejoin:l,strokeWidth:s,className:(0,J.q)("stroke-tremor-background dark:stroke-dark-tremor-background",M?"cursor-pointer":"",(0,ee.bM)(null!==(r=ea.get(d))&&void 0!==r?r:Y.fr.Gray,Q.K.text).fillColor)}):o.createElement(o.Fragment,{key:f})},key:e,name:e,type:E,dataKey:e,stroke:"",fill:"url(#".concat(ea.get(e),")"),strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round",isAnimationActive:g,animationDuration:v,stackId:s?"a":void 0,connectNulls:j})}),M?a.map(e=>o.createElement(K.x,{className:(0,J.q)("cursor-pointer"),strokeOpacity:0,key:e,name:e,type:E,dataKey:e,stroke:"transparent",fill:"transparent",legendType:"none",tooltipType:"none",strokeWidth:12,connectNulls:j,onClick:(e,t)=>{t.stopPropagation();let{name:n}=e;ec(n)}})):null):o.createElement(X.Z,{noDataText:P})))});et.displayName="AreaChart"},40278:function(e,t,n){"use strict";n.d(t,{Z:function(){return S}});var r=n(5853),o=n(7084),i=n(26898),a=n(97324),l=n(1153),s=n(2265),c=n(47625),u=n(93765),d=n(31699),f=n(97059),p=n(62994),h=n(25311),m=(0,u.z)({chartName:"BarChart",GraphicalChild:d.$,defaultTooltipEventType:"axis",validateTooltipEventTypes:["axis","item"],axisComponents:[{axisType:"xAxis",AxisComp:f.K},{axisType:"yAxis",AxisComp:p.B}],formatAxisMap:h.t9}),g=n(56940),v=n(8147),y=n(22190),b=n(65278),x=n(98593),w=n(69448),k=n(32644);let S=s.forwardRef((e,t)=>{let{data:n=[],categories:u=[],index:h,colors:S=i.s,valueFormatter:E=l.Cj,layout:O="horizontal",stack:C=!1,relative:j=!1,startEndOnly:_=!1,animationDuration:P=900,showAnimation:T=!1,showXAxis:M=!0,showYAxis:N=!0,yAxisWidth:A=56,intervalType:I="equidistantPreserveStart",showTooltip:R=!0,showLegend:D=!0,showGridLines:L=!0,autoMinValue:z=!1,minValue:Z,maxValue:B,allowDecimals:F=!0,noDataText:H,onValueChange:q,enableLegendSlider:U=!1,customTooltip:W,rotateLabelX:K,tickGap:V=5,className:$}=e,X=(0,r._T)(e,["data","categories","index","colors","valueFormatter","layout","stack","relative","startEndOnly","animationDuration","showAnimation","showXAxis","showYAxis","yAxisWidth","intervalType","showTooltip","showLegend","showGridLines","autoMinValue","minValue","maxValue","allowDecimals","noDataText","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap","className"]),G=M||N?20:0,[Y,Q]=(0,s.useState)(60),J=(0,k.me)(u,S),[ee,et]=s.useState(void 0),[en,er]=(0,s.useState)(void 0),eo=!!q;function ei(e,t,n){var r,o,i,a;n.stopPropagation(),q&&((0,k.vZ)(ee,Object.assign(Object.assign({},e.payload),{value:e.value}))?(er(void 0),et(void 0),null==q||q(null)):(er(null===(o=null===(r=e.tooltipPayload)||void 0===r?void 0:r[0])||void 0===o?void 0:o.dataKey),et(Object.assign(Object.assign({},e.payload),{value:e.value})),null==q||q(Object.assign({eventType:"bar",categoryClicked:null===(a=null===(i=e.tooltipPayload)||void 0===i?void 0:i[0])||void 0===a?void 0:a.dataKey},e.payload))))}let ea=(0,k.i4)(z,Z,B);return s.createElement("div",Object.assign({ref:t,className:(0,a.q)("w-full h-80",$)},X),s.createElement(c.h,{className:"h-full w-full"},(null==n?void 0:n.length)?s.createElement(m,{data:n,stackOffset:C?"sign":j?"expand":"none",layout:"vertical"===O?"vertical":"horizontal",onClick:eo&&(en||ee)?()=>{et(void 0),er(void 0),null==q||q(null)}:void 0},L?s.createElement(g.q,{className:(0,a.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:"vertical"!==O,vertical:"vertical"===O}):null,"vertical"!==O?s.createElement(f.K,{padding:{left:G,right:G},hide:!M,dataKey:h,interval:_?"preserveStartEnd":I,tick:{transform:"translate(0, 6)"},ticks:_?[n[0][h],n[n.length-1][h]]:void 0,fill:"",stroke:"",className:(0,a.q)("mt-4 text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,angle:null==K?void 0:K.angle,dy:null==K?void 0:K.verticalShift,height:null==K?void 0:K.xAxisHeight,minTickGap:V}):s.createElement(f.K,{hide:!M,type:"number",tick:{transform:"translate(-3, 0)"},domain:ea,fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,tickFormatter:E,minTickGap:V,allowDecimals:F,angle:null==K?void 0:K.angle,dy:null==K?void 0:K.verticalShift,height:null==K?void 0:K.xAxisHeight}),"vertical"!==O?s.createElement(p.B,{width:A,hide:!N,axisLine:!1,tickLine:!1,type:"number",domain:ea,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:j?e=>"".concat((100*e).toString()," %"):E,allowDecimals:F}):s.createElement(p.B,{width:A,hide:!N,dataKey:h,axisLine:!1,tickLine:!1,ticks:_?[n[0][h],n[n.length-1][h]]:void 0,type:"category",interval:"preserveStartEnd",tick:{transform:"translate(0, 6)"},fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content")}),s.createElement(v.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{fill:"#d1d5db",opacity:"0.15"},content:R?e=>{let{active:t,payload:n,label:r}=e;return W?s.createElement(W,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=J.get(e.dataKey))&&void 0!==t?t:o.fr.Gray})}),active:t,label:r}):s.createElement(x.ZP,{active:t,payload:n,label:r,valueFormatter:E,categoryColors:J})}:s.createElement(s.Fragment,null),position:{y:0}}),D?s.createElement(y.D,{verticalAlign:"top",height:Y,content:e=>{let{payload:t}=e;return(0,b.Z)({payload:t},J,Q,en,eo?e=>{eo&&(e!==en||ee?(er(e),null==q||q({eventType:"category",categoryClicked:e})):(er(void 0),null==q||q(null)),et(void 0))}:void 0,U)}}):null,u.map(e=>{var t;return s.createElement(d.$,{className:(0,a.q)((0,l.bM)(null!==(t=J.get(e))&&void 0!==t?t:o.fr.Gray,i.K.background).fillColor,q?"cursor-pointer":""),key:e,name:e,type:"linear",stackId:C||j?"a":void 0,dataKey:e,fill:"",isAnimationActive:T,animationDuration:P,shape:e=>((e,t,n,r)=>{let{fillOpacity:o,name:i,payload:a,value:l}=e,{x:c,width:u,y:d,height:f}=e;return"horizontal"===r&&f<0?(d+=f,f=Math.abs(f)):"vertical"===r&&u<0&&(c+=u,u=Math.abs(u)),s.createElement("rect",{x:c,y:d,width:u,height:f,opacity:t||n&&n!==i?(0,k.vZ)(t,Object.assign(Object.assign({},a),{value:l}))?o:.3:o})})(e,ee,en,O),onClick:ei})})):s.createElement(w.Z,{noDataText:H})))});S.displayName="BarChart"},14042:function(e,t,n){"use strict";n.d(t,{Z:function(){return eZ}});var r=n(5853),o=n(7084),i=n(26898),a=n(97324),l=n(1153),s=n(2265),c=n(60474),u=n(47625),d=n(93765),f=n(86757),p=n.n(f),h=n(9841),m=n(81889),g=n(87602),v=n(82944),y=["points","className","baseLinePoints","connectNulls"];function b(){return(b=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:[],t=[[]];return e.forEach(function(e){k(e)?t[t.length-1].push(e):t[t.length-1].length>0&&t.push([])}),k(e[0])&&t[t.length-1].push(e[0]),t[t.length-1].length<=0&&(t=t.slice(0,-1)),t},E=function(e,t){var n=S(e);t&&(n=[n.reduce(function(e,t){return[].concat(x(e),x(t))},[])]);var r=n.map(function(e){return e.reduce(function(e,t,n){return"".concat(e).concat(0===n?"M":"L").concat(t.x,",").concat(t.y)},"")}).join("");return 1===n.length?"".concat(r,"Z"):r},O=function(e,t,n){var r=E(e,n);return"".concat("Z"===r.slice(-1)?r.slice(0,-1):r,"L").concat(E(t.reverse(),n).slice(1))},C=function(e){var t=e.points,n=e.className,r=e.baseLinePoints,o=e.connectNulls,i=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,y);if(!t||!t.length)return null;var a=(0,g.Z)("recharts-polygon",n);if(r&&r.length){var l=i.stroke&&"none"!==i.stroke,c=O(t,r,o);return s.createElement("g",{className:a},s.createElement("path",b({},(0,v.L6)(i,!0),{fill:"Z"===c.slice(-1)?i.fill:"none",stroke:"none",d:c})),l?s.createElement("path",b({},(0,v.L6)(i,!0),{fill:"none",d:E(t,o)})):null,l?s.createElement("path",b({},(0,v.L6)(i,!0),{fill:"none",d:E(r,o)})):null)}var u=E(t,o);return s.createElement("path",b({},(0,v.L6)(i,!0),{fill:"Z"===u.slice(-1)?i.fill:"none",className:a,d:u}))},j=n(58811),_=n(41637),P=n(39206);function T(e){return(T="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 M(){return(M=Object.assign?Object.assign.bind():function(e){for(var t=1;t1e-5?"outer"===t?"start":"end":n<-.00001?"outer"===t?"end":"start":"middle"}},{key:"renderAxisLine",value:function(){var e=this.props,t=e.cx,n=e.cy,r=e.radius,o=e.axisLine,i=e.axisLineType,a=A(A({},(0,v.L6)(this.props,!1)),{},{fill:"none"},(0,v.L6)(o,!1));if("circle"===i)return s.createElement(m.o,M({className:"recharts-polar-angle-axis-line"},a,{cx:t,cy:n,r:r}));var l=this.props.ticks.map(function(e){return(0,P.op)(t,n,r,e.coordinate)});return s.createElement(C,M({className:"recharts-polar-angle-axis-line"},a,{points:l}))}},{key:"renderTicks",value:function(){var e=this,t=this.props,n=t.ticks,r=t.tick,o=t.tickLine,a=t.tickFormatter,l=t.stroke,c=(0,v.L6)(this.props,!1),u=(0,v.L6)(r,!1),d=A(A({},c),{},{fill:"none"},(0,v.L6)(o,!1)),f=n.map(function(t,n){var f=e.getTickLineCoord(t),p=A(A(A({textAnchor:e.getTickTextAnchor(t)},c),{},{stroke:"none",fill:l},u),{},{index:n,payload:t,x:f.x2,y:f.y2});return s.createElement(h.m,M({className:"recharts-polar-angle-axis-tick",key:"tick-".concat(t.coordinate)},(0,_.bw)(e.props,t,n)),o&&s.createElement("line",M({className:"recharts-polar-angle-axis-tick-line"},d,f)),r&&i.renderTickItem(r,p,a?a(t.value,n):t.value))});return s.createElement(h.m,{className:"recharts-polar-angle-axis-ticks"},f)}},{key:"render",value:function(){var e=this.props,t=e.ticks,n=e.radius,r=e.axisLine;return!(n<=0)&&t&&t.length?s.createElement(h.m,{className:"recharts-polar-angle-axis"},r&&this.renderAxisLine(),this.renderTicks()):null}}],r=[{key:"renderTickItem",value:function(e,t,n){return s.isValidElement(e)?s.cloneElement(e,t):p()(e)?e(t):s.createElement(j.x,M({},t,{className:"recharts-polar-angle-axis-tick-value"}),n)}}],n&&I(i.prototype,n),r&&I(i,r),Object.defineProperty(i,"prototype",{writable:!1}),i}(s.PureComponent);L(B,"displayName","PolarAngleAxis"),L(B,"axisType","angleAxis"),L(B,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var F=n(35802),H=n.n(F),q=n(37891),U=n.n(q),W=n(26680),K=["cx","cy","angle","ticks","axisLine"],V=["ticks","tick","angle","tickFormatter","stroke"];function $(e){return($="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 X(){return(X=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function J(e,t){for(var n=0;n0?el()(e,"paddingAngle",0):0;if(n){var l=(0,eg.k4)(n.endAngle-n.startAngle,e.endAngle-e.startAngle),s=eS(eS({},e),{},{startAngle:i+a,endAngle:i+l(r)+a});o.push(s),i=s.endAngle}else{var c=e.endAngle,d=e.startAngle,f=(0,eg.k4)(0,c-d)(r),p=eS(eS({},e),{},{startAngle:i+a,endAngle:i+f+a});o.push(p),i=p.endAngle}}),s.createElement(h.m,null,e.renderSectorsStatically(o))})}},{key:"attachKeyboardHandlers",value:function(e){var t=this;e.onkeydown=function(e){if(!e.altKey)switch(e.key){case"ArrowLeft":var n=++t.state.sectorToFocus%t.sectorRefs.length;t.sectorRefs[n].focus(),t.setState({sectorToFocus:n});break;case"ArrowRight":var r=--t.state.sectorToFocus<0?t.sectorRefs.length-1:t.state.sectorToFocus%t.sectorRefs.length;t.sectorRefs[r].focus(),t.setState({sectorToFocus:r});break;case"Escape":t.sectorRefs[t.state.sectorToFocus].blur(),t.setState({sectorToFocus:0})}}}},{key:"renderSectors",value:function(){var e=this.props,t=e.sectors,n=e.isAnimationActive,r=this.state.prevSectors;return n&&t&&t.length&&(!r||!ec()(r,t))?this.renderSectorsWithAnimation():this.renderSectorsStatically(t)}},{key:"componentDidMount",value:function(){this.pieRef&&this.attachKeyboardHandlers(this.pieRef)}},{key:"render",value:function(){var e=this,t=this.props,n=t.hide,r=t.sectors,o=t.className,i=t.label,a=t.cx,l=t.cy,c=t.innerRadius,u=t.outerRadius,d=t.isAnimationActive,f=this.state.isAnimationFinished;if(n||!r||!r.length||!(0,eg.hj)(a)||!(0,eg.hj)(l)||!(0,eg.hj)(c)||!(0,eg.hj)(u))return null;var p=(0,g.Z)("recharts-pie",o);return s.createElement(h.m,{tabIndex:this.props.rootTabIndex,className:p,ref:function(t){e.pieRef=t}},this.renderSectors(),i&&this.renderLabels(r),W._.renderCallByParent(this.props,null,!1),(!d||f)&&ep.e.renderCallByParent(this.props,r,!1))}}],r=[{key:"getDerivedStateFromProps",value:function(e,t){return t.prevIsAnimationActive!==e.isAnimationActive?{prevIsAnimationActive:e.isAnimationActive,prevAnimationId:e.animationId,curSectors:e.sectors,prevSectors:[],isAnimationFinished:!0}:e.isAnimationActive&&e.animationId!==t.prevAnimationId?{prevAnimationId:e.animationId,curSectors:e.sectors,prevSectors:t.curSectors,isAnimationFinished:!0}:e.sectors!==t.curSectors?{curSectors:e.sectors,isAnimationFinished:!0}:null}},{key:"getTextAnchor",value:function(e,t){return e>t?"start":e=360?x:x-1)*u,k=i.reduce(function(e,t){var n=(0,ev.F$)(t,b,0);return e+((0,eg.hj)(n)?n:0)},0);return k>0&&(t=i.map(function(e,t){var r,o=(0,ev.F$)(e,b,0),i=(0,ev.F$)(e,f,t),a=((0,eg.hj)(o)?o:0)/k,c=(r=t?n.endAngle+(0,eg.uY)(v)*u*(0!==o?1:0):s)+(0,eg.uY)(v)*((0!==o?m:0)+a*w),d=(r+c)/2,p=(g.innerRadius+g.outerRadius)/2,y=[{name:i,value:o,payload:e,dataKey:b,type:h}],x=(0,P.op)(g.cx,g.cy,p,d);return n=eS(eS(eS({percent:a,cornerRadius:l,name:i,tooltipPayload:y,midAngle:d,middleRadius:p,tooltipPosition:x},e),g),{},{value:(0,ev.F$)(e,b),startAngle:r,endAngle:c,payload:e,paddingAngle:(0,eg.uY)(v)*u})})),eS(eS({},g),{},{sectors:t,data:i})});var eM=(0,d.z)({chartName:"PieChart",GraphicalChild:eT,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:B},{axisType:"radiusAxis",AxisComp:eo}],formatAxisMap:P.t9,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}}),eN=n(8147),eA=n(69448),eI=n(98593);let eR=e=>{let{active:t,payload:n,valueFormatter:r}=e;if(t&&(null==n?void 0:n[0])){let e=null==n?void 0:n[0];return s.createElement(eI.$B,null,s.createElement("div",{className:(0,a.q)("px-4 py-2")},s.createElement(eI.zX,{value:r(e.value),name:e.name,color:e.payload.color})))}return null},eD=(e,t)=>e.map((e,n)=>{let r=ne||t((0,l.vP)(n.map(e=>e[r]))),ez=e=>{let{cx:t,cy:n,innerRadius:r,outerRadius:o,startAngle:i,endAngle:a,className:l}=e;return s.createElement("g",null,s.createElement(c.L,{cx:t,cy:n,innerRadius:r,outerRadius:o,startAngle:i,endAngle:a,className:l,fill:"",opacity:.3,style:{outline:"none"}}))},eZ=s.forwardRef((e,t)=>{let{data:n=[],category:c="value",index:d="name",colors:f=i.s,variant:p="donut",valueFormatter:h=l.Cj,label:m,showLabel:g=!0,animationDuration:v=900,showAnimation:y=!1,showTooltip:b=!0,noDataText:x,onValueChange:w,customTooltip:k,className:S}=e,E=(0,r._T)(e,["data","category","index","colors","variant","valueFormatter","label","showLabel","animationDuration","showAnimation","showTooltip","noDataText","onValueChange","customTooltip","className"]),O="donut"==p,C=eL(m,h,n,c),[j,_]=s.useState(void 0),P=!!w;return(0,s.useEffect)(()=>{let e=document.querySelectorAll(".recharts-pie-sector");e&&e.forEach(e=>{e.setAttribute("style","outline: none")})},[j]),s.createElement("div",Object.assign({ref:t,className:(0,a.q)("w-full h-40",S)},E),s.createElement(u.h,{className:"h-full w-full"},(null==n?void 0:n.length)?s.createElement(eM,{onClick:P&&j?()=>{_(void 0),null==w||w(null)}:void 0,margin:{top:0,left:0,right:0,bottom:0}},g&&O?s.createElement("text",{className:(0,a.q)("fill-tremor-content-emphasis","dark:fill-dark-tremor-content-emphasis"),x:"50%",y:"50%",textAnchor:"middle",dominantBaseline:"middle"},C):null,s.createElement(eT,{className:(0,a.q)("stroke-tremor-background dark:stroke-dark-tremor-background",w?"cursor-pointer":"cursor-default"),data:eD(n,f),cx:"50%",cy:"50%",startAngle:90,endAngle:-270,innerRadius:O?"75%":"0%",outerRadius:"100%",stroke:"",strokeLinejoin:"round",dataKey:c,nameKey:d,isAnimationActive:y,animationDuration:v,onClick:function(e,t,n){n.stopPropagation(),P&&(j===t?(_(void 0),null==w||w(null)):(_(t),null==w||w(Object.assign({eventType:"slice"},e.payload.payload))))},activeIndex:j,inactiveShape:ez,style:{outline:"none"}}),s.createElement(eN.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,content:b?e=>{var t;let{active:n,payload:r}=e;return k?s.createElement(k,{payload:null==r?void 0:r.map(e=>{var t,n,i;return Object.assign(Object.assign({},e),{color:null!==(i=null===(n=null===(t=null==r?void 0:r[0])||void 0===t?void 0:t.payload)||void 0===n?void 0:n.color)&&void 0!==i?i:o.fr.Gray})}),active:n,label:null===(t=null==r?void 0:r[0])||void 0===t?void 0:t.name}):s.createElement(eR,{active:n,payload:r,valueFormatter:h})}:s.createElement(s.Fragment,null)})):s.createElement(eA.Z,{noDataText:x})))});eZ.displayName="DonutChart"},59664:function(e,t,n){"use strict";n.d(t,{Z:function(){return E}});var r=n(5853),o=n(2265),i=n(47625),a=n(93765),l=n(54061),s=n(97059),c=n(62994),u=n(25311),d=(0,a.z)({chartName:"LineChart",GraphicalChild:l.x,axisComponents:[{axisType:"xAxis",AxisComp:s.K},{axisType:"yAxis",AxisComp:c.B}],formatAxisMap:u.t9}),f=n(56940),p=n(8147),h=n(22190),m=n(81889),g=n(65278),v=n(98593),y=n(69448),b=n(32644),x=n(7084),w=n(26898),k=n(97324),S=n(1153);let E=o.forwardRef((e,t)=>{let{data:n=[],categories:a=[],index:u,colors:E=w.s,valueFormatter:O=S.Cj,startEndOnly:C=!1,showXAxis:j=!0,showYAxis:_=!0,yAxisWidth:P=56,intervalType:T="equidistantPreserveStart",animationDuration:M=900,showAnimation:N=!1,showTooltip:A=!0,showLegend:I=!0,showGridLines:R=!0,autoMinValue:D=!1,curveType:L="linear",minValue:z,maxValue:Z,connectNulls:B=!1,allowDecimals:F=!0,noDataText:H,className:q,onValueChange:U,enableLegendSlider:W=!1,customTooltip:K,rotateLabelX:V,tickGap:$=5}=e,X=(0,r._T)(e,["data","categories","index","colors","valueFormatter","startEndOnly","showXAxis","showYAxis","yAxisWidth","intervalType","animationDuration","showAnimation","showTooltip","showLegend","showGridLines","autoMinValue","curveType","minValue","maxValue","connectNulls","allowDecimals","noDataText","className","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap"]),G=j||_?20:0,[Y,Q]=(0,o.useState)(60),[J,ee]=(0,o.useState)(void 0),[et,en]=(0,o.useState)(void 0),er=(0,b.me)(a,E),eo=(0,b.i4)(D,z,Z),ei=!!U;function ea(e){ei&&(e===et&&!J||(0,b.FB)(n,e)&&J&&J.dataKey===e?(en(void 0),null==U||U(null)):(en(e),null==U||U({eventType:"category",categoryClicked:e})),ee(void 0))}return o.createElement("div",Object.assign({ref:t,className:(0,k.q)("w-full h-80",q)},X),o.createElement(i.h,{className:"h-full w-full"},(null==n?void 0:n.length)?o.createElement(d,{data:n,onClick:ei&&(et||J)?()=>{ee(void 0),en(void 0),null==U||U(null)}:void 0},R?o.createElement(f.q,{className:(0,k.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:!0,vertical:!1}):null,o.createElement(s.K,{padding:{left:G,right:G},hide:!j,dataKey:u,interval:C?"preserveStartEnd":T,tick:{transform:"translate(0, 6)"},ticks:C?[n[0][u],n[n.length-1][u]]:void 0,fill:"",stroke:"",className:(0,k.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,minTickGap:$,angle:null==V?void 0:V.angle,dy:null==V?void 0:V.verticalShift,height:null==V?void 0:V.xAxisHeight}),o.createElement(c.B,{width:P,hide:!_,axisLine:!1,tickLine:!1,type:"number",domain:eo,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,k.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:O,allowDecimals:F}),o.createElement(p.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{stroke:"#d1d5db",strokeWidth:1},content:A?e=>{let{active:t,payload:n,label:r}=e;return K?o.createElement(K,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=er.get(e.dataKey))&&void 0!==t?t:x.fr.Gray})}),active:t,label:r}):o.createElement(v.ZP,{active:t,payload:n,label:r,valueFormatter:O,categoryColors:er})}:o.createElement(o.Fragment,null),position:{y:0}}),I?o.createElement(h.D,{verticalAlign:"top",height:Y,content:e=>{let{payload:t}=e;return(0,g.Z)({payload:t},er,Q,et,ei?e=>ea(e):void 0,W)}}):null,a.map(e=>{var t;return o.createElement(l.x,{className:(0,k.q)((0,S.bM)(null!==(t=er.get(e))&&void 0!==t?t:x.fr.Gray,w.K.text).strokeColor),strokeOpacity:J||et&&et!==e?.3:1,activeDot:e=>{var t;let{cx:r,cy:i,stroke:a,strokeLinecap:l,strokeLinejoin:s,strokeWidth:c,dataKey:u}=e;return o.createElement(m.o,{className:(0,k.q)("stroke-tremor-background dark:stroke-dark-tremor-background",U?"cursor-pointer":"",(0,S.bM)(null!==(t=er.get(u))&&void 0!==t?t:x.fr.Gray,w.K.text).fillColor),cx:r,cy:i,r:5,fill:"",stroke:a,strokeLinecap:l,strokeLinejoin:s,strokeWidth:c,onClick:(t,r)=>{r.stopPropagation(),ei&&(e.index===(null==J?void 0:J.index)&&e.dataKey===(null==J?void 0:J.dataKey)||(0,b.FB)(n,e.dataKey)&&et&&et===e.dataKey?(en(void 0),ee(void 0),null==U||U(null)):(en(e.dataKey),ee({index:e.index,dataKey:e.dataKey}),null==U||U(Object.assign({eventType:"dot",categoryClicked:e.dataKey},e.payload))))}})},dot:t=>{var r;let{stroke:i,strokeLinecap:a,strokeLinejoin:l,strokeWidth:s,cx:c,cy:u,dataKey:d,index:f}=t;return(0,b.FB)(n,e)&&!(J||et&&et!==e)||(null==J?void 0:J.index)===f&&(null==J?void 0:J.dataKey)===e?o.createElement(m.o,{key:f,cx:c,cy:u,r:5,stroke:i,fill:"",strokeLinecap:a,strokeLinejoin:l,strokeWidth:s,className:(0,k.q)("stroke-tremor-background dark:stroke-dark-tremor-background",U?"cursor-pointer":"",(0,S.bM)(null!==(r=er.get(d))&&void 0!==r?r:x.fr.Gray,w.K.text).fillColor)}):o.createElement(o.Fragment,{key:f})},key:e,name:e,type:L,dataKey:e,stroke:"",strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round",isAnimationActive:N,animationDuration:M,connectNulls:B})}),U?a.map(e=>o.createElement(l.x,{className:(0,k.q)("cursor-pointer"),strokeOpacity:0,key:e,name:e,type:L,dataKey:e,stroke:"transparent",fill:"transparent",legendType:"none",tooltipType:"none",strokeWidth:12,connectNulls:B,onClick:(e,t)=>{t.stopPropagation();let{name:n}=e;ea(n)}})):null):o.createElement(y.Z,{noDataText:H})))});E.displayName="LineChart"},65278:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var r=n(2265);let o=(e,t)=>{let[n,o]=(0,r.useState)(t);(0,r.useEffect)(()=>{let t=()=>{o(window.innerWidth),e()};return t(),window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[e,n])};var i=n(5853),a=n(26898),l=n(97324),s=n(1153);let c=e=>{var t=(0,i._T)(e,[]);return r.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),r.createElement("path",{d:"M8 12L14 6V18L8 12Z"}))},u=e=>{var t=(0,i._T)(e,[]);return r.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),r.createElement("path",{d:"M16 12L10 18V6L16 12Z"}))},d=(0,s.fn)("Legend"),f=e=>{let{name:t,color:n,onClick:o,activeLegend:i}=e,c=!!o;return r.createElement("li",{className:(0,l.q)(d("legendItem"),"group inline-flex items-center px-2 py-0.5 rounded-tremor-small transition whitespace-nowrap",c?"cursor-pointer":"cursor-default","text-tremor-content",c?"hover:bg-tremor-background-subtle":"","dark:text-dark-tremor-content",c?"dark:hover:bg-dark-tremor-background-subtle":""),onClick:e=>{e.stopPropagation(),null==o||o(t,n)}},r.createElement("svg",{className:(0,l.q)("flex-none h-2 w-2 mr-1.5",(0,s.bM)(n,a.K.text).textColor,i&&i!==t?"opacity-40":"opacity-100"),fill:"currentColor",viewBox:"0 0 8 8"},r.createElement("circle",{cx:4,cy:4,r:4})),r.createElement("p",{className:(0,l.q)("whitespace-nowrap truncate text-tremor-default","text-tremor-content",c?"group-hover:text-tremor-content-emphasis":"","dark:text-dark-tremor-content",i&&i!==t?"opacity-40":"opacity-100",c?"dark:group-hover:text-dark-tremor-content-emphasis":"")},t))},p=e=>{let{icon:t,onClick:n,disabled:o}=e,[i,a]=r.useState(!1),s=r.useRef(null);return r.useEffect(()=>(i?s.current=setInterval(()=>{null==n||n()},300):clearInterval(s.current),()=>clearInterval(s.current)),[i,n]),(0,r.useEffect)(()=>{o&&(clearInterval(s.current),a(!1))},[o]),r.createElement("button",{type:"button",className:(0,l.q)(d("legendSliderButton"),"w-5 group inline-flex items-center truncate rounded-tremor-small transition",o?"cursor-not-allowed":"cursor-pointer",o?"text-tremor-content-subtle":"text-tremor-content hover:text-tremor-content-emphasis hover:bg-tremor-background-subtle",o?"dark:text-dark-tremor-subtle":"dark:text-dark-tremor dark:hover:text-tremor-content-emphasis dark:hover:bg-dark-tremor-background-subtle"),disabled:o,onClick:e=>{e.stopPropagation(),null==n||n()},onMouseDown:e=>{e.stopPropagation(),a(!0)},onMouseUp:e=>{e.stopPropagation(),a(!1)}},r.createElement(t,{className:"w-full"}))},h=r.forwardRef((e,t)=>{var n,o;let{categories:s,colors:h=a.s,className:m,onClickLegendItem:g,activeLegend:v,enableLegendSlider:y=!1}=e,b=(0,i._T)(e,["categories","colors","className","onClickLegendItem","activeLegend","enableLegendSlider"]),x=r.useRef(null),[w,k]=r.useState(null),[S,E]=r.useState(null),O=r.useRef(null),C=(0,r.useCallback)(()=>{let e=null==x?void 0:x.current;e&&k({left:e.scrollLeft>0,right:e.scrollWidth-e.clientWidth>e.scrollLeft})},[k]),j=(0,r.useCallback)(e=>{var t;let n=null==x?void 0:x.current,r=null!==(t=null==n?void 0:n.clientWidth)&&void 0!==t?t:0;n&&y&&(n.scrollTo({left:"left"===e?n.scrollLeft-r:n.scrollLeft+r,behavior:"smooth"}),setTimeout(()=>{C()},400))},[y,C]);r.useEffect(()=>{let e=e=>{"ArrowLeft"===e?j("left"):"ArrowRight"===e&&j("right")};return S?(e(S),O.current=setInterval(()=>{e(S)},300)):clearInterval(O.current),()=>clearInterval(O.current)},[S,j]);let _=e=>{e.stopPropagation(),"ArrowLeft"!==e.key&&"ArrowRight"!==e.key||(e.preventDefault(),E(e.key))},P=e=>{e.stopPropagation(),E(null)};return r.useEffect(()=>{let e=null==x?void 0:x.current;return y&&(C(),null==e||e.addEventListener("keydown",_),null==e||e.addEventListener("keyup",P)),()=>{null==e||e.removeEventListener("keydown",_),null==e||e.removeEventListener("keyup",P)}},[C,y]),r.createElement("ol",Object.assign({ref:t,className:(0,l.q)(d("root"),"relative overflow-hidden",m)},b),r.createElement("div",{ref:x,tabIndex:0,className:(0,l.q)("h-full flex",y?(null==w?void 0:w.right)||(null==w?void 0:w.left)?"pl-4 pr-12 items-center overflow-auto snap-mandatory [&::-webkit-scrollbar]:hidden [scrollbar-width:none]":"":"flex-wrap")},s.map((e,t)=>r.createElement(f,{key:"item-".concat(t),name:e,color:h[t],onClick:g,activeLegend:v}))),y&&((null==w?void 0:w.right)||(null==w?void 0:w.left))?r.createElement(r.Fragment,null,r.createElement("div",{className:(0,l.q)("from-tremor-background","dark:from-dark-tremor-background","absolute top-0 bottom-0 left-0 w-4 bg-gradient-to-r to-transparent pointer-events-none")}),r.createElement("div",{className:(0,l.q)("to-tremor-background","dark:to-dark-tremor-background","absolute top-0 bottom-0 right-10 w-4 bg-gradient-to-r from-transparent pointer-events-none")}),r.createElement("div",{className:(0,l.q)("bg-tremor-background","dark:bg-dark-tremor-background","absolute flex top-0 pr-1 bottom-0 right-0 items-center justify-center h-full")},r.createElement(p,{icon:c,onClick:()=>{E(null),j("left")},disabled:!(null==w?void 0:w.left)}),r.createElement(p,{icon:u,onClick:()=>{E(null),j("right")},disabled:!(null==w?void 0:w.right)}))):null)});h.displayName="Legend";let m=(e,t,n,i,a,l)=>{let{payload:s}=e,c=(0,r.useRef)(null);o(()=>{var e,t;n((t=null===(e=c.current)||void 0===e?void 0:e.clientHeight)?Number(t)+20:60)});let u=s.filter(e=>"none"!==e.type);return r.createElement("div",{ref:c,className:"flex items-center justify-end"},r.createElement(h,{categories:u.map(e=>e.value),colors:u.map(e=>t.get(e.value)),onClickLegendItem:a,activeLegend:i,enableLegendSlider:l}))}},98593:function(e,t,n){"use strict";n.d(t,{$B:function(){return s},ZP:function(){return u},zX:function(){return c}});var r=n(2265),o=n(7084),i=n(26898),a=n(97324),l=n(1153);let s=e=>{let{children:t}=e;return r.createElement("div",{className:(0,a.q)("rounded-tremor-default text-tremor-default border","bg-tremor-background shadow-tremor-dropdown border-tremor-border","dark:bg-dark-tremor-background dark:shadow-dark-tremor-dropdown dark:border-dark-tremor-border")},t)},c=e=>{let{value:t,name:n,color:o}=e;return r.createElement("div",{className:"flex items-center justify-between space-x-8"},r.createElement("div",{className:"flex items-center space-x-2"},r.createElement("span",{className:(0,a.q)("shrink-0 rounded-tremor-full border-2 h-3 w-3","border-tremor-background shadow-tremor-card","dark:border-dark-tremor-background dark:shadow-dark-tremor-card",(0,l.bM)(o,i.K.background).bgColor)}),r.createElement("p",{className:(0,a.q)("text-right whitespace-nowrap","text-tremor-content","dark:text-dark-tremor-content")},n)),r.createElement("p",{className:(0,a.q)("font-medium tabular-nums text-right whitespace-nowrap","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis")},t))},u=e=>{let{active:t,payload:n,label:i,categoryColors:l,valueFormatter:u}=e;if(t&&n){let e=n.filter(e=>"none"!==e.type);return r.createElement(s,null,r.createElement("div",{className:(0,a.q)("border-tremor-border border-b px-4 py-2","dark:border-dark-tremor-border")},r.createElement("p",{className:(0,a.q)("font-medium","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis")},i)),r.createElement("div",{className:(0,a.q)("px-4 py-2 space-y-1")},e.map((e,t)=>{var n;let{value:i,name:a}=e;return r.createElement(c,{key:"id-".concat(t),value:u(i),name:a,color:null!==(n=l.get(a))&&void 0!==n?n:o.fr.Blue})})))}return null}},69448:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var r=n(97324),o=n(2265),i=n(5853);let a=(0,n(1153).fn)("Flex"),l={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"},s={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"},c={row:"flex-row",col:"flex-col","row-reverse":"flex-row-reverse","col-reverse":"flex-col-reverse"},u=o.forwardRef((e,t)=>{let{flexDirection:n="row",justifyContent:u="between",alignItems:d="center",children:f,className:p}=e,h=(0,i._T)(e,["flexDirection","justifyContent","alignItems","children","className"]);return o.createElement("div",Object.assign({ref:t,className:(0,r.q)(a("root"),"flex w-full",c[n],l[u],s[d],p)},h),f)});u.displayName="Flex";var d=n(84264);let f=e=>{let{noDataText:t="No data"}=e;return o.createElement(u,{alignItems:"center",justifyContent:"center",className:(0,r.q)("w-full h-full border border-dashed rounded-tremor-default","border-tremor-border","dark:border-dark-tremor-border")},o.createElement(d.Z,{className:(0,r.q)("text-tremor-content","dark:text-dark-tremor-content")},t))}},32644:function(e,t,n){"use strict";n.d(t,{FB:function(){return i},i4:function(){return o},me:function(){return r},vZ:function(){return function e(t,n){if(t===n)return!0;if("object"!=typeof t||"object"!=typeof n||null===t||null===n)return!1;let r=Object.keys(t),o=Object.keys(n);if(r.length!==o.length)return!1;for(let i of r)if(!o.includes(i)||!e(t[i],n[i]))return!1;return!0}}});let r=(e,t)=>{let n=new Map;return e.forEach((e,r)=>{n.set(e,t[r])}),n},o=(e,t,n)=>[e?"auto":null!=t?t:0,null!=n?n:"auto"];function i(e,t){let n=[];for(let r of e)if(Object.prototype.hasOwnProperty.call(r,t)&&(n.push(r[t]),n.length>1))return!1;return!0}},47323:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var r=n(5853),o=n(2265),i=n(1526),a=n(7084),l=n(97324),s=n(1153),c=n(26898);let u={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"}},f={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:""}},p=(e,t)=>{switch(e){case"simple":return{textColor:t?(0,s.bM)(t,c.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,s.bM)(t,c.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,s.bM)(t,c.K.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,s.bM)(t,c.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,s.bM)(t,c.K.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:"border-tremor-border dark:border-dark-tremor-border",ringColor:""};case"solid":return{textColor:t?(0,s.bM)(t,c.K.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,l.q)((0,s.bM)(t,c.K.background).bgColor,"bg-opacity-20"):"bg-tremor-brand dark:bg-dark-tremor-brand",borderColor:"border-tremor-brand-inverted dark:border-dark-tremor-brand-inverted",ringColor:"ring-tremor-ring dark:ring-dark-tremor-ring"};case"outlined":return{textColor:t?(0,s.bM)(t,c.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,s.bM)(t,c.K.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,s.bM)(t,c.K.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,l.q)((0,s.bM)(t,c.K.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}},h=(0,s.fn)("Icon"),m=o.forwardRef((e,t)=>{let{icon:n,variant:c="simple",tooltip:m,size:g=a.u8.SM,color:v,className:y}=e,b=(0,r._T)(e,["icon","variant","tooltip","size","color","className"]),x=p(c,v),{tooltipProps:w,getReferenceProps:k}=(0,i.l)();return o.createElement("span",Object.assign({ref:(0,s.lq)([t,w.refs.setReference]),className:(0,l.q)(h("root"),"inline-flex flex-shrink-0 items-center",x.bgColor,x.textColor,x.borderColor,x.ringColor,f[c].rounded,f[c].border,f[c].shadow,f[c].ring,u[g].paddingX,u[g].paddingY,y)},k,b),o.createElement(i.Z,Object.assign({text:m},w)),o.createElement(n,{className:(0,l.q)(h("icon"),"shrink-0",d[g].height,d[g].width)}))});m.displayName="Icon"},21487:function(e,t,n){"use strict";let r,o,i;n.d(t,{Z:function(){return nF}});var a,l,s,c,u=n(5853),d=n(2265),f=n(54887),p=n(13323),h=n(64518),m=n(96822),g=n(40048),v=n(72238),y=n(93689);let b=(0,d.createContext)(!1);var x=n(61424),w=n(27847);let k=d.Fragment,S=d.Fragment,E=(0,d.createContext)(null),O=(0,d.createContext)(null);Object.assign((0,w.yV)(function(e,t){var n;let r,o,i=(0,d.useRef)(null),a=(0,y.T)((0,y.h)(e=>{i.current=e}),t),l=(0,g.i)(i),s=function(e){let t=(0,d.useContext)(b),n=(0,d.useContext)(E),r=(0,g.i)(e),[o,i]=(0,d.useState)(()=>{if(!t&&null!==n||x.O.isServer)return null;let e=null==r?void 0:r.getElementById("headlessui-portal-root");if(e)return e;if(null===r)return null;let o=r.createElement("div");return o.setAttribute("id","headlessui-portal-root"),r.body.appendChild(o)});return(0,d.useEffect)(()=>{null!==o&&(null!=r&&r.body.contains(o)||null==r||r.body.appendChild(o))},[o,r]),(0,d.useEffect)(()=>{t||null!==n&&i(n.current)},[n,i,t]),o}(i),[c]=(0,d.useState)(()=>{var e;return x.O.isServer?null:null!=(e=null==l?void 0:l.createElement("div"))?e:null}),u=(0,d.useContext)(O),S=(0,v.H)();return(0,h.e)(()=>{!s||!c||s.contains(c)||(c.setAttribute("data-headlessui-portal",""),s.appendChild(c))},[s,c]),(0,h.e)(()=>{if(c&&u)return u.register(c)},[u,c]),n=()=>{var e;s&&c&&(c instanceof Node&&s.contains(c)&&s.removeChild(c),s.childNodes.length<=0&&(null==(e=s.parentElement)||e.removeChild(s)))},r=(0,p.z)(n),o=(0,d.useRef)(!1),(0,d.useEffect)(()=>(o.current=!1,()=>{o.current=!0,(0,m.Y)(()=>{o.current&&r()})}),[r]),S&&s&&c?(0,f.createPortal)((0,w.sY)({ourProps:{ref:a},theirProps:e,defaultTag:k,name:"Portal"}),c):null}),{Group:(0,w.yV)(function(e,t){let{target:n,...r}=e,o={ref:(0,y.T)(t)};return d.createElement(E.Provider,{value:n},(0,w.sY)({ourProps:o,theirProps:r,defaultTag:S,name:"Popover.Group"}))})});var C=n(31948),j=n(17684),_=n(32539),P=n(80004),T=n(38198),M=n(3141),N=((r=N||{})[r.Forwards=0]="Forwards",r[r.Backwards=1]="Backwards",r);function A(){let e=(0,d.useRef)(0);return(0,M.s)("keydown",t=>{"Tab"===t.key&&(e.current=t.shiftKey?1:0)},!0),e}var I=n(37863),R=n(47634),D=n(37105),L=n(24536),z=n(40293),Z=n(37388),B=((o=B||{})[o.Open=0]="Open",o[o.Closed=1]="Closed",o),F=((i=F||{})[i.TogglePopover=0]="TogglePopover",i[i.ClosePopover=1]="ClosePopover",i[i.SetButton=2]="SetButton",i[i.SetButtonId=3]="SetButtonId",i[i.SetPanel=4]="SetPanel",i[i.SetPanelId=5]="SetPanelId",i);let H={0:e=>{let t={...e,popoverState:(0,L.E)(e.popoverState,{0:1,1:0})};return 0===t.popoverState&&(t.__demoMode=!1),t},1:e=>1===e.popoverState?e:{...e,popoverState:1},2:(e,t)=>e.button===t.button?e:{...e,button:t.button},3:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},4:(e,t)=>e.panel===t.panel?e:{...e,panel:t.panel},5:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId}},q=(0,d.createContext)(null);function U(e){let t=(0,d.useContext)(q);if(null===t){let t=Error("<".concat(e," /> is missing a parent component."));throw Error.captureStackTrace&&Error.captureStackTrace(t,U),t}return t}q.displayName="PopoverContext";let W=(0,d.createContext)(null);function K(e){let t=(0,d.useContext)(W);if(null===t){let t=Error("<".concat(e," /> is missing a parent component."));throw Error.captureStackTrace&&Error.captureStackTrace(t,K),t}return t}W.displayName="PopoverAPIContext";let V=(0,d.createContext)(null);function $(){return(0,d.useContext)(V)}V.displayName="PopoverGroupContext";let X=(0,d.createContext)(null);function G(e,t){return(0,L.E)(t.type,H,e,t)}X.displayName="PopoverPanelContext";let Y=w.AN.RenderStrategy|w.AN.Static,Q=w.AN.RenderStrategy|w.AN.Static,J=Object.assign((0,w.yV)(function(e,t){var n,r,o,i;let a,l,s,c,u,f;let{__demoMode:h=!1,...m}=e,v=(0,d.useRef)(null),b=(0,y.T)(t,(0,y.h)(e=>{v.current=e})),x=(0,d.useRef)([]),k=(0,d.useReducer)(G,{__demoMode:h,popoverState:h?0:1,buttons:x,button:null,buttonId:null,panel:null,panelId:null,beforePanelSentinel:(0,d.createRef)(),afterPanelSentinel:(0,d.createRef)()}),[{popoverState:S,button:E,buttonId:j,panel:P,panelId:M,beforePanelSentinel:N,afterPanelSentinel:A},R]=k,z=(0,g.i)(null!=(n=v.current)?n:E),Z=(0,d.useMemo)(()=>{if(!E||!P)return!1;for(let e of document.querySelectorAll("body > *"))if(Number(null==e?void 0:e.contains(E))^Number(null==e?void 0:e.contains(P)))return!0;let e=(0,D.GO)(),t=e.indexOf(E),n=(t+e.length-1)%e.length,r=(t+1)%e.length,o=e[n],i=e[r];return!P.contains(o)&&!P.contains(i)},[E,P]),B=(0,C.E)(j),F=(0,C.E)(M),H=(0,d.useMemo)(()=>({buttonId:B,panelId:F,close:()=>R({type:1})}),[B,F,R]),U=$(),K=null==U?void 0:U.registerPopover,V=(0,p.z)(()=>{var e;return null!=(e=null==U?void 0:U.isFocusWithinPopoverGroup())?e:(null==z?void 0:z.activeElement)&&((null==E?void 0:E.contains(z.activeElement))||(null==P?void 0:P.contains(z.activeElement)))});(0,d.useEffect)(()=>null==K?void 0:K(H),[K,H]);let[Y,Q]=(a=(0,d.useContext)(O),l=(0,d.useRef)([]),s=(0,p.z)(e=>(l.current.push(e),a&&a.register(e),()=>c(e))),c=(0,p.z)(e=>{let t=l.current.indexOf(e);-1!==t&&l.current.splice(t,1),a&&a.unregister(e)}),u=(0,d.useMemo)(()=>({register:s,unregister:c,portals:l}),[s,c,l]),[l,(0,d.useMemo)(()=>function(e){let{children:t}=e;return d.createElement(O.Provider,{value:u},t)},[u])]),J=function(){var e;let{defaultContainers:t=[],portals:n,mainTreeNodeRef:r}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=(0,d.useRef)(null!=(e=null==r?void 0:r.current)?e:null),i=(0,g.i)(o),a=(0,p.z)(()=>{var e,r,a;let l=[];for(let e of t)null!==e&&(e instanceof HTMLElement?l.push(e):"current"in e&&e.current instanceof HTMLElement&&l.push(e.current));if(null!=n&&n.current)for(let e of n.current)l.push(e);for(let t of null!=(e=null==i?void 0:i.querySelectorAll("html > *, body > *"))?e:[])t!==document.body&&t!==document.head&&t instanceof HTMLElement&&"headlessui-portal-root"!==t.id&&(t.contains(o.current)||t.contains(null==(a=null==(r=o.current)?void 0:r.getRootNode())?void 0:a.host)||l.some(e=>t.contains(e))||l.push(t));return l});return{resolveContainers:a,contains:(0,p.z)(e=>a().some(t=>t.contains(e))),mainTreeNodeRef:o,MainTreeNode:(0,d.useMemo)(()=>function(){return null!=r?null:d.createElement(T._,{features:T.A.Hidden,ref:o})},[o,r])}}({mainTreeNodeRef:null==U?void 0:U.mainTreeNodeRef,portals:Y,defaultContainers:[E,P]});r=null==z?void 0:z.defaultView,o="focus",i=e=>{var t,n,r,o;e.target!==window&&e.target instanceof HTMLElement&&0===S&&(V()||E&&P&&(J.contains(e.target)||null!=(n=null==(t=N.current)?void 0:t.contains)&&n.call(t,e.target)||null!=(o=null==(r=A.current)?void 0:r.contains)&&o.call(r,e.target)||R({type:1})))},f=(0,C.E)(i),(0,d.useEffect)(()=>{function e(e){f.current(e)}return(r=null!=r?r:window).addEventListener(o,e,!0),()=>r.removeEventListener(o,e,!0)},[r,o,!0]),(0,_.O)(J.resolveContainers,(e,t)=>{R({type:1}),(0,D.sP)(t,D.tJ.Loose)||(e.preventDefault(),null==E||E.focus())},0===S);let ee=(0,p.z)(e=>{R({type:1});let t=e?e instanceof HTMLElement?e:"current"in e&&e.current instanceof HTMLElement?e.current:E:E;null==t||t.focus()}),et=(0,d.useMemo)(()=>({close:ee,isPortalled:Z}),[ee,Z]),en=(0,d.useMemo)(()=>({open:0===S,close:ee}),[S,ee]);return d.createElement(X.Provider,{value:null},d.createElement(q.Provider,{value:k},d.createElement(W.Provider,{value:et},d.createElement(I.up,{value:(0,L.E)(S,{0:I.ZM.Open,1:I.ZM.Closed})},d.createElement(Q,null,(0,w.sY)({ourProps:{ref:b},theirProps:m,slot:en,defaultTag:"div",name:"Popover"}),d.createElement(J.MainTreeNode,null))))))}),{Button:(0,w.yV)(function(e,t){let n=(0,j.M)(),{id:r="headlessui-popover-button-".concat(n),...o}=e,[i,a]=U("Popover.Button"),{isPortalled:l}=K("Popover.Button"),s=(0,d.useRef)(null),c="headlessui-focus-sentinel-".concat((0,j.M)()),u=$(),f=null==u?void 0:u.closeOthers,h=null!==(0,d.useContext)(X);(0,d.useEffect)(()=>{if(!h)return a({type:3,buttonId:r}),()=>{a({type:3,buttonId:null})}},[h,r,a]);let[m]=(0,d.useState)(()=>Symbol()),v=(0,y.T)(s,t,h?null:e=>{if(e)i.buttons.current.push(m);else{let e=i.buttons.current.indexOf(m);-1!==e&&i.buttons.current.splice(e,1)}i.buttons.current.length>1&&console.warn("You are already using a but only 1 is supported."),e&&a({type:2,button:e})}),b=(0,y.T)(s,t),x=(0,g.i)(s),k=(0,p.z)(e=>{var t,n,r;if(h){if(1===i.popoverState)return;switch(e.key){case Z.R.Space:case Z.R.Enter:e.preventDefault(),null==(n=(t=e.target).click)||n.call(t),a({type:1}),null==(r=i.button)||r.focus()}}else switch(e.key){case Z.R.Space:case Z.R.Enter:e.preventDefault(),e.stopPropagation(),1===i.popoverState&&(null==f||f(i.buttonId)),a({type:0});break;case Z.R.Escape:if(0!==i.popoverState)return null==f?void 0:f(i.buttonId);if(!s.current||null!=x&&x.activeElement&&!s.current.contains(x.activeElement))return;e.preventDefault(),e.stopPropagation(),a({type:1})}}),S=(0,p.z)(e=>{h||e.key===Z.R.Space&&e.preventDefault()}),E=(0,p.z)(t=>{var n,r;(0,R.P)(t.currentTarget)||e.disabled||(h?(a({type:1}),null==(n=i.button)||n.focus()):(t.preventDefault(),t.stopPropagation(),1===i.popoverState&&(null==f||f(i.buttonId)),a({type:0}),null==(r=i.button)||r.focus()))}),O=(0,p.z)(e=>{e.preventDefault(),e.stopPropagation()}),C=0===i.popoverState,_=(0,d.useMemo)(()=>({open:C}),[C]),M=(0,P.f)(e,s),I=h?{ref:b,type:M,onKeyDown:k,onClick:E}:{ref:v,id:i.buttonId,type:M,"aria-expanded":0===i.popoverState,"aria-controls":i.panel?i.panelId:void 0,onKeyDown:k,onKeyUp:S,onClick:E,onMouseDown:O},z=A(),B=(0,p.z)(()=>{let e=i.panel;e&&(0,L.E)(z.current,{[N.Forwards]:()=>(0,D.jA)(e,D.TO.First),[N.Backwards]:()=>(0,D.jA)(e,D.TO.Last)})===D.fE.Error&&(0,D.jA)((0,D.GO)().filter(e=>"true"!==e.dataset.headlessuiFocusGuard),(0,L.E)(z.current,{[N.Forwards]:D.TO.Next,[N.Backwards]:D.TO.Previous}),{relativeTo:i.button})});return d.createElement(d.Fragment,null,(0,w.sY)({ourProps:I,theirProps:o,slot:_,defaultTag:"button",name:"Popover.Button"}),C&&!h&&l&&d.createElement(T._,{id:c,features:T.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:B}))}),Overlay:(0,w.yV)(function(e,t){let n=(0,j.M)(),{id:r="headlessui-popover-overlay-".concat(n),...o}=e,[{popoverState:i},a]=U("Popover.Overlay"),l=(0,y.T)(t),s=(0,I.oJ)(),c=null!==s?(s&I.ZM.Open)===I.ZM.Open:0===i,u=(0,p.z)(e=>{if((0,R.P)(e.currentTarget))return e.preventDefault();a({type:1})}),f=(0,d.useMemo)(()=>({open:0===i}),[i]);return(0,w.sY)({ourProps:{ref:l,id:r,"aria-hidden":!0,onClick:u},theirProps:o,slot:f,defaultTag:"div",features:Y,visible:c,name:"Popover.Overlay"})}),Panel:(0,w.yV)(function(e,t){let n=(0,j.M)(),{id:r="headlessui-popover-panel-".concat(n),focus:o=!1,...i}=e,[a,l]=U("Popover.Panel"),{close:s,isPortalled:c}=K("Popover.Panel"),u="headlessui-focus-sentinel-before-".concat((0,j.M)()),f="headlessui-focus-sentinel-after-".concat((0,j.M)()),m=(0,d.useRef)(null),v=(0,y.T)(m,t,e=>{l({type:4,panel:e})}),b=(0,g.i)(m),x=(0,w.Y2)();(0,h.e)(()=>(l({type:5,panelId:r}),()=>{l({type:5,panelId:null})}),[r,l]);let k=(0,I.oJ)(),S=null!==k?(k&I.ZM.Open)===I.ZM.Open:0===a.popoverState,E=(0,p.z)(e=>{var t;if(e.key===Z.R.Escape){if(0!==a.popoverState||!m.current||null!=b&&b.activeElement&&!m.current.contains(b.activeElement))return;e.preventDefault(),e.stopPropagation(),l({type:1}),null==(t=a.button)||t.focus()}});(0,d.useEffect)(()=>{var t;e.static||1===a.popoverState&&(null==(t=e.unmount)||t)&&l({type:4,panel:null})},[a.popoverState,e.unmount,e.static,l]),(0,d.useEffect)(()=>{if(a.__demoMode||!o||0!==a.popoverState||!m.current)return;let e=null==b?void 0:b.activeElement;m.current.contains(e)||(0,D.jA)(m.current,D.TO.First)},[a.__demoMode,o,m,a.popoverState]);let O=(0,d.useMemo)(()=>({open:0===a.popoverState,close:s}),[a,s]),C={ref:v,id:r,onKeyDown:E,onBlur:o&&0===a.popoverState?e=>{var t,n,r,o,i;let s=e.relatedTarget;s&&m.current&&(null!=(t=m.current)&&t.contains(s)||(l({type:1}),(null!=(r=null==(n=a.beforePanelSentinel.current)?void 0:n.contains)&&r.call(n,s)||null!=(i=null==(o=a.afterPanelSentinel.current)?void 0:o.contains)&&i.call(o,s))&&s.focus({preventScroll:!0})))}:void 0,tabIndex:-1},_=A(),P=(0,p.z)(()=>{let e=m.current;e&&(0,L.E)(_.current,{[N.Forwards]:()=>{var t;(0,D.jA)(e,D.TO.First)===D.fE.Error&&(null==(t=a.afterPanelSentinel.current)||t.focus())},[N.Backwards]:()=>{var e;null==(e=a.button)||e.focus({preventScroll:!0})}})}),M=(0,p.z)(()=>{let e=m.current;e&&(0,L.E)(_.current,{[N.Forwards]:()=>{var e;if(!a.button)return;let t=(0,D.GO)(),n=t.indexOf(a.button),r=t.slice(0,n+1),o=[...t.slice(n+1),...r];for(let t of o.slice())if("true"===t.dataset.headlessuiFocusGuard||null!=(e=a.panel)&&e.contains(t)){let e=o.indexOf(t);-1!==e&&o.splice(e,1)}(0,D.jA)(o,D.TO.First,{sorted:!1})},[N.Backwards]:()=>{var t;(0,D.jA)(e,D.TO.Previous)===D.fE.Error&&(null==(t=a.button)||t.focus())}})});return d.createElement(X.Provider,{value:r},S&&c&&d.createElement(T._,{id:u,ref:a.beforePanelSentinel,features:T.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:P}),(0,w.sY)({mergeRefs:x,ourProps:C,theirProps:i,slot:O,defaultTag:"div",features:Q,visible:S,name:"Popover.Panel"}),S&&c&&d.createElement(T._,{id:f,ref:a.afterPanelSentinel,features:T.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:M}))}),Group:(0,w.yV)(function(e,t){let n;let r=(0,d.useRef)(null),o=(0,y.T)(r,t),[i,a]=(0,d.useState)([]),l={mainTreeNodeRef:n=(0,d.useRef)(null),MainTreeNode:(0,d.useMemo)(()=>function(){return d.createElement(T._,{features:T.A.Hidden,ref:n})},[n])},s=(0,p.z)(e=>{a(t=>{let n=t.indexOf(e);if(-1!==n){let e=t.slice();return e.splice(n,1),e}return t})}),c=(0,p.z)(e=>(a(t=>[...t,e]),()=>s(e))),u=(0,p.z)(()=>{var e;let t=(0,z.r)(r);if(!t)return!1;let n=t.activeElement;return!!(null!=(e=r.current)&&e.contains(n))||i.some(e=>{var r,o;return(null==(r=t.getElementById(e.buttonId.current))?void 0:r.contains(n))||(null==(o=t.getElementById(e.panelId.current))?void 0:o.contains(n))})}),f=(0,p.z)(e=>{for(let t of i)t.buttonId.current!==e&&t.close()}),h=(0,d.useMemo)(()=>({registerPopover:c,unregisterPopover:s,isFocusWithinPopoverGroup:u,closeOthers:f,mainTreeNodeRef:l.mainTreeNodeRef}),[c,s,u,f,l.mainTreeNodeRef]),m=(0,d.useMemo)(()=>({}),[]);return d.createElement(V.Provider,{value:h},(0,w.sY)({ourProps:{ref:o},theirProps:e,slot:m,defaultTag:"div",name:"Popover.Group"}),d.createElement(l.MainTreeNode,null))})});var ee=n(33044),et=n(9528);let en=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor"}),d.createElement("path",{fillRule:"evenodd",d:"M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z",clipRule:"evenodd"}))};var er=n(4537),eo=n(99735),ei=n(7656);function ea(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return t.setHours(0,0,0,0),t}function el(){return ea(Date.now())}function es(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return t.setDate(1),t.setHours(0,0,0,0),t}var ec=n(97324),eu=n(96398),ed=n(41154);function ef(e){var t,n;if((0,ei.Z)(1,arguments),e&&"function"==typeof e.forEach)t=e;else{if("object"!==(0,ed.Z)(e)||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach(function(e){var t=(0,eo.Z)(e);(void 0===n||nt||isNaN(t.getDate()))&&(n=t)}),n||new Date(NaN)}var eh=n(25721),em=n(47869);function eg(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,eh.Z)(e,-n)}var ev=n(55463);function ey(e,t){if((0,ei.Z)(2,arguments),!t||"object"!==(0,ed.Z)(t))return new Date(NaN);var n=t.years?(0,em.Z)(t.years):0,r=t.months?(0,em.Z)(t.months):0,o=t.weeks?(0,em.Z)(t.weeks):0,i=t.days?(0,em.Z)(t.days):0,a=t.hours?(0,em.Z)(t.hours):0,l=t.minutes?(0,em.Z)(t.minutes):0,s=t.seconds?(0,em.Z)(t.seconds):0;return new Date(eg(function(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,ev.Z)(e,-n)}(e,r+12*n),i+7*o).getTime()-1e3*(s+60*(l+60*a)))}function eb(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=new Date(0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n}function ex(e){return(0,ei.Z)(1,arguments),e instanceof Date||"object"===(0,ed.Z)(e)&&"[object Date]"===Object.prototype.toString.call(e)}function ew(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getUTCDay();return t.setUTCDate(t.getUTCDate()-((n<1?7:0)+n-1)),t.setUTCHours(0,0,0,0),t}function ek(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getUTCFullYear(),r=new Date(0);r.setUTCFullYear(n+1,0,4),r.setUTCHours(0,0,0,0);var o=ew(r),i=new Date(0);i.setUTCFullYear(n,0,4),i.setUTCHours(0,0,0,0);var a=ew(i);return t.getTime()>=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}var eS={};function eE(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,s,c,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.weekStartsOn)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.weekStartsOn)&&void 0!==o?o:eS.weekStartsOn)&&void 0!==r?r:null===(s=eS.locale)||void 0===s?void 0:null===(c=s.options)||void 0===c?void 0:c.weekStartsOn)&&void 0!==n?n:0);if(!(u>=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getUTCDay();return d.setUTCDate(d.getUTCDate()-((f=1&&f<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var p=new Date(0);p.setUTCFullYear(d+1,0,f),p.setUTCHours(0,0,0,0);var h=eE(p,t),m=new Date(0);m.setUTCFullYear(d,0,f),m.setUTCHours(0,0,0,0);var g=eE(m,t);return u.getTime()>=h.getTime()?d+1:u.getTime()>=g.getTime()?d:d-1}function eC(e,t){for(var n=Math.abs(e).toString();n.length0?n:1-n;return eC("yy"===t?r%100:r,t.length)},M:function(e,t){var n=e.getUTCMonth();return"M"===t?String(n+1):eC(n+1,2)},d:function(e,t){return eC(e.getUTCDate(),t.length)},h:function(e,t){return eC(e.getUTCHours()%12||12,t.length)},H:function(e,t){return eC(e.getUTCHours(),t.length)},m:function(e,t){return eC(e.getUTCMinutes(),t.length)},s:function(e,t){return eC(e.getUTCSeconds(),t.length)},S:function(e,t){var n=t.length;return eC(Math.floor(e.getUTCMilliseconds()*Math.pow(10,n-3)),t.length)}},e_={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"};function eP(e,t){var n=e>0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=r%60;return 0===i?n+String(o):n+String(o)+(t||"")+eC(i,2)}function eT(e,t){return e%60==0?(e>0?"-":"+")+eC(Math.abs(e)/60,2):eM(e,t)}function eM(e,t){var n=Math.abs(e);return(e>0?"-":"+")+eC(Math.floor(n/60),2)+(t||"")+eC(n%60,2)}var eN={G:function(e,t,n){var r=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if("yo"===t){var r=e.getUTCFullYear();return n.ordinalNumber(r>0?r:1-r,{unit:"year"})}return ej.y(e,t)},Y:function(e,t,n,r){var o=eO(e,r),i=o>0?o:1-o;return"YY"===t?eC(i%100,2):"Yo"===t?n.ordinalNumber(i,{unit:"year"}):eC(i,t.length)},R:function(e,t){return eC(ek(e),t.length)},u:function(e,t){return eC(e.getUTCFullYear(),t.length)},Q:function(e,t,n){var r=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return eC(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){var r=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return eC(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){var r=e.getUTCMonth();switch(t){case"M":case"MM":return ej.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){var r=e.getUTCMonth();switch(t){case"L":return String(r+1);case"LL":return eC(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){var o=function(e,t){(0,ei.Z)(1,arguments);var n=(0,eo.Z)(e);return Math.round((eE(n,t).getTime()-(function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,s,c,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:eS.firstWeekContainsDate)&&void 0!==r?r:null===(s=eS.locale)||void 0===s?void 0:null===(c=s.options)||void 0===c?void 0:c.firstWeekContainsDate)&&void 0!==n?n:1),d=eO(e,t),f=new Date(0);return f.setUTCFullYear(d,0,u),f.setUTCHours(0,0,0,0),eE(f,t)})(n,t).getTime())/6048e5)+1}(e,r);return"wo"===t?n.ordinalNumber(o,{unit:"week"}):eC(o,t.length)},I:function(e,t,n){var r=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return Math.round((ew(t).getTime()-(function(e){(0,ei.Z)(1,arguments);var t=ek(e),n=new Date(0);return n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0),ew(n)})(t).getTime())/6048e5)+1}(e);return"Io"===t?n.ordinalNumber(r,{unit:"week"}):eC(r,t.length)},d:function(e,t,n){return"do"===t?n.ordinalNumber(e.getUTCDate(),{unit:"date"}):ej.d(e,t)},D:function(e,t,n){var r=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getTime();return t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0),Math.floor((n-t.getTime())/864e5)+1}(e);return"Do"===t?n.ordinalNumber(r,{unit:"dayOfYear"}):eC(r,t.length)},E:function(e,t,n){var r=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){var o=e.getUTCDay(),i=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(i);case"ee":return eC(i,2);case"eo":return n.ordinalNumber(i,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){var o=e.getUTCDay(),i=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(i);case"cc":return eC(i,t.length);case"co":return n.ordinalNumber(i,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){var r=e.getUTCDay(),o=0===r?7:r;switch(t){case"i":return String(o);case"ii":return eC(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){var r=e.getUTCHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},b:function(e,t,n){var r,o=e.getUTCHours();switch(r=12===o?e_.noon:0===o?e_.midnight:o/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},B:function(e,t,n){var r,o=e.getUTCHours();switch(r=o>=17?e_.evening:o>=12?e_.afternoon:o>=4?e_.morning:e_.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},h:function(e,t,n){if("ho"===t){var r=e.getUTCHours()%12;return 0===r&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return ej.h(e,t)},H:function(e,t,n){return"Ho"===t?n.ordinalNumber(e.getUTCHours(),{unit:"hour"}):ej.H(e,t)},K:function(e,t,n){var r=e.getUTCHours()%12;return"Ko"===t?n.ordinalNumber(r,{unit:"hour"}):eC(r,t.length)},k:function(e,t,n){var r=e.getUTCHours();return(0===r&&(r=24),"ko"===t)?n.ordinalNumber(r,{unit:"hour"}):eC(r,t.length)},m:function(e,t,n){return"mo"===t?n.ordinalNumber(e.getUTCMinutes(),{unit:"minute"}):ej.m(e,t)},s:function(e,t,n){return"so"===t?n.ordinalNumber(e.getUTCSeconds(),{unit:"second"}):ej.s(e,t)},S:function(e,t){return ej.S(e,t)},X:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();if(0===o)return"Z";switch(t){case"X":return eT(o);case"XXXX":case"XX":return eM(o);default:return eM(o,":")}},x:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"x":return eT(o);case"xxxx":case"xx":return eM(o);default:return eM(o,":")}},O:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+eP(o,":");default:return"GMT"+eM(o,":")}},z:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+eP(o,":");default:return"GMT"+eM(o,":")}},t:function(e,t,n,r){return eC(Math.floor((r._originalDate||e).getTime()/1e3),t.length)},T:function(e,t,n,r){return eC((r._originalDate||e).getTime(),t.length)}},eA=function(e,t){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});default:return t.date({width:"full"})}},eI=function(e,t){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});default:return t.time({width:"full"})}},eR={p:eI,P:function(e,t){var n,r=e.match(/(P+)(p+)?/)||[],o=r[1],i=r[2];if(!i)return eA(e,t);switch(o){case"P":n=t.dateTime({width:"short"});break;case"PP":n=t.dateTime({width:"medium"});break;case"PPP":n=t.dateTime({width:"long"});break;default:n=t.dateTime({width:"full"})}return n.replace("{{date}}",eA(o,t)).replace("{{time}}",eI(i,t))}};function eD(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var eL=["D","DD"],ez=["YY","YYYY"];function eZ(e,t,n){if("YYYY"===e)throw RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("YY"===e)throw RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("D"===e)throw RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("DD"===e)throw RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var eB={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function eF(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}var eH={date:eF({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:eF({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:eF({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},eq={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function eU(e){return function(t,n){var r;if("formatting"===(null!=n&&n.context?String(n.context):"standalone")&&e.formattingValues){var o=e.defaultFormattingWidth||e.defaultWidth,i=null!=n&&n.width?String(n.width):o;r=e.formattingValues[i]||e.formattingValues[o]}else{var a=e.defaultWidth,l=null!=n&&n.width?String(n.width):e.defaultWidth;r=e.values[l]||e.values[a]}return r[e.argumentCallback?e.argumentCallback(t):t]}}function eW(e){return function(t){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=r.width,i=o&&e.matchPatterns[o]||e.matchPatterns[e.defaultMatchWidth],a=t.match(i);if(!a)return null;var l=a[0],s=o&&e.parsePatterns[o]||e.parsePatterns[e.defaultParseWidth],c=Array.isArray(s)?function(e,t){for(var n=0;n0?"in "+r:r+" ago":r},formatLong:eH,formatRelative:function(e,t,n,r){return eq[e]},localize:{ordinalNumber:function(e,t){var n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:eU({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:eU({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(e){return e-1}}),month:eU({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:eU({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:eU({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})},match:{ordinalNumber:(a={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(e){return parseInt(e,10)}},function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.match(a.matchPattern);if(!n)return null;var r=n[0],o=e.match(a.parsePattern);if(!o)return null;var i=a.valueCallback?a.valueCallback(o[0]):o[0];return{value:i=t.valueCallback?t.valueCallback(i):i,rest:e.slice(r.length)}}),era:eW({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:eW({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:eW({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:eW({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:eW({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},options:{weekStartsOn:0,firstWeekContainsDate:1}},eV=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,e$=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,eX=/^'([^]*?)'?$/,eG=/''/g,eY=/[a-zA-Z]/;function eQ(e,t,n){(0,ei.Z)(2,arguments);var r,o,i,a,l,s,c,u,d,f,p,h,m,g,v,y,b,x,w=String(t),k=null!==(r=null!==(o=null==n?void 0:n.locale)&&void 0!==o?o:eS.locale)&&void 0!==r?r:eK,S=(0,em.Z)(null!==(i=null!==(a=null!==(l=null!==(s=null==n?void 0:n.firstWeekContainsDate)&&void 0!==s?s:null==n?void 0:null===(c=n.locale)||void 0===c?void 0:null===(u=c.options)||void 0===u?void 0:u.firstWeekContainsDate)&&void 0!==l?l:eS.firstWeekContainsDate)&&void 0!==a?a:null===(d=eS.locale)||void 0===d?void 0:null===(f=d.options)||void 0===f?void 0:f.firstWeekContainsDate)&&void 0!==i?i:1);if(!(S>=1&&S<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var E=(0,em.Z)(null!==(p=null!==(h=null!==(m=null!==(g=null==n?void 0:n.weekStartsOn)&&void 0!==g?g:null==n?void 0:null===(v=n.locale)||void 0===v?void 0:null===(y=v.options)||void 0===y?void 0:y.weekStartsOn)&&void 0!==m?m:eS.weekStartsOn)&&void 0!==h?h:null===(b=eS.locale)||void 0===b?void 0:null===(x=b.options)||void 0===x?void 0:x.weekStartsOn)&&void 0!==p?p:0);if(!(E>=0&&E<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!k.localize)throw RangeError("locale must contain localize property");if(!k.formatLong)throw RangeError("locale must contain formatLong property");var O=(0,eo.Z)(e);if(!function(e){return(0,ei.Z)(1,arguments),(!!ex(e)||"number"==typeof e)&&!isNaN(Number((0,eo.Z)(e)))}(O))throw RangeError("Invalid time value");var C=eD(O),j=function(e,t){return(0,ei.Z)(2,arguments),function(e,t){return(0,ei.Z)(2,arguments),new Date((0,eo.Z)(e).getTime()+(0,em.Z)(t))}(e,-(0,em.Z)(t))}(O,C),_={firstWeekContainsDate:S,weekStartsOn:E,locale:k,_originalDate:O};return w.match(e$).map(function(e){var t=e[0];return"p"===t||"P"===t?(0,eR[t])(e,k.formatLong):e}).join("").match(eV).map(function(r){if("''"===r)return"'";var o,i=r[0];if("'"===i)return(o=r.match(eX))?o[1].replace(eG,"'"):r;var a=eN[i];if(a)return null!=n&&n.useAdditionalWeekYearTokens||-1===ez.indexOf(r)||eZ(r,t,String(e)),null!=n&&n.useAdditionalDayOfYearTokens||-1===eL.indexOf(r)||eZ(r,t,String(e)),a(j,r,k.localize,_);if(i.match(eY))throw RangeError("Format string contains an unescaped latin alphabet character `"+i+"`");return r}).join("")}var eJ=n(1153);let e0=(0,eJ.fn)("DateRangePicker"),e1=(e,t,n,r)=>{var o;if(n&&(e=null===(o=r.get(n))||void 0===o?void 0:o.from),e)return ea(e&&!t?e:ef([e,t]))},e2=(e,t,n,r)=>{var o,i;if(n&&(e=ea(null!==(i=null===(o=r.get(n))||void 0===o?void 0:o.to)&&void 0!==i?i:el())),e)return ea(e&&!t?e:ep([e,t]))},e4=[{value:"tdy",text:"Today",from:el()},{value:"w",text:"Last 7 days",from:ey(el(),{days:7})},{value:"t",text:"Last 30 days",from:ey(el(),{days:30})},{value:"m",text:"Month to Date",from:es(el())},{value:"y",text:"Year to Date",from:eb(el())}],e3=(e,t,n,r)=>{let o=(null==n?void 0:n.code)||"en-US";if(!e&&!t)return"";if(e&&!t)return r?eQ(e,r):e.toLocaleDateString(o,{year:"numeric",month:"short",day:"numeric"});if(e&&t){if(function(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getTime()===r.getTime()}(e,t))return r?eQ(e,r):e.toLocaleDateString(o,{year:"numeric",month:"short",day:"numeric"});if(e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear())return r?"".concat(eQ(e,r)," - ").concat(eQ(t,r)):"".concat(e.toLocaleDateString(o,{month:"short",day:"numeric"})," - \n ").concat(t.getDate(),", ").concat(t.getFullYear());{if(r)return"".concat(eQ(e,r)," - ").concat(eQ(t,r));let n={year:"numeric",month:"short",day:"numeric"};return"".concat(e.toLocaleDateString(o,n)," - \n ").concat(t.toLocaleDateString(o,n))}}return""};function e6(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(23,59,59,999),t}function e8(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,em.Z)(t),o=n.getFullYear(),i=n.getDate(),a=new Date(0);a.setFullYear(o,r,15),a.setHours(0,0,0,0);var l=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getFullYear(),r=t.getMonth(),o=new Date(0);return o.setFullYear(n,r+1,0),o.setHours(0,0,0,0),o.getDate()}(a);return n.setMonth(r,Math.min(i,l)),n}function e5(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,em.Z)(t);return isNaN(n.getTime())?new Date(NaN):(n.setFullYear(r),n)}function e7(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return 12*(n.getFullYear()-r.getFullYear())+(n.getMonth()-r.getMonth())}function e9(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()}function te(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getTime()=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getDay();return d.setDate(d.getDate()-((fr.getTime()}function ti(e,t){(0,ei.Z)(2,arguments);var n=ea(e),r=ea(t);return Math.round((n.getTime()-eD(n)-(r.getTime()-eD(r)))/864e5)}function ta(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,eh.Z)(e,7*n)}function tl(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,ev.Z)(e,12*n)}function ts(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,s,c,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.weekStartsOn)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.weekStartsOn)&&void 0!==o?o:eS.weekStartsOn)&&void 0!==r?r:null===(s=eS.locale)||void 0===s?void 0:null===(c=s.options)||void 0===c?void 0:c.weekStartsOn)&&void 0!==n?n:0);if(!(u>=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getDay();return d.setDate(d.getDate()+((fe7(l,a)&&(a=(0,ev.Z)(l,-1*((void 0===c?1:c)-1))),s&&0>e7(a,s)&&(a=s),u=es(a),f=t.month,h=(p=(0,d.useState)(u))[0],m=[void 0===f?h:f,p[1]])[0],v=m[1],[g,function(e){if(!t.disableNavigation){var n,r=es(e);v(r),null===(n=t.onMonthChange)||void 0===n||n.call(t,r)}}]),x=b[0],w=b[1],k=function(e,t){for(var n=t.reverseMonths,r=t.numberOfMonths,o=es(e),i=e7(es((0,ev.Z)(o,r)),o),a=[],l=0;l=e7(i,n)))return(0,ev.Z)(i,-(r?void 0===o?1:o:1))}}(x,y),O=function(e){return k.some(function(t){return e9(e,t)})};return th.jsx(tP.Provider,{value:{currentMonth:x,displayMonths:k,goToMonth:w,goToDate:function(e,t){O(e)||(t&&te(e,t)?w((0,ev.Z)(e,1+-1*y.numberOfMonths)):w(e))},previousMonth:E,nextMonth:S,isDateDisplayed:O},children:e.children})}function tM(){var e=(0,d.useContext)(tP);if(!e)throw Error("useNavigation must be used within a NavigationProvider");return e}function tN(e){var t,n=tS(),r=n.classNames,o=n.styles,i=n.components,a=tM().goToMonth,l=function(t){a((0,ev.Z)(t,e.displayIndex?-e.displayIndex:0))},s=null!==(t=null==i?void 0:i.CaptionLabel)&&void 0!==t?t:tE,c=th.jsx(s,{id:e.id,displayMonth:e.displayMonth});return th.jsxs("div",{className:r.caption_dropdowns,style:o.caption_dropdowns,children:[th.jsx("div",{className:r.vhidden,children:c}),th.jsx(tj,{onChange:l,displayMonth:e.displayMonth}),th.jsx(t_,{onChange:l,displayMonth:e.displayMonth})]})}function tA(e){return th.jsx("svg",tu({width:"16px",height:"16px",viewBox:"0 0 120 120"},e,{children:th.jsx("path",{d:"M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z",fill:"currentColor",fillRule:"nonzero"})}))}function tI(e){return th.jsx("svg",tu({width:"16px",height:"16px",viewBox:"0 0 120 120"},e,{children:th.jsx("path",{d:"M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z",fill:"currentColor"})}))}var tR=(0,d.forwardRef)(function(e,t){var n=tS(),r=n.classNames,o=n.styles,i=[r.button_reset,r.button];e.className&&i.push(e.className);var a=i.join(" "),l=tu(tu({},o.button_reset),o.button);return e.style&&Object.assign(l,e.style),th.jsx("button",tu({},e,{ref:t,type:"button",className:a,style:l}))});function tD(e){var t,n,r=tS(),o=r.dir,i=r.locale,a=r.classNames,l=r.styles,s=r.labels,c=s.labelPrevious,u=s.labelNext,d=r.components;if(!e.nextMonth&&!e.previousMonth)return th.jsx(th.Fragment,{});var f=c(e.previousMonth,{locale:i}),p=[a.nav_button,a.nav_button_previous].join(" "),h=u(e.nextMonth,{locale:i}),m=[a.nav_button,a.nav_button_next].join(" "),g=null!==(t=null==d?void 0:d.IconRight)&&void 0!==t?t:tI,v=null!==(n=null==d?void 0:d.IconLeft)&&void 0!==n?n:tA;return th.jsxs("div",{className:a.nav,style:l.nav,children:[!e.hidePrevious&&th.jsx(tR,{name:"previous-month","aria-label":f,className:p,style:l.nav_button_previous,disabled:!e.previousMonth,onClick:e.onPreviousClick,children:"rtl"===o?th.jsx(g,{className:a.nav_icon,style:l.nav_icon}):th.jsx(v,{className:a.nav_icon,style:l.nav_icon})}),!e.hideNext&&th.jsx(tR,{name:"next-month","aria-label":h,className:m,style:l.nav_button_next,disabled:!e.nextMonth,onClick:e.onNextClick,children:"rtl"===o?th.jsx(v,{className:a.nav_icon,style:l.nav_icon}):th.jsx(g,{className:a.nav_icon,style:l.nav_icon})})]})}function tL(e){var t=tS().numberOfMonths,n=tM(),r=n.previousMonth,o=n.nextMonth,i=n.goToMonth,a=n.displayMonths,l=a.findIndex(function(t){return e9(e.displayMonth,t)}),s=0===l,c=l===a.length-1;return th.jsx(tD,{displayMonth:e.displayMonth,hideNext:t>1&&(s||!c),hidePrevious:t>1&&(c||!s),nextMonth:o,previousMonth:r,onPreviousClick:function(){r&&i(r)},onNextClick:function(){o&&i(o)}})}function tz(e){var t,n,r=tS(),o=r.classNames,i=r.disableNavigation,a=r.styles,l=r.captionLayout,s=r.components,c=null!==(t=null==s?void 0:s.CaptionLabel)&&void 0!==t?t:tE;return n=i?th.jsx(c,{id:e.id,displayMonth:e.displayMonth}):"dropdown"===l?th.jsx(tN,{displayMonth:e.displayMonth,id:e.id}):"dropdown-buttons"===l?th.jsxs(th.Fragment,{children:[th.jsx(tN,{displayMonth:e.displayMonth,displayIndex:e.displayIndex,id:e.id}),th.jsx(tL,{displayMonth:e.displayMonth,displayIndex:e.displayIndex,id:e.id})]}):th.jsxs(th.Fragment,{children:[th.jsx(c,{id:e.id,displayMonth:e.displayMonth,displayIndex:e.displayIndex}),th.jsx(tL,{displayMonth:e.displayMonth,id:e.id})]}),th.jsx("div",{className:o.caption,style:a.caption,children:n})}function tZ(e){var t=tS(),n=t.footer,r=t.styles,o=t.classNames.tfoot;return n?th.jsx("tfoot",{className:o,style:r.tfoot,children:th.jsx("tr",{children:th.jsx("td",{colSpan:8,children:n})})}):th.jsx(th.Fragment,{})}function tB(){var e=tS(),t=e.classNames,n=e.styles,r=e.showWeekNumber,o=e.locale,i=e.weekStartsOn,a=e.ISOWeek,l=e.formatters.formatWeekdayName,s=e.labels.labelWeekday,c=function(e,t,n){for(var r=n?tn(new Date):tt(new Date,{locale:e,weekStartsOn:t}),o=[],i=0;i<7;i++){var a=(0,eh.Z)(r,i);o.push(a)}return o}(o,i,a);return th.jsxs("tr",{style:n.head_row,className:t.head_row,children:[r&&th.jsx("td",{style:n.head_cell,className:t.head_cell}),c.map(function(e,r){return th.jsx("th",{scope:"col",className:t.head_cell,style:n.head_cell,"aria-label":s(e,{locale:o}),children:l(e,{locale:o})},r)})]})}function tF(){var e,t=tS(),n=t.classNames,r=t.styles,o=t.components,i=null!==(e=null==o?void 0:o.HeadRow)&&void 0!==e?e:tB;return th.jsx("thead",{style:r.head,className:n.head,children:th.jsx(i,{})})}function tH(e){var t=tS(),n=t.locale,r=t.formatters.formatDay;return th.jsx(th.Fragment,{children:r(e.date,{locale:n})})}var tq=(0,d.createContext)(void 0);function tU(e){return tm(e.initialProps)?th.jsx(tW,{initialProps:e.initialProps,children:e.children}):th.jsx(tq.Provider,{value:{selected:void 0,modifiers:{disabled:[]}},children:e.children})}function tW(e){var t=e.initialProps,n=e.children,r=t.selected,o=t.min,i=t.max,a={disabled:[]};return r&&a.disabled.push(function(e){var t=i&&r.length>i-1,n=r.some(function(t){return tr(t,e)});return!!(t&&!n)}),th.jsx(tq.Provider,{value:{selected:r,onDayClick:function(e,n,a){if(null===(l=t.onDayClick)||void 0===l||l.call(t,e,n,a),(!n.selected||!o||(null==r?void 0:r.length)!==o)&&(n.selected||!i||(null==r?void 0:r.length)!==i)){var l,s,c=r?td([],r,!0):[];if(n.selected){var u=c.findIndex(function(t){return tr(e,t)});c.splice(u,1)}else c.push(e);null===(s=t.onSelect)||void 0===s||s.call(t,c,e,n,a)}},modifiers:a},children:n})}function tK(){var e=(0,d.useContext)(tq);if(!e)throw Error("useSelectMultiple must be used within a SelectMultipleProvider");return e}var tV=(0,d.createContext)(void 0);function t$(e){return tg(e.initialProps)?th.jsx(tX,{initialProps:e.initialProps,children:e.children}):th.jsx(tV.Provider,{value:{selected:void 0,modifiers:{range_start:[],range_end:[],range_middle:[],disabled:[]}},children:e.children})}function tX(e){var t=e.initialProps,n=e.children,r=t.selected,o=r||{},i=o.from,a=o.to,l=t.min,s=t.max,c={range_start:[],range_end:[],range_middle:[],disabled:[]};if(i?(c.range_start=[i],a?(c.range_end=[a],tr(i,a)||(c.range_middle=[{after:i,before:a}])):c.range_end=[i]):a&&(c.range_start=[a],c.range_end=[a]),l&&(i&&!a&&c.disabled.push({after:eg(i,l-1),before:(0,eh.Z)(i,l-1)}),i&&a&&c.disabled.push({after:i,before:(0,eh.Z)(i,l-1)}),!i&&a&&c.disabled.push({after:eg(a,l-1),before:(0,eh.Z)(a,l-1)})),s){if(i&&!a&&(c.disabled.push({before:(0,eh.Z)(i,-s+1)}),c.disabled.push({after:(0,eh.Z)(i,s-1)})),i&&a){var u=s-(ti(a,i)+1);c.disabled.push({before:eg(i,u)}),c.disabled.push({after:(0,eh.Z)(a,u)})}!i&&a&&(c.disabled.push({before:(0,eh.Z)(a,-s+1)}),c.disabled.push({after:(0,eh.Z)(a,s-1)}))}return th.jsx(tV.Provider,{value:{selected:r,onDayClick:function(e,n,o){null===(s=t.onDayClick)||void 0===s||s.call(t,e,n,o);var i,a,l,s,c,u=(a=(i=r||{}).from,l=i.to,a&&l?tr(l,e)&&tr(a,e)?void 0:tr(l,e)?{from:l,to:void 0}:tr(a,e)?void 0:to(a,e)?{from:e,to:l}:{from:a,to:e}:l?to(e,l)?{from:l,to:e}:{from:e,to:l}:a?te(e,a)?{from:e,to:a}:{from:a,to:e}:{from:e,to:void 0});null===(c=t.onSelect)||void 0===c||c.call(t,u,e,n,o)},modifiers:c},children:n})}function tG(){var e=(0,d.useContext)(tV);if(!e)throw Error("useSelectRange must be used within a SelectRangeProvider");return e}function tY(e){return Array.isArray(e)?td([],e,!0):void 0!==e?[e]:[]}(l=c||(c={})).Outside="outside",l.Disabled="disabled",l.Selected="selected",l.Hidden="hidden",l.Today="today",l.RangeStart="range_start",l.RangeEnd="range_end",l.RangeMiddle="range_middle";var tQ=c.Selected,tJ=c.Disabled,t0=c.Hidden,t1=c.Today,t2=c.RangeEnd,t4=c.RangeMiddle,t3=c.RangeStart,t6=c.Outside,t8=(0,d.createContext)(void 0);function t5(e){var t,n,r,o=tS(),i=tK(),a=tG(),l=((t={})[tQ]=tY(o.selected),t[tJ]=tY(o.disabled),t[t0]=tY(o.hidden),t[t1]=[o.today],t[t2]=[],t[t4]=[],t[t3]=[],t[t6]=[],o.fromDate&&t[tJ].push({before:o.fromDate}),o.toDate&&t[tJ].push({after:o.toDate}),tm(o)?t[tJ]=t[tJ].concat(i.modifiers[tJ]):tg(o)&&(t[tJ]=t[tJ].concat(a.modifiers[tJ]),t[t3]=a.modifiers[t3],t[t4]=a.modifiers[t4],t[t2]=a.modifiers[t2]),t),s=(n=o.modifiers,r={},Object.entries(n).forEach(function(e){var t=e[0],n=e[1];r[t]=tY(n)}),r),c=tu(tu({},l),s);return th.jsx(t8.Provider,{value:c,children:e.children})}function t7(){var e=(0,d.useContext)(t8);if(!e)throw Error("useModifiers must be used within a ModifiersProvider");return e}function t9(e,t,n){var r=Object.keys(t).reduce(function(n,r){return t[r].some(function(t){if("boolean"==typeof t)return t;if(ex(t))return tr(e,t);if(Array.isArray(t)&&t.every(ex))return t.includes(e);if(t&&"object"==typeof t&&"from"in t)return r=t.from,o=t.to,r&&o?(0>ti(o,r)&&(r=(n=[o,r])[0],o=n[1]),ti(e,r)>=0&&ti(o,e)>=0):o?tr(o,e):!!r&&tr(r,e);if(t&&"object"==typeof t&&"dayOfWeek"in t)return t.dayOfWeek.includes(e.getDay());if(t&&"object"==typeof t&&"before"in t&&"after"in t){var n,r,o,i=ti(t.before,e),a=ti(t.after,e),l=i>0,s=a<0;return to(t.before,t.after)?s&&l:l||s}return t&&"object"==typeof t&&"after"in t?ti(e,t.after)>0:t&&"object"==typeof t&&"before"in t?ti(t.before,e)>0:"function"==typeof t&&t(e)})&&n.push(r),n},[]),o={};return r.forEach(function(e){return o[e]=!0}),n&&!e9(e,n)&&(o.outside=!0),o}var ne=(0,d.createContext)(void 0);function nt(e){var t=tM(),n=t7(),r=(0,d.useState)(),o=r[0],i=r[1],a=(0,d.useState)(),l=a[0],s=a[1],c=function(e,t){for(var n,r,o=es(e[0]),i=e6(e[e.length-1]),a=o;a<=i;){var l=t9(a,t);if(!(!l.disabled&&!l.hidden)){a=(0,eh.Z)(a,1);continue}if(l.selected)return a;l.today&&!r&&(r=a),n||(n=a),a=(0,eh.Z)(a,1)}return r||n}(t.displayMonths,n),u=(null!=o?o:l&&t.isDateDisplayed(l))?l:c,f=function(e){i(e)},p=tS(),h=function(e,r){if(o){var i=function e(t,n){var r=n.moveBy,o=n.direction,i=n.context,a=n.modifiers,l=n.retry,s=void 0===l?{count:0,lastFocused:t}:l,c=i.weekStartsOn,u=i.fromDate,d=i.toDate,f=i.locale,p=({day:eh.Z,week:ta,month:ev.Z,year:tl,startOfWeek:function(e){return i.ISOWeek?tn(e):tt(e,{locale:f,weekStartsOn:c})},endOfWeek:function(e){return i.ISOWeek?tc(e):ts(e,{locale:f,weekStartsOn:c})}})[r](t,"after"===o?1:-1);"before"===o&&u?p=ef([u,p]):"after"===o&&d&&(p=ep([d,p]));var h=!0;if(a){var m=t9(p,a);h=!m.disabled&&!m.hidden}return h?p:s.count>365?s.lastFocused:e(p,{moveBy:r,direction:o,context:i,modifiers:a,retry:tu(tu({},s),{count:s.count+1})})}(o,{moveBy:e,direction:r,context:p,modifiers:n});tr(o,i)||(t.goToDate(i,o),f(i))}};return th.jsx(ne.Provider,{value:{focusedDay:o,focusTarget:u,blur:function(){s(o),i(void 0)},focus:f,focusDayAfter:function(){return h("day","after")},focusDayBefore:function(){return h("day","before")},focusWeekAfter:function(){return h("week","after")},focusWeekBefore:function(){return h("week","before")},focusMonthBefore:function(){return h("month","before")},focusMonthAfter:function(){return h("month","after")},focusYearBefore:function(){return h("year","before")},focusYearAfter:function(){return h("year","after")},focusStartOfWeek:function(){return h("startOfWeek","before")},focusEndOfWeek:function(){return h("endOfWeek","after")}},children:e.children})}function nn(){var e=(0,d.useContext)(ne);if(!e)throw Error("useFocusContext must be used within a FocusProvider");return e}var nr=(0,d.createContext)(void 0);function no(e){return tv(e.initialProps)?th.jsx(ni,{initialProps:e.initialProps,children:e.children}):th.jsx(nr.Provider,{value:{selected:void 0},children:e.children})}function ni(e){var t=e.initialProps,n=e.children,r={selected:t.selected,onDayClick:function(e,n,r){var o,i,a;if(null===(o=t.onDayClick)||void 0===o||o.call(t,e,n,r),n.selected&&!t.required){null===(i=t.onSelect)||void 0===i||i.call(t,void 0,e,n,r);return}null===(a=t.onSelect)||void 0===a||a.call(t,e,e,n,r)}};return th.jsx(nr.Provider,{value:r,children:n})}function na(){var e=(0,d.useContext)(nr);if(!e)throw Error("useSelectSingle must be used within a SelectSingleProvider");return e}function nl(e){var t,n,r,o,i,a,l,s,u,f,p,h,m,g,v,y,b,x,w,k,S,E,O,C,j,_,P,T,M,N,A,I,R,D,L,z,Z,B,F,H,q,U,W=(0,d.useRef)(null),K=(t=e.date,n=e.displayMonth,a=tS(),l=nn(),s=t9(t,t7(),n),u=tS(),f=na(),p=tK(),h=tG(),g=(m=nn()).focusDayAfter,v=m.focusDayBefore,y=m.focusWeekAfter,b=m.focusWeekBefore,x=m.blur,w=m.focus,k=m.focusMonthBefore,S=m.focusMonthAfter,E=m.focusYearBefore,O=m.focusYearAfter,C=m.focusStartOfWeek,j=m.focusEndOfWeek,_={onClick:function(e){var n,r,o,i;tv(u)?null===(n=f.onDayClick)||void 0===n||n.call(f,t,s,e):tm(u)?null===(r=p.onDayClick)||void 0===r||r.call(p,t,s,e):tg(u)?null===(o=h.onDayClick)||void 0===o||o.call(h,t,s,e):null===(i=u.onDayClick)||void 0===i||i.call(u,t,s,e)},onFocus:function(e){var n;w(t),null===(n=u.onDayFocus)||void 0===n||n.call(u,t,s,e)},onBlur:function(e){var n;x(),null===(n=u.onDayBlur)||void 0===n||n.call(u,t,s,e)},onKeyDown:function(e){var n;switch(e.key){case"ArrowLeft":e.preventDefault(),e.stopPropagation(),"rtl"===u.dir?g():v();break;case"ArrowRight":e.preventDefault(),e.stopPropagation(),"rtl"===u.dir?v():g();break;case"ArrowDown":e.preventDefault(),e.stopPropagation(),y();break;case"ArrowUp":e.preventDefault(),e.stopPropagation(),b();break;case"PageUp":e.preventDefault(),e.stopPropagation(),e.shiftKey?E():k();break;case"PageDown":e.preventDefault(),e.stopPropagation(),e.shiftKey?O():S();break;case"Home":e.preventDefault(),e.stopPropagation(),C();break;case"End":e.preventDefault(),e.stopPropagation(),j()}null===(n=u.onDayKeyDown)||void 0===n||n.call(u,t,s,e)},onKeyUp:function(e){var n;null===(n=u.onDayKeyUp)||void 0===n||n.call(u,t,s,e)},onMouseEnter:function(e){var n;null===(n=u.onDayMouseEnter)||void 0===n||n.call(u,t,s,e)},onMouseLeave:function(e){var n;null===(n=u.onDayMouseLeave)||void 0===n||n.call(u,t,s,e)},onPointerEnter:function(e){var n;null===(n=u.onDayPointerEnter)||void 0===n||n.call(u,t,s,e)},onPointerLeave:function(e){var n;null===(n=u.onDayPointerLeave)||void 0===n||n.call(u,t,s,e)},onTouchCancel:function(e){var n;null===(n=u.onDayTouchCancel)||void 0===n||n.call(u,t,s,e)},onTouchEnd:function(e){var n;null===(n=u.onDayTouchEnd)||void 0===n||n.call(u,t,s,e)},onTouchMove:function(e){var n;null===(n=u.onDayTouchMove)||void 0===n||n.call(u,t,s,e)},onTouchStart:function(e){var n;null===(n=u.onDayTouchStart)||void 0===n||n.call(u,t,s,e)}},P=tS(),T=na(),M=tK(),N=tG(),A=tv(P)?T.selected:tm(P)?M.selected:tg(P)?N.selected:void 0,I=!!(a.onDayClick||"default"!==a.mode),(0,d.useEffect)(function(){var e;!s.outside&&l.focusedDay&&I&&tr(l.focusedDay,t)&&(null===(e=W.current)||void 0===e||e.focus())},[l.focusedDay,t,W,I,s.outside]),D=(R=[a.classNames.day],Object.keys(s).forEach(function(e){var t=a.modifiersClassNames[e];if(t)R.push(t);else if(Object.values(c).includes(e)){var n=a.classNames["day_".concat(e)];n&&R.push(n)}}),R).join(" "),L=tu({},a.styles.day),Object.keys(s).forEach(function(e){var t;L=tu(tu({},L),null===(t=a.modifiersStyles)||void 0===t?void 0:t[e])}),z=L,Z=!!(s.outside&&!a.showOutsideDays||s.hidden),B=null!==(i=null===(o=a.components)||void 0===o?void 0:o.DayContent)&&void 0!==i?i:tH,F={style:z,className:D,children:th.jsx(B,{date:t,displayMonth:n,activeModifiers:s}),role:"gridcell"},H=l.focusTarget&&tr(l.focusTarget,t)&&!s.outside,q=l.focusedDay&&tr(l.focusedDay,t),U=tu(tu(tu({},F),((r={disabled:s.disabled,role:"gridcell"})["aria-selected"]=s.selected,r.tabIndex=q||H?0:-1,r)),_),{isButton:I,isHidden:Z,activeModifiers:s,selectedDays:A,buttonProps:U,divProps:F});return K.isHidden?th.jsx("div",{role:"gridcell"}):K.isButton?th.jsx(tR,tu({name:"day",ref:W},K.buttonProps)):th.jsx("div",tu({},K.divProps))}function ns(e){var t=e.number,n=e.dates,r=tS(),o=r.onWeekNumberClick,i=r.styles,a=r.classNames,l=r.locale,s=r.labels.labelWeekNumber,c=(0,r.formatters.formatWeekNumber)(Number(t),{locale:l});if(!o)return th.jsx("span",{className:a.weeknumber,style:i.weeknumber,children:c});var u=s(Number(t),{locale:l});return th.jsx(tR,{name:"week-number","aria-label":u,className:a.weeknumber,style:i.weeknumber,onClick:function(e){o(t,n,e)},children:c})}function nc(e){var t,n,r,o=tS(),i=o.styles,a=o.classNames,l=o.showWeekNumber,s=o.components,c=null!==(t=null==s?void 0:s.Day)&&void 0!==t?t:nl,u=null!==(n=null==s?void 0:s.WeekNumber)&&void 0!==n?n:ns;return l&&(r=th.jsx("td",{className:a.cell,style:i.cell,children:th.jsx(u,{number:e.weekNumber,dates:e.dates})})),th.jsxs("tr",{className:a.row,style:i.row,children:[r,e.dates.map(function(t){return th.jsx("td",{className:a.cell,style:i.cell,role:"presentation",children:th.jsx(c,{displayMonth:e.displayMonth,date:t})},function(e){return(0,ei.Z)(1,arguments),Math.floor(function(e){return(0,ei.Z)(1,arguments),(0,eo.Z)(e).getTime()}(e)/1e3)}(t))})]})}function nu(e,t,n){for(var r=(null==n?void 0:n.ISOWeek)?tc(t):ts(t,n),o=(null==n?void 0:n.ISOWeek)?tn(e):tt(e,n),i=ti(r,o),a=[],l=0;l<=i;l++)a.push((0,eh.Z)(o,l));return a.reduce(function(e,t){var r=(null==n?void 0:n.ISOWeek)?function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return Math.round((tn(t).getTime()-(function(e){(0,ei.Z)(1,arguments);var t=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getFullYear(),r=new Date(0);r.setFullYear(n+1,0,4),r.setHours(0,0,0,0);var o=tn(r),i=new Date(0);i.setFullYear(n,0,4),i.setHours(0,0,0,0);var a=tn(i);return t.getTime()>=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}(e),n=new Date(0);return n.setFullYear(t,0,4),n.setHours(0,0,0,0),tn(n)})(t).getTime())/6048e5)+1}(t):function(e,t){(0,ei.Z)(1,arguments);var n=(0,eo.Z)(e);return Math.round((tt(n,t).getTime()-(function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,s,c,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:eS.firstWeekContainsDate)&&void 0!==r?r:null===(s=eS.locale)||void 0===s?void 0:null===(c=s.options)||void 0===c?void 0:c.firstWeekContainsDate)&&void 0!==n?n:1),d=function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,s,c,u=(0,eo.Z)(e),d=u.getFullYear(),f=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:eS.firstWeekContainsDate)&&void 0!==r?r:null===(s=eS.locale)||void 0===s?void 0:null===(c=s.options)||void 0===c?void 0:c.firstWeekContainsDate)&&void 0!==n?n:1);if(!(f>=1&&f<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var p=new Date(0);p.setFullYear(d+1,0,f),p.setHours(0,0,0,0);var h=tt(p,t),m=new Date(0);m.setFullYear(d,0,f),m.setHours(0,0,0,0);var g=tt(m,t);return u.getTime()>=h.getTime()?d+1:u.getTime()>=g.getTime()?d:d-1}(e,t),f=new Date(0);return f.setFullYear(d,0,u),f.setHours(0,0,0,0),tt(f,t)})(n,t).getTime())/6048e5)+1}(t,n),o=e.find(function(e){return e.weekNumber===r});return o?o.dates.push(t):e.push({weekNumber:r,dates:[t]}),e},[])}function nd(e){var t,n,r,o=tS(),i=o.locale,a=o.classNames,l=o.styles,s=o.hideHead,c=o.fixedWeeks,u=o.components,d=o.weekStartsOn,f=o.firstWeekContainsDate,p=o.ISOWeek,h=function(e,t){var n=nu(es(e),e6(e),t);if(null==t?void 0:t.useFixedWeeks){var r=function(e,t){return(0,ei.Z)(1,arguments),function(e,t,n){(0,ei.Z)(2,arguments);var r=tt(e,n),o=tt(t,n);return Math.round((r.getTime()-eD(r)-(o.getTime()-eD(o)))/6048e5)}(function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(0,0,0,0),t}(e),es(e),t)+1}(e,t);if(r<6){var o=n[n.length-1],i=o.dates[o.dates.length-1],a=ta(i,6-r),l=nu(ta(i,1),a,t);n.push.apply(n,l)}}return n}(e.displayMonth,{useFixedWeeks:!!c,ISOWeek:p,locale:i,weekStartsOn:d,firstWeekContainsDate:f}),m=null!==(t=null==u?void 0:u.Head)&&void 0!==t?t:tF,g=null!==(n=null==u?void 0:u.Row)&&void 0!==n?n:nc,v=null!==(r=null==u?void 0:u.Footer)&&void 0!==r?r:tZ;return th.jsxs("table",{id:e.id,className:a.table,style:l.table,role:"grid","aria-labelledby":e["aria-labelledby"],children:[!s&&th.jsx(m,{}),th.jsx("tbody",{className:a.tbody,style:l.tbody,children:h.map(function(t){return th.jsx(g,{displayMonth:e.displayMonth,dates:t.dates,weekNumber:t.weekNumber},t.weekNumber)})}),th.jsx(v,{displayMonth:e.displayMonth})]})}var nf="undefined"!=typeof window&&window.document&&window.document.createElement?d.useLayoutEffect:d.useEffect,np=!1,nh=0;function nm(){return"react-day-picker-".concat(++nh)}function ng(e){var t,n,r,o,i,a,l,s,c=tS(),u=c.dir,f=c.classNames,p=c.styles,h=c.components,m=tM().displayMonths,g=(r=null!=(t=c.id?"".concat(c.id,"-").concat(e.displayIndex):void 0)?t:np?nm():null,i=(o=(0,d.useState)(r))[0],a=o[1],nf(function(){null===i&&a(nm())},[]),(0,d.useEffect)(function(){!1===np&&(np=!0)},[]),null!==(n=null!=t?t:i)&&void 0!==n?n:void 0),v=c.id?"".concat(c.id,"-grid-").concat(e.displayIndex):void 0,y=[f.month],b=p.month,x=0===e.displayIndex,w=e.displayIndex===m.length-1,k=!x&&!w;"rtl"===u&&(w=(l=[x,w])[0],x=l[1]),x&&(y.push(f.caption_start),b=tu(tu({},b),p.caption_start)),w&&(y.push(f.caption_end),b=tu(tu({},b),p.caption_end)),k&&(y.push(f.caption_between),b=tu(tu({},b),p.caption_between));var S=null!==(s=null==h?void 0:h.Caption)&&void 0!==s?s:tz;return th.jsxs("div",{className:y.join(" "),style:b,children:[th.jsx(S,{id:g,displayMonth:e.displayMonth,displayIndex:e.displayIndex}),th.jsx(nd,{id:v,"aria-labelledby":g,displayMonth:e.displayMonth})]},e.displayIndex)}function nv(e){var t=tS(),n=t.classNames,r=t.styles;return th.jsx("div",{className:n.months,style:r.months,children:e.children})}function ny(e){var t,n,r=e.initialProps,o=tS(),i=nn(),a=tM(),l=(0,d.useState)(!1),s=l[0],c=l[1];(0,d.useEffect)(function(){o.initialFocus&&i.focusTarget&&(s||(i.focus(i.focusTarget),c(!0)))},[o.initialFocus,s,i.focus,i.focusTarget,i]);var u=[o.classNames.root,o.className];o.numberOfMonths>1&&u.push(o.classNames.multiple_months),o.showWeekNumber&&u.push(o.classNames.with_weeknumber);var f=tu(tu({},o.styles.root),o.style),p=Object.keys(r).filter(function(e){return e.startsWith("data-")}).reduce(function(e,t){var n;return tu(tu({},e),((n={})[t]=r[t],n))},{}),h=null!==(n=null===(t=r.components)||void 0===t?void 0:t.Months)&&void 0!==n?n:nv;return th.jsx("div",tu({className:u.join(" "),style:f,dir:o.dir,id:o.id,nonce:r.nonce,title:r.title,lang:r.lang},p,{children:th.jsx(h,{children:a.displayMonths.map(function(e,t){return th.jsx(ng,{displayIndex:t,displayMonth:e},t)})})}))}function nb(e){var t=e.children,n=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);ot.indexOf(r[o])&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n}(e,["children"]);return th.jsx(tk,{initialProps:n,children:th.jsx(tT,{children:th.jsx(no,{initialProps:n,children:th.jsx(tU,{initialProps:n,children:th.jsx(t$,{initialProps:n,children:th.jsx(t5,{children:th.jsx(nt,{children:t})})})})})})})}function nx(e){return th.jsx(nb,tu({},e,{children:th.jsx(ny,{initialProps:e})}))}let nw=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z"}))},nk=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.1717 12.0007L8.22192 7.05093L9.63614 5.63672L16.0001 12.0007L9.63614 18.3646L8.22192 16.9504L13.1717 12.0007Z"}))},nS=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M4.83582 12L11.0429 18.2071L12.4571 16.7929L7.66424 12L12.4571 7.20712L11.0429 5.79291L4.83582 12ZM10.4857 12L16.6928 18.2071L18.107 16.7929L13.3141 12L18.107 7.20712L16.6928 5.79291L10.4857 12Z"}))},nE=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M19.1642 12L12.9571 5.79291L11.5429 7.20712L16.3358 12L11.5429 16.7929L12.9571 18.2071L19.1642 12ZM13.5143 12L7.30722 5.79291L5.89301 7.20712L10.6859 12L5.89301 16.7929L7.30722 18.2071L13.5143 12Z"}))};var nO=n(84264);n(41649);var nC=n(1526),nj=n(7084),n_=n(26898);let nP={xs:{paddingX:"px-2",paddingY:"py-0.5",fontSize:"text-xs"},sm:{paddingX:"px-2.5",paddingY:"py-1",fontSize:"text-sm"},md:{paddingX:"px-3",paddingY:"py-1.5",fontSize:"text-md"},lg:{paddingX:"px-3.5",paddingY:"py-1.5",fontSize:"text-lg"},xl:{paddingX:"px-3.5",paddingY:"py-1.5",fontSize:"text-xl"}},nT={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"}},nM={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"}},nN={[nj.wu.Increase]:{bgColor:(0,eJ.bM)(nj.fr.Emerald,n_.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Emerald,n_.K.text).textColor},[nj.wu.ModerateIncrease]:{bgColor:(0,eJ.bM)(nj.fr.Emerald,n_.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Emerald,n_.K.text).textColor},[nj.wu.Decrease]:{bgColor:(0,eJ.bM)(nj.fr.Rose,n_.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Rose,n_.K.text).textColor},[nj.wu.ModerateDecrease]:{bgColor:(0,eJ.bM)(nj.fr.Rose,n_.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Rose,n_.K.text).textColor},[nj.wu.Unchanged]:{bgColor:(0,eJ.bM)(nj.fr.Orange,n_.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Orange,n_.K.text).textColor}},nA={[nj.wu.Increase]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.0001 7.82843V20H11.0001V7.82843L5.63614 13.1924L4.22192 11.7782L12.0001 4L19.7783 11.7782L18.3641 13.1924L13.0001 7.82843Z"}))},[nj.wu.ModerateIncrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M16.0037 9.41421L7.39712 18.0208L5.98291 16.6066L14.5895 8H7.00373V6H18.0037V17H16.0037V9.41421Z"}))},[nj.wu.Decrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.0001 16.1716L18.3641 10.8076L19.7783 12.2218L12.0001 20L4.22192 12.2218L5.63614 10.8076L11.0001 16.1716V4H13.0001V16.1716Z"}))},[nj.wu.ModerateDecrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M14.5895 16.0032L5.98291 7.39664L7.39712 5.98242L16.0037 14.589V7.00324H18.0037V18.0032H7.00373V16.0032H14.5895Z"}))},[nj.wu.Unchanged]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M16.1716 10.9999L10.8076 5.63589L12.2218 4.22168L20 11.9999L12.2218 19.778L10.8076 18.3638L16.1716 12.9999H4V10.9999H16.1716Z"}))}},nI=(0,eJ.fn)("BadgeDelta");d.forwardRef((e,t)=>{let{deltaType:n=nj.wu.Increase,isIncreasePositive:r=!0,size:o=nj.u8.SM,tooltip:i,children:a,className:l}=e,s=(0,u._T)(e,["deltaType","isIncreasePositive","size","tooltip","children","className"]),c=nA[n],f=(0,eJ.Fo)(n,r),p=a?nT:nP,{tooltipProps:h,getReferenceProps:m}=(0,nC.l)();return d.createElement("span",Object.assign({ref:(0,eJ.lq)([t,h.refs.setReference]),className:(0,ec.q)(nI("root"),"w-max flex-shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-full bg-opacity-20 dark:bg-opacity-25",nN[f].bgColor,nN[f].textColor,p[o].paddingX,p[o].paddingY,p[o].fontSize,l)},m,s),d.createElement(nC.Z,Object.assign({text:i},h)),d.createElement(c,{className:(0,ec.q)(nI("icon"),"shrink-0",a?(0,ec.q)("-ml-1 mr-1.5"):nM[o].height,nM[o].width)}),a?d.createElement("p",{className:(0,ec.q)(nI("text"),"text-sm whitespace-nowrap")},a):null)}).displayName="BadgeDelta";var nR=n(47323);let nD=e=>{var{onClick:t,icon:n}=e,r=(0,u._T)(e,["onClick","icon"]);return d.createElement("button",Object.assign({type:"button",className:(0,ec.q)("flex items-center justify-center p-1 h-7 w-7 outline-none focus:ring-2 transition duration-100 border border-tremor-border dark:border-dark-tremor-border hover:bg-tremor-background-muted dark:hover:bg-dark-tremor-background-muted rounded-tremor-small focus:border-tremor-brand-subtle select-none dark:focus:border-dark-tremor-brand-subtle focus:ring-tremor-brand-muted dark:focus:ring-dark-tremor-brand-muted text-tremor-content-subtle dark:text-dark-tremor-content-subtle hover:text-tremor-content dark:hover:text-dark-tremor-content")},r),d.createElement(nR.Z,{onClick:t,icon:n,variant:"simple",color:"slate",size:"sm"}))};function nL(e){var{mode:t,defaultMonth:n,selected:r,onSelect:o,locale:i,disabled:a,enableYearNavigation:l,classNames:s,weekStartsOn:c=0}=e,f=(0,u._T)(e,["mode","defaultMonth","selected","onSelect","locale","disabled","enableYearNavigation","classNames","weekStartsOn"]);return d.createElement(nx,Object.assign({showOutsideDays:!0,mode:t,defaultMonth:n,selected:r,onSelect:o,locale:i,disabled:a,weekStartsOn:c,classNames:Object.assign({months:"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",month:"space-y-4",caption:"flex justify-center pt-2 relative items-center",caption_label:"text-tremor-default text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis font-medium",nav:"space-x-1 flex items-center",nav_button:"flex items-center justify-center p-1 h-7 w-7 outline-none focus:ring-2 transition duration-100 border border-tremor-border dark:border-dark-tremor-border hover:bg-tremor-background-muted dark:hover:bg-dark-tremor-background-muted rounded-tremor-small focus:border-tremor-brand-subtle dark:focus:border-dark-tremor-brand-subtle focus:ring-tremor-brand-muted dark:focus:ring-dark-tremor-brand-muted text-tremor-content-subtle dark:text-dark-tremor-content-subtle hover:text-tremor-content dark:hover:text-dark-tremor-content",nav_button_previous:"absolute left-1",nav_button_next:"absolute right-1",table:"w-full border-collapse space-y-1",head_row:"flex",head_cell:"w-9 font-normal text-center text-tremor-content-subtle dark:text-dark-tremor-content-subtle",row:"flex w-full mt-0.5",cell:"text-center p-0 relative focus-within:relative text-tremor-default text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",day:"h-9 w-9 p-0 hover:bg-tremor-background-subtle dark:hover:bg-dark-tremor-background-subtle outline-tremor-brand dark:outline-dark-tremor-brand rounded-tremor-default",day_today:"font-bold",day_selected:"aria-selected:bg-tremor-background-emphasis aria-selected:text-tremor-content-inverted dark:aria-selected:bg-dark-tremor-background-emphasis dark:aria-selected:text-dark-tremor-content-inverted ",day_disabled:"text-tremor-content-subtle dark:text-dark-tremor-content-subtle disabled:hover:bg-transparent",day_outside:"text-tremor-content-subtle dark:text-dark-tremor-content-subtle"},s),components:{IconLeft:e=>{var t=(0,u._T)(e,[]);return d.createElement(nw,Object.assign({className:"h-4 w-4"},t))},IconRight:e=>{var t=(0,u._T)(e,[]);return d.createElement(nk,Object.assign({className:"h-4 w-4"},t))},Caption:e=>{var t=(0,u._T)(e,[]);let{goToMonth:n,nextMonth:r,previousMonth:o,currentMonth:a}=tM();return d.createElement("div",{className:"flex justify-between items-center"},d.createElement("div",{className:"flex items-center space-x-1"},l&&d.createElement(nD,{onClick:()=>a&&n(tl(a,-1)),icon:nS}),d.createElement(nD,{onClick:()=>o&&n(o),icon:nw})),d.createElement(nO.Z,{className:"text-tremor-default tabular-nums capitalize text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis font-medium"},eQ(t.displayMonth,"LLLL yyy",{locale:i})),d.createElement("div",{className:"flex items-center space-x-1"},d.createElement(nD,{onClick:()=>r&&n(r),icon:nk}),l&&d.createElement(nD,{onClick:()=>a&&n(tl(a,1)),icon:nE})))}}},f))}nL.displayName="DateRangePicker",n(27281);var nz=n(57365),nZ=n(44140);let nB=el(),nF=d.forwardRef((e,t)=>{var n,r;let{value:o,defaultValue:i,onValueChange:a,enableSelect:l=!0,minDate:s,maxDate:c,placeholder:f="Select range",selectPlaceholder:p="Select range",disabled:h=!1,locale:m=eK,enableClear:g=!0,displayFormat:v,children:y,className:b,enableYearNavigation:x=!1,weekStartsOn:w=0,disabledDates:k}=e,S=(0,u._T)(e,["value","defaultValue","onValueChange","enableSelect","minDate","maxDate","placeholder","selectPlaceholder","disabled","locale","enableClear","displayFormat","children","className","enableYearNavigation","weekStartsOn","disabledDates"]),[E,O]=(0,nZ.Z)(i,o),[C,j]=(0,d.useState)(!1),[_,P]=(0,d.useState)(!1),T=(0,d.useMemo)(()=>{let e=[];return s&&e.push({before:s}),c&&e.push({after:c}),[...e,...null!=k?k:[]]},[s,c,k]),M=(0,d.useMemo)(()=>{let e=new Map;return y?d.Children.forEach(y,t=>{var n;e.set(t.props.value,{text:null!==(n=(0,eu.qg)(t))&&void 0!==n?n:t.props.value,from:t.props.from,to:t.props.to})}):e4.forEach(t=>{e.set(t.value,{text:t.text,from:t.from,to:nB})}),e},[y]),N=(0,d.useMemo)(()=>{if(y)return(0,eu.sl)(y);let e=new Map;return e4.forEach(t=>e.set(t.value,t.text)),e},[y]),A=(null==E?void 0:E.selectValue)||"",I=e1(null==E?void 0:E.from,s,A,M),R=e2(null==E?void 0:E.to,c,A,M),D=I||R?e3(I,R,m,v):f,L=es(null!==(r=null!==(n=null!=R?R:I)&&void 0!==n?n:c)&&void 0!==r?r:nB),z=g&&!h;return d.createElement("div",Object.assign({ref:t,className:(0,ec.q)("w-full min-w-[10rem] relative flex justify-between text-tremor-default max-w-sm shadow-tremor-input dark:shadow-dark-tremor-input rounded-tremor-default",b)},S),d.createElement(J,{as:"div",className:(0,ec.q)("w-full",l?"rounded-l-tremor-default":"rounded-tremor-default",C&&"ring-2 ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted z-10")},d.createElement("div",{className:"relative w-full"},d.createElement(J.Button,{onFocus:()=>j(!0),onBlur:()=>j(!1),disabled:h,className:(0,ec.q)("w-full outline-none text-left whitespace-nowrap truncate focus:ring-2 transition duration-100 rounded-l-tremor-default flex flex-nowrap border pl-3 py-2","rounded-l-tremor-default border-tremor-border text-tremor-content-emphasis focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:text-dark-tremor-content-emphasis dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",l?"rounded-l-tremor-default":"rounded-tremor-default",z?"pr-8":"pr-4",(0,eu.um)((0,eu.Uh)(I||R),h))},d.createElement(en,{className:(0,ec.q)(e0("calendarIcon"),"flex-none shrink-0 h-5 w-5 -ml-0.5 mr-2","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle"),"aria-hidden":"true"}),d.createElement("p",{className:"truncate"},D)),z&&I?d.createElement("button",{type:"button",className:(0,ec.q)("absolute outline-none inset-y-0 right-0 flex items-center transition duration-100 mr-4"),onClick:e=>{e.preventDefault(),null==a||a({}),O({})}},d.createElement(er.Z,{className:(0,ec.q)(e0("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null),d.createElement(ee.u,{className:"absolute z-10 min-w-min left-0",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},d.createElement(J.Panel,{focus:!0,className:(0,ec.q)("divide-y overflow-y-auto outline-none rounded-tremor-default p-3 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},d.createElement(nL,Object.assign({mode:"range",showOutsideDays:!0,defaultMonth:L,selected:{from:I,to:R},onSelect:e=>{null==a||a({from:null==e?void 0:e.from,to:null==e?void 0:e.to}),O({from:null==e?void 0:e.from,to:null==e?void 0:e.to})},locale:m,disabled:T,enableYearNavigation:x,classNames:{day_range_middle:(0,ec.q)("!rounded-none aria-selected:!bg-tremor-background-subtle aria-selected:dark:!bg-dark-tremor-background-subtle aria-selected:!text-tremor-content aria-selected:dark:!bg-dark-tremor-background-subtle"),day_range_start:"rounded-r-none rounded-l-tremor-small aria-selected:text-tremor-brand-inverted dark:aria-selected:text-dark-tremor-brand-inverted",day_range_end:"rounded-l-none rounded-r-tremor-small aria-selected:text-tremor-brand-inverted dark:aria-selected:text-dark-tremor-brand-inverted"},weekStartsOn:w},e))))),l&&d.createElement(et.R,{as:"div",className:(0,ec.q)("w-48 -ml-px rounded-r-tremor-default",_&&"ring-2 ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted z-10"),value:A,onChange:e=>{let{from:t,to:n}=M.get(e),r=null!=n?n:nB;null==a||a({from:t,to:r,selectValue:e}),O({from:t,to:r,selectValue:e})},disabled:h},e=>{var t;let{value:n}=e;return d.createElement(d.Fragment,null,d.createElement(et.R.Button,{onFocus:()=>P(!0),onBlur:()=>P(!1),className:(0,ec.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-r-tremor-default transition duration-100 border px-4 py-2","border-tremor-border shadow-tremor-input text-tremor-content-emphasis focus:border-tremor-brand-subtle","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:text-dark-tremor-content-emphasis dark:focus:border-dark-tremor-brand-subtle",(0,eu.um)((0,eu.Uh)(n),h))},n&&null!==(t=N.get(n))&&void 0!==t?t:p),d.createElement(ee.u,{className:"absolute z-10 w-full inset-x-0 right-0",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},d.createElement(et.R.Options,{className:(0,ec.q)("divide-y overflow-y-auto outline-none border my-1","shadow-tremor-dropdown bg-tremor-background border-tremor-border divide-tremor-border rounded-tremor-default","dark:shadow-dark-tremor-dropdown dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border")},null!=y?y:e4.map(e=>d.createElement(nz.Z,{key:e.value,value:e.value},e.text)))))}))});nF.displayName="DateRangePicker"},92414:function(e,t,n){"use strict";n.d(t,{Z:function(){return v}});var r=n(5853),o=n(2265);n(42698),n(64016),n(8710);var i=n(33232),a=n(44140),l=n(58747);let s=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.createElement("path",{d:"M18.031 16.6168L22.3137 20.8995L20.8995 22.3137L16.6168 18.031C15.0769 19.263 13.124 20 11 20C6.032 20 2 15.968 2 11C2 6.032 6.032 2 11 2C15.968 2 20 6.032 20 11C20 13.124 19.263 15.0769 18.031 16.6168ZM16.0247 15.8748C17.2475 14.6146 18 12.8956 18 11C18 7.1325 14.8675 4 11 4C7.1325 4 4 7.1325 4 11C4 14.8675 7.1325 18 11 18C12.8956 18 14.6146 17.2475 15.8748 16.0247L16.0247 15.8748Z"}))};var c=n(4537),u=n(9528),d=n(33044);let f=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",width:"100%",height:"100%",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},t),o.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),o.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))};var p=n(97324),h=n(1153),m=n(96398);let g=(0,h.fn)("MultiSelect"),v=o.forwardRef((e,t)=>{let{defaultValue:n,value:h,onValueChange:v,placeholder:y="Select...",placeholderSearch:b="Search",disabled:x=!1,icon:w,children:k,className:S}=e,E=(0,r._T)(e,["defaultValue","value","onValueChange","placeholder","placeholderSearch","disabled","icon","children","className"]),[O,C]=(0,a.Z)(n,h),{reactElementChildren:j,optionsAvailable:_}=(0,o.useMemo)(()=>{let e=o.Children.toArray(k).filter(o.isValidElement);return{reactElementChildren:e,optionsAvailable:(0,m.n0)("",e)}},[k]),[P,T]=(0,o.useState)(""),M=(null!=O?O:[]).length>0,N=(0,o.useMemo)(()=>P?(0,m.n0)(P,j):_,[P,j,_]),A=()=>{T("")};return o.createElement(u.R,Object.assign({as:"div",ref:t,defaultValue:O,value:O,onChange:e=>{null==v||v(e),C(e)},disabled:x,className:(0,p.q)("w-full min-w-[10rem] relative text-tremor-default",S)},E,{multiple:!0}),e=>{let{value:t}=e;return o.createElement(o.Fragment,null,o.createElement(u.R.Button,{className:(0,p.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 border pr-8 py-1.5","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",w?"pl-11 -ml-0.5":"pl-3",(0,m.um)(t.length>0,x))},w&&o.createElement("span",{className:(0,p.q)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},o.createElement(w,{className:(0,p.q)(g("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("div",{className:"h-6 flex items-center"},t.length>0?o.createElement("div",{className:"flex flex-nowrap overflow-x-scroll [&::-webkit-scrollbar]:hidden [scrollbar-width:none] gap-x-1 mr-5 -ml-1.5 relative"},_.filter(e=>t.includes(e.props.value)).map((e,n)=>{var r;return o.createElement("div",{key:n,className:(0,p.q)("max-w-[100px] lg:max-w-[200px] flex justify-center items-center pl-2 pr-1.5 py-1 font-medium","rounded-tremor-small","bg-tremor-background-muted dark:bg-dark-tremor-background-muted","bg-tremor-background-subtle dark:bg-dark-tremor-background-subtle","text-tremor-content-default dark:text-dark-tremor-content-default","text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis")},o.createElement("div",{className:"text-xs truncate "},null!==(r=e.props.children)&&void 0!==r?r:e.props.value),o.createElement("div",{onClick:n=>{n.preventDefault();let r=t.filter(t=>t!==e.props.value);null==v||v(r),C(r)}},o.createElement(f,{className:(0,p.q)(g("clearIconItem"),"cursor-pointer rounded-tremor-full w-3.5 h-3.5 ml-2","text-tremor-content-subtle hover:text-tremor-content","dark:text-dark-tremor-content-subtle dark:hover:text-tremor-content")})))})):o.createElement("span",null,y)),o.createElement("span",{className:(0,p.q)("absolute inset-y-0 right-0 flex items-center mr-2.5")},o.createElement(l.Z,{className:(0,p.q)(g("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),M&&!x?o.createElement("button",{type:"button",className:(0,p.q)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),C([]),null==v||v([])}},o.createElement(c.Z,{className:(0,p.q)(g("clearIconAllItems"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,o.createElement(d.u,{className:"absolute z-10 w-full",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},o.createElement(u.R.Options,{className:(0,p.q)("divide-y overflow-y-auto outline-none rounded-tremor-default max-h-[228px] left-0 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},o.createElement("div",{className:(0,p.q)("flex items-center w-full px-2.5","bg-tremor-background-muted","dark:bg-dark-tremor-background-muted")},o.createElement("span",null,o.createElement(s,{className:(0,p.q)("flex-none w-4 h-4 mr-2","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("input",{name:"search",type:"input",autoComplete:"off",placeholder:b,className:(0,p.q)("w-full focus:outline-none focus:ring-none bg-transparent text-tremor-default py-2","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis"),onKeyDown:e=>{"Space"===e.code&&""!==e.target.value&&e.stopPropagation()},onChange:e=>T(e.target.value),value:P})),o.createElement(i.Z.Provider,Object.assign({},{onBlur:{handleResetSearch:A}},{value:{selectedValue:t}}),N))))})});v.displayName="MultiSelect"},46030:function(e,t,n){"use strict";n.d(t,{Z:function(){return u}});var r=n(5853);n(42698),n(64016),n(8710);var o=n(33232),i=n(2265),a=n(97324),l=n(1153),s=n(9528);let c=(0,l.fn)("MultiSelectItem"),u=i.forwardRef((e,t)=>{let{value:n,className:u,children:d}=e,f=(0,r._T)(e,["value","className","children"]),{selectedValue:p}=(0,i.useContext)(o.Z),h=(0,l.NZ)(n,p);return i.createElement(s.R.Option,Object.assign({className:(0,a.q)(c("root"),"flex justify-start items-center cursor-default text-tremor-default p-2.5","ui-active:bg-tremor-background-muted ui-active:text-tremor-content-strong ui-selected:text-tremor-content-strong text-tremor-content-emphasis","dark:ui-active:bg-dark-tremor-background-muted dark:ui-active:text-dark-tremor-content-strong dark:ui-selected:text-dark-tremor-content-strong dark:ui-selected:bg-dark-tremor-background-muted dark:text-dark-tremor-content-emphasis",u),ref:t,key:n,value:n},f),i.createElement("input",{type:"checkbox",className:(0,a.q)(c("checkbox"),"flex-none focus:ring-none focus:outline-none cursor-pointer mr-2.5","accent-tremor-brand","dark:accent-dark-tremor-brand"),checked:h,readOnly:!0}),i.createElement("span",{className:"whitespace-nowrap truncate"},null!=d?d:n))});u.displayName="MultiSelectItem"},30150:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var r=n(5853),o=n(2265);let i=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),o.createElement("path",{d:"M12 4v16m8-8H4"}))},a=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),o.createElement("path",{d:"M20 12H4"}))};var l=n(97324),s=n(1153),c=n(69262);let u="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",f=o.forwardRef((e,t)=>{let{onSubmit:n,enableStepper:f=!0,disabled:p,onValueChange:h,onChange:m}=e,g=(0,r._T)(e,["onSubmit","enableStepper","disabled","onValueChange","onChange"]),v=(0,o.useRef)(null),[y,b]=o.useState(!1),x=o.useCallback(()=>{b(!0)},[]),w=o.useCallback(()=>{b(!1)},[]),[k,S]=o.useState(!1),E=o.useCallback(()=>{S(!0)},[]),O=o.useCallback(()=>{S(!1)},[]);return o.createElement(c.Z,Object.assign({type:"number",ref:(0,s.lq)([v,t]),disabled:p,makeInputClassName:(0,s.fn)("NumberInput"),onKeyDown:e=>{var t;if("Enter"===e.key&&!e.ctrlKey&&!e.altKey&&!e.shiftKey){let e=null===(t=v.current)||void 0===t?void 0:t.value;null==n||n(parseFloat(null!=e?e:""))}"ArrowDown"===e.key&&x(),"ArrowUp"===e.key&&E()},onKeyUp:e=>{"ArrowDown"===e.key&&w(),"ArrowUp"===e.key&&O()},onChange:e=>{p||(null==h||h(parseFloat(e.target.value)),null==m||m(e))},stepper:f?o.createElement("div",{className:(0,l.q)("flex justify-center align-middle")},o.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;p||(null===(e=v.current)||void 0===e||e.stepDown(),null===(t=v.current)||void 0===t||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,l.q)(!p&&d,u,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},o.createElement(a,{"data-testid":"step-down",className:(y?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"})),o.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;p||(null===(e=v.current)||void 0===e||e.stepUp(),null===(t=v.current)||void 0===t||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,l.q)(!p&&d,u,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},o.createElement(i,{"data-testid":"step-up",className:(k?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"}))):null},g))});f.displayName="NumberInput"},54250:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var r=n(5853),o=n(2265),i=n(44140),a=n(34237),l=n(33044),s=n(58747),c=n(4537),u=n(97324),d=n(1153),f=n(96398);let p=(0,d.fn)("SearchSelect"),h=(0,d.fn)("SearchSelect"),m=o.forwardRef((e,t)=>{let{defaultValue:n,value:d,onValueChange:m,placeholder:g="Select...",disabled:v=!1,icon:y,enableClear:b=!0,children:x,className:w}=e,k=(0,r._T)(e,["defaultValue","value","onValueChange","placeholder","disabled","icon","enableClear","children","className"]),[S,E]=(0,o.useState)(""),[O,C]=(0,i.Z)(n,d),{reactElementChildren:j,valueToNameMapping:_}=(0,o.useMemo)(()=>{let e=o.Children.toArray(x).filter(o.isValidElement);return{reactElementChildren:e,valueToNameMapping:(0,f.sl)(e)}},[x]),P=(0,o.useMemo)(()=>(0,f.n0)(S,j),[S,j]);return o.createElement(a.h,Object.assign({as:"div",ref:t,defaultValue:O,value:O,onChange:e=>{null==m||m(e),C(e)},disabled:v,className:(0,u.q)("w-full min-w-[10rem] relative text-tremor-default",w)},k),e=>{let{value:t}=e;return o.createElement(o.Fragment,null,o.createElement(a.h.Button,{className:"w-full"},y&&o.createElement("span",{className:(0,u.q)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},o.createElement(y,{className:(0,u.q)(p("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement(a.h.Input,{className:(0,u.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 text-tremor-default pr-14 border py-2","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",y?"pl-10":"pl-3",v?"placeholder:text-tremor-content-subtle dark:placeholder:text-tremor-content-subtle":"placeholder:text-tremor-content dark:placeholder:text-tremor-content",(0,f.um)((0,f.Uh)(t),v)),placeholder:g,onChange:e=>E(e.target.value),displayValue:e=>{var t;return null!==(t=_.get(e))&&void 0!==t?t:""}}),o.createElement("div",{className:(0,u.q)("absolute inset-y-0 right-0 flex items-center pr-2.5")},o.createElement(s.Z,{className:(0,u.q)(p("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),b&&O?o.createElement("button",{type:"button",className:(0,u.q)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),C(""),E(""),null==m||m("")}},o.createElement(c.Z,{className:(0,u.q)(h("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,P.length>0&&o.createElement(l.u,{className:"absolute z-10 w-full",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},o.createElement(a.h.Options,{className:(0,u.q)("divide-y overflow-y-auto outline-none rounded-tremor-default text-tremor-default max-h-[228px] left-0 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},P)))})});m.displayName="SearchSelect"},70450:function(e,t,n){"use strict";n.d(t,{Z:function(){return c}});var r=n(5853),o=n(2265),i=n(97324),a=n(1153),l=n(34237);let s=(0,a.fn)("SearchSelectItem"),c=o.forwardRef((e,t)=>{let{value:n,icon:a,className:c,children:u}=e,d=(0,r._T)(e,["value","icon","className","children"]);return o.createElement(l.h.Option,Object.assign({className:(0,i.q)(s("root"),"flex justify-start items-center cursor-default text-tremor-default p-2.5","ui-active:bg-tremor-background-muted ui-active:text-tremor-content-strong ui-selected:text-tremor-content-strong ui-selected:bg-tremor-background-muted text-tremor-content-emphasis","dark:ui-active:bg-dark-tremor-background-muted dark:ui-active:text-dark-tremor-content-strong dark:ui-selected:text-dark-tremor-content-strong dark:ui-selected:bg-dark-tremor-background-muted dark:text-dark-tremor-content-emphasis",c),ref:t,key:n,value:n},d),a&&o.createElement(a,{className:(0,i.q)(s("icon"),"flex-none h-5 w-5 mr-3","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}),o.createElement("span",{className:"whitespace-nowrap truncate"},null!=u?u:n))});c.displayName="SearchSelectItem"},27281:function(e,t,n){"use strict";n.d(t,{Z:function(){return h}});var r=n(5853),o=n(2265),i=n(58747),a=n(4537),l=n(97324),s=n(1153),c=n(96398),u=n(9528),d=n(33044),f=n(44140);let p=(0,s.fn)("Select"),h=o.forwardRef((e,t)=>{let{defaultValue:n,value:s,onValueChange:h,placeholder:m="Select...",disabled:g=!1,icon:v,enableClear:y=!0,children:b,className:x}=e,w=(0,r._T)(e,["defaultValue","value","onValueChange","placeholder","disabled","icon","enableClear","children","className"]),[k,S]=(0,f.Z)(n,s),E=(0,o.useMemo)(()=>{let e=o.Children.toArray(b).filter(o.isValidElement);return(0,c.sl)(e)},[b]);return o.createElement(u.R,Object.assign({as:"div",ref:t,defaultValue:k,value:k,onChange:e=>{null==h||h(e),S(e)},disabled:g,className:(0,l.q)("w-full min-w-[10rem] relative text-tremor-default",x)},w),e=>{var t;let{value:n}=e;return o.createElement(o.Fragment,null,o.createElement(u.R.Button,{className:(0,l.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 border pr-8 py-2","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",v?"pl-10":"pl-3",(0,c.um)((0,c.Uh)(n),g))},v&&o.createElement("span",{className:(0,l.q)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},o.createElement(v,{className:(0,l.q)(p("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("span",{className:"w-[90%] block truncate"},n&&null!==(t=E.get(n))&&void 0!==t?t:m),o.createElement("span",{className:(0,l.q)("absolute inset-y-0 right-0 flex items-center mr-3")},o.createElement(i.Z,{className:(0,l.q)(p("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),y&&k?o.createElement("button",{type:"button",className:(0,l.q)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),S(""),null==h||h("")}},o.createElement(a.Z,{className:(0,l.q)(p("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,o.createElement(d.u,{className:"absolute z-10 w-full",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},o.createElement(u.R.Options,{className:(0,l.q)("divide-y overflow-y-auto outline-none rounded-tremor-default max-h-[228px] left-0 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},b)))})});h.displayName="Select"},57365:function(e,t,n){"use strict";n.d(t,{Z:function(){return s}});var r=n(5853),o=n(2265),i=n(9528),a=n(97324);let l=(0,n(1153).fn)("SelectItem"),s=o.forwardRef((e,t)=>{let{value:n,icon:s,className:c,children:u}=e,d=(0,r._T)(e,["value","icon","className","children"]);return o.createElement(i.R.Option,Object.assign({className:(0,a.q)(l("root"),"flex justify-start items-center cursor-default text-tremor-default px-2.5 py-2.5","ui-active:bg-tremor-background-muted ui-active:text-tremor-content-strong ui-selected:text-tremor-content-strong ui-selected:bg-tremor-background-muted text-tremor-content-emphasis","dark:ui-active:bg-dark-tremor-background-muted dark:ui-active:text-dark-tremor-content-strong dark:ui-selected:text-dark-tremor-content-strong dark:ui-selected:bg-dark-tremor-background-muted dark:text-dark-tremor-content-emphasis",c),ref:t,key:n,value:n},d),s&&o.createElement(s,{className:(0,a.q)(l("icon"),"flex-none w-5 h-5 mr-1.5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}),o.createElement("span",{className:"whitespace-nowrap truncate"},null!=u?u:n))});s.displayName="SelectItem"},92858:function(e,t,n){"use strict";n.d(t,{Z:function(){return T}});var r=n(5853),o=n(2265),i=n(62963),a=n(90945),l=n(13323),s=n(17684),c=n(80004),u=n(93689),d=n(38198),f=n(47634),p=n(56314),h=n(27847),m=n(64518);let g=(0,o.createContext)(null),v=Object.assign((0,h.yV)(function(e,t){let n=(0,s.M)(),{id:r="headlessui-description-".concat(n),...i}=e,a=function e(){let t=(0,o.useContext)(g);if(null===t){let t=Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,e),t}return t}(),l=(0,u.T)(t);(0,m.e)(()=>a.register(r),[r,a.register]);let c={ref:l,...a.props,id:r};return(0,h.sY)({ourProps:c,theirProps:i,slot:a.slot||{},defaultTag:"p",name:a.name||"Description"})}),{});var y=n(37388);let b=(0,o.createContext)(null),x=Object.assign((0,h.yV)(function(e,t){let n=(0,s.M)(),{id:r="headlessui-label-".concat(n),passive:i=!1,...a}=e,l=function e(){let t=(0,o.useContext)(b);if(null===t){let t=Error("You used a