From 0622ce3f2c44c7602bbafba707cee4aee4df328b Mon Sep 17 00:00:00 2001 From: jquinter Date: Fri, 23 Jan 2026 00:34:29 -0300 Subject: [PATCH 01/38] Fix/nova grounding (#19598) * added support for nova grounding for amazon nova model * added citations support * added integration tests * removing test file * refactor: Use web_search_options for Nova grounding instead of system_tool --------- Co-authored-by: Juhie Co-authored-by: Juhie <75068056+juhiechandra@users.noreply.github.com> --- .../prompt_templates/factory.py | 3 +- .../bedrock/chat/converse_transformation.py | 71 ++- litellm/llms/bedrock/chat/invoke_handler.py | 5 + litellm/types/llms/bedrock.py | 85 +++ poetry.lock | 592 ++++++++++++++++-- .../test_bedrock_completion.py | 285 +++++++++ ...llm_core_utils_prompt_templates_factory.py | 83 ++- 7 files changed, 1057 insertions(+), 67 deletions(-) diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index 30263543fc..1d1e38c09d 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -4408,7 +4408,7 @@ def _bedrock_tools_pt(tools: List) -> List[BedrockToolBlock]: ] """ """ - Bedrock toolConfig looks like: + Bedrock toolConfig looks like: "tools": [ { "toolSpec": { @@ -4436,6 +4436,7 @@ def _bedrock_tools_pt(tools: List) -> List[BedrockToolBlock]: tool_block_list: List[BedrockToolBlock] = [] for tool in tools: + # Handle regular function tools parameters = tool.get("function", {}).get( "parameters", {"type": "object", "properties": {}} ) diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index cb26a22edf..2ec27a7af0 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -298,6 +298,39 @@ class AmazonConverseConfig(BaseConfig): # Check if the model is specifically Nova Lite 2 return "nova-2-lite" in model_without_region + def _map_web_search_options( + self, + web_search_options: dict, + model: str + ) -> Optional[BedrockToolBlock]: + """ + Map web_search_options to Nova grounding systemTool. + + Nova grounding (web search) is only supported on Amazon Nova models. + Returns None for non-Nova models. + + Args: + web_search_options: The web_search_options dict from the request + model: The model identifier string + + Returns: + BedrockToolBlock with systemTool for Nova models, None otherwise + + Reference: https://docs.aws.amazon.com/nova/latest/userguide/grounding.html + """ + # Only Nova models support nova_grounding + # Model strings can be like: "amazon.nova-pro-v1:0", "us.amazon.nova-pro-v1:0", etc. + if "nova" not in model.lower(): + verbose_logger.debug( + f"web_search_options passed but model {model} is not a Nova model. " + "Nova grounding is only supported on Amazon Nova models." + ) + return None + + # Nova doesn't support search_context_size or user_location params + # (unlike Anthropic), so we just enable grounding with no options + return BedrockToolBlock(systemTool={"name": "nova_grounding"}) + def _transform_reasoning_effort_to_reasoning_config( self, reasoning_effort: str ) -> dict: @@ -438,6 +471,10 @@ class AmazonConverseConfig(BaseConfig): ): supported_params.append("tools") + # Nova models support web_search_options (mapped to nova_grounding systemTool) + if base_model.startswith("amazon.nova"): + supported_params.append("web_search_options") + if litellm.utils.supports_tool_choice( model=model, custom_llm_provider=self.custom_llm_provider ) or litellm.utils.supports_tool_choice( @@ -730,6 +767,13 @@ class AmazonConverseConfig(BaseConfig): if bedrock_tier in ("default", "flex", "priority"): optional_params["serviceTier"] = {"type": bedrock_tier} + if param == "web_search_options" and value and isinstance(value, dict): + grounding_tool = self._map_web_search_options(value, model) + if grounding_tool is not None: + optional_params = self._add_tools_to_optional_params( + optional_params=optional_params, tools=[grounding_tool] + ) + # Only update thinking tokens for non-GPT-OSS models and non-Nova-Lite-2 models # Nova Lite 2 handles token budgeting differently through reasoningConfig if "gpt-oss" not in model and not self._is_nova_lite_2_model(model): @@ -1388,20 +1432,23 @@ class AmazonConverseConfig(BaseConfig): str, List[ChatCompletionToolCallChunk], Optional[List[BedrockConverseReasoningContentBlock]], + Optional[List[CitationsContentBlock]], ]: """ - Translate the message content to a string and a list of tool calls and reasoning content blocks + Translate the message content to a string and a list of tool calls, reasoning content blocks, and citations. Returns: content_str: str tools: List[ChatCompletionToolCallChunk] reasoningContentBlocks: Optional[List[BedrockConverseReasoningContentBlock]] + citationsContentBlocks: Optional[List[CitationsContentBlock]] - Citations from Nova grounding """ content_str = "" tools: List[ChatCompletionToolCallChunk] = [] reasoningContentBlocks: Optional[List[BedrockConverseReasoningContentBlock]] = ( None ) + citationsContentBlocks: Optional[List[CitationsContentBlock]] = None for idx, content in enumerate(content_blocks): """ - Content is either a tool response or text @@ -1446,8 +1493,13 @@ class AmazonConverseConfig(BaseConfig): if reasoningContentBlocks is None: reasoningContentBlocks = [] reasoningContentBlocks.append(content["reasoningContent"]) + # Handle Nova grounding citations content + if "citationsContent" in content: + if citationsContentBlocks is None: + citationsContentBlocks = [] + citationsContentBlocks.append(content["citationsContent"]) - return content_str, tools, reasoningContentBlocks + return content_str, tools, reasoningContentBlocks, citationsContentBlocks def _transform_response( self, @@ -1525,18 +1577,27 @@ class AmazonConverseConfig(BaseConfig): reasoningContentBlocks: Optional[List[BedrockConverseReasoningContentBlock]] = ( None ) + citationsContentBlocks: Optional[List[CitationsContentBlock]] = None if message is not None: ( content_str, tools, reasoningContentBlocks, + citationsContentBlocks, ) = self._translate_message_content(message["content"]) + # Initialize provider_specific_fields if we have any special content blocks + provider_specific_fields: dict = {} + if reasoningContentBlocks is not None: + provider_specific_fields["reasoningContentBlocks"] = reasoningContentBlocks + if citationsContentBlocks is not None: + provider_specific_fields["citationsContent"] = citationsContentBlocks + + if provider_specific_fields: + chat_completion_message["provider_specific_fields"] = provider_specific_fields + if reasoningContentBlocks is not None: - chat_completion_message["provider_specific_fields"] = { - "reasoningContentBlocks": reasoningContentBlocks, - } chat_completion_message["reasoning_content"] = ( self._transform_reasoning_content(reasoningContentBlocks) ) diff --git a/litellm/llms/bedrock/chat/invoke_handler.py b/litellm/llms/bedrock/chat/invoke_handler.py index dfa1f02a15..77d2a3c0c2 100644 --- a/litellm/llms/bedrock/chat/invoke_handler.py +++ b/litellm/llms/bedrock/chat/invoke_handler.py @@ -1476,6 +1476,11 @@ class AWSEventStreamDecoder: reasoning_content = ( "" # set to non-empty string to ensure consistency with Anthropic ) + elif "citationsContent" in delta_obj: + # Handle Nova grounding citations in streaming responses + provider_specific_fields = { + "citationsContent": delta_obj["citationsContent"], + } return ( text, tool_use, diff --git a/litellm/types/llms/bedrock.py b/litellm/types/llms/bedrock.py index ef2f1ba4d5..a85aaafe23 100644 --- a/litellm/types/llms/bedrock.py +++ b/litellm/types/llms/bedrock.py @@ -93,6 +93,67 @@ class GuardrailConverseContentBlock(TypedDict, total=False): text: GuardrailConverseTextBlock +class CitationWebLocationBlock(TypedDict, total=False): + """ + Web location block for Nova grounding citations. + Contains the URL and domain from web search results. + + Reference: https://docs.aws.amazon.com/nova/latest/userguide/grounding.html + """ + + url: str + domain: str + + +class CitationLocationBlock(TypedDict, total=False): + """ + Location block containing the web location for a citation. + """ + + web: CitationWebLocationBlock + + +class CitationReferenceBlock(TypedDict, total=False): + """ + Citation reference block containing a single citation with its location. + + Each citation contains: + - location.web.url: The URL of the source + - location.web.domain: The domain of the source + """ + + location: CitationLocationBlock + + +class CitationsContentBlock(TypedDict, total=False): + """ + Citations content block returned by Nova grounding (web search) tool. + + When Nova grounding is enabled via systemTool, the model may return + citationsContent blocks containing web search citation references. + + Reference: https://docs.aws.amazon.com/nova/latest/userguide/grounding.html + + Example response structure: + { + "citationsContent": { + "citations": [ + { + "location": { + "web": { + "url": "https://example.com/article", + "domain": "example.com" + } + } + } + ] + } + } + """ + + citations: List[CitationReferenceBlock] + + class ContentBlock(TypedDict, total=False): text: str image: ImageBlock @@ -103,6 +164,7 @@ class ContentBlock(TypedDict, total=False): cachePoint: CachePointBlock reasoningContent: BedrockConverseReasoningContentBlock guardContent: GuardrailConverseContentBlock + citationsContent: CitationsContentBlock class MessageBlock(TypedDict): @@ -159,8 +221,24 @@ class ToolSpecBlock(TypedDict, total=False): description: str +class SystemToolBlock(TypedDict, total=False): + """ + System tool block for Nova grounding and other built-in tools. + + Example: + { + "systemTool": { + "name": "nova_grounding" + } + } + """ + + name: Required[str] + + class ToolBlock(TypedDict, total=False): toolSpec: Optional[ToolSpecBlock] + systemTool: Optional[SystemToolBlock] cachePoint: Optional[CachePointBlock] @@ -210,11 +288,13 @@ class ContentBlockStartEvent(TypedDict, total=False): class ContentBlockDeltaEvent(TypedDict, total=False): """ Either 'text' or 'toolUse' will be specified for Converse API streaming response. + May also include 'citationsContent' when Nova grounding is enabled. """ text: str toolUse: ToolBlockDeltaEvent reasoningContent: BedrockConverseReasoningContentBlockDelta + citationsContent: CitationsContentBlock class PerformanceConfigBlock(TypedDict): @@ -879,3 +959,8 @@ class BedrockGetBatchResponse(TypedDict, total=False): outputDataConfig: BedrockOutputDataConfig timeoutDurationInHours: Optional[int] clientRequestToken: Optional[str] + +class BedrockToolBlock(TypedDict, total=False): + toolSpec: Optional[ToolSpecBlock] + systemTool: Optional[SystemToolBlock] # For Nova grounding + cachePoint: Optional[CachePointBlock] diff --git a/poetry.lock b/poetry.lock index c5f5a87894..e5ef1750da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -275,7 +275,7 @@ files = [ {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\""} +markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [[package]] name = "annotated-types" @@ -343,7 +343,7 @@ zookeeper = ["kazoo"] name = "async-timeout" version = "5.0.1" description = "Timeout context manager for asyncio programs" -optional = true +optional = false python-versions = ">=3.8" groups = ["main"] markers = "python_full_version < \"3.11.3\" and (extra == \"extra-proxy\" or extra == \"proxy\" or python_version < \"3.11\")" @@ -557,48 +557,48 @@ files = [ [[package]] name = "boto3" -version = "1.36.0" +version = "1.40.76" description = "The AWS SDK for Python" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "boto3-1.36.0-py3-none-any.whl", hash = "sha256:d0ca7a58ce25701a52232cc8df9d87854824f1f2964b929305722ebc7959d5a9"}, - {file = "boto3-1.36.0.tar.gz", hash = "sha256:159898f51c2997a12541c0e02d6e5a8fe2993ddb307b9478fd9a339f98b57e00"}, + {file = "boto3-1.40.76-py3-none-any.whl", hash = "sha256:8df6df755727be40ad9e309cfda07f9a12c147e17b639430c55d4e4feee8a167"}, + {file = "boto3-1.40.76.tar.gz", hash = "sha256:16f4cf97f8dd8e0aae015f4dc66219bd7716a91a40d1e2daa0dafa241a4761c5"}, ] [package.dependencies] -botocore = ">=1.36.0,<1.37.0" +botocore = ">=1.40.76,<1.41.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.11.0,<0.12.0" +s3transfer = ">=0.14.0,<0.15.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.36.26" +version = "1.40.76" description = "Low-level, data-driven core of boto 3." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "botocore-1.36.26-py3-none-any.whl", hash = "sha256:4e3f19913887a58502e71ef8d696fe7eaa54de7813ff73390cd5883f837dfa6e"}, - {file = "botocore-1.36.26.tar.gz", hash = "sha256:4a63bcef7ecf6146fd3a61dc4f9b33b7473b49bdaf1770e9aaca6eee0c9eab62"}, + {file = "botocore-1.40.76-py3-none-any.whl", hash = "sha256:fe425d386e48ac64c81cbb4a7181688d813df2e2b4c78b95ebe833c9e868c6f4"}, + {file = "botocore-1.40.76.tar.gz", hash = "sha256:2b16024d68b29b973005adfb5039adfe9099ebe772d40a90ca89f2e165c495dc"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] -crt = ["awscrt (==0.23.8)"] +crt = ["awscrt (==0.28.4)"] [[package]] name = "cachetools" @@ -607,7 +607,7 @@ description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "cachetools-6.2.2-py3-none-any.whl", hash = "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace"}, {file = "cachetools-6.2.2.tar.gz", hash = "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6"}, @@ -1393,6 +1393,24 @@ docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] ssh = ["paramiko (>=2.4.3)"] websockets = ["websocket-client (>=1.3.0)"] +[[package]] +name = "docstring-parser" +version = "0.17.0" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708"}, + {file = "docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912"}, +] + +[package.extras] +dev = ["pre-commit (>=2.16.0) ; python_version >= \"3.9\"", "pydoctor (>=25.4.0)", "pytest"] +docs = ["pydoctor (>=25.4.0)"] +test = ["pytest"] + [[package]] name = "docutils" version = "0.21.2" @@ -1453,7 +1471,7 @@ files = [ {file = "fastapi-0.121.3-py3-none-any.whl", hash = "sha256:0c78fc87587fcd910ca1bbf5bc8ba37b80e119b388a7206b39f0ecc95ebf53e9"}, {file = "fastapi-0.121.3.tar.gz", hash = "sha256:0055bc24fe53e56a40e9e0ad1ae2baa81622c406e548e501e717634e2dfbc40b"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\""} +markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [package.dependencies] annotated-doc = ">=0.0.2" @@ -1982,7 +2000,7 @@ description = "Google API client core library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version >= \"3.14\" and extra == \"extra-proxy\"" +markers = "python_version >= \"3.14\" and (extra == \"extra-proxy\" or extra == \"google\")" files = [ {file = "google_api_core-2.25.2-py3-none-any.whl", hash = "sha256:e9a8f62d363dc8424a8497f4c2a47d6bcda6c16514c935629c257ab5d10210e7"}, {file = "google_api_core-2.25.2.tar.gz", hash = "sha256:1c63aa6af0d0d5e37966f157a77f9396d820fba59f9e43e9415bc3dc5baff300"}, @@ -2010,7 +2028,7 @@ description = "Google API client core library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"extra-proxy\" and python_version < \"3.14\"" +markers = "python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\") or python_version < \"3.14\" and (extra == \"extra-proxy\" or extra == \"google\")" files = [ {file = "google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c"}, {file = "google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8"}, @@ -2020,12 +2038,12 @@ files = [ google-auth = ">=2.14.1,<3.0.0" googleapis-common-protos = ">=1.56.2,<2.0.0" grpcio = [ + {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, - {version = ">=1.33.2,<2.0.0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = [ {version = ">=1.22.3,<2.0.0"}, @@ -2047,7 +2065,7 @@ description = "Google Authentication Library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16"}, {file = "google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483"}, @@ -2056,6 +2074,7 @@ files = [ [package.dependencies] cachetools = ">=2.0.0,<7.0" pyasn1-modules = ">=0.2.1" +requests = {version = ">=2.20.0,<3.0.0", optional = true, markers = "extra == \"requests\""} rsa = ">=3.1.4,<5" [package.extras] @@ -2068,6 +2087,120 @@ requests = ["requests (>=2.20.0,<3.0.0)"] testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] urllib3 = ["packaging", "urllib3"] +[[package]] +name = "google-cloud-aiplatform" +version = "1.130.0" +description = "Vertex AI API client library" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_cloud_aiplatform-1.130.0-py2.py3-none-any.whl", hash = "sha256:f578ccee55655dd9e2300cfcafb178e47c3dfdcf746ad465234b875d3e955929"}, + {file = "google_cloud_aiplatform-1.130.0.tar.gz", hash = "sha256:f66aeb23f0a6848fc2d5bbdf1b5777c3cf8e06056f73ef815317abf89d5a0262"}, +] + +[package.dependencies] +docstring_parser = "<1" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0" +google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0" +google-cloud-resource-manager = ">=1.3.3,<3.0.0" +google-cloud-storage = [ + {version = ">=1.32.0,<4.0.0", markers = "python_version < \"3.13\""}, + {version = ">=2.10.0,<4.0.0", markers = "python_version >= \"3.13\""}, +] +google-genai = ">=1.37.0,<2.0.0" +packaging = ">=14.3" +proto-plus = ">=1.22.3,<2.0.0" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" +pydantic = "<3" +shapely = "<3.0.0" +typing_extensions = "*" + +[package.extras] +adk = ["google-adk (>=1.0.0,<2.0.0)", "opentelemetry-instrumentation-google-genai (>=0.3b0,<1.0.0)"] +ag2 = ["ag2[gemini]", "openinference-instrumentation-autogen (>=0.1.6,<0.2)"] +ag2-testing = ["absl-py", "ag2[gemini]", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "openinference-instrumentation-autogen (>=0.1.6,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +agent-engines = ["cloudpickle (>=3.0,<4.0)", "google-cloud-logging (<4)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "packaging (>=24.0)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +autologging = ["mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\""] +cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] +datasets = ["pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\""] +endpoint = ["requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)"] +evaluation = ["jsonschema", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "pandas (>=1.0.0)", "pyyaml", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "tqdm (>=4.23.0)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "jsonschema", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)"] +langchain = ["langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] +langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.3,<0.4)", "langchain-core (>=0.3,<0.4)", "langchain-google-vertexai (>=2.0.22,<3)", "langgraph (>=0.2.45,<0.4)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +lit = ["explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] +llama-index = ["llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)"] +llama-index-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "llama-index", "llama-index-llms-google-genai", "openinference-instrumentation-llama-index (>=3.0,<4.0)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "pytest-xdist", "typing_extensions"] +metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] +pipelines = ["pyyaml (>=5.3.1,<7)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.114.0)", "httpx (>=0.23.0,<=0.28.1)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\""] +ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "ray[train]", "scikit-learn (<1.6.0)", "tensorflow ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost_ray"] +reasoningengine = ["cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-logging (>=1.11.0a0,<2.0.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-exporter-otlp-proto-http (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.11.1,<3)", "typing_extensions"] +tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "werkzeug (>=2.0.0,<4.0.0)"] +testing = ["Pillow", "aiohttp", "bigframes ; python_version >= \"3.10\" and python_version < \"3.14\"", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0) ; python_version < \"3.13\"", "fastapi (>=0.71.0,<=0.114.0)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-vizier (>=0.1.6)", "google-vizier (>=0.1.6)", "grpcio-testing", "grpcio-tools (>=1.63.0) ; python_version >= \"3.13\"", "httpx (>=0.23.0,<=0.28.1)", "immutabledict", "immutabledict", "ipython", "jsonschema", "kfp (>=2.6.0,<3.0.0) ; python_version < \"3.13\"", "lit-nlp (==0.4.0) ; python_version < \"3.14\"", "litellm (>=1.72.4,!=1.77.2,!=1.77.3,!=1.77.4)", "mlflow (>=1.27.0) ; python_version >= \"3.13\"", "mlflow (>=1.27.0,<=2.16.0) ; python_version < \"3.13\"", "mock", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "protobuf (<=5.29.4)", "pyarrow (>=10.0.1) ; python_version == \"3.11\"", "pyarrow (>=14.0.0) ; python_version >= \"3.12\"", "pyarrow (>=3.0.0,<8.0.0) ; python_version < \"3.11\"", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-cov", "pytest-xdist", "pyyaml", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<2.10.dev0 || ==2.33.* || >=2.42.dev0,<=2.42.0) ; python_version < \"3.11\"", "ray[default] (>=2.5,<=2.47.1) ; python_version == \"3.11\"", "requests (>=2.28.1)", "requests-toolbelt (<=1.0.0)", "requests-toolbelt (<=1.0.0)", "ruamel.yaml", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn (<1.6.0) ; python_version <= \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "scikit-learn ; python_version > \"3.10\"", "sentencepiece (>=0.2.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorboard-plugin-profile (>=2.4.0,<2.18.0)", "tensorflow (==2.14.1) ; python_version <= \"3.11\"", "tensorflow (==2.19.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\"", "torch (>=2.0.0,<2.1.0) ; python_version <= \"3.11\"", "torch (>=2.2.0) ; python_version > \"3.11\" and python_version < \"3.13\"", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<4.0.0)", "werkzeug (>=2.0.0,<4.0.0)", "xgboost"] +tokenization = ["sentencepiece (>=0.2.0)"] +vizier = ["google-vizier (>=0.1.6)"] +xai = ["tensorflow (>=2.3.0,<3.0.0) ; python_version < \"3.13\""] + +[[package]] +name = "google-cloud-bigquery" +version = "3.40.0" +description = "Google BigQuery API client library" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_cloud_bigquery-3.40.0-py3-none-any.whl", hash = "sha256:0469bcf9e3dad3cab65b67cce98180c8c0aacf3253d47f0f8e976f299b49b5ab"}, + {file = "google_cloud_bigquery-3.40.0.tar.gz", hash = "sha256:b3ccb11caf0029f15b29569518f667553fe08f6f1459b959020c83fbbd8f2e68"}, +] + +[package.dependencies] +google-api-core = {version = ">=2.11.1,<3.0.0", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0" +google-cloud-core = ">=2.4.1,<3.0.0" +google-resumable-media = ">=2.0.0,<3.0.0" +packaging = ">=24.2.0" +python-dateutil = ">=2.8.2,<3.0.0" +requests = ">=2.21.0,<3.0.0" + +[package.extras] +all = ["google-cloud-bigquery[bigquery-v2,bqstorage,geopandas,ipython,ipywidgets,matplotlib,opentelemetry,pandas,tqdm]"] +bigquery-v2 = ["proto-plus (>=1.22.3,<2.0.0)", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.18.0,<3.0.0)", "grpcio (>=1.47.0,<2.0.0)", "grpcio (>=1.49.1,<2.0.0) ; python_version >= \"3.11\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "pyarrow (>=4.0.0)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0)", "geopandas (>=0.9.0,<2.0.0)"] +ipython = ["bigquery-magics (>=0.6.0)", "ipython (>=7.23.1)"] +ipywidgets = ["ipykernel (>=6.2.0)", "ipywidgets (>=7.7.1)"] +matplotlib = ["matplotlib (>=3.10.3) ; python_version >= \"3.10\"", "matplotlib (>=3.7.1,<=3.9.2) ; python_version == \"3.9\""] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=1.0.4,<2.0.0)", "grpcio (>=1.47.0,<2.0.0)", "grpcio (>=1.49.1,<2.0.0) ; python_version >= \"3.11\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "pandas (>=1.3.0)", "pandas-gbq (>=0.26.1)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.23.4,<5.0.0)"] + +[[package]] +name = "google-cloud-core" +version = "2.5.0" +description = "Google Cloud API client core library" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc"}, + {file = "google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0" +google-auth = ">=1.25.0,<3.0.0" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.38.0,<2.0.0)"] + [[package]] name = "google-cloud-iam" version = "2.20.0" @@ -2115,6 +2248,204 @@ grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +[[package]] +name = "google-cloud-resource-manager" +version = "1.16.0" +description = "Google Cloud Resource Manager API client library" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_cloud_resource_manager-1.16.0-py3-none-any.whl", hash = "sha256:fb9a2ad2b5053c508e1c407ac31abfd1a22e91c32876c1892830724195819a28"}, + {file = "google_cloud_resource_manager-1.16.0.tar.gz", hash = "sha256:cc938f87cc36c2672f062b1e541650629e0d954c405a4dac35ceedee70c267c3"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0" +grpc-google-iam-v1 = ">=0.14.0,<1.0.0" +grpcio = [ + {version = ">=1.33.2,<2.0.0"}, + {version = ">=1.75.1,<2.0.0", markers = "python_version >= \"3.14\""}, +] +proto-plus = [ + {version = ">=1.22.3,<2.0.0"}, + {version = ">=1.25.0,<2.0.0", markers = "python_version >= \"3.13\""}, +] +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" + +[[package]] +name = "google-cloud-storage" +version = "3.4.1" +description = "Google Cloud Storage API client library" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"google\" and python_version >= \"3.14\"" +files = [ + {file = "google_cloud_storage-3.4.1-py3-none-any.whl", hash = "sha256:972764cc0392aa097be8f49a5354e22eb47c3f62370067fb1571ffff4a1c1189"}, + {file = "google_cloud_storage-3.4.1.tar.gz", hash = "sha256:6f041a297e23a4b485fad8c305a7a6e6831855c208bcbe74d00332a909f82268"}, +] + +[package.dependencies] +google-api-core = ">=2.15.0,<3.0.0" +google-auth = ">=2.26.1,<3.0.0" +google-cloud-core = ">=2.4.2,<3.0.0" +google-crc32c = ">=1.1.3,<2.0.0" +google-resumable-media = ">=2.7.2,<3.0.0" +requests = ">=2.22.0,<3.0.0" + +[package.extras] +protobuf = ["protobuf (>=3.20.2,<7.0.0)"] +tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] + +[[package]] +name = "google-cloud-storage" +version = "3.8.0" +description = "Google Cloud Storage API client library" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"google\" and python_version < \"3.14\"" +files = [ + {file = "google_cloud_storage-3.8.0-py3-none-any.whl", hash = "sha256:78cfeae7cac2ca9441d0d0271c2eb4ebfa21aa4c6944dd0ccac0389e81d955a7"}, + {file = "google_cloud_storage-3.8.0.tar.gz", hash = "sha256:cc67952dce84ebc9d44970e24647a58260630b7b64d72360cedaf422d6727f28"}, +] + +[package.dependencies] +google-api-core = ">=2.27.0,<3.0.0" +google-auth = ">=2.26.1,<3.0.0" +google-cloud-core = ">=2.4.2,<3.0.0" +google-crc32c = ">=1.1.3,<2.0.0" +google-resumable-media = ">=2.7.2,<3.0.0" +requests = ">=2.22.0,<3.0.0" + +[package.extras] +grpc = ["google-api-core[grpc] (>=2.27.0,<3.0.0)", "grpc-google-iam-v1 (>=0.14.0,<1.0.0)", "grpcio (>=1.33.2,<2.0.0) ; python_version < \"3.14\"", "grpcio (>=1.75.1,<2.0.0) ; python_version >= \"3.14\"", "grpcio-status (>=1.76.0,<2.0.0)", "proto-plus (>=1.22.3,<2.0.0) ; python_version < \"3.13\"", "proto-plus (>=1.25.0,<2.0.0) ; python_version >= \"3.13\"", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0)"] +protobuf = ["protobuf (>=3.20.2,<7.0.0)"] +tracing = ["opentelemetry-api (>=1.1.0,<2.0.0)"] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_crc32c-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff"}, + {file = "google_crc32c-1.8.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288"}, + {file = "google_crc32c-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d"}, + {file = "google_crc32c-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092"}, + {file = "google_crc32c-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733"}, + {file = "google_crc32c-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8"}, + {file = "google_crc32c-1.8.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7"}, + {file = "google_crc32c-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15"}, + {file = "google_crc32c-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a"}, + {file = "google_crc32c-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2"}, + {file = "google_crc32c-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113"}, + {file = "google_crc32c-1.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb"}, + {file = "google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411"}, + {file = "google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454"}, + {file = "google_crc32c-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962"}, + {file = "google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b"}, + {file = "google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27"}, + {file = "google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa"}, + {file = "google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8"}, + {file = "google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f"}, + {file = "google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697"}, + {file = "google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651"}, + {file = "google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2"}, + {file = "google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21"}, + {file = "google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2"}, + {file = "google_crc32c-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ba6aba18daf4d36ad4412feede6221414692f44d17e5428bdd81ad3fc1eee5dc"}, + {file = "google_crc32c-1.8.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:87b0072c4ecc9505cfa16ee734b00cd7721d20a0f595be4d40d3d21b41f65ae2"}, + {file = "google_crc32c-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d488e98b18809f5e322978d4506373599c0c13e6c5ad13e53bb44758e18d215"}, + {file = "google_crc32c-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01f126a5cfddc378290de52095e2c7052be2ba7656a9f0caf4bcd1bfb1833f8a"}, + {file = "google_crc32c-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:61f58b28e0b21fcb249a8247ad0db2e64114e201e2e9b4200af020f3b6242c9f"}, + {file = "google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93"}, + {file = "google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c"}, + {file = "google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79"}, +] + +[[package]] +name = "google-genai" +version = "1.47.0" +description = "GenAI Python SDK" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version == \"3.9\" and extra == \"google\"" +files = [ + {file = "google_genai-1.47.0-py3-none-any.whl", hash = "sha256:e3851237556cbdec96007d8028b4b1f2425cdc5c099a8dc36b72a57e42821b60"}, + {file = "google_genai-1.47.0.tar.gz", hash = "sha256:ecece00d0a04e6739ea76cc8dad82ec9593d9380aaabef078990e60574e5bf59"}, +] + +[package.dependencies] +anyio = ">=4.8.0,<5.0.0" +google-auth = ">=2.14.1,<3.0.0" +httpx = ">=0.28.1,<1.0.0" +pydantic = ">=2.9.0,<3.0.0" +requests = ">=2.28.1,<3.0.0" +tenacity = ">=8.2.3,<9.2.0" +typing-extensions = ">=4.11.0,<5.0.0" +websockets = ">=13.0.0,<15.1.0" + +[package.extras] +aiohttp = ["aiohttp (<4.0.0)"] +local-tokenizer = ["protobuf", "sentencepiece (>=0.2.0)"] + +[[package]] +name = "google-genai" +version = "1.55.0" +description = "GenAI Python SDK" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"google\"" +files = [ + {file = "google_genai-1.55.0-py3-none-any.whl", hash = "sha256:98c422762b5ff6e16b8d9a1e4938e8e0ad910392a5422e47f5301498d7f373a1"}, + {file = "google_genai-1.55.0.tar.gz", hash = "sha256:ae9f1318fedb05c7c1b671a4148724751201e8908a87568364a309804064d986"}, +] + +[package.dependencies] +anyio = ">=4.8.0,<5.0.0" +distro = ">=1.7.0,<2" +google-auth = {version = ">=2.14.1,<3.0.0", extras = ["requests"]} +httpx = ">=0.28.1,<1.0.0" +pydantic = ">=2.9.0,<3.0.0" +requests = ">=2.28.1,<3.0.0" +sniffio = "*" +tenacity = ">=8.2.3,<9.2.0" +typing-extensions = ">=4.11.0,<5.0.0" +websockets = ">=13.0.0,<15.1.0" + +[package.extras] +aiohttp = ["aiohttp (<3.13.3)"] +local-tokenizer = ["protobuf", "sentencepiece (>=0.2.0)"] + +[[package]] +name = "google-resumable-media" +version = "2.8.0" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"google\"" +files = [ + {file = "google_resumable_media-2.8.0-py3-none-any.whl", hash = "sha256:dd14a116af303845a8d932ddae161a26e86cc229645bc98b39f026f9b1717582"}, + {file = "google_resumable_media-2.8.0.tar.gz", hash = "sha256:f1157ed8b46994d60a1bc432544db62352043113684d4e030ee02e77ebe9a1ae"}, +] + +[package.dependencies] +google-crc32c = ">=1.0.0,<2.0.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "google-auth (>=1.22.0,<2.0.0)"] +requests = ["requests (>=2.18.0,<3.0.0)"] + [[package]] name = "googleapis-common-protos" version = "1.72.0" @@ -2126,7 +2457,7 @@ files = [ {file = "googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038"}, {file = "googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5"}, ] -markers = {main = "extra == \"extra-proxy\""} +markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\")"} [package.dependencies] grpcio = {version = ">=1.44.0,<2.0.0", optional = true, markers = "extra == \"grpc\""} @@ -2275,7 +2606,7 @@ description = "IAM API client library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"extra-proxy\"" +markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ {file = "grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6"}, {file = "grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389"}, @@ -2371,7 +2702,7 @@ description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" groups = ["main"] -markers = "extra == \"extra-proxy\"" +markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, @@ -2389,7 +2720,7 @@ description = "WSGI HTTP Server for UNIX" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"proxy\" or (extra == \"proxy\" or extra == \"mlflow\") and platform_system != \"Windows\" and python_version >= \"3.10\"" +markers = "(python_version < \"3.14\" or extra == \"mlflow\" or extra == \"proxy\") and (platform_system != \"Windows\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"mlflow\")" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -3095,15 +3426,15 @@ files = [ [[package]] name = "litellm-proxy-extras" -version = "0.4.23" +version = "0.4.25" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_proxy_extras-0.4.23-py3-none-any.whl", hash = "sha256:dfda21203dde9fd97cf364396a9b5be0cfdf00fa9846439ee33ce11b7a52f9ce"}, - {file = "litellm_proxy_extras-0.4.23.tar.gz", hash = "sha256:8e3f95576dc2a296e7f73d8c87e73628bd899b4644c45863960fe3c3762d8f64"}, + {file = "litellm_proxy_extras-0.4.25-py3-none-any.whl", hash = "sha256:da79e1a7a999020a82ec33c45d8fd35eb390ff3d0bc3d7686542b3529aff2cda"}, + {file = "litellm_proxy_extras-0.4.25.tar.gz", hash = "sha256:a03790e574ec6b8098c74d49836313651c0a0e72354a716c76c50ed16b087815"}, ] [[package]] @@ -3446,8 +3777,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, {version = ">1.20"}, + {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -3860,7 +4191,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(python_version >= \"3.10\" or extra == \"extra-proxy\" or extra == \"semantic-router\") and python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\")" +markers = "python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or python_version >= \"3.10\") and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or extra == \"mlflow\")" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -3907,7 +4238,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\")" +markers = "python_version >= \"3.12\" and (extra == \"extra-proxy\" or extra == \"google\" or extra == \"semantic-router\" or extra == \"mlflow\") and (python_version < \"3.14\" or extra == \"mlflow\" or extra == \"google\")" files = [ {file = "numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10"}, {file = "numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218"}, @@ -4838,7 +5169,7 @@ description = "Beautiful, Pythonic protocol buffers" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"extra-proxy\"" +markers = "extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, @@ -4870,7 +5201,7 @@ files = [ {file = "protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5"}, {file = "protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\""} +markers = {main = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\""} [[package]] name = "pyarrow" @@ -4940,7 +5271,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -4953,7 +5284,7 @@ description = "A collection of ASN.1-based protocols modules" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, @@ -4985,7 +5316,7 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "(platform_python_implementation != \"PyPy\" or extra == \"proxy\") and implementation_name != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} [[package]] name = "pydantic" @@ -5362,7 +5693,7 @@ description = "Extensions to the standard Python datetime module" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\"" +markers = "(extra == \"mlflow\" or extra == \"proxy\" or extra == \"google\") and python_version >= \"3.10\" or extra == \"proxy\" or extra == \"google\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -5422,7 +5753,7 @@ description = "World timezone definitions, modern and historical" optional = true python-versions = "*" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\"" +markers = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\"" files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -6241,7 +6572,7 @@ description = "Pure-Python RSA implementation" optional = true python-versions = "<4,>=3.6" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"extra-proxy\") or extra == \"extra-proxy\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\" or extra == \"mlflow\") and python_version >= \"3.10\" or extra == \"google\" or extra == \"extra-proxy\"" files = [ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, @@ -6279,22 +6610,22 @@ files = [ [[package]] name = "s3transfer" -version = "0.11.3" +version = "0.14.0" description = "An Amazon S3 Transfer Manager" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "s3transfer-0.11.3-py3-none-any.whl", hash = "sha256:ca855bdeb885174b5ffa95b9913622459d4ad8e331fc98eb01e6d5eb6a30655d"}, - {file = "s3transfer-0.11.3.tar.gz", hash = "sha256:edae4977e3a122445660c7c114bba949f9d191bae3b34a096f18a1c8c354527a"}, + {file = "s3transfer-0.14.0-py3-none-any.whl", hash = "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456"}, + {file = "s3transfer-0.14.0.tar.gz", hash = "sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125"}, ] [package.dependencies] -botocore = ">=1.36.0,<2.0a.0" +botocore = ">=1.37.4,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] +crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] [[package]] name = "scikit-learn" @@ -6542,6 +6873,141 @@ postgres = ["psycopg[binary] (>=3.1.0,<4)"] qdrant = ["qdrant-client (>=1.11.1,<2)"] vision = ["pillow (>=10.2.0,<11.0.0) ; python_version < \"3.13\"", "torch (>=2.6.0) ; python_version < \"3.13\"", "torchvision (>=0.17.0) ; python_version < \"3.13\"", "transformers (>=4.36.2) ; python_version < \"3.13\""] +[[package]] +name = "shapely" +version = "2.0.7" +description = "Manipulation and analysis of geometric objects" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version == \"3.9\" and extra == \"google\"" +files = [ + {file = "shapely-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691"}, + {file = "shapely-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98"}, + {file = "shapely-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895"}, + {file = "shapely-2.0.7-cp310-cp310-win32.whl", hash = "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2"}, + {file = "shapely-2.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34"}, + {file = "shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0"}, + {file = "shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3"}, + {file = "shapely-2.0.7-cp311-cp311-win32.whl", hash = "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2"}, + {file = "shapely-2.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa"}, + {file = "shapely-2.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e"}, + {file = "shapely-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73"}, + {file = "shapely-2.0.7-cp312-cp312-win32.whl", hash = "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd"}, + {file = "shapely-2.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb"}, + {file = "shapely-2.0.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36"}, + {file = "shapely-2.0.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98"}, + {file = "shapely-2.0.7-cp313-cp313-win32.whl", hash = "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913"}, + {file = "shapely-2.0.7-cp313-cp313-win_amd64.whl", hash = "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e"}, + {file = "shapely-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc"}, + {file = "shapely-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98"}, + {file = "shapely-2.0.7-cp37-cp37m-win32.whl", hash = "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d"}, + {file = "shapely-2.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36"}, + {file = "shapely-2.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611"}, + {file = "shapely-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24"}, + {file = "shapely-2.0.7-cp38-cp38-win32.whl", hash = "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532"}, + {file = "shapely-2.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5"}, + {file = "shapely-2.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b"}, + {file = "shapely-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27"}, + {file = "shapely-2.0.7-cp39-cp39-win32.whl", hash = "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999"}, + {file = "shapely-2.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5"}, + {file = "shapely-2.0.7.tar.gz", hash = "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "shapely" +version = "2.1.2" +description = "Manipulation and analysis of geometric objects" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"google\"" +files = [ + {file = "shapely-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f"}, + {file = "shapely-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0"}, + {file = "shapely-2.1.2-cp310-cp310-win32.whl", hash = "sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e"}, + {file = "shapely-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2"}, + {file = "shapely-2.1.2-cp311-cp311-win32.whl", hash = "sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6"}, + {file = "shapely-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d"}, + {file = "shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454"}, + {file = "shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd"}, + {file = "shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350"}, + {file = "shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99"}, + {file = "shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf"}, + {file = "shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc"}, + {file = "shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566"}, + {file = "shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0"}, + {file = "shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735"}, + {file = "shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9"}, + {file = "shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9"}, +] + +[package.dependencies] +numpy = ">=1.21" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov", "scipy-doctest"] + [[package]] name = "shellingham" version = "1.5.4" @@ -6561,7 +7027,7 @@ description = "Python 2 and 3 compatibility utilities" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\"" +markers = "(extra == \"mlflow\" or extra == \"proxy\" or extra == \"google\") and python_version >= \"3.10\" or extra == \"proxy\" or extra == \"google\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -6984,6 +7450,26 @@ examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] granian = ["granian (>=2.3.1)"] uvicorn = ["uvicorn (>=0.34.0)"] +[[package]] +name = "starlette" +version = "0.49.3" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, + {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, +] +markers = {main = "python_version == \"3.9\" and extra == \"proxy\"", dev = "python_version == \"3.9\""} + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + [[package]] name = "starlette" version = "0.50.0" @@ -6995,7 +7481,7 @@ files = [ {file = "starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca"}, {file = "starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\""} +markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\")", dev = "python_version >= \"3.10\""} [package.dependencies] anyio = ">=3.6.2,<5" @@ -7044,7 +7530,7 @@ description = "Retry code until it succeeds" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"extra-proxy\" and python_version < \"3.14\"" +markers = "(extra == \"extra-proxy\" or extra == \"google\") and (python_version < \"3.14\" or extra == \"google\")" files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -7522,7 +8008,7 @@ description = "The lightning-fast ASGI server." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\") or extra == \"proxy\"" +markers = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\"" files = [ {file = "uvicorn-0.31.1-py3-none-any.whl", hash = "sha256:adc42d9cac80cf3e51af97c1851648066841e7cfb6993a4ca8de29ac1548ed41"}, {file = "uvicorn-0.31.1.tar.gz", hash = "sha256:f5167919867b161b7bcaf32646c6a94cdbd4c3aa2eb5c17d36bb9aa5cfd8c493"}, @@ -7543,7 +8029,7 @@ description = "Fast implementation of asyncio event loop on top of libuv" optional = true python-versions = ">=3.8.0" groups = ["main"] -markers = "sys_platform != \"win32\" and extra == \"proxy\"" +markers = "extra == \"proxy\" and sys_platform != \"win32\"" files = [ {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, @@ -7613,7 +8099,7 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"proxy\"" +markers = "extra == \"google\" or extra == \"proxy\"" files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -7996,7 +8482,7 @@ type = ["pytest-mypy"] [extras] caching = ["diskcache"] extra-proxy = ["a2a-sdk", "azure-identity", "azure-keyvault-secrets", "google-cloud-iam", "google-cloud-kms", "prisma", "redisvl", "resend"] -grpc = ["grpcio", "grpcio"] +google = ["google-cloud-aiplatform"] mlflow = ["mlflow"] proxy = ["PyJWT", "apscheduler", "azure-identity", "azure-storage-blob", "backoff", "boto3", "cryptography", "fastapi", "fastapi-sso", "gunicorn", "litellm-enterprise", "litellm-proxy-extras", "mcp", "orjson", "polars", "pynacl", "python-multipart", "pyyaml", "rich", "rq", "soundfile", "uvicorn", "uvloop", "websockets"] semantic-router = ["semantic-router"] @@ -8005,4 +8491,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "f6a98e687d478db6e30274a4cf70391960775cbf648da0783558444da3a662ea" +content-hash = "76f5b5fb10667c2dcf428976292672e7a1f3f2eb5f5bf78998e2192899f5037e" diff --git a/tests/llm_translation/test_bedrock_completion.py b/tests/llm_translation/test_bedrock_completion.py index 7c0db41d13..d48dd1bfd9 100644 --- a/tests/llm_translation/test_bedrock_completion.py +++ b/tests/llm_translation/test_bedrock_completion.py @@ -3954,3 +3954,288 @@ def test_bedrock_openai_error_handling(): assert exc_info.value.status_code == 422 print("✓ Error handling works correctly") + +# ============================================================================ +# Nova Grounding (web_search_options) Unit Tests (Mocked) +# ============================================================================ + +def test_bedrock_nova_grounding_web_search_options_non_streaming(): + """ + Unit test for Nova grounding using web_search_options parameter (non-streaming). + + This test mocks the HTTP call to verify: + 1. web_search_options is correctly mapped to systemTool for Nova models + 2. The request structure is correct + + Related: https://docs.aws.amazon.com/nova/latest/userguide/grounding.html + """ + from unittest.mock import patch, MagicMock + from litellm.llms.custom_httpx.http_handler import HTTPHandler + + client = HTTPHandler() + + messages = [ + { + "role": "user", + "content": "What is the current population of Tokyo, Japan?", + } + ] + + with patch.object(client, "post") as mock_post: + try: + completion( + model="us.amazon.nova-pro-v1:0", # No bedrock/ prefix when using api_base + messages=messages, + web_search_options={}, # Enables Nova grounding + max_tokens=500, + client=client, + api_base="https://bedrock-runtime.us-east-1.amazonaws.com", + ) + except Exception: + pass # Expected - we're just checking the request structure + + # Verify the request was made correctly + if mock_post.called: + request_body = json.loads(mock_post.call_args.kwargs.get("data", "{}")) + print(f"Request body: {json.dumps(request_body, indent=2)}") + + # Verify toolConfig is present with systemTool + assert "toolConfig" in request_body, "toolConfig should be in request" + tool_config = request_body["toolConfig"] + assert "tools" in tool_config, "tools should be in toolConfig" + + # Find the systemTool for nova_grounding + system_tool_found = False + for tool in tool_config["tools"]: + if "systemTool" in tool: + assert tool["systemTool"]["name"] == "nova_grounding" + system_tool_found = True + break + + assert system_tool_found, "systemTool with nova_grounding should be present" + print(f"✓ web_search_options correctly transformed to systemTool (non-streaming)") + + +def test_bedrock_nova_grounding_with_function_tools(): + """ + Unit test for Nova grounding combined with regular function tools. + + This tests the scenario where users want both web grounding AND + custom function calling capabilities. + """ + from unittest.mock import patch + from litellm.llms.custom_httpx.http_handler import HTTPHandler + + client = HTTPHandler() + + # Regular function tool + tools = [ + { + "type": "function", + "function": { + "name": "get_stock_price", + "description": "Get the current stock price for a given ticker symbol", + "parameters": { + "type": "object", + "properties": { + "ticker": { + "type": "string", + "description": "The stock ticker symbol, e.g. AAPL, GOOGL", + } + }, + "required": ["ticker"], + }, + }, + } + ] + + messages = [ + { + "role": "user", + "content": "What is the current market cap of Apple Inc?", + } + ] + + with patch.object(client, "post") as mock_post: + try: + completion( + model="us.amazon.nova-pro-v1:0", # No bedrock/ prefix when using api_base + messages=messages, + tools=tools, + web_search_options={}, # Also enable web grounding + max_tokens=500, + client=client, + api_base="https://bedrock-runtime.us-east-1.amazonaws.com", + ) + except Exception: + pass # Expected - we're just checking the request structure + + # Verify the request was made correctly + if mock_post.called: + request_body = json.loads(mock_post.call_args.kwargs.get("data", "{}")) + print(f"Request body: {json.dumps(request_body, indent=2)}") + + # Verify toolConfig has both function tool and systemTool + assert "toolConfig" in request_body, "toolConfig should be in request" + tool_config = request_body["toolConfig"] + assert "tools" in tool_config, "tools should be in toolConfig" + + tools_in_request = tool_config["tools"] + + # Should have both the function tool and the systemTool + function_tool_found = False + system_tool_found = False + + for tool in tools_in_request: + if "toolSpec" in tool: + assert tool["toolSpec"]["name"] == "get_stock_price" + function_tool_found = True + if "systemTool" in tool: + assert tool["systemTool"]["name"] == "nova_grounding" + system_tool_found = True + + assert function_tool_found, "Function tool (get_stock_price) should be present" + assert system_tool_found, "systemTool (nova_grounding) should be present" + print(f"✓ Both function tools and web_search_options correctly combined") + + +@pytest.mark.asyncio +async def test_bedrock_nova_grounding_async(): + """ + Async unit test for Nova grounding via web_search_options. + + This test verifies the request transformation for async calls. + """ + from unittest.mock import patch, AsyncMock + from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler + + client = AsyncHTTPHandler() + + messages = [ + { + "role": "user", + "content": "What is the weather forecast for New York City today?", + } + ] + + with patch.object(client, "post", new=AsyncMock()) as mock_post: + try: + await litellm.acompletion( + model="us.amazon.nova-pro-v1:0", # No bedrock/ prefix when using api_base + messages=messages, + web_search_options={}, + max_tokens=500, + client=client, + api_base="https://bedrock-runtime.us-east-1.amazonaws.com", + ) + except Exception: + pass # Expected - we're just checking the request structure + + # Verify the request was made correctly + if mock_post.called: + request_body = json.loads(mock_post.call_args.kwargs.get("data", "{}")) + print(f"Request body: {json.dumps(request_body, indent=2)}") + + # Verify toolConfig is present with systemTool + assert "toolConfig" in request_body, "toolConfig should be in request" + tool_config = request_body["toolConfig"] + assert "tools" in tool_config, "tools should be in toolConfig" + + # Find the systemTool for nova_grounding + system_tool_found = False + for tool in tool_config["tools"]: + if "systemTool" in tool: + assert tool["systemTool"]["name"] == "nova_grounding" + system_tool_found = True + break + + assert system_tool_found, "systemTool with nova_grounding should be present" + print(f"✓ Async web_search_options correctly transformed to systemTool") + + +def test_bedrock_nova_web_search_options_ignored_for_non_nova(): + """ + Test that web_search_options is ignored for non-Nova Bedrock models. + + Nova grounding is only supported on Nova models. For other models, + the parameter should be silently ignored. + """ + from litellm.llms.bedrock.chat.converse_transformation import AmazonConverseConfig + + config = AmazonConverseConfig() + + # Should return None for non-Nova models + result = config._map_web_search_options({}, "anthropic.claude-3-sonnet-v1") + assert result is None + + result = config._map_web_search_options({}, "amazon.titan-text-express-v1") + assert result is None + + # Should return systemTool for Nova models + result = config._map_web_search_options({}, "amazon.nova-pro-v1:0") + assert result is not None + system_tool = result.get("systemTool") + assert system_tool is not None + assert system_tool["name"] == "nova_grounding" + + result2 = config._map_web_search_options({}, "us.amazon.nova-premier-v1:0") + assert result2 is not None + system_tool2 = result2.get("systemTool") + assert system_tool2 is not None + assert system_tool2["name"] == "nova_grounding" + + +def test_bedrock_nova_grounding_request_transformation(): + """ + Unit test to verify that web_search_options transforms to systemTool in the request. + """ + from unittest.mock import patch, MagicMock + from litellm.llms.custom_httpx.http_handler import HTTPHandler + + client = HTTPHandler() + + messages = [{"role": "user", "content": "What is the population of Tokyo?"}] + + with patch.object(client, "post") as mock_post: + mock_post.return_value = MagicMock( + status_code=200, + json=lambda: { + "output": {"message": {"role": "assistant", "content": [{"text": "Test"}]}}, + "stopReason": "end_turn", + "usage": {"inputTokens": 10, "outputTokens": 5} + } + ) + + try: + response = completion( + model="bedrock/us.amazon.nova-pro-v1:0", + messages=messages, + web_search_options={}, + max_tokens=100, + client=client, + ) + except Exception: + pass # Expected - we're just checking the request + + if mock_post.called: + request_body = json.loads(mock_post.call_args.kwargs.get("data", "{}")) + print(f"Request body: {json.dumps(request_body, indent=2)}") + + # Verify toolConfig is present with systemTool + assert "toolConfig" in request_body, "toolConfig should be in request" + + tool_config = request_body["toolConfig"] + assert "tools" in tool_config, "tools should be in toolConfig" + + tools_in_request = tool_config["tools"] + + # Find the systemTool + system_tool_found = False + for tool in tools_in_request: + if "systemTool" in tool: + assert tool["systemTool"]["name"] == "nova_grounding" + system_tool_found = True + break + + assert system_tool_found, "systemTool with nova_grounding should be present" + print("✓ web_search_options correctly transformed to systemTool") diff --git a/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py b/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py index a22fe13798..e87233a52a 100644 --- a/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py +++ b/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py @@ -1138,6 +1138,73 @@ def test_bedrock_create_bedrock_block_different_document_formats(): assert block["document"]["name"].endswith(f"_{format_type}") assert block["document"]["format"] == format_type +def test_bedrock_nova_web_search_options_mapping(): + """ + Test that web_search_options is correctly mapped to Nova grounding. + + This follows the LiteLLM pattern for web search where: + - Vertex AI maps web_search_options to {"googleSearch": {}} + - Anthropic maps web_search_options to {"type": "web_search_20250305", ...} + - Nova should map web_search_options to {"systemTool": {"name": "nova_grounding"}} + """ + from litellm.llms.bedrock.chat.converse_transformation import AmazonConverseConfig + + config = AmazonConverseConfig() + + # Test basic mapping for Nova model + result = config._map_web_search_options({}, "amazon.nova-pro-v1:0") + + assert result is not None + system_tool = result.get("systemTool") + assert system_tool is not None + assert system_tool["name"] == "nova_grounding" + + # Test with search_context_size (should be ignored for Nova) + result2 = config._map_web_search_options( + {"search_context_size": "high"}, + "us.amazon.nova-premier-v1:0" + ) + + assert result2 is not None + system_tool2 = result2.get("systemTool") + assert system_tool2 is not None + assert system_tool2["name"] == "nova_grounding" + # Nova doesn't support search_context_size, so it's just ignored + +def test_bedrock_tools_pt_does_not_handle_system_tool(): + """ + Verify that _bedrock_tools_pt does NOT handle system_tool format. + + System tools (nova_grounding) should be added via web_search_options, + not via the tools parameter directly. + """ + + from litellm.litellm_core_utils.prompt_templates.factory import _bedrock_tools_pt + + # Regular function tools should still work + tools = [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the current weather", + "parameters": { + "type": "object", + "properties": { + "location": {"type": "string"} + }, + "required": ["location"] + } + } + } + ] + + result = _bedrock_tools_pt(tools=tools) + + assert len(result) == 1 + tool_spec = result[0].get("toolSpec") + assert tool_spec is not None + assert tool_spec["name"] == "get_weather" def test_convert_to_anthropic_tool_result_image_with_cache_control(): """ @@ -1305,12 +1372,12 @@ def test_convert_to_anthropic_tool_result_image_url_as_http(): assert result["content"][0]["cache_control"]["type"] == "ephemeral" def test_anthropic_messages_pt_server_tool_use_passthrough(): """ - Test that anthropic_messages_pt passes through server_tool_use and + Test that anthropic_messages_pt passes through server_tool_use and tool_search_tool_result blocks in assistant message content. - + These are Anthropic-native content types used for tool search functionality that need to be preserved when reconstructing multi-turn conversations. - + Fixes: https://github.com/BerriAI/litellm/issues/XXXXX """ from litellm.litellm_core_utils.prompt_templates.factory import anthropic_messages_pt @@ -1359,15 +1426,15 @@ def test_anthropic_messages_pt_server_tool_use_passthrough(): # Verify we have 3 messages (user, assistant, user) assert len(result) == 3 - + # Verify the assistant message content assistant_msg = result[1] assert assistant_msg["role"] == "assistant" assert isinstance(assistant_msg["content"], list) - + # Find the different content block types content_types = [block.get("type") for block in assistant_msg["content"]] - + # Verify server_tool_use block is preserved assert "server_tool_use" in content_types server_tool_use_block = next( @@ -1376,7 +1443,7 @@ def test_anthropic_messages_pt_server_tool_use_passthrough(): assert server_tool_use_block["id"] == "srvtoolu_01ABC123" assert server_tool_use_block["name"] == "tool_search_tool_regex" assert server_tool_use_block["input"] == {"query": ".*time.*"} - + # Verify tool_search_tool_result block is preserved assert "tool_search_tool_result" in content_types tool_result_block = next( @@ -1385,7 +1452,7 @@ def test_anthropic_messages_pt_server_tool_use_passthrough(): assert tool_result_block["tool_use_id"] == "srvtoolu_01ABC123" assert tool_result_block["content"]["type"] == "tool_search_tool_search_result" assert tool_result_block["content"]["tool_references"][0]["tool_name"] == "get_time" - + # Verify text block is also preserved assert "text" in content_types text_block = next( From 324f1f4682c82cc0572398ecb774b862a8804231 Mon Sep 17 00:00:00 2001 From: ruanjiefeng Date: Fri, 23 Jan 2026 11:38:14 +0800 Subject: [PATCH 02/38] add Vertex_AI llm credentials sensitive keywords "vertex_credentials" (#19551) * add Vertex_AI llm credentials sensitive keywords "vertex_credentials" * Update test_litellm_logging.py add test case --- litellm/litellm_core_utils/litellm_logging.py | 1 + tests/test_litellm/litellm_core_utils/test_litellm_logging.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index d3bcfe8200..d512893465 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -3296,6 +3296,7 @@ def _get_masked_values( "token", "key", "secret", + "vertex_credentials", ] return { k: ( 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 e035e193fe..1f3f558a49 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -787,11 +787,13 @@ def test_get_masked_values(): "presidio_ad_hoc_recognizers": None, "aws_bedrock_runtime_endpoint": None, "presidio_anonymizer_api_base": None, + "vertex_credentials": "{sensitive_api_key}", } masked_values = _get_masked_values( sensitive_object, unmasked_length=4, number_of_asterisks=4 ) assert masked_values["presidio_anonymizer_api_base"] is None + assert masked_values["vertex_credentials"] == "{s****y}" @pytest.mark.asyncio From 65e943dc2b99b68e5d2b0a23653c8670c282fa48 Mon Sep 17 00:00:00 2001 From: moh-dev-stack Date: Fri, 23 Jan 2026 03:39:58 +0000 Subject: [PATCH 03/38] Bugfix/19481 num retries env var type (#19507) * Enhance error handling for num_retries in Router class to support string values. Add test case to verify conversion from string to int for deployment num_retries. * Refactor Router class for improved readability by formatting long lines and enhancing exception handling tests for num_retries. Ensure consistent style in test cases for better maintainability. * Update exception handling for num_retries in Router class to suppress mypy warnings. Add type ignore comment for clarity in type conversion from string to int. --- litellm/router.py | 19 +++++-- .../test_router_per_deployment_num_retries.py | 57 +++++++++++++++---- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 62070d2375..3234366cfb 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -1696,8 +1696,11 @@ class Router: litellm_params = deployment.get("litellm_params", {}) dep_num_retries = litellm_params.get("num_retries") - if dep_num_retries is not None and isinstance(dep_num_retries, int): - exception.num_retries = dep_num_retries # type: ignore + if dep_num_retries is not None: + try: + exception.num_retries = int(dep_num_retries) # type: ignore # Handle both int and str + except (ValueError, TypeError): + pass # Skip if value can't be converted to int def _update_kwargs_with_default_litellm_params( self, kwargs: dict, metadata_variable_name: Optional[str] = "metadata" @@ -4692,9 +4695,12 @@ class Router: # get num_retries from retry policy # Use the model_group captured at the start of the function, or get it from metadata # kwargs.get("model") at this point is the deployment model, not the model_group - _model_group_for_retry_policy = model_group or _metadata.get("model_group") or kwargs.get("model") + _model_group_for_retry_policy = ( + model_group or _metadata.get("model_group") or kwargs.get("model") + ) _retry_policy_retries = self.get_num_retries_from_retry_policy( - exception=original_exception, model_group=_model_group_for_retry_policy + exception=original_exception, + model_group=_model_group_for_retry_policy, ) if _retry_policy_retries is not None: num_retries = _retry_policy_retries @@ -5879,7 +5885,10 @@ class Router: ) # done reading model["litellm_params"] # Check if provider is supported: either in enum or JSON-configured - if custom_llm_provider not in litellm.provider_list and not JSONProviderRegistry.exists(custom_llm_provider): + if ( + custom_llm_provider not in litellm.provider_list + and not JSONProviderRegistry.exists(custom_llm_provider) + ): raise Exception(f"Unsupported provider - {custom_llm_provider}") #### DEPLOYMENT NAMES INIT ######## diff --git a/tests/test_litellm/test_router_per_deployment_num_retries.py b/tests/test_litellm/test_router_per_deployment_num_retries.py index 4021ca2807..154ba579e4 100644 --- a/tests/test_litellm/test_router_per_deployment_num_retries.py +++ b/tests/test_litellm/test_router_per_deployment_num_retries.py @@ -32,17 +32,17 @@ class TestPerDeploymentNumRetries: ) deployment = router.model_list[0] - + # Create a mock exception without num_retries class MockException(Exception): pass - + exc = MockException("test error") assert not hasattr(exc, "num_retries") or exc.num_retries is None - + # Call the helper router._set_deployment_num_retries_on_exception(exc, deployment) - + # Verify num_retries was set from deployment assert exc.num_retries == 5 @@ -66,16 +66,16 @@ class TestPerDeploymentNumRetries: ) deployment = router.model_list[0] - + # Create an exception that already has num_retries class MockException(Exception): num_retries = 10 # Already set - + exc = MockException("test error") - + # Call the helper router._set_deployment_num_retries_on_exception(exc, deployment) - + # Verify num_retries was NOT overridden assert exc.num_retries == 10 @@ -99,15 +99,15 @@ class TestPerDeploymentNumRetries: ) deployment = router.model_list[0] - + class MockException(Exception): pass - + exc = MockException("test error") - + # Call the helper router._set_deployment_num_retries_on_exception(exc, deployment) - + # Verify num_retries was not set (deployment has no num_retries) assert not hasattr(exc, "num_retries") or exc.num_retries is None @@ -155,3 +155,36 @@ class TestPerDeploymentNumRetries: kwargs = {} router._update_kwargs_before_fallbacks(model="test-model", kwargs=kwargs) assert kwargs["num_retries"] == 7 # Uses global + + def test_set_deployment_num_retries_with_string_value(self): + """ + Test that _set_deployment_num_retries_on_exception handles string values + from environment variables correctly. + GitHub Issue: #19481 + """ + router = Router( + model_list=[ + { + "model_name": "test-model", + "litellm_params": { + "model": "openai/gpt-4", + "api_key": "test-key", + "num_retries": "6", # String value (as from env var) + }, + }, + ], + num_retries=0, # Global setting + ) + + deployment = router.model_list[0] + + class MockException(Exception): + pass + + exc = MockException("test error") + + # Call the helper + router._set_deployment_num_retries_on_exception(exc, deployment) + + # Verify num_retries was converted from string to int + assert exc.num_retries == 6 From 6cf7bd7c0fc7962bd63b9d6b87439b82cdee1d0a Mon Sep 17 00:00:00 2001 From: Cesar Garcia <128240629+Chesars@users.noreply.github.com> Date: Fri, 23 Jan 2026 00:42:15 -0300 Subject: [PATCH 04/38] Fix gpt-image-1.5 cost calculation not including output image tokens (#19515) Fixes #19508 The cost calculation for gpt-image-1.5 was not including image tokens from output_tokens_details, causing costs to be underreported (e.g., $0.046 instead of $0.14). Root cause: The OpenAI image generation API uses Responses API naming (input_tokens, output_tokens, output_tokens_details) but the cost calculator expected Chat Completions API naming (prompt_tokens, completion_tokens, completion_tokens_details). Changes: - convert_dict_to_response.py: Map Responses API fields to Chat Completions API fields and convert dicts to wrapper objects - cost_calculator.py: Use usage directly if already transformed, avoiding double transformation that lost the wrapper objects - Added test for gpt-image-1.5 output image token cost calculation --- .../convert_dict_to_response.py | 18 +++++ .../image_generation/cost_calculator.py | 20 ++++-- .../test_gpt_image_cost_calculator.py | 68 +++++++++++++++++++ 3 files changed, 99 insertions(+), 7 deletions(-) diff --git a/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py b/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py index bbe28e3ec2..25ad0a570c 100644 --- a/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py +++ b/litellm/litellm_core_utils/llm_response_utils/convert_dict_to_response.py @@ -21,11 +21,13 @@ from litellm.types.utils import ( ChatCompletionMessageToolCall, ChatCompletionRedactedThinkingBlock, Choices, + CompletionTokensDetailsWrapper, Delta, EmbeddingResponse, Function, HiddenParams, ImageResponse, + PromptTokensDetailsWrapper, ) from litellm.types.utils import Logprobs as TextCompletionLogprobs from litellm.types.utils import ( @@ -304,6 +306,22 @@ class LiteLLMResponseObjectHandler: "text_tokens": 0, } + # Map Responses API naming to Chat Completions API naming for cost calculator + if usage.get("prompt_tokens") is None: + usage["prompt_tokens"] = usage.get("input_tokens", 0) + if usage.get("completion_tokens") is None: + usage["completion_tokens"] = usage.get("output_tokens", 0) + + # Convert dicts to wrapper objects so getattr() works in cost calculation + if isinstance(usage.get("input_tokens_details"), dict): + usage["prompt_tokens_details"] = PromptTokensDetailsWrapper( + **usage["input_tokens_details"] + ) + if isinstance(usage.get("output_tokens_details"), dict): + usage["completion_tokens_details"] = CompletionTokensDetailsWrapper( + **usage["output_tokens_details"] + ) + if model_response_object is None: model_response_object = ImageResponse(**response_object) return model_response_object diff --git a/litellm/llms/openai/image_generation/cost_calculator.py b/litellm/llms/openai/image_generation/cost_calculator.py index 35caaf6e9b..988d562613 100644 --- a/litellm/llms/openai/image_generation/cost_calculator.py +++ b/litellm/llms/openai/image_generation/cost_calculator.py @@ -8,8 +8,7 @@ from typing import Optional from litellm import verbose_logger from litellm.litellm_core_utils.llm_cost_calc.utils import generic_cost_per_token -from litellm.responses.utils import ResponseAPILoggingUtils -from litellm.types.utils import ImageResponse +from litellm.types.utils import ImageResponse, Usage def cost_calculator( @@ -39,11 +38,18 @@ def cost_calculator( ) return 0.0 - # Transform ImageUsage to Usage using the existing helper - # ImageUsage has the same format as ResponseAPIUsage - chat_usage = ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( - usage - ) + # If usage is already a Usage object with completion_tokens_details set, + # use it directly (it was already transformed in convert_to_image_response) + if isinstance(usage, Usage) and usage.completion_tokens_details is not None: + chat_usage = usage + else: + # Transform ImageUsage to Usage using the existing helper + # ImageUsage has the same format as ResponseAPIUsage + from litellm.responses.utils import ResponseAPILoggingUtils + + chat_usage = ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( + usage + ) # Use generic_cost_per_token for cost calculation prompt_cost, completion_cost = generic_cost_per_token( diff --git a/tests/test_litellm/test_gpt_image_cost_calculator.py b/tests/test_litellm/test_gpt_image_cost_calculator.py index 0a2a62b6c9..620c073498 100644 --- a/tests/test_litellm/test_gpt_image_cost_calculator.py +++ b/tests/test_litellm/test_gpt_image_cost_calculator.py @@ -19,10 +19,13 @@ import pytest import litellm from litellm.types.utils import ( + CompletionTokensDetailsWrapper, ImageResponse, ImageObject, ImageUsage, ImageUsageInputTokensDetails, + PromptTokensDetailsWrapper, + Usage, ) @@ -202,6 +205,71 @@ class TestGPTImageCostRouting: assert cost >= 0 +class TestGPTImage15OutputImageTokens: + """ + Test for GitHub issue #19508: + Image usage calculation does not include image tokens in gpt-image-1.5 + + gpt-image-1.5 returns output_tokens_details with separate image_tokens and text_tokens, + and these must be correctly included in cost calculation. + """ + + def test_gpt_image_15_output_image_tokens_cost(self): + """ + Test that output image tokens are correctly included in cost calculation. + + This tests the fix for issue #19508 where output_tokens_details.image_tokens + were not being included in the cost calculation, causing costs to be + underreported (e.g., $0.046 instead of $0.14). + """ + # Simulate gpt-image-1.5 response with output_tokens_details + # This is what the API returns and what convert_to_image_response transforms + usage = Usage( + prompt_tokens=169, + completion_tokens=4599, + total_tokens=4768, + prompt_tokens_details=PromptTokensDetailsWrapper( + text_tokens=169, + image_tokens=0, + ), + completion_tokens_details=CompletionTokensDetailsWrapper( + text_tokens=439, + image_tokens=4160, + ), + ) + + image_response = ImageResponse( + created=1234567890, + data=[ImageObject(b64_json="test")], + ) + image_response.usage = usage + image_response._hidden_params = {"custom_llm_provider": "openai"} + + cost = litellm.completion_cost( + completion_response=image_response, + model="gpt-image-1.5", + call_type="image_generation", + custom_llm_provider="openai", + ) + + # gpt-image-1.5 pricing: + # - input_cost_per_token: 5e-06 ($5/1M for text input) + # - output_cost_per_token: 1e-05 ($10/1M for text output) + # - output_cost_per_image_token: 3.2e-05 ($32/1M for image output) + # + # Expected cost: + # Input text: 169 * $5/1M = $0.000845 + # Output text: 439 * $10/1M = $0.00439 + # Output image: 4160 * $32/1M = $0.13312 + # Total: $0.138355 + expected_cost = 169 * 5e-06 + 439 * 1e-05 + 4160 * 3.2e-05 + + assert abs(cost - expected_cost) < 1e-6, ( + f"Expected {expected_cost}, got {cost}. " + f"Image tokens may not be included in cost calculation." + ) + + class TestCompletionCostIntegration: """Test the full completion_cost integration for gpt-image-1""" From 3372430d40cc94223ec4d7f12101f38e4e606455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8B=90=E7=88=B7=26=26=E8=80=81=E6=8B=90=E7=98=A6?= Date: Fri, 23 Jan 2026 11:47:21 +0800 Subject: [PATCH 05/38] Add pricing for volcengine models (deepseek-v3-2, glm-4-7, kimi-k2-thinking) (#19335) Co-authored-by: Claude Opus 4.5 --- model_prices_and_context_window.json | 42 ++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 6d87e0b599..3d67bc25b5 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -10219,6 +10219,48 @@ "mode": "completion", "output_cost_per_token": 5e-07 }, + "deepseek-v3-2-251201": { + "input_cost_per_token": 0.0, + "litellm_provider": "volcengine", + "max_input_tokens": 98304, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 0.0, + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, + "glm-4-7-251222": { + "input_cost_per_token": 0.0, + "litellm_provider": "volcengine", + "max_input_tokens": 204800, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 0.0, + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, + "kimi-k2-thinking-251104": { + "input_cost_per_token": 0.0, + "litellm_provider": "volcengine", + "max_input_tokens": 229376, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 0.0, + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, "doubao-embedding": { "input_cost_per_token": 0.0, "litellm_provider": "volcengine", From 1d04414f305497a14d3005be23717d514619b5aa Mon Sep 17 00:00:00 2001 From: Harshit Jain <48647625+Harshit28j@users.noreply.github.com> Date: Fri, 23 Jan 2026 09:19:22 +0530 Subject: [PATCH 06/38] feat(datadog): add agent support for LLM Observability (#19574) --- docs/my-website/docs/observability/datadog.md | 7 +- litellm/integrations/datadog/datadog.py | 17 ++--- .../integrations/datadog/datadog_handler.py | 8 +++ .../integrations/datadog/datadog_llm_obs.py | 64 ++++++++++++++----- .../datadog/test_datadog_llm_obs_agent.py | 62 ++++++++++++++++++ 5 files changed, 127 insertions(+), 31 deletions(-) create mode 100644 tests/test_litellm/integrations/datadog/test_datadog_llm_obs_agent.py diff --git a/docs/my-website/docs/observability/datadog.md b/docs/my-website/docs/observability/datadog.md index 7cf91ced34..0f50cbd5c9 100644 --- a/docs/my-website/docs/observability/datadog.md +++ b/docs/my-website/docs/observability/datadog.md @@ -73,7 +73,7 @@ Send logs through a local DataDog agent (useful for containerized environments): ```shell LITELLM_DD_AGENT_HOST="localhost" # hostname or IP of DataDog agent LITELLM_DD_AGENT_PORT="10518" # [OPTIONAL] port of DataDog agent (default: 10518) -DD_API_KEY="5f2d0f310***********" # [OPTIONAL] your datadog API Key (agent handles auth) +DD_API_KEY="5f2d0f310***********" # [OPTIONAL] your datadog API Key (Agent handles auth for Logs. REQUIRED for LLM Observability) DD_SOURCE="litellm_dev" # [OPTIONAL] your datadog source ``` @@ -84,6 +84,9 @@ When `LITELLM_DD_AGENT_HOST` is set, logs are sent to the agent instead of direc **Note:** We use `LITELLM_DD_AGENT_HOST` instead of `DD_AGENT_HOST` to avoid conflicts with `ddtrace` which automatically sets `DD_AGENT_HOST` for APM tracing. +> [!IMPORTANT] +> **Datadog LLM Observability**: `DD_API_KEY` is **REQUIRED** even when using the Datadog Agent (`LITELLM_DD_AGENT_HOST`). The agent acts as a proxy but the API key header is mandatory for the LLM Observability endpoint. + **Step 3**: Start the proxy, make a test request Start proxy @@ -203,5 +206,5 @@ LiteLLM supports customizing the following Datadog environment variables | `POD_NAME` | Pod name tag (useful for Kubernetes deployments) | "unknown" | ❌ No | \* **Required when using Direct API** (default): `DD_API_KEY` and `DD_SITE` are required -\* **Optional when using DataDog Agent**: Set `LITELLM_DD_AGENT_HOST` to use agent mode; `DD_API_KEY` and `DD_SITE` are not required +\* **Optional when using DataDog Agent**: Set `LITELLM_DD_AGENT_HOST` to use agent mode; `DD_API_KEY` and `DD_SITE` are not required for **Datadog Logs**. (**Note: `DD_API_KEY` IS REQUIRED for Datadog LLM Observability**) diff --git a/litellm/integrations/datadog/datadog.py b/litellm/integrations/datadog/datadog.py index 503e8d8c87..735d1005d2 100644 --- a/litellm/integrations/datadog/datadog.py +++ b/litellm/integrations/datadog/datadog.py @@ -32,6 +32,7 @@ from litellm.integrations.datadog.datadog_handler import ( get_datadog_service, get_datadog_source, get_datadog_tags, + get_datadog_base_url_from_env, ) from litellm.litellm_core_utils.dd_tracing import tracer from litellm.llms.custom_httpx.http_handler import ( @@ -100,7 +101,9 @@ class DataDogLogger( self._configure_dd_direct_api() # Optional override for testing - self._apply_dd_base_url_override() + dd_base_url = get_datadog_base_url_from_env() + if dd_base_url: + self.intake_url = f"{dd_base_url}/api/v2/logs" self.sync_client = _get_httpx_client() asyncio.create_task(self.periodic_flush()) self.flush_lock = asyncio.Lock() @@ -159,18 +162,6 @@ class DataDogLogger( self.DD_API_KEY = os.getenv("DD_API_KEY") self.intake_url = f"https://http-intake.logs.{os.getenv('DD_SITE')}/api/v2/logs" - def _apply_dd_base_url_override(self) -> None: - """ - Apply base URL override for testing purposes - """ - dd_base_url: Optional[str] = ( - os.getenv("_DATADOG_BASE_URL") - or os.getenv("DATADOG_BASE_URL") - or os.getenv("DD_BASE_URL") - ) - if dd_base_url is not None: - self.intake_url = f"{dd_base_url}/api/v2/logs" - async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): """ Async Log success events to Datadog diff --git a/litellm/integrations/datadog/datadog_handler.py b/litellm/integrations/datadog/datadog_handler.py index 26fab77759..e2f30f2f61 100644 --- a/litellm/integrations/datadog/datadog_handler.py +++ b/litellm/integrations/datadog/datadog_handler.py @@ -20,6 +20,14 @@ def get_datadog_hostname() -> str: return os.getenv("HOSTNAME", "") +def get_datadog_base_url_from_env() -> Optional[str]: + """ + Get base URL override from common DD_BASE_URL env var. + This is useful for testing or custom endpoints. + """ + return os.getenv("DD_BASE_URL") + + def get_datadog_env() -> str: return os.getenv("DD_ENV", "unknown") diff --git a/litellm/integrations/datadog/datadog_llm_obs.py b/litellm/integrations/datadog/datadog_llm_obs.py index 6ffdbc0a00..4f6a5b339a 100644 --- a/litellm/integrations/datadog/datadog_llm_obs.py +++ b/litellm/integrations/datadog/datadog_llm_obs.py @@ -21,6 +21,7 @@ from litellm.integrations.custom_batch_logger import CustomBatchLogger from litellm.integrations.datadog.datadog_handler import ( get_datadog_service, get_datadog_tags, + get_datadog_base_url_from_env, ) from litellm.litellm_core_utils.dd_tracing import tracer from litellm.litellm_core_utils.prompt_templates.common_utils import ( @@ -43,24 +44,22 @@ class DataDogLLMObsLogger(CustomBatchLogger): def __init__(self, **kwargs): try: verbose_logger.debug("DataDogLLMObs: Initializing logger") - if os.getenv("DD_API_KEY", None) is None: - raise Exception("DD_API_KEY is not set, set 'DD_API_KEY=<>'") - if os.getenv("DD_SITE", None) is None: - raise Exception( - "DD_SITE is not set, set 'DD_SITE=<>', example sit = `us5.datadoghq.com`" - ) + # Configure DataDog endpoint (Agent or Direct API) + # Use LITELLM_DD_AGENT_HOST to avoid conflicts with ddtrace's DD_AGENT_HOST + dd_agent_host = os.getenv("LITELLM_DD_AGENT_HOST") self.async_client = get_async_httpx_client( llm_provider=httpxSpecialProvider.LoggingCallback ) self.DD_API_KEY = os.getenv("DD_API_KEY") - self.DD_SITE = os.getenv("DD_SITE") - self.intake_url = ( - f"https://api.{self.DD_SITE}/api/intake/llm-obs/v1/trace/spans" - ) - # testing base url - dd_base_url = os.getenv("DD_BASE_URL") + if dd_agent_host: + self._configure_dd_agent(dd_agent_host=dd_agent_host) + else: + self._configure_dd_direct_api() + + # Optional override for testing + dd_base_url = get_datadog_base_url_from_env() if dd_base_url: self.intake_url = f"{dd_base_url}/api/intake/llm-obs/v1/trace/spans" @@ -78,6 +77,38 @@ class DataDogLLMObsLogger(CustomBatchLogger): verbose_logger.exception(f"DataDogLLMObs: Error initializing - {str(e)}") raise e + def _configure_dd_agent(self, dd_agent_host: str): + """ + Configure the Datadog logger to send traces to the Agent. + """ + # When using the Agent, LLM Observability Intake does NOT require the API Key + # Reference: https://docs.datadoghq.com/llm_observability/setup/sdk/#agent-setup + + # Use specific port for LLM Obs (Trace Agent) to avoid conflict with Logs Agent (10518) + agent_port = os.getenv("LITELLM_DD_LLM_OBS_PORT", "8126") + self.DD_SITE = "localhost" # Not used for URL construction in agent mode + self.intake_url = ( + f"http://{dd_agent_host}:{agent_port}/api/intake/llm-obs/v1/trace/spans" + ) + verbose_logger.debug(f"DataDogLLMObs: Using DD Agent at {self.intake_url}") + + def _configure_dd_direct_api(self): + """ + Configure the Datadog logger to send traces directly to the Datadog API. + """ + if not self.DD_API_KEY: + raise Exception("DD_API_KEY is not set, set 'DD_API_KEY=<>'") + + self.DD_SITE = os.getenv("DD_SITE") + if not self.DD_SITE: + raise Exception( + "DD_SITE is not set, set 'DD_SITE=<>', example site = `us5.datadoghq.com`" + ) + + self.intake_url = ( + f"https://api.{self.DD_SITE}/api/intake/llm-obs/v1/trace/spans" + ) + def _get_datadog_llm_obs_params(self) -> Dict: """ Get the datadog_llm_observability_params from litellm.datadog_llm_observability_params @@ -164,13 +195,14 @@ class DataDogLLMObsLogger(CustomBatchLogger): json_payload = safe_dumps(payload) + headers = {"Content-Type": "application/json"} + if self.DD_API_KEY: + headers["DD-API-KEY"] = self.DD_API_KEY + response = await self.async_client.post( url=self.intake_url, content=json_payload, - headers={ - "DD-API-KEY": self.DD_API_KEY, - "Content-Type": "application/json", - }, + headers=headers, ) if response.status_code != 202: diff --git a/tests/test_litellm/integrations/datadog/test_datadog_llm_obs_agent.py b/tests/test_litellm/integrations/datadog/test_datadog_llm_obs_agent.py new file mode 100644 index 0000000000..2bb51e1e1b --- /dev/null +++ b/tests/test_litellm/integrations/datadog/test_datadog_llm_obs_agent.py @@ -0,0 +1,62 @@ +import os +from unittest.mock import patch +from litellm.integrations.datadog.datadog_llm_obs import DataDogLLMObsLogger + + +def test_datadog_llm_obs_agent_configuration(): + """ + Test that DataDog LLM Obs logger correctly configures agent endpoint. + """ + test_env = { + "LITELLM_DD_AGENT_HOST": "localhost", + "LITELLM_DD_LLM_OBS_PORT": "10518", + "DD_API_KEY": "test-api-key", # Optional, but checking if it's preserved + } + + # Ensure DD_SITE is NOT set to verify we don't need it in agent mode + + with patch.dict(os.environ, test_env, clear=True): + with patch("asyncio.create_task"): # Prevent periodic flush task from running + dd_logger = DataDogLLMObsLogger() + + expected_url = "http://localhost:10518/api/intake/llm-obs/v1/trace/spans" + assert dd_logger.intake_url == expected_url + assert dd_logger.DD_API_KEY == "test-api-key" + + +def test_datadog_llm_obs_agent_no_api_key_ok(): + """ + Test that agent mode works WITHOUT DD_API_KEY (agent handles auth). + """ + test_env = { + "LITELLM_DD_AGENT_HOST": "localhost", + # No DD_API_KEY + } + + with patch.dict(os.environ, test_env, clear=True): + with patch("asyncio.create_task"): + # Should NOT raise exception anymore + dd_logger = DataDogLLMObsLogger() + + assert dd_logger.DD_API_KEY is None + # Default port is 8126 if not set + expected_url = "http://localhost:8126/api/intake/llm-obs/v1/trace/spans" + assert dd_logger.intake_url == expected_url + + +def test_datadog_llm_obs_direct_api_configuration(): + """ + Test that direct API configuration still works as expected. + """ + test_env = { + "DD_API_KEY": "direct-api-key", + "DD_SITE": "us5.datadoghq.com", + } + + with patch.dict(os.environ, test_env, clear=True): + with patch("asyncio.create_task"): + dd_logger = DataDogLLMObsLogger() + + expected_url = "https://api.us5.datadoghq.com/api/intake/llm-obs/v1/trace/spans" + assert dd_logger.intake_url == expected_url + assert dd_logger.DD_API_KEY == "direct-api-key" From 06a749708d5b9d0a2851ce85400aee107dd469bb Mon Sep 17 00:00:00 2001 From: Harshit Jain <48647625+Harshit28j@users.noreply.github.com> Date: Fri, 23 Jan 2026 09:22:14 +0530 Subject: [PATCH 07/38] feat: add datadog cost management support and fix startup callback issue (#19584) --- docs/my-website/docs/observability/datadog.md | 45 ++++ litellm/integrations/callback_configs.json | 29 ++- .../datadog/datadog_cost_management.py | 202 ++++++++++++++++++ litellm/proxy/common_utils/callback_utils.py | 45 ++-- .../integrations/datadog_cost_management.py | 27 +++ .../datadog/test_datadog_cost_management.py | 169 +++++++++++++++ 6 files changed, 498 insertions(+), 19 deletions(-) create mode 100644 litellm/integrations/datadog/datadog_cost_management.py create mode 100644 litellm/types/integrations/datadog_cost_management.py create mode 100644 tests/test_litellm/integrations/datadog/test_datadog_cost_management.py diff --git a/docs/my-website/docs/observability/datadog.md b/docs/my-website/docs/observability/datadog.md index 0f50cbd5c9..6f785be101 100644 --- a/docs/my-website/docs/observability/datadog.md +++ b/docs/my-website/docs/observability/datadog.md @@ -7,6 +7,7 @@ import TabItem from '@theme/TabItem'; LiteLLM Supports logging to the following Datdog Integrations: - `datadog` [Datadog Logs](https://docs.datadoghq.com/logs/) - `datadog_llm_observability` [Datadog LLM Observability](https://www.datadoghq.com/product/llm-observability/) +- `datadog_cost_management` [Datadog Cloud Cost Management](#datadog-cloud-cost-management) - `ddtrace-run` [Datadog Tracing](#datadog-tracing) ## Datadog Logs @@ -164,6 +165,50 @@ On the Datadog LLM Observability page, you should see that both input messages a + + + +## Datadog Cloud Cost Management + +| Feature | Details | +|---------|---------| +| **What is logged** | Aggregated LLM Costs (FOCUS format) | +| **Events** | Periodic Uploads of Aggregated Cost Data | +| **Product Link** | [Datadog Cloud Cost Management](https://docs.datadoghq.com/cost_management/) | + +We will use the `--config` to set `litellm.callbacks = ["datadog_cost_management"]`. This will periodically upload aggregated LLM cost data to Datadog. + +**Step 1**: Create a `config.yaml` file and set `litellm_settings`: `success_callback` + +```yaml +model_list: + - model_name: gpt-3.5-turbo + litellm_params: + model: gpt-3.5-turbo +litellm_settings: + callbacks: ["datadog_cost_management"] +``` + +**Step 2**: Set Required env variables + +```shell +DD_API_KEY="your-api-key" +DD_APP_KEY="your-app-key" # REQUIRED for Cost Management +DD_SITE="us5.datadoghq.com" +``` + +**Step 3**: Start the proxy + +```shell +litellm --config config.yaml +``` + +**How it works** +* LiteLLM aggregates costs in-memory by Provider, Model, Date, and Tags. +* Requires `DD_APP_KEY` for the Custom Costs API. +* Costs are uploaded periodically (flushed). + + ### Datadog Tracing Use `ddtrace-run` to enable [Datadog Tracing](https://ddtrace.readthedocs.io/en/stable/installation_quickstart.html) on litellm proxy diff --git a/litellm/integrations/callback_configs.json b/litellm/integrations/callback_configs.json index 6b30b6b736..6a003b8c49 100644 --- a/litellm/integrations/callback_configs.json +++ b/litellm/integrations/callback_configs.json @@ -83,6 +83,33 @@ }, "description": "Datadog Logging Integration" }, + { + "id": "datadog_cost_management", + "displayName": "Datadog Cost Management", + "logo": "datadog.png", + "supports_key_team_logging": false, + "dynamic_params": { + "dd_api_key": { + "type": "password", + "ui_name": "API Key", + "description": "Datadog API key for authentication", + "required": true + }, + "dd_app_key": { + "type": "password", + "ui_name": "App Key", + "description": "Datadog Application Key for Cloud Cost Management", + "required": true + }, + "dd_site": { + "type": "text", + "ui_name": "Site", + "description": "Datadog site URL (e.g., us5.datadoghq.com)", + "required": true + } + }, + "description": "Datadog Cloud Cost Management Integration" + }, { "id": "lago", "displayName": "Lago", @@ -407,4 +434,4 @@ }, "description": "SQS Queue (AWS) Logging Integration" } -] +] \ No newline at end of file diff --git a/litellm/integrations/datadog/datadog_cost_management.py b/litellm/integrations/datadog/datadog_cost_management.py new file mode 100644 index 0000000000..9bfb2aba71 --- /dev/null +++ b/litellm/integrations/datadog/datadog_cost_management.py @@ -0,0 +1,202 @@ +import asyncio +import os +import time +from datetime import datetime +from typing import Dict, List, Optional + +from litellm._logging import verbose_logger +from litellm.integrations.custom_batch_logger import CustomBatchLogger +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + httpxSpecialProvider, +) +from litellm.types.integrations.datadog_cost_management import ( + DatadogFOCUSCostEntry, +) +from litellm.types.utils import StandardLoggingPayload + + +class DatadogCostManagementLogger(CustomBatchLogger): + def __init__(self, **kwargs): + self.dd_api_key = os.getenv("DD_API_KEY") + self.dd_app_key = os.getenv("DD_APP_KEY") + self.dd_site = os.getenv("DD_SITE", "datadoghq.com") + + if not self.dd_api_key or not self.dd_app_key: + verbose_logger.warning( + "Datadog Cost Management: DD_API_KEY and DD_APP_KEY are required. Integration will not work." + ) + + self.upload_url = f"https://api.{self.dd_site}/api/v2/cost/custom_costs" + + self.async_client = get_async_httpx_client( + llm_provider=httpxSpecialProvider.LoggingCallback + ) + + # Initialize lock and start periodic flush task + self.flush_lock = asyncio.Lock() + asyncio.create_task(self.periodic_flush()) + + # Check if flush_lock is already in kwargs to avoid double passing (unlikely but safe) + if "flush_lock" not in kwargs: + kwargs["flush_lock"] = self.flush_lock + + super().__init__(**kwargs) + + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): + try: + standard_logging_object: Optional[StandardLoggingPayload] = kwargs.get( + "standard_logging_object", None + ) + + if standard_logging_object is None: + return + + # Only log if there is a cost associated + if standard_logging_object.get("response_cost", 0) > 0: + self.log_queue.append(standard_logging_object) + + if len(self.log_queue) >= self.batch_size: + await self.async_send_batch() + + except Exception as e: + verbose_logger.exception( + f"Datadog Cost Management: Error in async_log_success_event: {str(e)}" + ) + + async def async_send_batch(self): + if not self.log_queue: + return + + try: + # Aggregate costs from the batch + aggregated_entries = self._aggregate_costs(self.log_queue) + + if not aggregated_entries: + return + + # Send to Datadog + await self._upload_to_datadog(aggregated_entries) + + # Clear queue only on success (or if we decide to drop on failure) + # CustomBatchLogger clears queue in flush_queue, so we just process here + + except Exception as e: + verbose_logger.exception( + f"Datadog Cost Management: Error in async_send_batch: {str(e)}" + ) + + def _aggregate_costs( + self, logs: List[StandardLoggingPayload] + ) -> List[DatadogFOCUSCostEntry]: + """ + Aggregates costs by Provider, Model, and Date. + Returns a list of DatadogFOCUSCostEntry. + """ + aggregator: Dict[str, DatadogFOCUSCostEntry] = {} + + for log in logs: + try: + # Extract keys for aggregation + provider = log.get("custom_llm_provider") or "unknown" + model = log.get("model") or "unknown" + cost = log.get("response_cost", 0) + + if cost == 0: + continue + + # Get date strings (FOCUS format requires specific keys, but for aggregation we group by Day) + # UTC date + # We interpret "ChargePeriod" as the day of the request. + ts = log.get("startTime") or time.time() + dt = datetime.fromtimestamp(ts) + date_str = dt.strftime("%Y-%m-%d") + + # ChargePeriodStart and End + # If we want daily granularity, end date is usually same day or next day? + # Datadog Custom Costs usually expects periods. + # "ChargePeriodStart": "2023-01-01", "ChargePeriodEnd": "2023-12-31" in example. + # If we send daily, we can say Start=Date, End=Date. + + # Grouping Key: Provider + Model + Date + Tags? + # For simplicity, let's aggregate by Provider + Model + Date first. + # If we handle tags, we need to include them in the key. + + tags = self._extract_tags(log) + tags_key = tuple(sorted(tags.items())) if tags else () + + key = (provider, model, date_str, tags_key) + + if key not in aggregator: + aggregator[key] = { + "ProviderName": provider, + "ChargeDescription": f"LLM Usage for {model}", + "ChargePeriodStart": date_str, + "ChargePeriodEnd": date_str, + "BilledCost": 0.0, + "BillingCurrency": "USD", + "Tags": tags if tags else None, + } + + aggregator[key]["BilledCost"] += cost + + except Exception as e: + verbose_logger.warning( + f"Error processing log for cost aggregation: {e}" + ) + continue + + return list(aggregator.values()) + + def _extract_tags(self, log: StandardLoggingPayload) -> Dict[str, str]: + from litellm.integrations.datadog.datadog_handler import ( + get_datadog_env, + get_datadog_hostname, + get_datadog_pod_name, + get_datadog_service, + ) + + tags = { + "env": get_datadog_env(), + "service": get_datadog_service(), + "host": get_datadog_hostname(), + "pod_name": get_datadog_pod_name(), + } + + # Add metadata as tags + metadata = log.get("metadata", {}) + if metadata: + # Add user info + if "user_api_key_alias" in metadata: + tags["user"] = str(metadata["user_api_key_alias"]) + if "user_api_key_team_alias" in metadata: + tags["team"] = str(metadata["user_api_key_team_alias"]) + if "model_group" in metadata: + tags["model_group"] = str(metadata["model_group"]) + + return tags + + async def _upload_to_datadog(self, payload: List[Dict]): + if not self.dd_api_key or not self.dd_app_key: + return + + headers = { + "Content-Type": "application/json", + "DD-API-KEY": self.dd_api_key, + "DD-APPLICATION-KEY": self.dd_app_key, + } + + # The API endpoint expects a list of objects directly in the body (file content behavior) + from litellm.litellm_core_utils.safe_json_dumps import safe_dumps + + data_json = safe_dumps(payload) + + response = await self.async_client.put( + self.upload_url, content=data_json, headers=headers + ) + + response.raise_for_status() + + verbose_logger.debug( + f"Datadog Cost Management: Uploaded {len(payload)} cost entries. Status: {response.status_code}" + ) diff --git a/litellm/proxy/common_utils/callback_utils.py b/litellm/proxy/common_utils/callback_utils.py index cb434da55b..a9e9bd237b 100644 --- a/litellm/proxy/common_utils/callback_utils.py +++ b/litellm/proxy/common_utils/callback_utils.py @@ -274,11 +274,20 @@ def initialize_callbacks_on_proxy( # noqa: PLR0915 WebSearchInterceptionLogger, ) - websearch_interception_obj = WebSearchInterceptionLogger.initialize_from_proxy_config( - litellm_settings=litellm_settings, - callback_specific_params=callback_specific_params, + websearch_interception_obj = ( + WebSearchInterceptionLogger.initialize_from_proxy_config( + litellm_settings=litellm_settings, + callback_specific_params=callback_specific_params, + ) ) imported_list.append(websearch_interception_obj) + elif isinstance(callback, str) and callback == "datadog_cost_management": + from litellm.integrations.datadog.datadog_cost_management import ( + DatadogCostManagementLogger, + ) + + datadog_cost_management_obj = DatadogCostManagementLogger() + imported_list.append(datadog_cost_management_obj) elif isinstance(callback, CustomLogger): imported_list.append(callback) else: @@ -353,17 +362,17 @@ def get_remaining_tokens_and_requests_from_request_data(data: Dict) -> Dict[str, remaining_requests_variable_name = f"litellm-key-remaining-requests-{model_group}" remaining_requests = _metadata.get(remaining_requests_variable_name, None) if remaining_requests: - headers[f"x-litellm-key-remaining-requests-{h11_model_group_name}"] = ( - remaining_requests - ) + headers[ + f"x-litellm-key-remaining-requests-{h11_model_group_name}" + ] = remaining_requests # Remaining Tokens remaining_tokens_variable_name = f"litellm-key-remaining-tokens-{model_group}" remaining_tokens = _metadata.get(remaining_tokens_variable_name, None) if remaining_tokens: - headers[f"x-litellm-key-remaining-tokens-{h11_model_group_name}"] = ( - remaining_tokens - ) + headers[ + f"x-litellm-key-remaining-tokens-{h11_model_group_name}" + ] = remaining_tokens return headers @@ -412,9 +421,9 @@ def add_guardrail_response_to_standard_logging_object( ): if litellm_logging_obj is None: return - standard_logging_object: Optional[StandardLoggingPayload] = ( - litellm_logging_obj.model_call_details.get("standard_logging_object") - ) + standard_logging_object: Optional[ + StandardLoggingPayload + ] = litellm_logging_obj.model_call_details.get("standard_logging_object") if standard_logging_object is None: return guardrail_information = standard_logging_object.get("guardrail_information", []) @@ -443,7 +452,9 @@ def get_metadata_variable_name_from_kwargs( return "litellm_metadata" if "litellm_metadata" in kwargs else "metadata" -def process_callback(_callback: str, callback_type: str, environment_variables: dict) -> dict: +def process_callback( + _callback: str, callback_type: str, environment_variables: dict +) -> dict: """Process a single callback and return its data with environment variables""" env_vars = CustomLogger.get_callback_env_vars(_callback) @@ -455,11 +466,9 @@ def process_callback(_callback: str, callback_type: str, environment_variables: else: env_vars_dict[_var] = env_variable - return { - "name": _callback, - "variables": env_vars_dict, - "type": callback_type - } + return {"name": _callback, "variables": env_vars_dict, "type": callback_type} + + def normalize_callback_names(callbacks: Iterable[Any]) -> List[Any]: if callbacks is None: return [] diff --git a/litellm/types/integrations/datadog_cost_management.py b/litellm/types/integrations/datadog_cost_management.py new file mode 100644 index 0000000000..fe04f43ea0 --- /dev/null +++ b/litellm/types/integrations/datadog_cost_management.py @@ -0,0 +1,27 @@ +from typing import Dict, Optional, TypedDict + + +from litellm.types.integrations.custom_logger import StandardCustomLoggerInitParams + + +class DatadogCostManagementInitParams(StandardCustomLoggerInitParams): + """ + Init params for Datadog Cost Management + """ + + datadog_cost_management_params: Optional[Dict] = None + + +class DatadogFOCUSCostEntry(TypedDict): + """ + Represents a single cost line item in the FOCUS format. + Ref: https://focus.finops.org/#specification + """ + + ProviderName: str + ChargeDescription: str + ChargePeriodStart: str + ChargePeriodEnd: str + BilledCost: float + BillingCurrency: str + Tags: Optional[Dict[str, str]] diff --git a/tests/test_litellm/integrations/datadog/test_datadog_cost_management.py b/tests/test_litellm/integrations/datadog/test_datadog_cost_management.py new file mode 100644 index 0000000000..be2084969a --- /dev/null +++ b/tests/test_litellm/integrations/datadog/test_datadog_cost_management.py @@ -0,0 +1,169 @@ +import os +import time +from unittest.mock import AsyncMock + +import pytest +from httpx import Response + +from litellm.integrations.datadog.datadog_cost_management import ( + DatadogCostManagementLogger, +) +from litellm.types.utils import StandardLoggingPayload + + +@pytest.fixture +def clean_env(): + # Save original env + original_api_key = os.environ.get("DD_API_KEY") + original_app_key = os.environ.get("DD_APP_KEY") + original_site = os.environ.get("DD_SITE") + + # Set test env + os.environ["DD_API_KEY"] = "test_api_key" + os.environ["DD_APP_KEY"] = "test_app_key" + os.environ["DD_SITE"] = "test.datadoghq.com" + + yield + + # Restore original env + if original_api_key: + os.environ["DD_API_KEY"] = original_api_key + else: + del os.environ["DD_API_KEY"] + + if original_app_key: + os.environ["DD_APP_KEY"] = original_app_key + else: + del os.environ["DD_APP_KEY"] + + if original_site: + os.environ["DD_SITE"] = original_site + else: + del os.environ["DD_SITE"] + + +@pytest.mark.asyncio +async def test_init(clean_env): + """ + Test initialization sets up clients and url correctly + """ + logger = DatadogCostManagementLogger() + assert logger.dd_api_key == "test_api_key" + assert logger.dd_app_key == "test_app_key" + assert ( + logger.upload_url == "https://api.test.datadoghq.com/api/v2/cost/custom_costs" + ) + + +@pytest.mark.asyncio +async def test_aggregate_costs(clean_env): + """ + Test that costs are correctly aggregated by provider, model, and date + """ + logger = DatadogCostManagementLogger() + + # Mock some log payloads + now = time.time() + day_str = time.strftime("%Y-%m-%d", time.localtime(now)) + + logs = [ + StandardLoggingPayload( + custom_llm_provider="openai", + model="gpt-4", + response_cost=0.01, + startTime=now, + metadata={"user_api_key_team_alias": "team-a"}, + ), + StandardLoggingPayload( + custom_llm_provider="openai", + model="gpt-4", + response_cost=0.02, + startTime=now, + metadata={"user_api_key_team_alias": "team-a"}, + ), + StandardLoggingPayload( + custom_llm_provider="anthropic", + model="claude-3", + response_cost=0.05, + startTime=now, + ), + ] + + aggregated = logger._aggregate_costs(logs) + + assert len(aggregated) == 2 + + # Check OpenAI entry + openai_entry = next(e for e in aggregated if e["ProviderName"] == "openai") + assert openai_entry["BilledCost"] == 0.03 + assert openai_entry["ChargeDescription"] == "LLM Usage for gpt-4" + assert openai_entry["ChargePeriodStart"] == day_str + assert openai_entry["Tags"]["team"] == "team-a" + assert "env" in openai_entry["Tags"] + assert "service" in openai_entry["Tags"] + + # Check Anthropic entry + anthropic_entry = next(e for e in aggregated if e["ProviderName"] == "anthropic") + assert anthropic_entry["BilledCost"] == 0.05 + + +@pytest.mark.asyncio +async def test_async_log_success_event(clean_env): + """ + Test that logs are added to queue + """ + logger = DatadogCostManagementLogger(batch_size=10) + + await logger.async_log_success_event( + kwargs={"standard_logging_object": {"response_cost": 0.01}}, + response_obj={}, + start_time=time.time(), + end_time=time.time(), + ) + + assert len(logger.log_queue) == 1 + assert logger.log_queue[0]["response_cost"] == 0.01 + + # Test zero cost ignored + await logger.async_log_success_event( + kwargs={"standard_logging_object": {"response_cost": 0.0}}, + response_obj={}, + start_time=time.time(), + end_time=time.time(), + ) + + assert len(logger.log_queue) == 1 + + +@pytest.mark.asyncio +async def test_async_send_batch(clean_env): + """ + Test that batch is aggregated and uploaded + """ + logger = DatadogCostManagementLogger() + logger.async_client = AsyncMock() + logger.async_client.put.return_value = Response(202, json={"status": "ok"}) + + # Add logs directly to queue + logger.log_queue = [ + StandardLoggingPayload( + custom_llm_provider="openai", + model="gpt-4", + response_cost=0.01, + startTime=time.time(), + ) + ] + + await logger.async_send_batch() + + # Verify API called + assert logger.async_client.put.called + call_args = logger.async_client.put.call_args + assert call_args[0][0] == "https://api.test.datadoghq.com/api/v2/cost/custom_costs" + + import json + + # Use call_args.kwargs['content'] + content = json.loads(call_args[1]["content"]) + assert content[0]["ProviderName"] == "openai" + assert content[0]["BilledCost"] == 0.01 From 89ecdc405dd95ac7739d450cd2718153ec270964 Mon Sep 17 00:00:00 2001 From: Harshit Jain <48647625+Harshit28j@users.noreply.github.com> Date: Fri, 23 Jan 2026 09:26:41 +0530 Subject: [PATCH 08/38] fix: recursive pydantic issue (#19531) --- litellm/integrations/custom_guardrail.py | 16 +++- litellm/integrations/langfuse/langfuse.py | 14 ++-- .../test_custom_guardrail_recursion.py | 73 +++++++++++++++++++ 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 tests/test_litellm/integrations/test_custom_guardrail_recursion.py diff --git a/litellm/integrations/custom_guardrail.py b/litellm/integrations/custom_guardrail.py index 6a76b57e7f..a5bb530fc5 100644 --- a/litellm/integrations/custom_guardrail.py +++ b/litellm/integrations/custom_guardrail.py @@ -516,7 +516,9 @@ class CustomGuardrail(CustomLogger): from litellm.types.utils import GuardrailMode # Use event_type if provided, otherwise fall back to self.event_hook - guardrail_mode: Union[GuardrailEventHooks, GuardrailMode, List[GuardrailEventHooks]] + guardrail_mode: Union[ + GuardrailEventHooks, GuardrailMode, List[GuardrailEventHooks] + ] if event_type is not None: guardrail_mode = event_type elif isinstance(self.event_hook, Mode): @@ -524,11 +526,21 @@ class CustomGuardrail(CustomLogger): else: guardrail_mode = self.event_hook # type: ignore[assignment] + from litellm.litellm_core_utils.core_helpers import ( + filter_exceptions_from_params, + ) + + # Sanitize the response to ensure it's JSON serializable and free of circular refs + # This prevents RecursionErrors in downstream loggers (Langfuse, Datadog, etc.) + clean_guardrail_response = filter_exceptions_from_params( + guardrail_json_response + ) + slg = StandardLoggingGuardrailInformation( guardrail_name=self.guardrail_name, guardrail_provider=guardrail_provider, guardrail_mode=guardrail_mode, - guardrail_response=guardrail_json_response, + guardrail_response=clean_guardrail_response, guardrail_status=guardrail_status, start_time=start_time, end_time=end_time, diff --git a/litellm/integrations/langfuse/langfuse.py b/litellm/integrations/langfuse/langfuse.py index 8087c17caf..b64af66ce9 100644 --- a/litellm/integrations/langfuse/langfuse.py +++ b/litellm/integrations/langfuse/langfuse.py @@ -23,6 +23,7 @@ from litellm.constants import MAX_LANGFUSE_INITIALIZED_CLIENTS from litellm.litellm_core_utils.core_helpers import ( safe_deep_copy, reconstruct_model_name, + filter_exceptions_from_params, ) from litellm.litellm_core_utils.redact_messages import redact_user_api_key_info from litellm.llms.custom_httpx.http_handler import _get_httpx_client @@ -71,9 +72,8 @@ def _extract_cache_read_input_tokens(usage_obj) -> int: # Check prompt_tokens_details.cached_tokens (used by Gemini and other providers) if hasattr(usage_obj, "prompt_tokens_details"): prompt_tokens_details = getattr(usage_obj, "prompt_tokens_details", None) - if ( - prompt_tokens_details is not None - and hasattr(prompt_tokens_details, "cached_tokens") + if prompt_tokens_details is not None and hasattr( + prompt_tokens_details, "cached_tokens" ): cached_tokens = getattr(prompt_tokens_details, "cached_tokens", None) if ( @@ -526,7 +526,6 @@ class LangFuseLogger: verbose_logger.debug("Langfuse Layer Logging - logging to langfuse v2") try: - metadata = metadata or {} standard_logging_object: Optional[StandardLoggingPayload] = cast( Optional[StandardLoggingPayload], kwargs.get("standard_logging_object", None), @@ -692,9 +691,10 @@ class LangFuseLogger: clean_metadata["litellm_response_cost"] = cost if standard_logging_object is not None: - clean_metadata["hidden_params"] = standard_logging_object[ - "hidden_params" - ] + hidden_params = standard_logging_object.get("hidden_params", {}) + clean_metadata["hidden_params"] = filter_exceptions_from_params( + hidden_params + ) if ( litellm.langfuse_default_tags is not None diff --git a/tests/test_litellm/integrations/test_custom_guardrail_recursion.py b/tests/test_litellm/integrations/test_custom_guardrail_recursion.py new file mode 100644 index 0000000000..f05b5848bd --- /dev/null +++ b/tests/test_litellm/integrations/test_custom_guardrail_recursion.py @@ -0,0 +1,73 @@ +import pytest +from litellm.integrations.custom_guardrail import CustomGuardrail +from litellm.types.guardrails import GuardrailEventHooks +import json + + +class TestCustomGuardrailRecursion: + """ + Specific tests for the circular reference / RecursionError fix in logging. + """ + + def test_log_guardrail_information_handles_circular_references(self): + """ + Test that add_standard_logging method sanitizes input data containing circular references + instead of crashing. + + This reproduces the Langfuse crash scenario: + Request -> Metadata -> GuardrailResponse -> DebugContext -> Request + """ + guardrail = CustomGuardrail( + guardrail_name="recursion_test_guardrail", + event_hook=GuardrailEventHooks.pre_call, + ) + + # 1. Setup Circular Data + request_data = {"user_id": "test_recursive_user"} + metadata = {"session_id": "123"} + request_data["metadata"] = metadata + + # Create the danger: Guardrail Response holding a reference back to request_data + dirty_response = { + "flagged": False, + "debug_context": request_data, # <--- ACCESS TO ROOT (Circular Ref) + } + + # 2. Invoke the logging method + # If the fix is working, this will NOT raise RecursionError + try: + guardrail.add_standard_logging_guardrail_information_to_request_data( + guardrail_json_response=dirty_response, + request_data=request_data, + guardrail_status="success", + start_time=1.0, + end_time=2.0, + duration=1.0, + masked_entity_count={}, + event_type=GuardrailEventHooks.pre_call, + ) + except RecursionError: + pytest.fail( + "RecursionError raised! The cyclic reference sanitization failed." + ) + + # 3. Verify the data stored is safe + stored_info = request_data["metadata"][ + "standard_logging_guardrail_information" + ][0] + stored_response = stored_info["guardrail_response"] + + # Check that we can dump it to JSON without crashing (Ultimate proof) + try: + json.dumps(stored_response) + except Exception as e: + pytest.fail(f"Stored data is not JSON serializable: {e}") + + # Check content - keys should be preserved but recursion broken + assert "debug_context" in stored_response + debug_context = stored_response["debug_context"] + + # In a sanitized copy, the nested metadata should be a copy, not the original live dict + assert debug_context["user_id"] == "test_recursive_user" + # The 'metadata' inside 'debug_context' would be where recursion stops or is filtered + assert "metadata" in debug_context From 188c2315adaaa401669072cdf04d9b0b80678f58 Mon Sep 17 00:00:00 2001 From: Chesars Date: Fri, 23 Jan 2026 15:11:37 -0300 Subject: [PATCH 09/38] feat(vercel_ai_gateway): add embeddings support Add support for /embeddings endpoint via Vercel AI Gateway. Closes #19658 Changes: - Add VercelAIGatewayEmbeddingConfig in litellm/llms/vercel_ai_gateway/embedding/ - Register provider in utils.py and main.py - Add unit tests for embedding transformation - Update documentation with embeddings examples Usage: ```python from litellm import embedding response = embedding( model="vercel_ai_gateway/openai/text-embedding-3-small", input="Hello world", api_key="your-api-key" ) ``` --- .../docs/providers/vercel_ai_gateway.md | 36 ++- .../vercel_ai_gateway/embedding/__init__.py | 0 .../embedding/transformation.py | 176 ++++++++++++++ litellm/main.py | 30 +++ litellm/utils.py | 6 + .../vercel_ai_gateway/embedding/__init__.py | 0 .../test_vercel_ai_gateway_embedding.py | 218 ++++++++++++++++++ 7 files changed, 464 insertions(+), 2 deletions(-) create mode 100644 litellm/llms/vercel_ai_gateway/embedding/__init__.py create mode 100644 litellm/llms/vercel_ai_gateway/embedding/transformation.py create mode 100644 tests/test_litellm/llms/vercel_ai_gateway/embedding/__init__.py create mode 100644 tests/test_litellm/llms/vercel_ai_gateway/embedding/test_vercel_ai_gateway_embedding.py diff --git a/docs/my-website/docs/providers/vercel_ai_gateway.md b/docs/my-website/docs/providers/vercel_ai_gateway.md index 91f0a18ea1..3ff007171e 100644 --- a/docs/my-website/docs/providers/vercel_ai_gateway.md +++ b/docs/my-website/docs/providers/vercel_ai_gateway.md @@ -11,7 +11,7 @@ import TabItem from '@theme/TabItem'; | Provider Route on LiteLLM | `vercel_ai_gateway/` | | Link to Provider Doc | [Vercel AI Gateway Documentation ↗](https://vercel.com/docs/ai-gateway) | | Base URL | `https://ai-gateway.vercel.sh/v1` | -| Supported Operations | `/chat/completions`, `/models` | +| Supported Operations | `/chat/completions`, `/embeddings`, `/models` |

@@ -73,7 +73,7 @@ messages = [{"content": "Hello, how are you?", "role": "user"}] # Vercel AI Gateway call with streaming response = completion( - model="vercel_ai_gateway/openai/gpt-4o", + model="vercel_ai_gateway/openai/gpt-4o", messages=messages, stream=True ) @@ -82,6 +82,33 @@ for chunk in response: print(chunk) ``` +### Embeddings + +```python showLineNumbers title="Vercel AI Gateway Embeddings" +import os +from litellm import embedding + +os.environ["VERCEL_AI_GATEWAY_API_KEY"] = "your-api-key" + +# Vercel AI Gateway embedding call +response = embedding( + model="vercel_ai_gateway/openai/text-embedding-3-small", + input="Hello world" +) + +print(response.data[0]["embedding"][:5]) # Print first 5 dimensions +``` + +You can also specify the `dimensions` parameter: + +```python showLineNumbers title="Vercel AI Gateway Embeddings with Dimensions" +response = embedding( + model="vercel_ai_gateway/openai/text-embedding-3-small", + input=["Hello world", "Goodbye world"], + dimensions=768 +) +``` + ## Usage - LiteLLM Proxy Add the following to your LiteLLM Proxy configuration file: @@ -97,6 +124,11 @@ model_list: litellm_params: model: vercel_ai_gateway/anthropic/claude-4-sonnet api_key: os.environ/VERCEL_AI_GATEWAY_API_KEY + + - model_name: text-embedding-3-small-gateway + litellm_params: + model: vercel_ai_gateway/openai/text-embedding-3-small + api_key: os.environ/VERCEL_AI_GATEWAY_API_KEY ``` Start your LiteLLM Proxy server: diff --git a/litellm/llms/vercel_ai_gateway/embedding/__init__.py b/litellm/llms/vercel_ai_gateway/embedding/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/litellm/llms/vercel_ai_gateway/embedding/transformation.py b/litellm/llms/vercel_ai_gateway/embedding/transformation.py new file mode 100644 index 0000000000..7238b05f10 --- /dev/null +++ b/litellm/llms/vercel_ai_gateway/embedding/transformation.py @@ -0,0 +1,176 @@ +""" +Vercel AI Gateway Embedding API Configuration. + +This module provides the configuration for Vercel AI Gateway's Embedding API. +Vercel AI Gateway is OpenAI-compatible and supports embeddings via the /v1/embeddings endpoint. + +Docs: https://vercel.com/docs/ai-gateway/openai-compat/embeddings +""" + +from typing import TYPE_CHECKING, Any, Optional + +import httpx + +from litellm.llms.base_llm.embedding.transformation import BaseEmbeddingConfig +from litellm.secret_managers.main import get_secret_str +from litellm.types.llms.openai import AllEmbeddingInputValues +from litellm.types.utils import EmbeddingResponse +from litellm.utils import convert_to_model_response_object + +from ..common_utils import VercelAIGatewayException + +if TYPE_CHECKING: + from litellm.litellm_core_utils.litellm_logging import Logging as _LiteLLMLoggingObj + + LiteLLMLoggingObj = _LiteLLMLoggingObj +else: + LiteLLMLoggingObj = Any + + +class VercelAIGatewayEmbeddingConfig(BaseEmbeddingConfig): + """ + Configuration for Vercel AI Gateway's Embedding API. + + Reference: https://vercel.com/docs/ai-gateway/openai-compat/embeddings + """ + + def validate_environment( + self, + headers: dict, + model: str, + messages: list, + optional_params: dict, + litellm_params: dict, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + ) -> dict: + """ + Validate environment and set up headers for Vercel AI Gateway API. + + Vercel AI Gateway requires: + - Authorization header with Bearer token (API key or OIDC token) + """ + vercel_headers = { + "Content-Type": "application/json", + } + + # Add Authorization header if api_key is provided + if api_key: + vercel_headers["Authorization"] = f"Bearer {api_key}" + + # Merge with existing headers (user's extra_headers take priority) + merged_headers = {**vercel_headers, **headers} + + return merged_headers + + def get_complete_url( + self, + api_base: Optional[str], + api_key: Optional[str], + model: str, + optional_params: dict, + litellm_params: dict, + stream: Optional[bool] = None, + ) -> str: + """ + Get the complete URL for Vercel AI Gateway Embedding API endpoint. + """ + if api_base: + api_base = api_base.rstrip("/") + else: + api_base = ( + get_secret_str("VERCEL_AI_GATEWAY_API_BASE") + or "https://ai-gateway.vercel.sh/v1" + ) + + return f"{api_base}/embeddings" + + def transform_embedding_request( + self, + model: str, + input: AllEmbeddingInputValues, + optional_params: dict, + headers: dict, + ) -> dict: + """ + Transform embedding request to Vercel AI Gateway format (OpenAI-compatible). + """ + # Ensure input is a list + if isinstance(input, str): + input = [input] + + # Strip 'vercel_ai_gateway/' prefix if present + if model.startswith("vercel_ai_gateway/"): + model = model.replace("vercel_ai_gateway/", "", 1) + + return { + "model": model, + "input": input, + **optional_params, + } + + def transform_embedding_response( + self, + model: str, + raw_response: httpx.Response, + model_response: EmbeddingResponse, + logging_obj: LiteLLMLoggingObj, + api_key: Optional[str], + request_data: dict, + optional_params: dict, + litellm_params: dict, + ) -> EmbeddingResponse: + """ + Transform embedding response from Vercel AI Gateway format (OpenAI-compatible). + """ + logging_obj.post_call(original_response=raw_response.text) + + # Vercel AI Gateway returns standard OpenAI-compatible embedding response + response_json = raw_response.json() + + return convert_to_model_response_object( + response_object=response_json, + model_response_object=model_response, + response_type="embedding", + ) + + def get_supported_openai_params(self, model: str) -> list: + """ + Get list of supported OpenAI parameters for Vercel AI Gateway embeddings. + + Vercel AI Gateway supports the standard OpenAI embeddings parameters + and auto-maps 'dimensions' to each provider's expected field. + """ + return [ + "timeout", + "dimensions", + "encoding_format", + "user", + ] + + def map_openai_params( + self, + non_default_params: dict, + optional_params: dict, + model: str, + drop_params: bool, + ) -> dict: + """ + Map OpenAI parameters to Vercel AI Gateway format. + """ + for param, value in non_default_params.items(): + if param in self.get_supported_openai_params(model): + optional_params[param] = value + return optional_params + + def get_error_class( + self, error_message: str, status_code: int, headers: Any + ) -> Any: + """ + Get the error class for Vercel AI Gateway errors. + """ + return VercelAIGatewayException( + message=error_message, + status_code=status_code, + headers=headers, + ) diff --git a/litellm/main.py b/litellm/main.py index ea41919e19..24aac661db 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -4863,6 +4863,36 @@ def embedding( # noqa: PLR0915 headers = openrouter_headers + response = base_llm_http_handler.embedding( + model=model, + input=input, + custom_llm_provider=custom_llm_provider, + api_base=api_base, + api_key=api_key, + logging_obj=logging, + timeout=timeout, + model_response=EmbeddingResponse(), + optional_params=optional_params, + client=client, + aembedding=aembedding, + litellm_params=litellm_params_dict, + headers=headers, + ) + elif custom_llm_provider == "vercel_ai_gateway": + api_base = ( + api_base + or litellm.api_base + or get_secret_str("VERCEL_AI_GATEWAY_API_BASE") + or "https://ai-gateway.vercel.sh/v1" + ) + + api_key = ( + api_key + or litellm.api_key + or get_secret_str("VERCEL_AI_GATEWAY_API_KEY") + or get_secret_str("VERCEL_OIDC_TOKEN") + ) + response = base_llm_http_handler.embedding( model=model, input=input, diff --git a/litellm/utils.py b/litellm/utils.py index 06eceefe0c..21d096b97c 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8014,6 +8014,12 @@ class ProviderConfigManager: ) return OpenrouterEmbeddingConfig() + elif litellm.LlmProviders.VERCEL_AI_GATEWAY == provider: + from litellm.llms.vercel_ai_gateway.embedding.transformation import ( + VercelAIGatewayEmbeddingConfig, + ) + + return VercelAIGatewayEmbeddingConfig() elif litellm.LlmProviders.GIGACHAT == provider: return litellm.GigaChatEmbeddingConfig() elif litellm.LlmProviders.SAGEMAKER == provider: diff --git a/tests/test_litellm/llms/vercel_ai_gateway/embedding/__init__.py b/tests/test_litellm/llms/vercel_ai_gateway/embedding/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_litellm/llms/vercel_ai_gateway/embedding/test_vercel_ai_gateway_embedding.py b/tests/test_litellm/llms/vercel_ai_gateway/embedding/test_vercel_ai_gateway_embedding.py new file mode 100644 index 0000000000..af1e1df92f --- /dev/null +++ b/tests/test_litellm/llms/vercel_ai_gateway/embedding/test_vercel_ai_gateway_embedding.py @@ -0,0 +1,218 @@ +import os +import sys +from unittest.mock import MagicMock, patch + +import httpx +import pytest + +sys.path.insert( + 0, os.path.abspath("../../../../..") +) # Adds the parent directory to the system path + +from litellm.llms.vercel_ai_gateway.embedding.transformation import ( + VercelAIGatewayEmbeddingConfig, +) +from litellm.llms.vercel_ai_gateway.common_utils import VercelAIGatewayException +from litellm.types.utils import EmbeddingResponse + + +def test_vercel_ai_gateway_embedding_get_complete_url(): + """Test URL generation for embeddings endpoint""" + config = VercelAIGatewayEmbeddingConfig() + + # Test with default API base + url = config.get_complete_url( + api_base=None, + api_key=None, + model="openai/text-embedding-3-small", + optional_params={}, + litellm_params={}, + ) + assert url == "https://ai-gateway.vercel.sh/v1/embeddings" + + # Test with custom API base + url = config.get_complete_url( + api_base="https://custom.vercel.sh/v1", + api_key=None, + model="openai/text-embedding-3-small", + optional_params={}, + litellm_params={}, + ) + assert url == "https://custom.vercel.sh/v1/embeddings" + + # Test with trailing slash + url = config.get_complete_url( + api_base="https://custom.vercel.sh/v1/", + api_key=None, + model="openai/text-embedding-3-small", + optional_params={}, + litellm_params={}, + ) + assert url == "https://custom.vercel.sh/v1/embeddings" + + +def test_vercel_ai_gateway_embedding_transform_request(): + """Test request transformation for embeddings""" + config = VercelAIGatewayEmbeddingConfig() + + # Test with string input + request = config.transform_embedding_request( + model="openai/text-embedding-3-small", + input="Hello world", + optional_params={}, + headers={}, + ) + assert request["model"] == "openai/text-embedding-3-small" + assert request["input"] == ["Hello world"] + + # Test with list input + request = config.transform_embedding_request( + model="openai/text-embedding-3-small", + input=["Hello", "World"], + optional_params={}, + headers={}, + ) + assert request["model"] == "openai/text-embedding-3-small" + assert request["input"] == ["Hello", "World"] + + # Test stripping vercel_ai_gateway/ prefix + request = config.transform_embedding_request( + model="vercel_ai_gateway/openai/text-embedding-3-small", + input="Hello", + optional_params={}, + headers={}, + ) + assert request["model"] == "openai/text-embedding-3-small" + + +def test_vercel_ai_gateway_embedding_transform_request_with_dimensions(): + """Test request transformation with dimensions parameter""" + config = VercelAIGatewayEmbeddingConfig() + + request = config.transform_embedding_request( + model="openai/text-embedding-3-small", + input="Hello world", + optional_params={"dimensions": 768}, + headers={}, + ) + assert request["model"] == "openai/text-embedding-3-small" + assert request["input"] == ["Hello world"] + assert request["dimensions"] == 768 + + +def test_vercel_ai_gateway_embedding_validate_environment(): + """Test header validation and setup""" + config = VercelAIGatewayEmbeddingConfig() + + headers = config.validate_environment( + headers={}, + model="openai/text-embedding-3-small", + messages=[], + optional_params={}, + litellm_params={}, + api_key="test_key", + ) + assert headers["Content-Type"] == "application/json" + assert headers["Authorization"] == "Bearer test_key" + + # Test with existing headers (should merge) + headers = config.validate_environment( + headers={"X-Custom": "value"}, + model="openai/text-embedding-3-small", + messages=[], + optional_params={}, + litellm_params={}, + api_key="test_key", + ) + assert headers["X-Custom"] == "value" + assert headers["Authorization"] == "Bearer test_key" + + +def test_vercel_ai_gateway_embedding_get_supported_params(): + """Test supported OpenAI parameters""" + config = VercelAIGatewayEmbeddingConfig() + supported = config.get_supported_openai_params("openai/text-embedding-3-small") + + assert "dimensions" in supported + assert "encoding_format" in supported + assert "timeout" in supported + assert "user" in supported + + +def test_vercel_ai_gateway_embedding_map_openai_params(): + """Test OpenAI parameter mapping""" + config = VercelAIGatewayEmbeddingConfig() + + optional_params = config.map_openai_params( + non_default_params={"dimensions": 768, "encoding_format": "float"}, + optional_params={}, + model="openai/text-embedding-3-small", + drop_params=False, + ) + assert optional_params["dimensions"] == 768 + assert optional_params["encoding_format"] == "float" + + +def test_vercel_ai_gateway_embedding_error_class(): + """Test error class creation""" + config = VercelAIGatewayEmbeddingConfig() + + error = config.get_error_class( + error_message="Test error", + status_code=400, + headers={"Content-Type": "application/json"}, + ) + + assert isinstance(error, VercelAIGatewayException) + assert error.message == "Test error" + assert error.status_code == 400 + + +def test_vercel_ai_gateway_embedding_transform_response(): + """Test response transformation""" + config = VercelAIGatewayEmbeddingConfig() + + mock_response = MagicMock(spec=httpx.Response) + mock_response.text = '{"object":"list","data":[{"object":"embedding","index":0,"embedding":[0.1,0.2,0.3]}],"model":"openai/text-embedding-3-small","usage":{"prompt_tokens":2,"total_tokens":2}}' + mock_response.json.return_value = { + "object": "list", + "data": [{"object": "embedding", "index": 0, "embedding": [0.1, 0.2, 0.3]}], + "model": "openai/text-embedding-3-small", + "usage": {"prompt_tokens": 2, "total_tokens": 2}, + } + + mock_logging = MagicMock() + + response = config.transform_embedding_response( + model="openai/text-embedding-3-small", + raw_response=mock_response, + model_response=EmbeddingResponse(), + logging_obj=mock_logging, + api_key="test_key", + request_data={}, + optional_params={}, + litellm_params={}, + ) + + assert response is not None + mock_logging.post_call.assert_called_once() + + +def test_vercel_ai_gateway_embedding_env_vars(): + """Test environment variable handling""" + config = VercelAIGatewayEmbeddingConfig() + + with patch.dict( + os.environ, + { + "VERCEL_AI_GATEWAY_API_BASE": "https://env.vercel.sh/v1", + }, + ): + url = config.get_complete_url( + api_base=None, + api_key=None, + model="openai/text-embedding-3-small", + optional_params={}, + litellm_params={}, + ) + assert url == "https://env.vercel.sh/v1/embeddings" From de538456e3447db5bd27f440a9b9974a38bac80a Mon Sep 17 00:00:00 2001 From: Misha <72940774+formorter@users.noreply.github.com> Date: Sat, 24 Jan 2026 06:54:23 +0300 Subject: [PATCH 10/38] feat: support role_mappings from environment variables (#19498) * feat: support role_mappings from environment variables * fix linter --- litellm/proxy/management_endpoints/ui_sso.py | 96 +++++++++++---- .../test_proxy_setting_endpoints.py | 110 ++++++++++++++++++ 2 files changed, 183 insertions(+), 23 deletions(-) diff --git a/litellm/proxy/management_endpoints/ui_sso.py b/litellm/proxy/management_endpoints/ui_sso.py index 5adf54c162..1756fe9c6f 100644 --- a/litellm/proxy/management_endpoints/ui_sso.py +++ b/litellm/proxy/management_endpoints/ui_sso.py @@ -99,24 +99,24 @@ def determine_role_from_groups( ) -> Optional[LitellmUserRoles]: """ Determine the highest privilege role for a user based on their groups. - + Role hierarchy (highest to lowest): - proxy_admin - proxy_admin_viewer - internal_user - internal_user_viewer - + Args: user_groups: List of group names from the SSO token role_mappings: RoleMappings configuration object - + Returns: The highest privilege role found, or default_role if no matches, or None """ if not role_mappings.roles: # No role mappings configured, return default_role return role_mappings.default_role - + # Role hierarchy (highest to lowest) role_hierarchy = [ LitellmUserRoles.PROXY_ADMIN, @@ -124,20 +124,22 @@ def determine_role_from_groups( LitellmUserRoles.INTERNAL_USER, LitellmUserRoles.INTERNAL_USER_VIEW_ONLY, ] - + # Convert user_groups to a set for efficient lookup user_groups_set = set(user_groups) if isinstance(user_groups, list) else set() - + # Find the highest privilege role the user belongs to for role in role_hierarchy: if role in role_mappings.roles: role_groups = role_mappings.roles[role] - if isinstance(role_groups, list) and user_groups_set.intersection(set(role_groups)): + if isinstance(role_groups, list) and user_groups_set.intersection( + set(role_groups) + ): verbose_proxy_logger.debug( f"User groups {user_groups} matched role '{role.value}' via groups: {role_groups}" ) return role - + # No matching groups found, return default_role verbose_proxy_logger.debug( f"User groups {user_groups} did not match any role mappings, using default_role: {role_mappings.default_role}" @@ -326,9 +328,7 @@ def generic_response_convertor( "GENERIC_USER_PROVIDER_ATTRIBUTE", "provider" ) - generic_user_role_attribute_name = os.getenv( - "GENERIC_USER_ROLE_ATTRIBUTE", "role" - ) + generic_user_role_attribute_name = os.getenv("GENERIC_USER_ROLE_ATTRIBUTE", "role") verbose_proxy_logger.debug( f" generic_user_id_attribute_name: {generic_user_id_attribute_name}\n generic_user_email_attribute_name: {generic_user_email_attribute_name}" @@ -345,12 +345,15 @@ def generic_response_convertor( # Determine user role based on role_mappings if available # Only apply role_mappings for GENERIC SSO provider user_role: Optional[LitellmUserRoles] = None - - if role_mappings is not None and role_mappings.provider.lower() in ["generic", "okta"]: + + if role_mappings is not None and role_mappings.provider.lower() in [ + "generic", + "okta", + ]: # Use role_mappings to determine role from groups group_claim = role_mappings.group_claim user_groups_raw: Any = get_nested_value(response, group_claim) - + # Handle different formats: could be a list, string (comma-separated), or single value user_groups: List[str] = [] if isinstance(user_groups_raw, list): @@ -361,7 +364,7 @@ def generic_response_convertor( elif user_groups_raw is not None: # Single value user_groups = [str(user_groups_raw)] - + if user_groups: user_role = determine_role_from_groups(user_groups, role_mappings) verbose_proxy_logger.debug( @@ -373,10 +376,12 @@ def generic_response_convertor( verbose_proxy_logger.debug( f"No groups found in '{group_claim}', using default_role: {role_mappings.default_role}" ) - + # Fallback to existing logic if role_mappings not used if user_role is None: - user_role_from_sso = get_nested_value(response, generic_user_role_attribute_name) + user_role_from_sso = get_nested_value( + response, generic_user_role_attribute_name + ) if user_role_from_sso is not None: role = get_litellm_user_role(user_role_from_sso) if role is not None: @@ -399,7 +404,9 @@ def generic_response_convertor( ) -def _setup_generic_sso_env_vars(generic_client_id: str, redirect_url: str) -> Tuple[str, List[str], str, str, str, bool]: +def _setup_generic_sso_env_vars( + generic_client_id: str, redirect_url: str +) -> Tuple[str, List[str], str, str, str, bool]: """Setup and validate Generic SSO environment variables.""" generic_client_secret = os.getenv("GENERIC_CLIENT_SECRET", None) generic_scope = os.getenv("GENERIC_SCOPE", "openid email profile").split(" ") @@ -492,7 +499,43 @@ async def _setup_role_mappings() -> Optional["RoleMappings"]: verbose_proxy_logger.debug( f"Could not load role_mappings from database: {e}. Continuing with existing role logic." ) + + generic_role_mappings = os.getenv("GENERIC_ROLE_MAPPINGS_ROLES", None) + generic_role_mappings_group_claim = os.getenv( + "GENERIC_ROLE_MAPPINGS_GROUP_CLAIM", None + ) + generic_role_mappoings_default_role = os.getenv( + "GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE", None + ) + if generic_role_mappings is not None: + verbose_proxy_logger.debug( + "Found role_mappings for generic provider in environment variables" + ) + import ast + try: + generic_user_role_mappings_data: Dict[ + LitellmUserRoles, List[str] + ] = ast.literal_eval(generic_role_mappings) + if isinstance(generic_user_role_mappings_data, dict): + from litellm.types.proxy.management_endpoints.ui_sso import ( + RoleMappings, + ) + + role_mappings_data = { + "provider": "generic", + "group_claim": generic_role_mappings_group_claim, + "default_role": generic_role_mappoings_default_role, + "roles": generic_user_role_mappings_data, + } + + role_mappings = RoleMappings(**role_mappings_data) + verbose_proxy_logger.debug( + f"Loaded role_mappings from environments for provider '{role_mappings.provider}'." + ) + return role_mappings + except TypeError as e: + verbose_proxy_logger.warning(f"Error decoding role mappings from environment variables: {e}. Continuing with existing role logic.") return role_mappings @@ -529,7 +572,7 @@ async def get_generic_sso_response( # Get role_mappings from SSO settings if available role_mappings = await _setup_role_mappings() - + def response_convertor(response, client): nonlocal received_response # return for user debugging received_response = response @@ -1217,20 +1260,24 @@ async def insert_sso_user( role_mappings_configured = False try: from litellm.proxy.utils import get_prisma_client_or_throw - + prisma_client = get_prisma_client_or_throw( "Prisma client is None, connect a database to your proxy" ) - + # Get SSO config from dedicated table sso_db_record = await prisma_client.db.litellm_ssoconfig.find_unique( where={"id": "sso_config"} ) - + if sso_db_record and sso_db_record.sso_settings: sso_settings_dict = dict(sso_db_record.sso_settings) role_mappings_data = sso_settings_dict.get("role_mappings") role_mappings_configured = role_mappings_data is not None + generic_user_role_mappings = os.getenv("GENERIC_USER_ROLE_MAPPINGS", None) + if generic_user_role_mappings is not None: + role_mappings_configured = True + except Exception as e: # If we can't check role_mappings, continue with existing logic verbose_proxy_logger.debug( @@ -1240,7 +1287,10 @@ async def insert_sso_user( # Apply default_internal_user_params if litellm.default_internal_user_params: # If role_mappings is configured and user_role is already set from SSO, preserve it - if role_mappings_configured and user_defined_values.get("user_role") is not None: + if ( + role_mappings_configured + and user_defined_values.get("user_role") is not None + ): # Preserve the SSO-extracted role, but apply other defaults preserved_role = user_defined_values.get("user_role") user_defined_values.update(litellm.default_internal_user_params) # type: ignore diff --git a/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py b/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py index ad4f53dac4..60bdb7d12c 100644 --- a/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py +++ b/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py @@ -1227,3 +1227,113 @@ class TestProxySettingEndpoints: assert retrieved_role_mappings["provider"] == "google" assert retrieved_role_mappings["group_claim"] == "groups" assert retrieved_role_mappings["default_role"] == LitellmUserRoles.INTERNAL_USER + + def test_setup_role_mappings_custom_logic_with_env_vars(self, monkeypatch): + """Test the _setup_role_mappings function directly with custom role mapping logic from environment variables""" + import asyncio + import os + from litellm.proxy.management_endpoints.ui_sso import _setup_role_mappings + from litellm.proxy._types import LitellmUserRoles + + # Set up environment variables for custom role mappings using valid Python dict format + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_ROLES", "{'proxy_admin': ['custom-admin-group'], 'internal_user': ['custom-user-group'], 'proxy_admin_viewer': ['custom-viewer-group']}") + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_GROUP_CLAIM", "custom-groups") + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE", "internal_user_viewer") + + # Debug: Print environment variables + print("GENERIC_ROLE_MAPPINGS_ROLES:", os.getenv("GENERIC_ROLE_MAPPINGS_ROLES")) + print("GENERIC_ROLE_MAPPINGS_GROUP_CLAIM:", os.getenv("GENERIC_ROLE_MAPPINGS_GROUP_CLAIM")) + print("GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE:", os.getenv("GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE")) + + # Run the async function + role_mappings = asyncio.run(_setup_role_mappings()) + + # Debug: Print result + print("role_mappings result:", role_mappings) + + # Verify role_mappings is returned correctly from environment variables + assert role_mappings is not None + assert role_mappings.provider == "generic" + assert role_mappings.group_claim == "custom-groups" + assert role_mappings.default_role == LitellmUserRoles.INTERNAL_USER_VIEW_ONLY + assert role_mappings.roles[LitellmUserRoles.PROXY_ADMIN] == ["custom-admin-group"] + assert role_mappings.roles[LitellmUserRoles.INTERNAL_USER] == ["custom-user-group"] + assert role_mappings.roles[LitellmUserRoles.PROXY_ADMIN_VIEW_ONLY] == ["custom-viewer-group"] + + def test_setup_role_mappings_custom_logic_with_no_config(self, monkeypatch): + """Test the _setup_role_mappings function returns None when no configuration is available""" + import asyncio + from unittest.mock import AsyncMock, MagicMock + from litellm.proxy.management_endpoints.ui_sso import _setup_role_mappings + + # Ensure environment variables are not set + monkeypatch.delenv("GENERIC_ROLE_MAPPINGS_ROLES", raising=False) + monkeypatch.delenv("GENERIC_ROLE_MAPPINGS_GROUP_CLAIM", raising=False) + monkeypatch.delenv("GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE", raising=False) + + # Mock the prisma client to return None (no database record) + mock_prisma = MagicMock() + mock_prisma.db.litellm_ssoconfig.find_unique = AsyncMock(return_value=None) + # Run the async function + role_mappings = asyncio.run(_setup_role_mappings()) + + # Should return None when no configuration is available + assert role_mappings is None + + def test_get_sso_settings_with_env_role_mappings(self, mock_proxy_config, mock_auth, monkeypatch): + import json + from unittest.mock import AsyncMock, MagicMock + from litellm.proxy._types import LitellmUserRoles + + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_ROLES", '{"proxy_admin": ["custom-admin-group"], "internal_user": ["custom-user-group"], "proxy_admin_viewer": ["custom-viewer-group"]}') + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_GROUP_CLAIM", "custom-groups") + monkeypatch.setenv("GENERIC_ROLE_MAPPINGS_DEFAULT_ROLE", "internal_user_viewer") + + mock_prisma = MagicMock() + mock_db_record = MagicMock() + mock_db_record.sso_settings = { + "google_client_id": "test_google_client_id", + "role_mappings": { + "provider": "google", + "group_claim": "db-groups", + "default_role": "proxy_admin", + "roles": { + "proxy_admin": ["db-admin-group"], + }, + }, + } + mock_prisma.db.litellm_ssoconfig.find_unique = AsyncMock(return_value=mock_db_record) + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma) + + from litellm.proxy.proxy_server import proxy_config + monkeypatch.setattr( + proxy_config, "_decrypt_and_set_db_env_variables", lambda environment_variables: environment_variables + ) + + response = client.get("/get/sso_settings") + + assert response.status_code == 200 + data = response.json() + + values = data["values"] + assert "role_mappings" in values + assert values["role_mappings"] is not None + + # The database values shoeld override the environment variables + assert values["role_mappings"]["provider"] == "google" + assert values["role_mappings"]["group_claim"] == "db-groups" + assert values["role_mappings"]["default_role"] == LitellmUserRoles.PROXY_ADMIN + assert values["role_mappings"]["roles"][LitellmUserRoles.PROXY_ADMIN] == ["db-admin-group"] + + # Verify that the database was checked but environment variables took priority + mock_prisma.db.litellm_ssoconfig.find_unique.assert_called_once_with( + where={"id": "sso_config"} + ) + + # Verify other SSO settings are still correctly returned + assert values["google_client_id"] == "test_google_client_id" + + # Verify field_schema is still present + assert "field_schema" in data + assert "properties" in data["field_schema"] + assert "role_mappings" in data["field_schema"]["properties"] From 7ffc1a718ade0e52c681869420f260d8ab8a3e49 Mon Sep 17 00:00:00 2001 From: houdataali <84786211+houdataali@users.noreply.github.com> Date: Sat, 24 Jan 2026 04:56:04 +0100 Subject: [PATCH 11/38] a2a agent Header-Based Context Propagation (#19504) * a2a agent Header-Based Context Propagation * docs: add guide for A2A context header forwarding --- docs/my-website/docs/a2a.md | 114 ++++++++++++++++++ docs/my-website/img/a2a_agent_spend.png | Bin 0 -> 188367 bytes docs/my-website/img/a2a_trace_grouping.png | Bin 0 -> 396967 bytes litellm/a2a_protocol/main.py | 13 +- litellm/proxy/_types.py | 2 + litellm/proxy/litellm_pre_call_utils.py | 10 ++ .../spend_tracking/spend_tracking_utils.py | 2 +- 7 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 docs/my-website/img/a2a_agent_spend.png create mode 100644 docs/my-website/img/a2a_trace_grouping.png diff --git a/docs/my-website/docs/a2a.md b/docs/my-website/docs/a2a.md index d7145e4b83..7b863f185d 100644 --- a/docs/my-website/docs/a2a.md +++ b/docs/my-website/docs/a2a.md @@ -193,6 +193,120 @@ The logs show: style={{width: '100%', display: 'block', margin: '2rem auto'}} /> + +## Forwarding LiteLLM Context Headers + +When LiteLLM invokes your A2A agent, it sends special headers that enable: +- **Trace Grouping**: All LLM calls from the same agent execution appear under one trace +- **Agent Spend Tracking**: Costs are attributed to the specific agent + +| Header | Purpose | +|--------|---------| +| `X-LiteLLM-Trace-Id` | Links all LLM calls to the same execution flow | +| `X-LiteLLM-Agent-Id` | Attributes spend to the correct agent | + + +To enable these features, your A2A server must **forward these headers** to any LLM calls it makes back to LiteLLM. + +### Implementation Steps + +**Step 1: Extract headers from incoming A2A request** +```python def get_litellm_headers(request) -> dict: + """Extract X-LiteLLM-* headers from incoming A2A request.""" + all_headers = request.call_context.state.get('headers', {}) + return { + k: v for k, v in all_headers.items() + if k.lower().startswith('x-litellm-') + } +``` + +**Step 2: Forward headers to your LLM calls** +Pass the extracted headers when making calls back to LiteLLM: + + + +```python from openai import OpenAI + +headers = get_litellm_headers(request) + +client = OpenAI( + api_key="sk-your-litellm-key", + base_url="http://localhost:4000", + default_headers=headers, # Forward headers +) + +response = client.chat.completions.create( + model="gpt-4o", + messages=[{"role": "user", "content": "Hello"}] +) +``` + + + + +```python +from langchain_openai import ChatOpenAI + +headers = get_litellm_headers(request) + +llm = ChatOpenAI( + model="gpt-4o", + openai_api_key="sk-your-litellm-key", + base_url="http://localhost:4000", + default_headers=headers, # Forward headers +) +``` + + + +```python +import litellm + +headers = get_litellm_headers(request) + +response = litellm.completion( + model="gpt-4o", + messages=[{"role": "user", "content": "Hello"}], + api_base="http://localhost:4000", + extra_headers=headers, # Forward headers +) +``` + + + +```python +import httpx + +headers = get_litellm_headers(request) +headers["Authorization"] = "Bearer sk-your-litellm-key" + +response = httpx.post( + "http://localhost:4000/v1/chat/completions", + headers=headers, + json={"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]} +) +``` + + + +### Result + +With header forwarding enabled, you'll see: + +**Trace Grouping in Langfuse:** + + + +**Agent Spend Attribution:** + + + ## API Reference ### Endpoint diff --git a/docs/my-website/img/a2a_agent_spend.png b/docs/my-website/img/a2a_agent_spend.png new file mode 100644 index 0000000000000000000000000000000000000000..15ec769392a8f68c346b245819cc07c584d1e106 GIT binary patch literal 188367 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 z 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
  • EX;r4Db`796aTQvCCCE9;wZkHYdEeKoE_R+#vZ*8RLJ|xoHkmGHXkZ7TV;MA?qN!tb(^RvZ;%X% zZLp<>uyKohJc!z?rn4ig;9tF+ahGNu@3U!}`J|62+lAITyAyY56ga`BmMO-wf!nXC zArjE-T6CZ924|+ zV4)~hyk`ct#IE6<>hFg6-!93OosC=dHH6|>a)|my(-wK#ygzX1KB@hF2#lmI&MBx@-S&gG zb znDVBF;dNFV|E5J&{2;0=DDQXM=Z_v5p(3O0B##D><2*y0!A}JT6vj}cJ9&m)kaI*8 zGZ4W%K6Q;?{t-AI8(X5#;FE5?)qe$ts#x{DpB6E^ zn5WQ?BNy}MyX%p=J{GRj)?&Bxlb2M>NP;2K-904C*4B?p3{NO3J9TMRm?v@FpD6vl zZ$l`ATGiEe3+&gnb4?DH<8N-b$os%4+pDljg*Kl3(UcX>>mFe#f!~wkS=?39erzn_ z56==+P!mIne$?0R-7!0z#sJuX+EWjkHCMq9wW3OksNETp7@L&p#YY=V=JI1}k!r?V z019g4GcSFW{MC#_!8c*Sax(STL1mDgD|u|SnrKILmvf(x-KO?sq{c{;u@7wE1GH;B ztyY7twH6DdLT+r`_3^2yY$s#B4_G3pmT10pF?`b4Du!4hZ6k~%<>{oI9NT{Fz9Ly& zGEm`95-E=14fM)PxrfahTkv#W^a(>rNHa$(ml%fN0z~{4tCD0h7D{m4`4m|(iSb6d zWb3q9YDH6brN<#+_#Pj;M>%h{K5x0WyoX5N?P$)_rlR6B$H+}2t?oj6lKH)7hEM)0huuun^GCPg7q~=B>gPVqW&7?-Uho*+ z&l6%vQO3C3aj-Ujy|Z0P!TCDRUM}WLLlQ<->Te!K$XLoLnk@yEk@UnqxldWZl8rrU z8hT_JR`9zi{RL2c;(@_8DD1{z!mDj06zl1ofLfB&(e@;JWQgO}_XCHIK<6k&n|0z( zv>)5b*ib&==Qa~`L=zo}BNisV7-SXRwG!G6l*;nN|P&-tayLRBtme4D1A(TLRx zmI2sLa!cO*MUCz=ovZG+I5fCe+p_neO?e=B<*j1kuG~M|W`#XbjUVy{{jqx*!mzkH z)O6}ucOJa4I?}sDI(5JKV4LLOI5+yB5f@M_y{YOk7H|ii;+zbCBE?mz<-(HmaG=&I zl({e?O=`a0jadGTSGHUs5F77SGmgL;SnH-fNobT?v_WM63@9{B1bd>rh`ytMA;zo3 z34QpoGg{r`wd8hJ7RdG9Gi{2vzu>I!CWi={$d<_5cIK5TCTH|lIM-^S$V(rAbi_z} zZS!{i+@lvv26gu@jP+}8%=^(qSj47%{Iz0s=^UZl30IB2Lc)4R=5ji4xpQdhOzzDn zY-sT6$It4XHmL$W7F3<;pwU};ZO61U`#12xak9mBslT%gDpYIk@K+vn9V@@r8GF^9 zbkw1t{dI z(!=ElZD{CV0kMC3``T};B<9Je=La1LmeF%J%5w-Ca~&yd2aqH2CQ${J4_wj;^(|Pm zlkc_ZN|@)Aq0C8(wBG2F@p@ORB#epkh^-o;>mkdi3v?rGVD%GOk^9}&e4kC;7JO~B zSgx_=Vx-DRx5bQKzpbPd@L{ZjOvv8vixu}5U*BJUhUL2vJmBM>(Q9$3)g*y=R{y>K zhT4buov-GqZ7|&exVPWRs6eh(t0l}CKQemNtSymjh5J%HG&N!OJ5Exj!Iy~SlL4~) z34vE22Q#)l@0?m-D>4l!;o&+GACeXu@0S^FD2NZN`UdQ$>nsK6x@{uKwq2Uu1fz#} zIw==m+X3Hw#wM(J117EbEI<3^47G$)SB8R@iSQ;rPd;k`_n(kU+d3=hCjWcJ3UkP3 zovd-TfgrHh6xD0x#dc(@&GYVK&uN_nAdC8lzE-Kax;(T0iS{dhmX5)8)dc*Oo#wu~ z=`Cm_jhoUwNxwH$=$a(O8gJkcu@I&1(ZAdy0ZWHHh{)59y~4Y`&B_#rL;Oy?yuFzekg2gP-_wQXZGK z=`4A?m}Nb7%gM5s&gXBCxRg8(slA2vV-;8{%w^j@U>5QGj1LPRw96Veo;A&CeAgi< zGAn&T7`8GVZk4e}O#NQcT|MqxTzcQY`5DRcg=Hwq!QCUdO4B#_$LS0FA>4~(g#iV5 z0oicN(gjR4<>0=-|1q3EP2(ecc$S6rYcKI>FyGjlY4hC0Skn7PaEf|?OONuC^@Nw^ zL-!+3Xr)0qLkt2S=Q<_ZLCMic;)C=uNAt=5fvotigztXy=kbkBVqFJ7nh|lE@toWj z2~HJ00l>P|xhz!pN3XGg9zdM4hAH919EmzfM}@}%~&Opd>{EqvtO@+Hs!*Wfex}- zX@s>OnbeWLLyLA@j$TJsJQz}v>^TbfS>l$Wk>=LeFXA;!pl(Z8{RwZ4*(;ukk&n~6(`DDXCBF` zXg}m3Nz&E||J4#is(uHCn8h~uuMf}k_4QSFz+=m=TqrLuuW%u&Scjx_c)auB5u^N` z>hlZ6H2CLee7rR`t?auPTSTmDK|Z|ESOi$Q-?~4Ixg1r3$uV&Lk38f5`o#xfrmv^> zsZIwMldk*LTz3je@Wtm8Sc7bFdo<(})pS)J{kl8&v}1uH!jWcqLvP zO`0rV4RO9kj&zsP48<-EZ zqHS7CfJ_|w#^|^)GW8BZe!u@4uO)0s2smlHic|_p8zD7Qbk-wVPO>SPzQ$wAQZWOSJ(d+xfK5M*Omu zf2g+WqzShpx$E0&B^SI?ZP%#tpwmnt8}vGQ9OL?0`f&gE+)!Ck2$QRxxMfdXoSS!9j^#y{&NM}nvcZ)KDogg#vj${l&Pbym zgonJ)w$~2xo(*RX<4%l6avK+1iBfu6Yk4@Vt~^7jZ*2EyJQO$-wH71lq=<#4hnQ9g zl*mD(i(mSl|GCrOH`OL!Z3W-0Za7yplz@BhlN&LklXMi@&T$|lM;sQ!5ST16_5{HN z^0bJb48e~Y zLx~DbW7}zd=$eU*AkwOL|w+=V>I#5SD(Kp~Ct>^n<-=CZm_ zorHcpP~4446Ln}kBlsVC!-u#u$nlLNIrsA9(HZZSqjMb~2bjsdaA~@?(PU)hBael# z2_{`h+y3yHwew(+AkKcDAA4XWTwIFmk2EWsV$@Gp0f~gTQ`;2PamhsX^A`kE$f>r! z5bs)6dCp>RCDJ6hBvEgSRtm{?M&o4Cu6dzB4i zt&6wOWXaO*cp%K=tke?Pdq|*)-(y0_Z~Pa}n6=m;iR-Vi7O8e+<$8O%G1w|Fv&nG;f`k(`@ZQF{CsKrYr({6`_Xk;W!ZAU*?dG zcXux^Lq~{#NvGFu6k6USnN}B@TRaXGh{@|Y9qc66K_2%nbh}Wl0y9 zOWOgTDp!@2m#Q|R{1%ENbmMd~$>H|`u(`f2nrXR*?VqFC#%7R2MV;pliPhTkJY&^0 zH^)a*_n+Y9P!$MAwy~y%9aT%q6ZN4wi95yn7}t8s;+s=%U5sjRGu^TxYPP}k_8xkDs zfWa1HsF9#FYRSJntvRAR&m@2S@r%`mdL>q3 zdkRW!$)H)Byknk(!0|{YgX{k^pTadDUo?}$@M9zEpOpg3vuf$xBRbIi8k8KI}98M>(RI2U<^~+LdPg#n1NKOj$y?UxK)^HtTdrhtZ@vp-)A<{1TFDbNF_ zf4+$YHc05OXcbQyFX zrgPh3sMD2|d=p@A2|NOj!>82d?*3<;!54!0bt48pl#U%|6P8E~|m0Wxx^%krSQ>w4cy7fU~F`4lrC` zd0xG>jLkDKaI5-g+W+k9+urSsmQ(hL&nsouj|glvpkpljoZRFJx9vZ3_=QDRA@GJ& z%FF0DB~Tb;L`)ALG>3yL7Kd||RI?fuCf4P$zCOb{H4U7_4xz@AdK{20dV2js4FFW%oSB$HkUO{QaD4jFCc;N#VQ>|e)D!`|T zpy@VN4prInd2wF#q+4yjS~+`RU)|4Ky1>V$X)sPIeGI;Pi>txDxk73wqHVf?USMWU zOndrg%cb$H4RUETDHjvQZ4cFVr3=W%Xu!5 z%g*}=2GiSP6<-Uy*?|qanLs%1*`r+PqNAS*8h2#W^OkFsZ35sd5@vg_2J};A1Lw6N z3XdYJM5DfA^WrnB5rc}3s?IdWfN`Jb3Aq9Bv}!hc-O-(^*VY0%T4ZJ-?rz=YJB5EN z1`fIpjiu5Y>(+h+qcyWsV%qnW$e-y!w=B6lC4I5xSt+2s;Zg5pRPNn);F*j!Hn^& zllidpuFy^T@>*}~^Gq*wTpTq`*}Vo@q(5x&(PSz38_`}9umh^or-G33Of5G5a-UztR3 z-gJqt4Kl+EBP2?Lb+zWA*jD@s{LxD)7;CEo3Vg*Wq;`S3o|?@w?hklQ;D3vj!3S6{ zzqpri_q3FTh~gr{CB@U|C8?3EohkS9;BR5tKUWB64)I)%=>a>Xu*n(cTOn8NhPyRt z6&Q#5y!R?@rUi}$n4Qdf>0dlA`nrAWpUixz#@q?8F4tM8BVnEGi-@2}sbg3|5al0F zMfV>+aONLQsUkN|z+j%-gP70BN*iC{t{+Ufo%u}z1qNH4lC$Z7s6>s&a!KXc9hw}1 z1_A&(rzXpV0esik)EpWX%yL{d^4?seo1N82i@VD4H#an)a{-2Uz2$KrmyGvBNuYA# z74vGvaq-@9B1S(tp2b8q*MmTqxR;_}F_nVTu!-uiwQ^=L846KK zg&eOu->2jrNUB+VnU(;|T&OBbv*YiUamsV#(#x~k-Js)pEk>`up~uVN>?-Y1w7_7N zyxUQ3V51~3RgG~icaCU+Ggmnu<+qHXw)&YUnvIh`%|7V~e4Hz?n7m?2Z#adO*kXcj z2{%2WY`E73q`{B<`VuFi0gl@SGgmeuR+syScZm6MgMUb zwM_f1t5U0Yffa-0?#xamuJJI_DyXnWztDS4+6@_>tlMjNUE$pQknDrmX*}Ei$v#jK zE;?HmROS_p(i1wD0Sos?|Ht`x^!DKtpoLBzm(#c{3Fpp~@49dQ%Dv&ib~<>@dfvk+ zju(wdTk84apb`0~#TYVaUIgRQ^$t&B43W{_^*UgopBmFkur`>>erA%P;Hzcd^IP?q z;UMSaV5^{sEK+o0SxjPJ8zGjWBptS&F_Mzm z$_!Q(g-9^D>l@+qpQn5X#=&N3edGXc@vGzy&&knCZ z1SKJG;~H&D><#+8Zx7o}^q1saU$`+Zag0|SNbJYBjrr{c@c-b87@hiycJ8-drRT65 zwZst1O^tac9_tqz{`x58N#HQ(@u4cg=A=ga*O#iTGT2HJ7F)#IujcpogLfdyeWThV zL!aN|)ugiFop|9XEX+Bh5q6cRWl!4|L@%z*d|$vw7X*6l(^*=#@=Gg>r*8MdK;^q= zztQ*a8K(s(K<}Ie_z%L^KIs-t(9RIVSh4+?dLuf55pihiF7f0iolK&CB;q8UGlC;q=_tdm^VNu_Gr+#%Mi2hu?`ooNO`2FI~OZU=@eq#br!F@WT#oA># z#nI@6%(;vGs8lD~4xXqMd0u|$%&l{q!LZFaSuBRia>sfi$5LNlld(ch0!Let_9w5z z*S_hh_l$jKA=?8PBhLlTK0c$bbJ?Ru4=c)|@yZ_;j&}j`*t` z2wQLT=-eIwqj;_KnHFq+(c*~qTlBYdYKyIAE<*>{e10H~>MLo>}3xx{C-HYP>1 z9~JN}Ra6id)-sj55%TM0*Y$5`ro5x}Z|b4lCwz@`BoGrm{Er+JJtpxf`tZZ3Lucf8 zANmta^3SclpqJ;gzyjqcHGT%#iZ4)FZ?g2V8rea4_PHCqJ{G7yd(iMhIW#fRaHUFb zI^x*DzV^!naghQ|)QjJF?a#I$XUkS`bav}2q5m*XQ|a6I&NiFIqcxqDvX6h&`n~gn z(f!#3PoKEK6==>(Rrq>*pII??D&NL-KEq}v!A(1~*#0bSHxy=iqTjO9nf6V3I~R7R zr`=-0EL?{0I-0hIimtAOo(1&i*wvtXJgKM0Z&-%-^;D1J{p}5j{0Qdcm>4i#rwM0& zz#mB7<(uxiD}2t>&wvI8eIpYtaBSCGp0hG;GjkGSxnqJ07YDvPMh2_s12}so z(xk-lmkS3g4MQq~3LX|X5D|&A8O>is*ZRMHlyWBM)SepcByY2sV|SUfI`$#(P8jO2 ziX?lUC?ePEZ)IP-8)aeeB`+m|^-o@K^!BOW9J;3}Z5)0WhL51fYL)WOMn(S#kM1BA zDrY-4lT`Qgit%Z+G)y-b8?AubSr70Esjv8(%U5H_WBj6v4)>4bDigKi*IlNfc3Sy* zG9)s5kP8aok{lDRV;Dn_$cm(uzX3zOBuX3QwbCWYQfZIp_f!Y8pV-*A>02qdd-~&U z4Qt92nw(tT)egnznb$j~J^b<%BaKz0**Oy&x{Us&;h+P~GBa^kGSH~@N6c&IG9{LU~p&~db++y!934=n#DiG61YL~$-2c9^mh9@ z4m||gse^Zqa+nHWrM{o;)nsWY!rN7trDqTQ!!!`Oq#$zX(xoM3Ee9(Gq{ji-rms9u#_6wJZt2&n zzWD2~is8RJCQo?wblT6>HpuOuoV?eN#ExE?B`3LVjFmoz3IB0l=2JHUmJ%D3z1~sw z>_=U#g{x7s3e_&{4CIMfC?>?lqV~$2qukNs^*t&Z*@PNbVm&s&#KE}OY7T0=`{H}X zxgyhv!)e0aR!VnF$U#Xa82n*e{Ck=5BH~~! zOin@c+f#;;pI`fPVl2_K)n-7jy1luEuk1m9AzzDfrnKFJ20ZKL%Nj8ntS!jHIfG<&r_6F7LPyaBk$Ozirl1G4vHK5hK>jtZU(ZUVI-Ez)U|;f5a7LVQtej8L~n z;A%}62cKs}-Rf@l_QWZOw>x^(viJHw49LUuTigz?^iH%tr}x*vR)c2eIsx2*@$AK` zWp*oovPMvvU|klU`DH#xaDU)SxFK!d_K9QLrxGH?4XvE*g3bA6>n(eu*aqHKS){9Z zjYtXHk?2f4-8NeMHj=4-cF}$Xb6{3(F6%b(vxoHkj*P@+w=@l8|1NaGcfQQS2(V_B zFKUrwJ-ik#IE;W8G*uI%o_`^9M9P37xAh1|s#2}H;z{qXAZ2Gyy>WT>B2})Zr{g<4 z&5ogL(+Z8L(_f5r0a)OseXi2;)A>F7h*K**mC*Gm?T~~^()M*53Lk5&l>cc~t{-a4 z0NcS5v4_2|qrs~S;?)xCs{B*f4^3Sw%9QCr{5_<+&u}f?8uAD_rNFiYtF0N{5?mfK z!_}4Mb*f^g7VXkj1GJ$|0e0$XKDZu2Ai*i^jpSUGX4~NwFUovStAF(XwWKh|hmM-p z&DD-w>ye@b9ha}DVgKp(nrhH(=MRG^R_B#0P9Gj597is`it+oszcTMRA!<;*@4vEd z)O`+xQz##*`T&Y}D|jw2re@Ja&Nu_ew~+!6g>eO^H%0 zZ=WrEq)L-r|IpZv{mdlPx-JmbarWzp zyO{TXws)z_=dw-DC%l#Rw5yekK(~JwETUy3~D`lsj*?bSH z@WdJOtPNUKS@CQi$fv}M@sP(Fv~rJPe5ZtZK4ienY|R<@t~X-ISde^lfSLzo{UL_m zod?~x@Qzw|mR3Pqz2ICXudtW1Z{NB{4OkZ?)+7vS2axQE?BI3~t^(lIxNdoRR~)eo zLC_Gij{tN`e`A#xyu|u7lCrpD`cyB^#azZ$Fjs5ls6oE*@m-hQtFVz5#Q1Q`i(L2G z8glg-bus0v*QAaJlBn}zw-e;D)qrHDyLCf#zpBZNT6lAMK^k6F`iQbJUhY=bLeuGC zd~x*Db-C4Zat+^2tf@+ea!H4zzxyO#u!FSOm#tW_zl^%>rF(q5Y`2MnQqo7_r>-)A4a(RCJ+Zo`d+x1$l;mdr#%;L1KBL-Io59d%YQZ z&|bmV9(l7lv?B0F)3e^}9V)pE6$z9n!AA3UV&kLmBD30s)Qi2>5JtgF+6;SSPdFP~ zk#uj@y+=uI3_yAx*mNe1d6KHoHT61Rc9UhT`?u5n)MAeD-KKD3v2)rJO8!evAThAn zrHpan&j7x)x22fs(xzn}D~9gT(5#r`#J~t*2yFXt>&ul3&J2G;X2WTR^2@6qqzB$j z(`+I2;D_CPU+40rB46z;ddYeu5V*jGj9(-5#gi z8GNnN?=YyR^EuOukj{rU{RdVy^cB~D#N`p&b9Bq=@&ZoZW{bDU6$kc1CjPiMOiT$X z@0HKe)A!OTlYwC*Xi@_n>F={sJC_llR>kD`M3ZlLs9|CV<2Gg?P+Y3Ob1c$>FTv74 zdvBZ|gBcVBsxn}C+-`Ve@IyuvkVr%?Wm>-Al@Azy_dZ2cw@0{`%x5}pAfVkob6osm zFomNN%q^OEx$t*OO2ld5%OLoO!=MA(cjw}MmsH^PY^^Wh0`w&Mt3(oF99kEjN*Rk< z8@rPNK3RCyAI@f%&=^;=vgBB|GZQX(MbH~D5Amo}L+slV6C(U1D*ds3*03TZHP=@> zI&fw2N%}P|#^H$NHJp zFJietE7@MtI~PWLe?9;HJ>5?=bKO5elT?w=9@w28Z_Gvg=2@2nz!^G5`ag}Kr{o>7 zZW)wWLOaZg5>t05eBsJJ;Wz5%2{7#ixrq*DXS@iJ zloaFoS4X+3-sXoWwjKBlC7t88;y1azPFyW~f_zf)03ETgAfXk>t2~R+|4e3=Xef)` zyvFf_gl=yNWZLc8%QLxtZ7j8_?Z|mPQxpu-aMNu~RoO4=l9*ozXx(7p747W-hAdGDIB`1>{9>$Cxi%nyKS z(FHJKEDq>7$``)CkW4RuC?NicpvNsux9c~&hZ$oxpOk@FoEAj_jI9bF;4X7(;}tgi zl1NQwKFEAq>UcJbT?vF#OGG|_J6)j?Ox+AuKu@?DzdU_XHT!t5PwDv^o~E7LS1;{e z+z^}_7y!9BF3`(Li|FBe6KUU~Z9y>qq%ApY@x zATWB_*K*DV{r5NbuOBPA0xTpF@+B4M>;5+;`In#BDgqd2WaZM_%m4JP{2~D6=#I#^ zI!AkR|Mpu)^ngukDDCo(|ECB0=M%R_fKJuQU-_N#|FJM$!wJl_tm372=AR$_?`=k_ zlY-2zXs5tS@891hFzGU*)WbE{LVxba3d7`oG{IkpffMZ~nu!lS-PIiYVw7u`ueWVE zN5cgFlSQ)FUMd46*@+A4uiKx~G1z{6$qGIhxV6Z&XZAhD5c>D(NTpDE^;w7Cy{dtKj@1sQN}~1*6w6v+Xk3w92K=DDVdvLdDaRlDV_)k$h?ol7j=xc*p!v)ah{r1L z0v*~M-4xjhUy?B@Xtc_yzuwy+<**<>Jvx}OJu(A7*v%h*`t7(>z@{V0y+23umnd$^ z0x0$RQNL?)5-Pwb@jJW$^A{BJJhAa&cc97{D#4?c8PTkS-b6{8+vGyT#ywvD+kVTV zGb>WUbDq=fCrLS!zKt`ot~5o;uLN$+|Mc2FNHTprx9|2N^X8A0G?{B(H1YYy5fKs5 z`YOA(#gX$Dd8Wn8Dsq$#_c#2=%7NRl;+9B_u^P9TP!5$36?WK8pa3}YGmNi>aNngC z3j~k3m+zX#FsmQ#&hg<4o>dd_nak4bz=XvrtUG$k*nhvgjUX9j9k?vhk)hhyl`Nxe z_3S5;V$bgvOl(UB276J=<<U5H%?f?*Fh5#d0qjVSj-$4|O$Gk=Z{B(qDKcSLFHfusUl-Y-P_7_ z!I$_Y&?IVuwnrRl;#PO(G9-YeWHnag;paz0A-&Wq$^n~Cp?og!#OnACgL;QK5Zkqp%nsP*VT*-l{gr_EKi2Fn_LU z1p@T&k~7?P*JlVeu~#iS^;|NgP5Uzo1l=@Ax?m)rw*v#1wRMZ3F&RVw!f{uPDi9CT zz)C_M?<_H^Y-J9SY5yYTqpsPE3{wHLOq3ItX6W|Aj9~ytWQTx;i4baz*Gy;hz{Zc? z3FK9x#PVo$<;;M4X*J4uu33Mh*I`&D*Ui@&JZdU?Vu6f^3!4pxri5lsX+s1n| zrv2BvyR<<(eQHQE=@G1>Q zQcyk%27Tp`V62!!+eyF3ZW?6tZ%u5ggeZHz3o0B!I*I(B?nTvDD!It@o?9AB@S_yb zJ#yG5R^^EpeaV?0t_S|W>E;x;HE1&C>Ft~3hfwleeCRY%k?V->)YR3(5>ijf3kV9{ zweL!Nj0$D9Q`JqrUOm&lQU>&gZK4i={_$vV6%aRAxdkOp_|HKAaaMecP*rnd=y`Eo zPI_Atf&qwkTYa3LcPucg%!|Eh)JaGnTmb4C|K9RyuTLF;V!=3F!RsZZ%+IT}9U&a1 zL_>uG4}jIXnsgyDUWns;x@GX4b)ME5mG<3W3cGwiCOB}U+$L-uG@yIc0w=7wQzR|> zbTZ^u3Z6=mJ@+se`0$-W)C!WcWcszI+!wkms9@SJ83dTOBE3o*?;3u$^2ol8pGkvF ze0+VJXLQ%N*nGq@I>ln-dylnOhd@nSdC%o7rIorV_61^N<3KSKzoHFQ1Ls?d-UbIf zE9-Pul6sY*ms_|VjZY+%@_fkJJW4?B0gIqXrY*p^7ib~E3S?Vy@Gb7;nRad4Q!`H%fv!BJFcPwwki<) zoAU=|!c}(eB^LGLPZp%yb_;DL0z#|ZUtiXlKh#lZeTtxGiY^-*DFS^#)y>uYx!M_) z^GW?fNXh&smxoQiYbr;5YKzn=X}3^e>&;5+x=p_~;zHU;Ly@)XD+CPD(>(_q=aocv z*JnS1oicAva`*yRct9rs=nN;=wCMxZHPbSKS=K>!KD!P{|1}jvvjN~i^1`Irz~S}o ziW)WHq$*b@h-MZ9)F6pg{WR%%scbbbQd3SUwgwWIqf_ui6NyiZr3%H$J@dxBtkKBz zea|Du?yrCDie6NXTmTwjt(+$gcCq^rU>}fhJDCLPx9-;2w^_p_)(T0!qCX!YtSu9O ze^VLF=R-6A8uvjFmUCXRne$IXca{kdz8@b%3O1^rT5RgtDKNBWJn@wAGXsQ`#tT8Q z-aoXf)lc2H^A}y|U%r_pw2DW&JH2o*gEZ1)ebp;(va5<`?tV-pOM}ls|NY7sP|f?w zpUJ`PSZG~*je}2FkZGgsy*%V~_R~LoydCuB9%%}}odY&Z(OYHQzK^0iMraG+!(YCS znD?$-ISP`>!oRkxkzU@{z?B}+4p=4_MqEQplC|9r>q zeszrQcz|O?F_vvQhT*}z%OKTf&7Rh4of!TzM!_0k)AmWAa{zjWt&J(9THJfF`o7k$ z>0I_>ciz%SCVh;0sW&tsiG3=kIsst0a1p#0@vigWvr?b`Y7CX0XHhQ)OVg4Ow3j4` zztVXX`m%Uz?%@?h6b-4loQa51^7qniruVlyL|hr8zrny2l}&Tsxg+z2A?DUj=-jOY z&UR%Xn9B3SBV+c|}zNl9;8!b(D713*f4}o#z?ARlm@#x+tVx53Z`r zXt1GhO}R5A+U8~MjEC0It{QO5zZo0oV)l2}lj*v=+iCR7;XY0S{zhgauMx>oX{!$5 zli(V12yhsNtNhHjiFGmQeZ@8tL*wx`l@8fW?1?_)S(P0?WPPEPU%y^ZgPdXajiePS zZa&|WxD<3W7EGA<3Kr!VasNnwe4M?>FSgk9?x|IH+=Y8Zn&Ea&z?chLD>`ZfIBU%P zRwg87I^%V4oP9R(rHP4W3u3?`6Ti;W>ci1sdEDK*eg&8= zr&i5;2oaw4Pyfg(x9G8zxuNNL$Xc8~<8e!YmO)=;eFklGQpYgUnc5E6wq9(iJgozIwweFVWbabrW4;3* zLm#fp18oy`b|9E@R_D3Gwa{SxQ@~C8jrh|Rn|ze>FY~^e^!U5E9W>0cvfXIr2*wY2 z^aOo{meXiG8rF2hDXDuM{`&9#zCr1SEjA6Du;T+S@HD;oJ%3W+fWm87#sH!qw=)F1 zYZ<1`hX#f*!Qc+;Il&#cW}KP1148~&8ifkiWUz_Jl#4ql$;nG>bc{vMy{GgY8gOg0 zg$885iWmPEcW)h*b+?3#N=YdwiqfETD@eB}-3AR}-QC?C zXYuZ>ulw8Y*6*Klo$EUO1^C4JtuwkSG`y zZdw7_mgZVv!9TthbqQK3WI3b@E7PQ331|i=$ZjAhwG6=c8#Q=kq|D`P@5kzzgXV8c=<-76cEx03c+avd;8_V)orZVG7e|oS&wwj`lA6_WlQUfm# z@elmK4Y?j$A~2Zy`*C6NN%0XdzqRoHu4Y@}tC3bm!SM}ij9||3^;PHHV zzDShF`KtuiSz4GbaOpJPQ7yO2-rAOW*iC)=hTC2T+b)0yBhan!(!Q#2YWc=0i2Z~u zlf^XulqD$W%tTvOKEIxAvOjFe;d-7FLZkXDGnQuQ-S2M0TScv|Nv|ME=_CL)hQ8hC zq~@?nGN+x+eHT;s4pwvuGE(qP06%Yjg+sV0vNc&bagro4?l9-~l~MBAb7u%_&;Iat;zhC!kLSfYBwmU8n1aM|5FE$Si+g^fI+98NV}sd66~H;Qq=Vi&IiJ(Mt6tC z4hrm$HYCfcz(^J|{^4>4^1diG^XpLwEdhL&1_(u9)=Kazv(lH>(8R0Sy!xVOqOz!$ zUbCVEjE+%Jf@zw1T|>vFgSDYzN40MTkIE{;+BWWo7kz2j*C}!C(=V z2oCEMjZQvbecg+LKCWr=dY@eFrV(&CJx7}#`a~7};>C+3`#g4{-{~m8b@`T;UUbM~ zwO_KaT56Ht62vAQn_G0M*bGXHShh3ip@r|V`g)bUYCsq#cW%$9Hrgycm}?QXNm@0J zsLy4yJgwKmzp)SwF)A{$&fFZFLO;y? zR?kMr^K;qwe`uyIwSFl!<8ngQ+o196!CXb1tic_1nRV@Nh2NT-2r zo~dR3nnuDvTtjltErJn5RgN}f5i0TG2{~=j3@lW<$~j}rt>k*XzSP~GuC*J75SAZb z$B|qX>)qx*3kMZ&6$y}hhnKpcVxJT$Q|o#6t8~gT0{Y>?TlbHMsl$&4VgFVC;d{C1w(RD zd2+ONRiwdgeAEf6*!{H8s@j%7o%*rAsiC1cn#0=UVGkIrlGhfz+XXGpAtFma*w zMHoP^H{F8sF?Syaj$W^Mie-AOJ@wFX7z{A`-wOqC>v1Q?t52hVYOU@ zolKS{zrBdeXgWzM;uw9qj9G*g6s$$CoFTKX0O-X~#2tWyoJkF90IvH;)HmAkxu$@# z#=V0a>DK)oZQ+jNj8ZZ%QATvcx8gUC|1ZPN-we+o*cl;&%aR)<)2mcHDruuePUyw< zWIMB|_p-DQ+ro&9Q29%Zxsgad=I@q!tx!HlldRLb*;Y(7l-XdAOS@1uTY*19NZM~- z%`xH_|3>QoSMM=@aaY8=*Viv7I*M?V%g*b^s2rA$)xIWb&-btNsUFz;!I&x{J+@j5 z880Q3#H=qRhfJ2t=rTXQ!wwcCuNV;n9Ne$)c*i`BOhR8V2(e=r0{LL+U#v!QI`2(< z0W8Mfxj9y={nULmn@OOaRQ=iVtCBzr1boBP`WC@$w&+s=d=Hxk-CCeFan$~*wqCBp z0*?9%AA~d9z5ci1eO2-4?H=uGlk*9in#xg{ZB9CC&30Dd&*;q@;^5R0JwRZO?~%zKIR|3UgRYJLFpe_a{ll-0KO~$2)Z54 z-2?(LfA~~6Spb4)-sIE%;dQ_pR|g>I|I;mHlGwKIPm`4^G*axb|GgOeCFK0Qh)gfG zi(0fZV5rVTdiOSyKxbbuc!dQa^8IG7&vmvg6-qaN|e8Cx{- zBE{&@$TjQse+wJ3NVTjK3&_zdKX=${h2COCGXc1NSbgzpqJnssm#cvEcTwEcz>0{pg*gnd2IGJgbDM$Y) zvQW&AAz5C$$7tnr)lBxKVuxIE;Zd5bGZN}!P@47F>o~US$&I904~<1a|M`d z_NM;*?G#I*{*n~9QUN$L8F%>m@i&mD`2W|B^Bf)oE$5+3U0B1WJzwA54Cc4!CFUS$ zN{-v_k_dh}<$6XhKds!DrdmKjAr);vLr;%e0Nl0u^^t;uxhV6hbjCvHnce=@l(asD zco;~xxcX4brz~sB7JuEZz+*G>RVy@FxncL>#amtqxFytk6wAKa9IP(K7V8t`%EaZ? zOa4{wKTn+R_erlUSwZLY!7#=$SV$@ni&03`CCDVCEa4LqV{-5UmtwrcQZTN-ZbOZX z@MyHqIPffRjqmb!F2!1R+6x);E12LJ=-7I$>%5Ymd>Xk+`{apCcuH8iaYXRRQ+Z0W zKkfv0L8%nU7_(b)e}Q9gp(~r&xB(hsThTMr^GRuROw1vV_R|A=GJK(Ycfse+!Du9a68RZlR|EjgC+$4+N%S7*dz z@wBEOEA)lc6fZ+5J0ngyh7-H9v-5ZjR=v;p9RV5R1xPD(CyCwz`B@CBb8li-{+YUW zwr<+$sE8o{f)l{K`vGJ7{kwNF?;dKphlYkuGS+UA3i~hHdh5n=*{#=nQErM??bF-d z-|s(?1G5qw23|?zh@IPsMOLT&IrWoTi!6sBpMjRaNB_x07km z^VMk&d;sV6*})K`ewfnZwINnk=nYtACaqKqXL5mUWktpQQ&JMzy(f`6o0lMY`4PT; ztMZ7b>U5Qs=V4+TVv&Zrx=e}$ZnLfZ)?{|UTXGcwLPEci5_T{eqIDk+XKCm2A8yn2 zRy4=JbI2WXa8dczq=iUJjgsA=&3^F_D@AZ~b2G&h6%DiiYu#68Z9gO8vbzPcAfUe_ zw$1ze5Sg&Tw|*2O^+J2QQYigm{4B{7s@v3K+=2BY)^k7XAIt6B@5*~-P>zsUM@xXs3qNzD*^PC1BOM&pJ(?KCiy6&4q>ZHSvD$|Z|&uBqjFL!bwWB7?ah zC3=a!(_{Z$xK%NK)$L2P@(`;qrd~PLQ;;x1!9Z;U>d^*u{^LE$l+#x3)8#}9YwNz` z82$Dy9$-+YAbgroFdY~y9vUa;jq!T2!m%;o7Efzrxz*)xp0*|J=>sx!6)|@Fh@wH( zK_|)As7m6hdWnt>4$C)S(XNn=5{fbXSG zr}hm60|O&XDLZoWjc7Ofii(TW|Hc06!1${$E?JHGQKnq>Zig{K{8J>OzKYIKsFc}I z1BIaL*AWG7@=AKhi!k?`tTktlq^+dLLv;6}5Lf_Vjul&vCSTmdp+*+}7Iv)rQlsrn zZ2r*8lch3(0-f8+nQD?(bgKC;kYfRBAmAy?zXxs@)LSkGbvNQ*g@np=Yn0h|gm|-> z7ZnwiDOhW1x$~xiBwU%x9+<1zQBFPEy!BDFvthCULGt-%wnZQ>p zkTJHxrw9lL*XHmR&XXIHlaqnIDlO5_)%4USCc{slk-p@~p&-YILP`}i>JTx(s9F=G zs~*qqao;;I3xax>Vh2T47v~>pY^3?uRA}mxEF{FD zFfF>2e5lHi8D75&DdVUD*#+uC$3YI-t6VXRm)uRbJW9P09UX0DLR9hOHx?O4ato5D zC#@H{Dgosn-(Rsd1*Y zR^+x_ElrtV4>Q9#T10f=+k1F^a>o5E4bl|!NN$4^Zt62*l|NzmVZ^D3%t>1pAHTO< zw#1oLU*jh}rNpcF@Fz1d%1?|My2qcfbiVtYdfe_tpV!$QVl6))cVFAuikk@U=sqBm zKP=y>s^6JwI#8^ylU5c zf0GY>Pp^yL`!Kr?|9unn|MZ9c(j)vicbX5U&2vhO(J3CmP17i5EE9u~1?WgrfiJW! zrKjRSDXkOe*KeQeu(E~2yLy{@M}f~|>Ki=vMQc=NpoudomiN1N^9Rgxe^%2hYfLErP#G5__PQsvgWr8Di`w`>wk zpr4QLXU58RrF(A7NN!$&3~Re1FNt;rj6IMMHM^~?q!QP6OWpZ-^mg97ycY^#TU=kB zcCULkVe4p*3$sbbN)OA!z(AEvUL=)Gu@UX#{-ZnCj+E6AXAuR?kY5R9cyu&g_$YOI zute7BxNwavf}y~Ah|gd&pE+aD$U~35yauKwe+!3O47O%$6M4Gx@buWj4HLgyBH**E z?5RrfYKO&!+84uW6N$@hd8oMmqCHY;s#$uo{>p%g0`1nao#}v%zOYh)R_CzO-bS=ZPU0q4#kW}zu!qG z5C}4Ct!=h+lsI{JcvXsSsZfuw!>&oUgSqeV;tuC6ynxR|%osrAX|6BvvYfTUc4UE? z#==Ntaz+xnSd;3Pow8@fdH>~ znEkBf@nNP6MzR=1SN;Z<#j{iHvu_wW;nW%uy2y;RTwBoiu3$(tOx;hGvHG?!vUA1N zq_M+B=nM*4nXi5YJq6$E~56%Y(*& z3=#CY>AHRpYQC$@vp6z5Z|OgHaPBBij@zygg zru%ZnGU>RdXtQ-lR&_enRMw?dz;EVsZ~f4QazeNEt8PlptD=qmu`V0vV^v(kM0say z-&oEC`jXPpH|K8+(^RWjR#}bwR^nVgc6ZYX6~71wsyzQrDZjniMw;tl`P|~9oOo$1 zXrOl|`RSbP)q;;}K?3R*`m&$;)|E4S9n^;d-VAenBEc=!g=Jcn93!s9S)z@qNc zxYR6`MfQ(d?Ip5S#NCi3eg9^}oUgVEmUVJxJmn8ggPMCSpG|F#vHaa7jiMP_^ntMB=C7bJ5Vgeh5D$5FGl0Fox)!QR8AbBsxiick$ z5GTL2HtJ|?MH9Sv_}znNZF>iKYkB=u>E?X;Ro_CYJPq^3zC5aj9&UlbXJMNMxh8S! zj(GVD<_^cV9Y2A2Ub90}VXJZR&eo#^Tk*Vl=NW3r@PN(vhWjPZxBG|he8TtVs*wYh zn_Ro>yxSEc5!;=QT*S=x9{%2v+<)>gm&L8l^co1NQcrKWDPc|(DOz9P;NrgPfmMA> zZc~b4h>FNkqVD515#fueEI)qQkW@5k6Z)ITiwj>pww?EP!h8u$(#c;esBk;M10jfQe^h#%6aXCPGPcW$K= zir=x>yit@RO<+=JBPPw;BVd04{f=ick}qhENj!>aSCsD7q&q0Rw{y`R_ej7X(b3WI z&G{?XYN~fYbOT5h`3j!)G}E!##q!{%v5AM$`3J2EN9ycrvX}FHC!VOSgM^;bEXO`% zxJk}Q`efVX>ypd!KR9hKu0_fIT9iupn-^pxVh)j9qbvDgu(3QSKD5Ic4ppGt10nWh zVMgf8^703stM#samroBFKPk~iY4wF^d^y;I=Mf6;3`pe|93(7%y4lfk>^NEX;$qNr z_-mZ_ouQT%>Ylt2zKb_tNB42*)GOrpz!>#gE(-5+LgK>W^AHVU21<9WRVS_*M2WT6 zDs4YVA|w^aR;rOt%w?ME&47fU6Bpe%r(UOMNwtmC((B)c2Z)$F`sHVdm{2Aekf^q` zkkr08s=*SRXOs9mJsH+&lW*-shN8=STP8hqtSnL*D_f-=@vI52JJq|B+tvEqTV_$QMrbg0Jn_T-dC0SkpAK#qxK0M|(80 z;plX8$>S%AwC$f6$zaM2j&4h=sT2JkFig+f(^}lBKZ@M*rw&YpA5>CG*#T`5Jkrt( zxcd%JCE_@V)`sZB?gwrRC*0N~;z88!)U5e3G&STgg-KbRUZ5}Om3G@Wv*Ai!SKBlZ zGYXbR%caH>mK&C9a^!r7>nKvdVmyjstjwq&FfcltXG~0%OIxemava0veADS*Idc6R zvIO<2Jj0l|R(#q_S9vi1X9vb(r%&5YcB~b4X}uY%qCXx{K)>GRjber4DYNgn@O8uw zXl!{OQ)ug%koEGsEgJSnH}8m;J!9xmSZ^;gZl7(mPCb(f+ zi1YMB#KZxC-B0fC9JGfXJ-l}>QH&JgQCv((KtRC6)AZqkNC=g(aGcv_Kat3GfA52b z551?S+qQRiyBAV}W0ec-tYa*lsiz^s8Mbd>>XkR81L|_~L{VN)ZZLM4k5_#BvW(;4 zdl9VRi$-K7Cw#iIXxXQS zsW*^_O571$bUP;7i<+CM3YE5b&#SEbh~Dgf@W4eoZxyw(vwP4b0AH0~W$q-29LIde zUCNmIVK}@Y;o{Rj?9YvxZYRWWU~86;iZ+Imheks2(-jMtgaUAambN~!{oZrDfy6{p zGi@&PeK-z80&L-d4e4K77js;QWXVWTDLQebyqE~@yOS-(F8=-r{vQ-!vmdNzUmT?Mm zNy-D6T5wRWNRk8V$fR4hmH*e-F zmO5ixEZr(l(Z&PZ{rqkdtZ&HFjNC0MVtq2ncnf|ifTkG`?}A*x~uurTy#o&v8hDzr`;d|b6300C#v1}01S_l7{LI6 zarvbkvg=L5#b$TyC8m^$c?sK$k>h4zWqkmIICmcZ`_rd+78bc(+w40#J0JXfyb`?x zKP_2N{#fu|=M{K_B!{LT+6XHQWf?~+oxi}JCzK&UN1Ersa^->FjeW}GzF^gO)*95c zuFB4X@%NIfUet(PXfK=DX_f-p34&-Z-!qm1OnH2EroUVPBI=Ksn6P+xd2@@38c74V zJprwLb>r4;8(4w*6$qg^kySf__Ru<{QcPmAykV# zj}V+{CMM`7Eawl@N_4P`Hit9MobKDze@K8%Z!CPCwUryC)^0A-GWj8~|H5vY4@6G& zaa(kJl^`Ss2Mp2Wl$|58Bo9#$Ayp|=?542GMg33%rCXO2v(xu}NNYP{do{aW(V2(o zO(aN9s2CY<#KaXv%V9f27N5h4%xEA(_i4Niy7)F*;s!Xmq0|ssWsGn}2;ir%bpyh- z%WexL4Lajogbj#O9D^u0(3JKd0!#CR&|@hU|4Yx<8#lD;^H{t%3Nj$%J@$j9Eb|fmbhKGtYq0-MX3*eS^)@J#h z#vkZ5kDGGk&6{m`c;$>ZX1~!i9PVA$SAUzY3*xWJ$5>aQjCILI z-}5ei2aqmyMjTi)KmB@}Paq_Q)5@FdQqal3pdzr7?h8O#K9*r4aE;Bcz0p4+enlV0 z;w<;?G(zBAIDGsZ9piLme?&KCwL^}?3%{sv-zgB+j|X)&oO_mQgV{90rv%qga6mrC zo3NVS0Wq*ZEheDs0?QE@5RnpPFVwaVb`++H0t8Yq=w)G2wmdD(&9B&@6nD%62;ll?~WeTm3`m;48`96i~8DxHsXW5+LdqbnH0miz-&+B)sFOnDn<))RLnliA8{QapJ@qsxpHKK^1rm6;1O(Y|917Zz-q0zwhP80Fmn0fU8^l)>+ zCxThOuA@UTpwMK5=>Sua5|m`z?&V{~ZEZY176C4&dc0$>6K6NgLTqIvT76^V&4sqG zUIdK_8%@4bhbv{*QiYFSRf-Mu^U*cXs(f3qui9>g?IcO;FLYLDWD8|pWcvt&`ZSyOjy zs@oVP!Yz<)T8_UmoHR(1?)+4;q=f9UG0$fepU9Qa($dnhOGbesEwAb7|3E$F-R z@%C%Nc^=DIM5q1b1O&zvKWg0wa%+3=klWka{K;aWHh1jLk9STL+}zv}us=Eq$)}5ol6|+K%3{Xf;K$}wo)`zef zb5O`+o2x=R%?LEs7?P1f=7-vga_z23K?^&(y6~xvrlcLl#N6^I8YIG~<){WWg}|YX z4wexD^zw&tkei|e_ru(Cz18Z6R6`TQjH6$QE0fA)bDj4j(8dDU_X5+5&29sTt#ZF)x*PsGmX{*k{AleqQm_WRl6_XtA&DZX(n!rm171u zj#oHZYlnBDVW5>6IGI&F1&q^}+v9oK!aR%2UEE$EVU^x4@Nm!UI@FLa!_Ra&WIpQg z-lzj&sF|^Dz0~yTb<^fW3C?}b-sDd!7ak8iW%3xHzoyN|?LyUPB+&aIl ztrkAfP^=kilZQTSklm6tCAcc^aGH2c+CBEolIOh2s4|1f0!del+~sw{vnOm+fx?It z1SWY;X;=f=!}^kbx+tpD@vXfSsFz~%%7+tri{?so*6ZHF}xZ2~F!Ucu4P(dVrK z`1DLny~8g)KYnSGt0cyZFFAOFRc$0+_h1pwt9&(vi%g>oUkx6b4(BGU5Y20ny*e&k zx*2);#k@JPT0TXh_Bzb#RFf~28{&DL&B>RpnVclTFJ5o#s-~;A4NV4~!N*WHv+jFT zsudqP%d*w;2o@RD6NWY??59yM2sqyhM-2=?i_E6HVw^FSH&XmoGp5aN6m5+nqn>w0 zR4X9)`Yf-%MqN!|ks9eG-*9 zt1_77#SHgSVy0cuw6&-?&9!N5Cc9r{xq403&*$tsv8wjXU1;7&gRQsTR zkupi4FQk-|wjnj}ZnXVYD03>m6iTzR#H4ty9NHm;8|GpIoulO6IT*E#JQ1^L*Ts-V;2$TqL zQ&x^aHg&renV5eNFN{L_HW9aqm_z--k6r-uJa52o4Tj~Kot3`SJl6{+oipWiPd#&Z^j${!c2A;s8*w#XX!y>Aez0m>8;pthz)BWmq!Eu0-xas8wAA!wo%Y3uY z9$DwmCRX^T3$y#q{ghN9=uD&;(LXr9Yqd%3dsgQFZEKgAXvlF0d>9HM5=0=K=iyzL zoW?w1GH+h0+-1btrP^!@@AcUbCAo({W5H0tOJ0#aZ%aDS)>d)JOVio81q@^3wHKCe z*Gs$!P%n!NdLGvw6#*C^FT+w#nQHBc=wWJVBHxkW^WlSgK|z75hi`(}RFxm7Lnokr zRn+fcf|?_`n1krF)Dfj`(-$Desn%JXmnZrS;`yA(A2HCE!aA>@Q2bjLd!sO#j*vST zc9SL$?ox$Kh``uY7lBVg9Q%FRoYzIRU?&XcyhF(3r;??ceW0AC<+NHfZfUc8cKzDjo5zH^>9*Ij z_NC9hb{e(-bI)GTAeNABaqW-*j=heaRKYTVDmr`i;_PhDdT!Q3y0c_%Tac=@RW+n$ zuGFga)PaI*;un*+^}u!hy&BlMxH&_wH^?M3JHb)!nS?lXo@VZ#{UY`tdE)v|q;fp# z?tNCGy>i5@0C-hOlC6UB)$q_y+pUR+?!iTGc}0(QIsUeDeDEVg=hs!lRXxrC81?`_ z0l2$2k{E>Xyz2@ZQFHR!QZb;*0a z$Uib%&ED4^-eLYee-L(l?X3OBTCa_UM+j2TP1}31O%b+I95^O}9#H@Vyo5ikv|*f4 zp43M5$tJ&zMhP|R>0W>Fw;aB8w~hTmPAU5HFTa5C-5CDo>H3QCtWy)X<{#iWs7bcc z-!dv}SB3_|5MV#BCx0hMI7BgTR?z(1iN8Hf%#ZxNS(8a!_i%i*1_V9p#*+9Spd>xm zmOPCWKjlVGseAO}0pt1ouOkB5`~R3!#mu}R&dZktt}|5 z^AmX1+^V<2qdLk+yVRP;{Mf?nYD0HkY+d~4W?OlI=t}8~;xxf8+y3K6hYv{kdX-ZE zF?!{@NxQpwk;mTiAEG$V z2}gU-A%1C0HB?C#eFups+P&iY+}zwjS&J(jaN$YWRu0P&jFFo!p5dQqMVS+t^u@{FeH%LF98I% zXGZ-ZTfyryfOkgvc!NI}PwvQtmj(V4R zsjRSnp!L)UQfLt!OP&pqD;$tSBGLk~2h7`OFbfwnl0XDt0aPUmY@N*qOG|`6<;?2kD#n7S7#p2_^dOQ=hc?+Kn6Bh8tq6`5bpZ=de#w4wLpkZ zOlH`C$v-40ET{|U`+;&cli_$`asyfc9Yc+ByYGOcYQwRJ%dEG&*2ePY&71w5Z>}*s z&V%>)!**hwR;jNsJ)kCqt~_gD4b#)t_XY$QEKv2vN?4#%e=Y5CDO^2>&rHp&LHdHgCZs$A5pe;OVsh!Zj zPRCb03Rpp+}yyz`4mY=ijfq=Zf_YmSD%O^IN*P{s-U)P{r4(l`= z;wn4lwcXC#H4QXOSzGSw`sum3;AQ=W4|h)iIjhO{wasGw%E!?(`BZ<`GW#vf3o4JP z{>ZG0sC_)c1L>7mIlQr6SL&EH=m=xry{*#qYH`iKNql5~rM$8JbNl~wC;(&z)@)rn z@msm3V?{WCk2=Z9SWTB4+z|yd-io1#NtWT*aG*I zjYasmlEX%M$Ty4)tCN;?{&o<6SmX-=Gqo|kQ`c~43>+NX>6fgFwarbl)rTO{13;KyzEg7L!QiXYrseHs(g2*OFHc^>m)Wkp z2Sr5!OuFC$4)VZ5uQY+^6cK3tBeD<5DyNpUfwE-v3;q^e@Y!@cUI0NpuAlYvXe-XZ zrBt)mS#m4ZH;;Zpe}9SeSD~a3l!R$ACJ2nBVYk!{neRx2r8(PtTj_=I6# zv9m@N78Yvit1v-z2@Hvdh#F^f0>DLJ+ZZderS;`M0G3I@7)?1_ZJ?jB@b<%p51XZp zI)a>otm!wvZ0{0~viaKs86mG}pIQ%EwEel#UzCq~ggf?TB#(1$RFHr%qATd_;0{y; zzZerB3CiuNdKLj3*ZVM*$C-7pGsb6csY`pd;bWOj0l{*2f)_6X+)S+(auhs3k*>hs zv)q||+4rRvaN0bVhw~D7mq5pz@8AV@L848yKyP-wCD_Rg5atiG)v8;==+Q|7>DF$D z7i|MN;}gIj?lT0OX=YP>y}#5BL~pUiI$w!|c1l~7%i8~Mq9GHbmaTGOdt4_oHNVF= z1BtmMwIuex3~VX1EE>Y_;KN71w(kXV{Z{4wHm?abT4r&yOMjyeqO2MXm57Ulmluz2 zqF&`!p&J**SV)*QO?@ZCzJ*~RGh4-1E*hZ&flNI!*9I##82v__1F81ECVIjbEK=HT zO%hh0@1mQSm|Vw2ZC3kR&Mopc($c7!ohq>A5BB!N?bPi=YLvue#RJ(ZDLm%zSd5Z} zH`*Ah8vx1+T>f$b?TTPV2F;r!ZMawNiEkN#pyGom=U(G&$3xU>?9-y*k?Vmyn@x_d z@y>NXu%c6<*fYxrIz%U~;V(+e`q$+KLB7r$|1Zk07lV)w%FRRY7>B!V9eYy2Zc)b$ zrGhlmUzA&0{JFFi&F!f6@P3hrpFfgBA#SP#%9@Zj_9tO%k$2Rd1B za6YsK_UuG1FIlpa&u$$jssCG#PURHP3D<7I10>gl3g7^01GAHIOK)W8>q~SO(7Of) z^jzYWEW|wuH$t|p`O9Ha8=C!(Y^6^44Q96j@yMYBehkzndu-m*do#KbCsCM?ev=Av z-~*7dGXC%Z_!;g!$#=e&5=t0R9f1@`qOYQ&5^21nXJbOm2%T%Z?cnIByWjufLYLsg z($-e;TbwkN7Rr;op}^_u>+3O23B-T=D02Qg?$f=YUFD9!-JJD*^!BL&AxKGNG2Y%y z2$ej@$lhld=dEvb2u@!AXZpSOf!4^g9%ub1rShW;P8gg^EU;9^NvNc<8G{QGMD z*SkEv0smWa%v<=UiT&lS{@0K5sMnaVp{+smM_S_tqWZ6wUVD}zuYl_P|Kq|jUuX#% zAi8o|FL?NV7x-1p1qK0lL7i?v{Er%&zX-Kqs?sO$mF0)(DAVxv&*+4euIPL*nBqsH zvv(dib4|F4a_JmaB+YIAV#D|+v2#1h<(Jz3`HX_lvM{Us56>9MCSsOPo@{v@f0g?9 z;!MujikIoZ;h@sCWxjZ}_@^`D94>#c&cowm*@*iAZJqJ2@^A{TxRulcSPxcK7vD-7 zKk$MDR~kahMsUg~Z)Dbgy)#@S_dbOTw;D!>QMb9w4%Pfv?Vk{5E>Iz#j6z^?+163= zz#6~LA6eV1SrT#Tqp%PBA&x@+6Q_`Ukv*rd*y4j-N$$!m?mETX3t>LUK7H_EiJ@l5 zPk;@?(kl5HjqU2rB>lRHKZJ^Z5wW$5eKt5hHYIpT1Eon5TOm5Av?M<#Sl7epB-E$VgisDDFYx@1kH=_0(^}0go z6k7N-G%Im9@6#uFLyPXqh#_%J$qBS()0_OCcTItGYS7sV%`j#aDRtf zG{n;^-cMyT&FniecXFC0diwZM^X1yEpaiM2vw2kOVUw{7ZZC<;6HZ+m=7T1ewwLZI zs5;+*#Fa%SsQ2Du)81DJMJMlkPNZ3j?>0#D{?pN+IZ9~)jMN%xw}jh#fR|n>#rME> zO!NV2RdT)&pHi(h2g3zf4NXL`Q1EWEm9!56YzC_MUbQG0aSun)iBl-Xc+&s_s9I>?bW5Zb(4!xW{VZ6nM+D1W42Ev)~@FjLG(d<;teoXqSqI77weqnQ$Z~v?irjO~=tCq%k+g6#FIFvy-8eE^2gLspJ&K05oCb8v*bQM zz5PPC2`@F>5{`K5Et9ZSj*ky>bWF5FQwLjJ9c)f+TQ`JGQv%Y){=jza0X#fo%|r*G zom~;tx@PmUsc(xkOA{q`)4lTw3S^f`BRZKI!(?e;6C`jo;YWfbG7>msJE zjUOAiD=WEYWQQk)vx)o4j)sTX)l1TN=_acD-h3yL<^9NKL5}y~pE$71Z188Wmoq(X z@HQN?pI=Vgxr6N^`mipSnHxZF_yfX{csQu?mv#nd5za zoVtiG0U>cU{m>0s-475B2e`NaD*ss{=qp34Xp@DgKvcRe^9g_9 znhh=oxlpN`Bqklo^aJx^b)N?OrJPx#byJCSS&1?MF?>w?+$+n@T(n-dXeNo#z!SXp4l09&2t z_(LWJQ+2|oG*f7@O+k+kVTn5nO-Z>3k}}sr@$(~`L}~Lvx8{#`Dq!$y?+8tNC#b#- z3WgCU##G>DiZg|mENQL75?vDD+dYgnbj_RQ*BD+|X=)sBRxTewWJYkJ0)DZ=C(y^WXQ__XswwM=&-w@}$L;~Eyi2B<*jr%O2`BHa$iNEn4`j;W&I zY!ehM!5kN}()THaf>^F>1_;^qkV?y34F`5qTOe8aqj7VPUdE z;-h5SXGG3n(rwuqGR9f-v54{1BmzI-28*(cq)O z&B~#de7C3-ao+VuwjL;0uoO}lADGFgwqdETjV9{n#LGWrD;c{wN-eFw+rwF6y8o2O zhn?~qx*kn~N-r>;L|?E(PUzkBix05tUE_9D*S>g$%N>s_mL?&OY9@8LEPl;DfI8Vd z?Wkin8%c=|q53s&429lN_T zM02O=KCJRt!!s!{{4u-rzKEtdO`;6K03yC*Cii<{T*>`$Xa8U@n~CA&Mo;2tJh)Yn zMEz=DTeX3R?nH8VxD~Bd?ZLTX`?7eS&;RSQ_(h@qTKX}Gk2OWNR~pWM-O)}cA3Pn|Xr zfrJNSWvIQJgeKEu#@Jp5d-^TKNL9M-IUW=(Lt=3xV|>?`Cb4YLzrg88D-`wCK|z|) zT^okjz^4T1`M&6>GC?DUn%^r73fAzn+qCt%n2Ei{epMR6Bu$>xHxq#mp6?7Z(FvPR!(Y{2p&Bsn-;A_Y zAIKj)&vE#siZCbhDF6=c;WeEI5Y8}|h*8DjIP7^<-Kd!fv2jC}oqDO0OYtbh4GmD0 zkYh3Bj^^~%i;kaGp2R5b?eEfMAyhM^ff&{5V9tBKtI6n17Mj!0+7#3Box=uc*HxzEGeSg5y5jtMoi zLe{H6HzfI%l{*bGJ^d(`5MRmxEhmLixG3w^+_V;~m5Y-1DER6kt&LlF;*-!8QA|fU zDL4*7O#&`abFufk=w5LwcCXIAOrC#Lz%`<5Y9Q`UQZLFPr{lAl=vQOGW+%>BBvb9g zFWziC?cnM;*-_#=V=uJ+&ydZ(gv+CXQD$G0dd7!ZXO$?R%C8BHBgH8gD;|2-O#V#K zqdS7-)7N~Osr7_bA^XwQ0CA(+n&M-Y*vsE!YlnApt~A7%9I6%9_82ss38J2p-a~R@ zOt*FDcx7Qzw}*v<)%rMGxmI31pt1D9!s}ovefAkTMn%@s47AmhAq7Rlkm3R%t)R6Q zN8An*f5nIf%8>BXUB?FMnJqSq)!3*sx>@PW`vT<`OFIFrDq+*GxU!?T0lP0u&lr)R z>M@MjCTPjIx^8-1!PX)a(>6%eO2s!$!N>b@}^);1UBl@tc$a@uc5<5 z)-Vhcr7Rf=*@rFa9U>$8s%=A867Gh#TKailgH_py`T8BNB6`VX@}8@PCad4nZ6muR zGB&af-J2phgICH@3lJ2R{_0C38q*Utc`im>%(7PWm|?Ssn)KwGTYRUM6zw+c9tt|T z@Kf8X#PD(O3BGvbaV03^}s!jy`Hb zN`qylD(pL>`A>r|oMACl;U}j>am5Vp=*rC}{hRQxld@dRH?$JX)dI|ks@{gu)E|FU z^BEHFXfhDq(yb1Y3<|B_&yF|?X+;cM*D*v#z#8n%PVwyOUCp?qmd4^vo;KdgmJk`e ze#J6Pqi$;2ld$Y|rsJlTo!)vHlPo4CF1prxRkT9$!c3cO$&SR zV`Qi7$WYsD`}#$VG*~N(c!c(z9rI(XRH-=eVe+Yd1>8CzblH)H#yn4?7~Ayun+HZ| zEG}0dCuRCPv=uwob|R!TxN+QU*|qD%AN{EW{mG#>~naPy+m8vkw{~0UqM4n zzwz<$$M7z-6#v^}_uT!fa)uKJ=VLP9hcp!4TO~W!P90{rL9wY!tFPcw!u^DFLuD)0 z#O_aWx!u0tM$@4>=E|=K$GGGzT%*%u$R1=<%G(O)qNr|qeTBGc>&@0rodCKzJQk6G zMypk;ECQCIp}JD-cw(OYbW-Qp|3lkb#zon6?Zb+KA|iq!lA;pQD$;2H($W$GN=i2f z1B?iYN=i3KN{%!Ptx?E&%O6r>sV_Y2lrNn z{^N4ZU%ng2j%vugpE=1Z9Mr9<*uBinmxy@mC!K~Do^WGlq@|9#KC~*a+X`1T$l0rR?VVsK(xm{-&>3-LbHE0elZl!Gd_3mbMPnE1Eq*I&VE5*fHbg8(+S$SZdkw4F&KPM@PHo~mt?$xg<;wD5j$ia`)FCQ(6bF;L@{azSK`a~ zBr$j={$bLrY8~|`!s)3Izv!Q7{6EeZN&PE#@0)~m;#($GqOzo5WA=T*+73 zQIBxowgLoP3MNEJ9|9WcChM<{&%a$=i1^84;W?(Cy;XEpCtcRAA7Vn`$Ha!`G)Yji z4E>1D+*3Nrv55bic|?+1`pj~;^Q$(U2?>k-q^qfvfx@!`rrTONJd_U(43;S}lE3=r z@kR2n`$S!eZ^~gmZ&my<`)A>2SxaXgTfzC^Ooq71iFa z9|U5@yGo6{Uj7mo*ZC${Xf?NGdWD?&-D?eGOaFE)8O40Uk4ZNfPz%3-QGWXB`llWD znS_sy8Gu@Zg`XSM@$pKl2tlU0dEHRunT<|gA+&t%O3iKDb@XZ)zVoD;rUQqH=>+% z5A}-aw8`{7i9Aok$&|O1o$TfDs{Sf4HT$POI`-qu*`up=kj_@N^JeS@)?Oonk;qN~ zb?K79j6T&$Q}@~Q2bx}Js;jxJMynV47R8ztkKX6nX*KjuZc|;(eUWLim5+`hpSq6p zpxp4kxC)AFlO;PzoHY9dXZq!<;!QidKJhkN{uP5?WVXs{KO_yMcMUO$sYTm6Qdhh; zo~KDq=XKC`*)B2mTCvHGi48K|FZ`E^mbJADX{Dxl6(1}^Pr;41Bh|GLWGS)(`EAuD z&b>6s6VA+>^*=whnxl# zqt(OK+j3t#9yVQ!Z^-}sygf#sUkegO@8a!hR;n!jSS`P!i^o4^J$pf9@R8Tx$$yme z-U2_0t09N}QM&j?p~PRl_uqG$w?V3XW-sc)l|KtfPu{}cMjKKC5YKtqf^+|doc-;) zlHPhepd~6F_EGTRzuo?ck^J}NJPD}h`TzgM*DhapA~pKx`OdcATBlpv-$xq~br#fC z+H-Nzffm#b`Q9156VI;jX&t|RZi`{NCAlNmEmk zjX?lIedP+tIiL^<$ynZM{D^QS=~Pn6I2`%g9EBv-1&!kGx(#WWyIAVg@{iGNK8p1W z@QHfMv)Cn($gtAL?azR}=teE&QN7-Sw@n*7!fC)JE77$q!kUBCm$Nn5gAco0e1gl& zQjFZzWlfhkD^R*+DeLQ0n3uRQA4FwdAgK<&?FaJ5_+;Fl7jq4} z8Z~5-eo(#9EPr*gA>_2!_{xfDk0AaMUHu4Q+htl;T|yZBJ*OASy>zNo*IoaXaw%th zmhzl@Yhll~WpXue*lyb5y1UErd5-O)vHfU} zmanP>qD*r~sQ1dG20SvKY^P+zyNbiIwA6Ic@@^ISvgN+` z^UauYs#OdHdq^dn!NHpUp6S8e1g`i2K>(E9-JF%0>t7~T*PJ{ovGGs*vBhTl)pmFj zR@#y9TOs@J3zCT{r0Y&K)af3*Ag$fQb1a6NM45Uw%R)1v|uI8tO&g+of>5YFboh?4BA?YIfYXYZr_+P}Y% zT6gFp^UbQkUcn&l;WX$31p2sF+uFE5* zKYvz3)4MvvM!=TamqN zu6`xCe`KEY+BAn9hx%n}UH*4x(LC>bGb~saH@()kt>}c^DL`@XLmFu-JtL9&fidS4QcMQL`O=`?r}pp)I)Q(x~CK>PbD0#<-5 z7#!MUU6vgppqY~M@~g2lhRFOK+I&LD__D@xc$j((h~#G)4KkKHrEmy0<(v;5}I&c&53f3LjZ5%kfv#&?J> zXTb~8rT+$Vq?Z{v>UI_)TsmO+D@Y3m&Z_62i0uQX{3g>umD9FP^d5m-E`yBM$BrGg zr1>{CO)kM%t;#o_r)J-$mvAHE&8W^iGh(SR4q!z`l?-+Jt$8$|pT;TAUr34mdzO^N zHhD84g`*_!AepVa>(#y?sXk(d&x^=;s>O*ny>`^kMMmX6&ubELpHR=9j!Rc4JsYP5 zAH5ipR2dg{X<+r4!4oWpR;;%{FGmaMe=8SA2{vrc9a`TLsG@L#ULy975-o>@@ZhFV zjpMdno+fSv$AxicbxK}c1YOwf5Dcxr?X|s~;GSAnDvh_fqThemekJS1eynNGm-M7P z%vgvjerHfiJV{2`c#o=IKy)9m=cl9>JK5~qMX3LiS6Lz`l=;(F+h0e4^9K7LvQ~o? zove*U!WsH&GZ{_l7>xbZrt{HvLbScF7fGa+PBqW#=bdv(iTR zd{3}J$21MDSJ|yo9O9Pg#7y%RBDNl6xY*I5us6k!Dxe)Z>WP)Jur+ zCi|u)L2blA>q5y#W)iFrKuO(~o+J?GD7V(Z*?Mb{+GQ9IY|Vur*0Wz=`roeBa_^q0 zRL6cZp0*jT&->)p|7!D?zZSQu( z^=Z{_`dH+RJ-_;<$R*;G2Zu(ZP#(YYcfkOtEBoFh`cw&6YdJ9Aujk+S-tRU~Xfyin z4)9*OTAo_d%xq9&m|Aym{$~Svq-(yV(_~G6n%MQ&VQa1>;LFzVH6B_)L(g}1D(!4k z?nXa2G}*4lD8jCccyMLXvNv1qfBvcWM9y)v{IlR4&eJc+$OI1j&g@FNSxgFkMe3A*COGD%xc7CbZO;~G+Qx`E=lWafJ$<#SMjTQ?gDSzJZ zRir$$Y4vR{XtDpzP281Xd=z0FDfd`etcRt?EH;S!&h8Io68oLGEOno9EEYSrXMFA; zhGoa$&Rcc2SHu=_{CVLLov)zF31ndjx0uu79^~fWZiu_6O0?=UQe5SW4GZ(h&u2;x zQ%(}fbj2+UptsVsX(u)aImqAwxo zYKN!Swy|4w_LyPk# z@gv|GuIMs8%Ol}XB*>mo6o>8XxzC@<+&xSi&OzDyY)_(!DSSN@j8N4V;#Dkkwp7nc z^NFg&G4!FEeek%uq|-1KN!wbXm$BwayNwY!F9oUW96f$@g85#V7`YKedQdU$&4yZ_}R3kVA}M;IN1003jeL( zvZ!-JIbcVH4IxXdXC3# z>wWM_cA0AdXZ(VGHBjv>itCoGdgmq3(+uQ%1kGO)Ka^|wnY;E|qZ;FPk9?Q@&{B zGgppwcU!XCJr_oM8OcbF6IKsclb5V4l}9DY0Ql7Do8#6XG5eM6_dOjGGHhLXE%5l2 zqjfWkVc4EkiDHDi&5+<18da5T?YW=xMLYJ5ej(%LNS25wV^TfyFIw=J(&^m@CY)K` zz+}X=E3`Q`0u59@A%}#2MF*E zDw|3E{gRioHX{MYE>`Rw>nNa4q40W!yLEaI%+L#Oc4je?J=D%jk?h?<|FFcctqO9h zmHvZT1v6b;-R8|R7R$d5{DSW9#9a;iGXq!m_*Tdoe8_Lg)D1L#oFYVCIc^)93cgXx zr5l(4J$x757FyT_daH`Py2R7voY4Ph88f!dfgHEv8A^Hfq*|Uk&fKjk9X^VZ2vbE$ zU$fPjY`!7JV2k^zcPKDAbBH6kEn$)IwRIP&J^UBk%Z5ZqemVV*dwBng@ zutEK-&@XUCWe^f&Dh`MkY~Edn&1c=z&Zz>CPvnkviRqchynT5%PPbNxv}%2U1hFd7 z+FcbhO!zfmF-C$%o%%^F;nx;>dDqLTAQuEDBUF6U?+RRV zVQ)j7pK0v|ImZV*l(BsI@cVBT=j-4;KAtH?=7G2AZ`ckKEb9uOV7~WSpRm%r`FlQk zB(tvjwAeZtRdml~-*2uvqhjxt)%9yU26;963jvq%bfcx=YSo`Q8xK7DG3<}aMA|oRPbeQ2rF}%CTQYM^D zgWw!lQe7+GqDrPTrDxUa9+_wIdG(cUc!_TXhYW=bt1HzNsz0Q$UL zwPGr0|3DlCz(o$N=v_oQo`ohRYKD_lDJ?RF||mG?0^^M9EW;-wq^%!Get@o>T0^? zJY`|Bnp-0VQAQJe)U99nriyZp(2~IWOueLs%Fz&;XFJKyxfXJMuqt!tu>-tH@q%da zF(H){U@f_jO}1tgNnB3lASJ8eQ1PZn?Gx+Mtb3qE%qeu1ZJF1gR$%@GTcFX_=Ypjr zhb~vA6}yg?lj*;VSkC4*jMbM>!ObQV691%>+NgOGf#zy<*{_~0w5BUUkbFG~j`F8; zA5R)BwZa6FJgk2`ko)AD!oya+HZz76^@!y8&qkSBHN>`6XSMwXUa5Y1UiboKGZK`O zo$GMyrZQV!csZIuKbRu-V0C}?)P8Hk`yv_+etspBqSF3MZtVgh;P`{W3SOhHPl8#M zlj_IL$aE{^B`nUX3_2+cWJ3UJBHgpaIr09i1aA09m8=+O$yb6qR!T+qiqFHY1umi* z+istmf060oWigV>-}&{_9Cj41!JK)foX(x{u?911MeUw*cB)>CD#FT%i}LQF+0jEf z5jUdDgRU=@v)B**{*RrUE(%MG>2#&$7TR+?KLy3otGAt5{vITT-=3{5Sdg#n&sOjA zJnR}vsGCGSe^L7>SDtj264(@fKc+Q?LV7Uw=Q1}%lI;9C|2x;&B`gSavKC=C8dQz~36 zgNIZS$0z?18bg`-K&sTzW+j48Ub?8YkA?Qsz~Oe$04=KDTe(&)VOUt3~&c4*{pvTPGgQM*4 z?JzQ|L6nf-tV_LJ9L(qY;iTgsAq$j&;WD6&f2!_1F_twwFB(JPd~rl{o@9<{CsY-Q zQS|7|^yjw;>F)aV^6jHN^jn}v*rG0Z^wIDA`__+Y-l4-h9+(v4y|1F01SG!E5)&bp z%OT!k^*1-V8y}Yq$GiN_s4huy?fezeCE=F+o6_H5MVGE9J2L2-c0T?wg&;m+a2GU4 z@o?!y=g?FsF4ET|8O1DYL?71XPC{fR;IKGM##xP*K`>a*3>zjhCJH<;ejTKylpJ)NPg9+vx@hn zi`(L>Pty)hKO~UH_nvJ}9S(aw{G_zEYaz4iY|LI_4>pJQZND(LtfCX#1kx(9K@~cQ z6tCzLTDifvD?oQ`Q^T5=k2jZZht~Ac7XgBLnjkW=vwji+$?_QULnv8`l4!pz)ulC2Q~|rdIYyY>N2bnCVl<*EZX@f1KO? zjNjamQj@!Of;7KH8R!daK$YEY{hPqR?PO5k#RVZCIq{)tz^OLz%;>V%bN@@dzizx~tG>inehPu!;_r!=^^dCn}=bcb!n-3^l%KFi1v z*wMj+HTI2c9Dm+b4owBn*Jwr01^C1(tIHxQSu@*PHa9jxzrQ1q&rpbo&y8a!Sp}pl zvOxAM9USihdCG(*X6E1K9_TW#ctcrsfIKZ<_i(yAm59EWg=C3g!>4)>;+ z_+B%S_6@fwa;>;GZ%$D^cokCJ8O4)CC+;zr7!0(OX&$^{)ENT=9NJ|z3D%1iuax5N zla5%t7&OO&CW1E5iMXoI*XWp+iOVvm^$GxeDF0JdV&axv*I5{7DzY-$7xp$VTN5VP zQ9=UkC@G)XSirE&x>9eDX~0?zT^SMD-Du-U2g(Vc;pSSV;J_qc>9KzC+>Bt6bL{1h z_p+e7eaUKKkcQ~oIsY*@;MV7_qt}JB{`+K{xH0cI;t^ixp+&b=l>5MouTUglKD+Bt zX%2XS9Dwpd43IsBOlbS$-%Agm=9L4zZC2}`&5~NJQ%Dfj@Sg&NI3+kFb4e7Z_AMY8^%->I^$dKprYpTCabiIKU4o3V=dJKY zQBLl=isoZAl}>X*GKu_6!A*)3q(qs%Tg$~l_w9CA?^|OZX_vp2iofBuJrs!iI!&^H zlE6=lNOR~ToV4Eu?5W2Vudve_EZtTv@st(k8`~4Oby8l$Ri3dY($fXI{4x>Pi)$%q^?f$Kp`zE1a{kQchOK`dKK-`6u z6Gcng^eP-=ORdnxD^(St+z{bmeG(_>Z$!1uGaHk^5;lu9o1G%6S*pxX23=1xvX`X$ zfWN$d09EZT6G&rXb{3BLroUAK_>CyY$jI1K(>{2P0bcXLaVLdIyS)aarMe9!{Z;1tVeYdD)88Dvgy_8b7@K)GU-kqQ#OVh^9uW38&tS!>{Si%b>cE_ zoj7@2Z-u<7$6VvmIo27s`ljU*4h&r#JaI9xQb!Z$i&YwLEQ=>|Q|HM>d4PU4;EUEk zoQU$cVY&7CtjBEfsz6#D5Yv%E5-WgeMJT%lJ2*{Jxiu1)<*)TnH>S%+Mc#b;esGUw zzrPQ3g+u#pAe!Jrk*V^!WxhPh5Fjj|RWKmowI98xvpShp-iO=Vbj%+1{Kx}A7{hVP zqpZh@grxhzlunHWEG6BNE>@FvLv~M296A4)NN=dxiw2&>rMkvIYId9n=@Imizo~Mo zeDzplEq1A_P139-ez%ke{!r!MzMIv&&A>-SOy(#%QdwK znY@~n2Z}NG8(dU!G`XN2O9f3!$Tnd-7RYYcIZL>%=+V+Sn~Z#y1^t0mx}=ErIGa(@D0LD3GH82T@-pu-%DIv5kQP8dc%d1zjoqGFQ0)d} zBvB&s0+0Ok{-Kj2nL@lI;`F4dx{Ap%^26ydS9~oCo{TP1J@FTeB6g?aqIRi8p2E?B z8tS=o%mjaeei)1LKqNLV(P8?i-1r?Qq(B-QgB4E2ejMsobmQgC*{PM_X-MxJSQatK zNBg)o<<~Z}aRiELmV`Q490lxF{)E9Kw5vQK+GER}?<*5Mol&4p)6cU&=9}=MqPCrt zN0pltBk5s>Mo}8a8e+r_rlu%ZimHe06gHv=#vbdH07lob8)_q?;FY*CV`<_!dhZ77*Y(PemKN)n!jtK#p zjY25iYwhqH#pTN{aO211J|4T%Q9WatQH}%a3l~ii)++&nmK)&tTSoTu@Rj%Pt$5BY zO@dbO7Qi;c_3+`t4ZwdO2YB0_M2*#id5x~t|5JpFDN*u3Cm8)^vizgk)c1G(`QAIz z&Du0C;caK{6)XbI_a?y_URC>#%od+t7it!eBiyj~arplPqzW1`= z;?Y`>ZuaJ^0kmDb>PFk?EAckZYcn7WZY^E4av1N_CC`$gX%1BLAWsc1M{#->HZM-r z8^76%bA*Lv@y-rI=XVgb;?GJ~2f0ct)k_{O+%{!fOgwmxUf0N9OMYPa9L2{i2Aiut zx8$ssgz6uRUm7_GMsv6oR*5a$#x0$nt=M-MWZa&Z&RNd2;1YEo!JPe4Ccl1*ka%CZ zdxGGPla28v;UV6_^wAh|Y)t}lOv0@M(p(^F=ID_Ij)kFdOW?HKa?%3AEQHuY5d zC!h!J1^zJaBLCxde?L=Jti9b$HS<^Sm9OU6@$4$aA?nbyw=t)6w*ZgO)z<0AV0=7)NraU40yWh*!gdLU)XusL0*G5+LRpjOA9`v*p znlIikg^hA-eAQmiHc&I;3Zdy|m)9+tT~A2+&e9F}Rgc_w5ffVA!fUY>w=t8fg8X86 zLxfkyX92y^c1x_%kLL`%rO|~GdTbw9y`K;t+Kg49FV))p`p#dM#j6i=Js+yEo^s3V zLIGa09<8ZxUNa?;AN?&TG;q{J-8PDa72D z`kLdpSlG9B;nJm2JedgoQYPT?lN%jeutbBck$O%GiLMzgeaGXL76U9q1YkCZA(Nk7 zcIZ;NtkY&l;}`k)Z-(%)x8&kCZ_lZu>T|}O`^@}zv!MrGyB!MiCT~BNba)lp zD;_No9}UYk4JcO-)DD%-wk1FyOM?}|iA|cbRWaUlPW*%ISgu>=E-^Tkbi@sJC9aCu zH50+wBDk326vo}BqSuk2(2fldjTO5i3Ua&>^@Nr~2in>%{-Q${4e=xB92Mm6SJI5l zeB_o9+sV@xuog4we1!KvFuBy@H(P6b{Fuj`l0gDjWhiDE&>jDI5RZ_0S2FDPpPB;d zv(~^5h7Cx5>%<1Gnk20f>Fce22Fx4fnkC!!jhjP~w?{>A+oT3FEn;0lwf**j%Yy%j zTmSqs#y54`+7kSL@U~qH@MVj{K97OLV2{MyhgNInd_Nf!KHdW>U{%710-?D-i zS?kc6f+fMY3_JzeY8;GfmG$Qak=*9=6_`r<>VYM$D#LB}EVIVlR{1V8<1T2-pMn(q z+%86wq)$9HNiUD_RQ%H}N-};STybC1GQ%Re)&k)%HN>P+M<=G|x3Nj8UM_dvj$INc zQgU{iUP6B_t3pz?FtBS$yF1M@{t(|$aM|B2BRzBuyoXfDyvzLRjE1s6-H~!{RM@=V)JTiH{l|JA^(ISIVi8LOBDL{&a8%|$$V>x z3)w^&{=F?#hWuTakV_h!s8iq4L8W{~oJp!5Ot6!aRZJm1=4VeJFLxI$q%v+==-~o? z*8}^GAfO&qGPjLQfVGs;!zlKvsc%jHIh^%dYZ&Qo>qy9m@Xc{r0alBDQEDt>2WnyL z@LIl+_I!G4vwcJvDm{r$sD5Zf!1M@^-u}?&IMCxwpw1zof;;v1grPTKg}l05gh|0_ z3HU8x_ybLFa&N(^EAuMR zoP>GvAu$j4`^zwK=z7+4$-^pSu8OByy5-J*0iw&^itTua_~c|qm-wCt^F&Nw9rkl- z(`|JjCqa+WA~l9DAt#{$3d!;Ou6@NfX36q@cUi&4^`<2l8`F2$eVM>De6a0}1Qo8l zIRX(@=u$PW;o?yuefg+67M1{R_|AYiGJY$ny=q^XwlR^UCG)KhT@$R8$5fj;%#{KrsqNTGRk`gm84(%a5!&?2Tj`zF(_!{u(;eQaQy&pCUZ&C;Q&~mR3gg;t z<%U8~j5BTNAiB_uz-MWrZ`gII6gsQPiF?C^nhu}ke9peeZ&ku;2?xO&Z+p9e;&gk! z_@Js@qJRV5$1mt1+?L@s`Mqs-m5tdpOL)Q!h6(It7O>_Q=gDiHB{q@1 z0WtRA%KaEdSA`ZH85e5&uNPP7jz-!)=o{u_xz1Ba<*Mv$iQnU6zVWBs^nOjbcAl3_ zADYH{_HudV*{!5B6 zN&_78zq^U4Tr&D~`N4FZ#mM?yr4S2J%x@1NW10I>)7TS5%&`5rd zdh=(CTIkKkM6#=4+(X&+S*fJXY}0o)B}i3eqPXK23p&qtniC+i6d3s&kob7qHr|>+!L_NBP=BhSS1jt+(z_H*m$&~kYoIU4C;Amhq&gYSPyaIrVxDd$Bb^vkHiPe&4Lv$$BCZ`|V7z3qB7HWg(^8724xkB0Um%y8v&r zgn<#!8+XRv8}LH9L*pc0x8sobxy1UixQUG_B@BQ?4wPTfd>uFlJZXuT-b?NX^MABA zTls(K&;EAd%eFvibTTkB=pWYjcfaWO54?X~0phK%u_M%fE`k5!)dvBfp1LkAEA!h$ z{%=)J$qAsIswfIw3HW_MoHT-edGBZ3sd~)o)U?|tw&U;j_SgGhTt9pMkR?&fRr>E^ z`0Mw;rxS``KUb+B$^ZFC{&v$LufarJ=}Hv&f9L}LcE9T^l4}BEcjnLk<8qgu>Jz|L z(L8>aZd9}0U}u{8q=#_YO{AmsIcZ4?&Z@Ew1XciL;(ttrGXS_kU)Hr%#rgdU5dNKzTd(|%nptO*2?(#Gid^&I@ZblYg+aw$hysqw z`$KV$L2ALOfV-n=JTu8;H@l<|l>fEFGKb9-A_HmrKC7EnykgA*PU8&c^IK5djY4O4 z7w8z9185q>MJ2!vnM<;@C;^MBRt>(TRO0Yzl9PG5QlJb3P1zPzBCleLDHx7uB0jMk z*fi>R)5Qh50{^l@{Owdt6EJGkHmg?UxUM* zLUKIuMF)tC_^#JV@UgAp*Y&BP_VAo;vo&o+shL$~+YDAgq+uKHc9KMyLD6TZhnqu- zWD#pY=eVGpQqt|-E{@$?Zaah?HT{#*JW@*7b%pMx0Z)A49YW)Otab47pLf;(u1Mb2j_jn@ zkzfYu!V!KPkzv_nS|O%^3uxgk(f(&T5=Ys&!{7R+`hy3#V>w7Kz<90mMOCxntG1=d zbSEoZzPKol36Vs~`DZB0H3rmd{5q<+YRemj^H+W^-*~a6bnK_CX|rCDZxPgD=vzLg zL4hWt`ZnfY*Hbf2yqk4|Y^%LmbE z2?Bs?Fu?eOots*Gr-r#U(ioha%ornJs~>I))35PBW9ca>(ofp4w292-%8``v5v@o58_1byiLrXohZfrBx zY2)4=oC_W_OgNy0?4gd*TCm@wKATONc7zHcSPEuLI>UQ{dX9c(-PsPp`^`!Ta0tqo z+&^)OJZ&WScx}I0Hv@t4CxY?KFB#y*S4U~i;2!?dVyrNGKlTeAI&gN3n-0Y+?WSC1 zk5(=;?qq^v>8-GxVpN%5W)KB^4j2?dE{j4cwYX(GPXBF}!M9zI=LmYnfPy}GWz7Ac zywdFGOEbE#Yic)5p2NJlIyLYGwdXb^!~uKc+zNox+4!*y`@{WRB;dWxdiLe*R9loX&;w^vjD7IYQ9{IZ zP-bS3foh9^U9x2fOj}k$enr&U~p@ERRyRVueaHhNS-NB z%Ty}CZ@Rm?e_H7mfnsxYFB~3c874gah1CH~zm1;+AfR`f3=}wjIJOWc>v>{w z|NE3b6ut42+0n1O$Jd<5l>=D3>p2hh^Qv(5W~Dms&dJLI@7)2b_fw-+RO~i(+G`X9 z8|@gys;Q`wIOB$e?b0L=d!@lvZSt9;lPvTw+|1R$IPYR+F@wUR!etTg%uaH$;G=8l zZP7ibNH=I^Nz*x?7u>+aMGJeCt;FXbN%j1OyTAN zuOX+|;nFL&3&*8N2hvdJ)(Oh_&{B7{8$veRuuJGdK)Q+ssjGyTIFQebj+JUo5^>E3 z=L+v5eJ7)UXE%}WIt5)q6T!PmZ{NOU0$LhM{4)QT3`xeZvt#t#n;D*BDzo;-u~WPt zH6!)?olh%0v_hT&FBN=qn^6b^I%hPo48G>&(LPow4&cLv&E=%evqL2zS278h@SfVs z*{?_!QJjdxXw+(0r{ueYf+$FPx}c{U{Hcy9&FzK{ z5CRI;kyIBhUUV`6SisKmbFOZaR6s}lYH`l3F@TyGq?z;i~wT^kT65{&m-W^ zz4xD2-ml4@7RS`C6uFIdZD%=Azw$Kyq-V-Ixt40w6qEvQmc_01SHDY`@>-dizX!5` zy16=f|+61B&g$!~pp8k(A#ROuZ7rt9i^nYHQk%5qcd1sMx zdWm7MKc*gvCCg0ba7no{9yvvDvCNrLlqB3_Sbq8~t#mcMVJlrCFVCgEL%c_ z!m5V>1I^U%{N|K;9rdwyUu@I!OfKRMjS16imq7?|m|3&98iqsB!Y#$dIZF$FPpi5d zySW`M1mOHj^C-MjOI%Y|f8t5Q_@9ar48KhTPJD+m!!XXEWaIJuWM$m*MZtGRdr9E{ zm3dl zGH3M^Q1j9&lzY@p<)@Y@#|+|#&*E_B&&6Y7`M>nu`yS!+%yKFWgU5NvGUTcD%m>~6<6M)Zpajd~2}bZeh&pf$bR~wRyxSPATZ{^;jS>JHK5dc)p74qQ2PT!a@Gv z$@T6i0~ilT_e9m(R1U!RikgKK|so{R_rE4idiCjjT z$~U`U#!V}*srBp#CfEG<(i=CDoK*Jwxo&4b8wObJwLMr9F{@W)!$}fnX_lny7tOxm zgj8sb(d>JB2<~&Cy7lKpo+~8^Th~0(Q~X55#zf0+8%3Fe8jktyslV(lzfI6imB1Il zrmfH#$@a@4hjn*zI?%3z@XzT(UIo+l03#p`rjMA>Zhph0g3dvTAzxhy$XRo{DSj*c zBqZUs5KujgIa(@f%8VN*!{poSJWvif>+nH>bvS*;g1 zs7g2wwF+0OGp{iKQl8^R3-DhUbVZTW$wFOA*wxA; zDOo?SX=)mEt~C}@+Pnz&t+ln!qp}m;-^>%%f)y9WozML9C~1)b$c%#Tt6y%*>ytt{GsqN>{J2o@p28b}WzVM@j^YB(aw5LvJyDuU01V zHJEL;PvWSRtP$PV9{y-wkcu)v89>vgi^S3*V#M~H!iZAjFDfSp8AQgM%8118 z?LF;fU5rLI1lo#xpzAGq7tJ&8C18}FJNm7k=#le)#U!hxe7_&Z&%P%hAd5U)4Jv)u zhwCWp6;ce@233&?G53_c4y=nv-!BdbLlh)S-fCNDtA%Kv&R)zplcwfpHdXiKb|JDo zzuHSoJv+KTNq_OM>U9jdRY~XfWPHc$&vsMhukIz;ABj*2Cei)dq4pom0}%TTJ&y?6 z@3&D}jictv!nL{Nd}?Ka4>*`V#dM|4_qGk2x~)(&d=k{iwXLagQ+TmsP^nkUO-_$; zXYF{+XVMkf-+$vowN#5dcs?8M5^gl$`8@VsfefL^c7%srhH~E(cJAB%s=z7_lQljx z^Xa%D>2Z7HrW%U@@kL>(n>@{WncLV;Yv+QuX2@9U>u0U2%3um`x2<@`jRRhvCJX}85+q9MQ4~T?{VGV|6$L6N2g&4LMKF+RLfYc z(5(|C#~?PPNW0VTbsQHQ4sMsJ=RebA;Paj|7_bR>cw784&@ya&Jk4;o?T#N>66@Q- z%OpP&pqkm3TG+XiwC|7JX!_Cn!$X?Hz|gIN_;v8Xgb17ZxR*Hw5wrBb2=BF`Jj0uu zNg8kYLJPvDxM$^5?5#=4M8?PKb(9F80KUW1ePes zQjD)BZJFW9`4SN8YcmmK$o83c9i1Wq_vTgx?8ak1(qecd@Cp zS|7qx_fgklp!1_IIL|YN%n|HyEerGAD8Ue*Y;BKTivNUdppB{dzm*+yd;at&8WKw& z7Ul2~x_y}RWPmefx&0;1p8=mI?2nKy^HE^W{B5LVJK)Kes|rx&tAJOWLlNRpX6P$V_d$t+4{XfqHPDB5yQA9 zNBh%yxG<|-zzs1APqaji&-|clLu==C(DWC%{f-135LkN2sW;Q@4;73~Sa;@_!kouwV%UXQKEU3ZejS?)smN_)H>tl=G^u*hVaz_ohHUuIW?R}HK7~5@^=68e#inb9-DeKvvE>%B-zbLI;4@8Xn`e`%%--V6Qd9G($!*oYu7Hvn)>=xIgEJF5h*{6bbtCzy`1C=!xeN3u&HMjU-2MtmV-2=NhyT z`MMrfur?m@m1iYI#Ky+d(I|`{JpI}YirYPG5EfAng9?6GUp+20vF=Am8EILPJ}c!v zjj}|++X`UHJUq9h@ls%gf*C_kJbKWlxa0i|f5WU>E* z3v5Np(UnY{{!jdj9>BKhrt6_qv0v*QA!FK6VKyd_l>^L034M8vP`A`se{zCeC2c1e z`mQ-vYZWc zaZa#AJ?us@I!<6UkU2Csj%QJrO=Cg5GfT`uB9`dlVI9NmqwW_Lu@8O~$vRQq!A&h1 znc`xvUb|L9sZ>1_{PF0cTH%ZJ3s?3JdL#RJIi5Pd>K!36vu@BM9o#|P%MumA>-$5D~QIl0$(Iu@<=c=UMQDLp*QJb1S6fWl(AY3RJN9Cdfy7wANI zwT>9qzB_U?pgiz85+3kfYyVLyUbO!< z7M3Vd6tX$nW^{NtM5*Y%Iltf6eH}f?&h$ltm^t;jm^+@Jep(s;Y1f%CErL!vUq?6j z%M32L^|sq^sozZ^b*~w6{iZE6AFsxxALQmR8(xcJxC`yory9*@lFd}|TZP261=Nd? zt{lZ)q!-g93f}4CHd^AWT-xHbUur&oAZYCjWq@q6am$)9)DC9l72EbJxWssd!SqWs zfh)!_+kU^x7Pm|u#jWT3;Kk_dGP#R_k#v(KM$hs;PQr|M$ zgYYV$SK&)Ln>T3p11-hyhtUoB@zx)UC6tww*SELH%}k4CPE_fH=7WGQ4L^3z0W9uQ z-T*%QP}8U!Z;Bn|GBevoU^1T7<4x9d;pi7|yg=8sM|<<>e2H7HB+GFe3Cj*Wd&~B- zj}g6E3I~GIohrkD2X-NjEq^V;`apG>lw}XVqive`pCe6c^$!YjGC+0gAahV#I5)#D zam1t0uy`(;L|e>vFE6AAsrZTj?{mHnG@#mV2~yx*P5Nyh2QuoCr@O|vW1cRCT6T|D zPkD7yB=NK-qAf(_D6GuS^NtY)hRPpL%i%Q#)RGMRN!tt#v4hoto}jvNAz0I8dUVOS zCp2P)0<03XNh@|wAp$67FM?`=QBo4nLAO$!6{-$-cPUE0BcI@>Aj zK^@PYP|A(%;tFIfPJZK6#HV})?2^cfE@zCsqJ19DTU$p5_bgF-UJW&fjnN*X*|B-H zYClYMqSQLH^mvL74)3`ipC8^ciVJ94@ut3N=r}5C@{r4kRXNH(h)W8kY_-ky_%BfP zgnaU%W8U`ajSG6C`aTiSF+jtiF(Vm|2*LW;Sf3g|2 zv4FxK2A=2xpUf`(x$GNBticj{-#jE-KYQ%$3OH<)*Fq-T(upS+?zd^W-Yqgn#nWY+ zMn@|1-CgzyRc=y_923+3Ru8H6TJ`Bl13_5&GjETLrp{WEFU0wpufJ_^5yDW`gNA3m z(p2?ZdpgD4fbb&>E6y#Y0u%(xvsL=gX;fFh$9C@y6T)46_4I1X?j}{bLW^Oc*Cs#S zfn9uS{ER8q`DT`Ob+*E;S53gqt13{X*pz>DyDRaGOGZKG0GDlJK3o1aP3%Dc-_CF~ zPQ(V^iWDg;`lFDAPua(_cvdmbAq>>b6 z4WY$S24f#)Fezo<_Zfrij4_s&VaE8L?&oQ_pZoqi&p*G{>-R^mF3GsA^E%JtJkI02 z9O8IFfxGV1>Tji)m;x}qXXulXK45$=gq|26YnQjq{1wnHkK7?=yf4bDPC*7Sz=@Hb z5-V!D0C{-o;ZoCaBrKvp^lsB6>%`+dmBEt!k67V{VA*(X!uW|)^i1>IINKxE=P!8S0^UbOO9vEe&6vvbn#%`cX;lg( z?&262xv&@xX8K8JOK~vOI)qbsav%G9Mn_L>PSP$qpkd)4Y|-Ze_ebuWeA=L{kK)X2BzWLL+v4>=rg_lQlwd&m#M$R=f1`K_?maB^x)$w|7Lz%KhJOX z6I22PQXTi&KS*K8ss7Fo+L)P;;mU(Kna&X`tA?D%O2YswsPio;Jw4aQtsP zP|~SYfdUJ;>=((wn@esDA^4yw=9 z-<&Fv9cX+%4br}*$Anc-<3`!Ep72#NW=)=4jjT?m?q646>QNy#C4Z@Sx_GQFphN5` zw{7+xzsh)LI72V9GTiZHq^#?p{SDTcTlm*E|F0_{P^J#Ug6d~HAZdP~@^rtyp)R2J z>X@zkt{*$x?f3a0JJVshH7YO+^u0EMk%z`Y2hQ&jkBO(nJ8${mk7FnUJ*L|cX7sFN}i#CW_)HWAxDBi z?`hBnj&K>ymMrHXzK+HN8JVsxJYks-{1sm{oS_+;0XVjuRe`=H99&fR;unsIim5d3 z3D5ig{Snm+4lU@+g+`r_mufsHY@F-lXmdsAaov7`N4W*c-D_hViYMlp6^{=%DmL~Y zOzZ)s3h1NT`%z< z>38vl&~MXdlPMmTX}w7mXr^|I7v?^m74a#wtxeGGa*FYPqhA3`DOZxyeD+LTt zf|cbBQ9#e_GRv?QptD0&f);|ES-Qtlvh9(TOHa5Hhpr~}fwMDoB{4=1=(NOXtEAXA z6Ol?OfI2_`=I>$bMpVg)ir^w>GZ4;g|sGWhrLD^=M`P-P=pR)L$IvnF6~A( zT;pBcZ`4`Vz}vP5NQl>5zob8CQI&Z$+T;v?4ZXJXZRcY!!{0W zX<|Ui_rAob;}ZCh)3|769vjf03}aHbxhKSVxVkD%#6%AuB*OMh38l84>z$sEcGEDd zLaY&G4kUp&Rng2D%M(qGX&=Ia0DoQ911v0HEN4sWd|kji1dSMrds$gkHBm(wimeKy zG=dIimeRp{=vlR!Tz(FJ4;8;gi_d@e8J7iW^-4)j3{XR#ACL5@W zV-r9r=3Vt_BUswL@yu2a+)4l?c4q7Ic5H--80CzkBboJv{l-|gv`MV3F85%d?{^s; zNSn&Go2NcQNTli_r0=F0g06@&-5+9Ew?UpuqBFJ+U3$0|q;(0zrO&(e9W9}B64?dy z>OHU<4ipg(aqmu;^?g^J9D|L=ZHCD_-+o8ZUG!wr>&ueId*I zxeoSjE0_<=4IKwsz($}h`lP58stQ(+hys(TBLo6m@jUj@qwih)uk5Xu7iw?kf#O3S zs%a-U^VA0XF=8zra(?30X2ZIwvNj%D1lrlIjYdkG8U(Sp!jm`c1J-2 zUL9-8Qyi(1xz3=mSFD`2E#QR~Y7R=;Q3s@;DhX@q8+UI2QxEwy1`^`nplvsb*+Hk+}B?&{+HN-6bU zG)}qsJJa>puETDV$kuu2FxiBu`h_DE2FOc3&eMuX8z2snulV^{ahWB0@W{EpnvTJO zaEoeEq|6O;&F`ZFb>YA|l-OHJfs?B!bB7x?Xp}_rQkQ`u)KCBb__@Z>`GEewoqaUG z&#!-5VV>Vuc*7G(XEaB-|P(<9B`uBrDYH{6Y7wEUf%2Fp^+OXfK6tMs+VEj4F`-QuYm zVB6zl$F5l$=M9|QhuxI2_JEI!9P*#4ias;#T95(5dx=_mTyp%ir3)E<{4Bcf1Zw!x z*o%6zC9^P$oVJ39X;*CoyN9vNP^0Q5-MfSTjq3XJX`twQ>lYY!wSTj(;zjH0DzAwr zRO$nAA8}l;R`SAy{-HWJ?`Zkp6rhomC3oo|p}oc8P#rDK9qam*j=|{{j-0L7D9U^q zJ}Jb0nQy$YXXi|!-pxlJ(?$;ZJB_`GTP#rG|B-7PyvV1cG{{)G!#H^Q8`dm5B3qtK zLV8NzT7cE3@%GPaqZ`Hef(~2zjY(3`t*<+2nJc?LV?5uaa}%(9^VU}#$G#q=Kl_l^ zN?&PuVWr~daWByKMr+$nX3aVd+O^c==*FdZ2&vE!HTACByY2Bz+B|eLfaj(SZ_v6% zZq4vZ9AU0HJu2mlh%qv8>x@e0O>Af-1lkRiw0ZPCT}s(~g2MKke*A#8@ba$k>-rlp zVc`#w)ZeH2eLLx_qxTYjX1`dM!k;yf&<7k&F_L*YAO4_7r18@qm#Z86v9Q{?DW|WX z86ww^q#T)A&e=sC*t2pzLTcG0QK~lytALObZ-76#YdKrznA*Ps^WkRpQ8?jQ9FT6} z(a+ewL%E1Dp*B~;egT00o=!p*xA43eyP^A;OSD#ObE9LmL8gKKO#8YJAU_R>`wwC^ z&s8`joE-vk6z4TpHfMVWHdR7KC}4iv$ZCBh0nYb@6V=r!o!=W2I@f2uN;1E&jj>*A zQm`;YU6C0mro7IT3hm&rQn$Y;U&uA%V?+%*ipGXEq zkUa7ty*@pJ9J?hk0IrSoS$T?fjg)16D{~L$-uDbKWsLaR9BINnAwXOd>S7olG29yW z%py1uuqW@Xc(2UL%&1b~@;>7)<0LG!yrvpYVsi;jJ1X(x$z~HeCXQWy06P5lV4`wG zkkDlpL*$(-_#@l^M%kM8Ol)111n8<6*L3ovtRGO+me`k0Ej(+MS*yS#cwBA9BPUcY|Asu7XPuBe-I`C zb}_#5N))FD<<-V$>^Ir7Icx=Y7u%#52xo!am7UC<_%c`FW!*G!TJBV`&%Rv1DJ`xU z*kY7cIyOHY=xxJp=|`$EN07|kx(7;Te|Q1trzwc7G{>~1rKK(Tm4>@5_%$~g)^v5v=5gg~dy_|Uv&?09;6=skjs{>uxTs_dDIahog?>^9muVK(V0oiMpm?JCw z5_;5IxXn;jzl{(}+iz(lrGST<>D*f@4~#!M#inxolalwnAW7%sIYP+w&g7)lRE3f_ zpkBeFXS!(hBcSH*&8{Qxvuprf?XevZvdeOkJPCpSL?3y4LRQ*cW}>2yE#G#F1rNx( z_T*4?J>!zPA57AV#(B>bjB<8M-+kxyhmf?WsLtfejYl%NX;Mw4CJV!XZ2grz5V`u; z6&Ktxuuj8Ge2`g~14`-LHc@8FCD?mip=H#Ti|+;z1It~Z-|Y25=OJ@xK5G!d=?i7u zq=zu6;8DY*&91i9%qAn0+kk2E`S&8uoePd-{c~r3Rqe_ZchHRkd|y@U`}_30+qRoZ z=>NRBRaCZBfX+VsL&E%=R&}iB^ui5J+85s#d~*W4cq-E1{Vf&6eUzT+Fj5*uuPTKb z+ICy;VfijAZ#!(8_^yqy7^D0Vk2iGx79G6$;lo}Ul~tSjwrv8`XXX=gG#n1E718Bd zbE4w&gQm_H3A0UoFN+SA_pZk<1w27-5e}MZo=H0E?qvhS3we-S6hWT#2T})4a*tWI zC%~gvE~Eb;os5aOCyvaOwo1&iv}MX^?MJ!dPo8wpAC}6DR5V-lBjKQZE8pII(>|>_ zT>a4Stj$;EUr*%Q&!(0K%lb3v<;1>Z5Ft+z0^50-Co31cRS@x6vQmv02V zTG~(orUHV^OHE+w^tB>tCdGUiAFNn*IC}TJ)mO7buhtm(chfrdo9w8vGo|4VSR&Qc z)k(^&yV4V9971el8UahPJD@UWf8Z39U#oi0QrI;h)pg}4{ zoX`7rb=<#0{)jdE^tvTv&2P|dM)7XO`S%utW(U@|0aekXsml1*daQkSMdHN7K+v0;$O2VU z%|u6w2B6l2aZYi12gmJj@Sk7{XMNu6P?j4D?8whP)Va4B*&uD#_|zZP3yIF>9xpfZ zTB~AHDc(M=RN^_?O3ZS;~#J(WEpsk^5;Uth(~dTK0Nb(}AhQNpNjWUU@3Coneu(!OD%8fUul%B$ zMPJwHpr>eTVc=5v3-Y+~`ZbLYrt{m^Zg+Tb%C2wDd3Ajrnz0WX!%+Y(_?)mg7d!ck zsQFIt6HU)H;Z<*3!(jSvj3l)?yZs&{#T}EIOxw+O*Y{5i+>I>_+(5Jto=_p=tC_H4 zKJYGo6U+FU!-hZVp!bKue)5%pg~hK7)P$t=xwh+7cw*9W`?(77+g{V(f+Cg%NIJKk zQ>huTfW9RuHM`#iNJTV3CG@1c70xu#y7ktMR8Ac=**CFKHyrV37Ps(}k!AEViwVpg zUd>6J&0V=rQE)~$YL#O~ISBLcMvQgCAFX&p6^eDrVz*c*O^NDnNwnD>NDQc4D5A5y zd80fzF8teZ>$Jq1Rc#iY!w#dgH?sBQlUxaG-utMKq(M`h;=J!0fvw>6k+l1K!%O2V z!$x04UFWcS+8^;EbZuDv(?I&=f90MVUgN2B@c_kWP6mFRRFc8^_n3E2t>|F8@;#4) z&TLA=bq&X{Nm=P&@|E?#wqXB_yl)0oE*dj~h4HKg#5rKQ;&NBcYs923qsE+ak3@>< z!sA7>x^y_DA6LKC*1M~OminC)dCdtZiS~%;{DUBQ+Ya9|*K@C3{9sh|B-gac+8BwS zn{BGw=|`*X?SZ!ZMRa2Y7%y6z68EOA{;J3PxSIFeZY8|M6V9+-zEb2!-d=Iy@To1D z(!+fdi9XJo7ExzYj>??%r|#m9_l3I>@`j-q!2gWx#C$RRZ4dZ| z&<|o`=rO?f{JKqD_8(sJue5jT>UrFjRxi^xvhaUDmgMe(^k>^2x&A%){CErh4$FK( zTdG1W@=@FWUUA&I`8x;ssK=T15Bwj)^XqQa3=UsQjbm>5$EUxuwO$Se?$SC`&a%sk zW{+XH`sMkLa{-_Q0Hk`R%JJ#3zYp@`8~6CkpPv7%kk9vgZkOq*`~dcg65szCzl@#W zMGJkin&kXn?}Tq)Yr3s^NV5H=T>ABNzh4Pm+?wcqiT+pq*GOMm-I@{`7R^lm>+Pv& zfpJbbJY=8tSIGAt=1)x37O{Bq=<>b)^-i82-Xa!1@J(|3n={aV40NcS1b7Aie-0@h z^p299lhb=TF+}TrYg(*Qg|`+k&9VA?!GE^o!J|hN`Bhb2*AkkO#w{28K>?&lWLUo8 zg)-t5_O9etDS*g#sBGnHf>sI@zzN{h-raw=W!opW0xsH?Do)f)N|DeAEE*;NKM-h8 zgd0)>Q5mvVDL(5u&;1|8#*nI;M-!#P0}oC8uR*={(Tby-STihQl3za^Em%L%bTUTS z!g#=U0=t7|iuRN{ z6i*zG7`>SU(Xn+)y)tzUgOV{67|Cp^#8yL7|I=@4gMe`=+#sF9UMm*f6tgp!= zKOQsyxF(LBgT1N|SQsq5c^o)iJQqus^$vB#ErtKloNf}e5!e|u(c|8RzTZ%G_&5Cg z=ZXtdQ^PLs9CNDPogOBE9A@%hQU7hG@m<{Vs-TdSSzNcRlBx;1?dLHk%|>Y*%DU zikx<)R{Z7kG2m=?qj5}RY;K@9Mt(U2@p*$r#*R)+ao7-sVX9oUs$S!d-E7`pr|x`+ zpMU!3*F0!29?543S)OQdbF7czS$?Qwm|vn~nw0_kZ!YZ|0p25JHHIys=H>U|#LdoM z@(;3{R#x3~N!}lfaC|U-fLGoD$s14*r<|tDAu5w&;@P7~B)K_?hNw;n4uJZPkVQ_p z;RnmsX5&>@&$pfbu`t1x*K|U8gQ*vjWgwGW_nCDhtSirQ-P%~2O1GbCP2E!Wo2*rN z9wYS&wf+TJ4eud+2 zM61PJl#DgJChG-kf|b=jePZBkO(|@>aRRzr#gx16D`lvs`a$jXC zqNb<&!%gkFvX+Sr%DSeQGy(=l%cDE3;!zGO;Tn{s9+T3m!UB)W!^5v-N434I3TA5n zRP6Hk7pH0PReJv-JM7WY`;+jA2!-eY?~N-HK;P41Dsc^vmYWJft0sUY#~e>B5U`VH z!~QB`_;Um1E8O|LX-<_veOCnsW=&_T&_1hVE}$2R^{8IE!pz1aYHe*@X33NSAdJL| zVayEx$aQW5Q7v-|-kiQ(>xMpmPswZi+6VK}91=2MW%jM~(^RzyGIrA)FXx8q7Vj8D zLm?K(;EnYn&#|w&Pb4w61F*6dn#|gws=YgV3uyDSvBF8$W zgaAT%!Dh7Yeq^G!*5c?FwvGd3 zb&M@r`!`~wkm*Ri1Z~T3*lsCKzH_1?A%@HtJPfL98~g)+xZH=o3sl8(1A*<`()8FnhLes>Ffu8AEZ{6)|Boc>`X0^C5ZnPo4<}HA3CzEiKDbi5v)AdI zfn(l0uCxgtYP3F=5fc-6V*4BQ2XAH=WeV)3luzvFQ}OhIez%? zDXwd<`;A|o94VHLfXWv3ZUNmIL?;_AH7npMxQX)RUASRv##^Vaz#n(*Y5@E7g6(@@ zxsQv4Pu;m_czNzl4Kwn|+f#3Icip&nNg?&JI>$dV+ymZG%Y zJcK=~{(6_yQcNaRb6ACAjZu@sSPov-V7Q_0_ac3>f(*|@pIP8-n17v}I;hFTW8K%1 zZ1dpl#A?cVviqx8yYXqyrBM-f{*!OemK}(2!WB#&!-OI|f$*42CWhz@r7wPX)tRXt zWlKHqb?1)Vab}@$afUPo8;oha!G$ujdJA7Z@!^BByHp?KVx6W``lIaM>TFA zn)~P(mnDpZ>oH!p_WW{03M`5fM+)c5x!$|@)|rc8g4Vn+rj*q4&M~RIP%gTQX$7PY z_>A9qSpM2);+iA*rt{#3LcC^4F_YK zKBB#+^kxPtiU~gb1-A_Vu04bA+gF~gpFXcxiy>D-vOO>)S&Ka+i$mumJ>PO%qmYM( zqdp*dnsCFz+eavX=8#ZZdwHP5ITko^*1As$`w~>v zDx76j0DL_udxU$FGLxNNw)~7srU=PJg`Cy-RiZmPyyK8SWj)VA*-o+Z3;o4%ng_Js z3)I{nI9&NkNxw9Z!V~c%Du&t^@0HhQ^9Yu-(xZDUmvFJ`;BKSs@JPrJ;$)s;W-uZ7 zO+eB~Zz~rW+ewb47RnGWe~I8W(&WbeE{!T#(xbW3J>-TQY%k7wN2?;uP=2a;PCt+~ zTn{RPc9Vj`{rTUH%e;pKC{4Sm>KMEnYfi;p%SvWT%pmEbHhF!bMo7d3-l zdUuLOa7*Vbn{AOBjyrVvO23xr6s%Q#s$a{PbRYnbUZkAb`7DI!*v*YLw^LjhE+*}L z)`5AIjCG>at&iI}JRd-92t%a+)*Wa7c5ed(ln3m31nYVA3fC#AB?p~8bQX{qywO&Z^<6k=4Pa?2SFUbx}k9Bn*jl6I(@mVn%3B+ z%R~Wz1@Ao*%m|6@RI^4rfxa(Y!U2_*z_Tgji?b2Wo3G`?MLic?j&Vk0oj&tbv|$PH zx)+LOW!+lruc^BN4DL=R|8Eg2H4rSju3>b=9|pE*x%eU%4uMpq#lhb~sa~%&2Ejk!aA$H z?C{KPFy&^m#1!Y!v^uKk(KCzj_`YEotFFHI)A*9+?TdZ0rAtF4`kBM=iTxWx!4!2) zY4;)}zcw{mQ%G>#0NO2lX607acWhQ-iOYaa^{b7r%7rBhso4e=c*uo%Pbr5ViS(b5 zD^zKxPmo#Og&qlRtO>%klz4|#R;GRhY1nhU3k#@5&8_Id0O(UIxBPvMienUAj2W!v zgYgN>h>4tYe>;s2aXidKUB}H0Usj5ow*Zt7f?X(5+^&b!Y68KWjYoN)Zs%HuwL&Oe z$7Nj$>bi0!Zq*>&UmJDgJDVb|a227mtYi>f;C;ZY>@eO$S&%5wKb8_#&HHv4ugyxi zG4OwkPm*3xd^y~wsuD7P?QRpAuWK=IasBc^5fJ^9Lstaa-TGgrmAH18<`_mK#wzei zP=-2&eYlMYLFP(k4664tOTyHh^~ zX~o6s*`822cibtixuZTONL-}*%dH1V0ycH(ssol`#@on}Ms?@^a&~^rx1Ds@6mzt< z5ge|7?}zC;nka5FLcC<~rZm@7LDUqFM{XFa2hL|55c2AALhGU@mgoj@yFm z631Gh#Y^eiJvu^v)9zr>$Wnk{FKswo@dm|Z#l=aDgCz5 zEuJrd-*qFKD*aX>slQM?4ZdooNB}%88V;DP)6lL1QqH)N4<*iBUyTQ=zjtbvrP%u( zz}(nAZ23BuAPqq^;?94BPKn;~#jM8zvJY}yF$J%W$$(j%1hNNvSXERHZ77gDFcT?J z-CsSqqAT)lsyWHlq>8cbrznerG3D88F{Z5YjnG`lM0vC?**#I2Iucgoyeu$K>=@08 z--yn`J9G5nN}8Nxx+L6Yvnavm2=Ol?sZh2}E+%bU{VsQjxLq8UBLZ+__A9R^KJ$ZSK9%Nf zI95;cP!-7saEM)ReF)8ir4E)tOpZTsnLxm@gSvF(21t9Cb(!q*{$K#RdXgWSF(ul} zKtGG(&W%Uob`=v9*1!m_kb-LuT^%n^tcD|Hl@;tmp7)`?g+>6#c>SnVuz&gqf^oX< zkiYD7Z(xtht*RjqjW4M%sJ0LzWWJnULBOuEH|pWI#VF{0dv0D+3>sDgwZ^l|lU0#c zo)EdN0B*rlpBT7oKu}c{B){UTd-BVdP635`Rh}koF24L1TKqa=XJ<=zDNJyZaoj~S zHGTO(xSEcS;ftYbmsWB#0xGX79Q)>RR+%+_*Y=&4E~$xlun=(iX~))zUik-bB&~j% zDob(Xo>JtOX$f{2Vr@@zx->NFPro`^@W3VJ*a90D>w{9-wAK-kBeTGf(IcjCY&bqr z{DQVQ?+t1p@(;;VmomIEpJ>c}u+r~3c)>8VeE+h#=Fg4z;91GgskA^n@K*S_wgC$q za`lLbh%wZvDM8HJGV&2-i?@2?-Iaj}uAM{}E7$pgWt{RNIMbkRNGb-ls zv%&gBB1_bxoHI~04h{}M;0$qy^vEnsn>7UkB?@pA4SCjaSI-hYs+W%ehzUQ`H<4)L zF4sZp7SC@}Am*OH>_2g#ox_eoB0hX4FT0Sk#ik?;vdRrUKTYj<7+}pUXNHOC9f5%z z8a6k)Wl;gRt*(#rZZ9*jDc$<)$_?o+1u0kmlhLa@{#7A#QAn4y(5uUp*Cv85OS%972$%weOnyV@DO6|c+ zLS1)w2N1?v?)om4mXsuvf|`$8he93^-Hr~xH_lN6msvm?G?bpM|NNIdOTbOAp}qsD zS)9e1iI>lA7&)omROP#x_?5LvJhe{u<()PHHoY(NCFZ#=*gab;${M)kD8-S$1X+lU zEyS7!J`GzAf3SBKk0UM0N{T*{2t>B;CYH3lLrx8+W}mUS*|nNDK6An3<(}NZSm8P` zQ*H;}FQlL4_J@b+V|HV)l`mCmA5$cVq7mo2h7_bzllVDf_!0U}hT~X_Ge-?h%oC78 zYj;J=Hv-=zF<=881CFo_$2}@f;vU{LH&1q2xm%EBB?gge;o4nSTe}mVd%bC&cl9ln zPGY-wPS~>)M9rL$i4{NBQR1<$EL~r`3cS}PY|uU*&b#)v2k`-0o?KfoIgfexT@!>i zG&Q6vkdRt#;nJ6rN|dL1n7o_;9P5GCaD{6V9i_ci3%iK|U z#FzA9{ae@W1}TZ8^%*DWJk<|oFdW9#D!a+~&;9g^MEg6JT}j=AHx|<$OFt-8vz$|< z`8sNjO=ERuyR`~7RYayg2W!CHo~~JRzdgaWeP?6IN08J$VMY^s-HJjMOzBNhW>v7T z^N`N=AcefQC2oXELrGFyQ3Q-rgOpj3PsJ;kmSA8Tf?;{OOLcuvFMY5gEZ4Hse6rQ% z3>Uq6rFB31vA)F5hf9{^HpkBJ^EbVps>5$vAC%TlNX>d|vCyu&HF4cU2ZdEK5V{WA;!vf_ zaAdiuH5^{FKX6u~!(BjpuGa|Qq<8wnY!<_V6dgn92%1^v$O5_(<0zNpj(*yk|MqzD z+IAprgN7vxdma^Mq@PLle6RwU9@{Ld>-9kGFE_xQ==dbp22OoH=jzsya}O=Ft!o@_ zh$ZdiE~cW1pglS;oAjD`t!V%4)59{6DZs~FkAjWAxY`J|*`Q^e-+uaf=MEp5W#{NC zw$Q^zU*o6Lnfew3c;yJ<(SEK45(O)&F|e?#bT78K{EGneqHymoD8e zaXQ4qD{EEZm02a2R}FepIKME&P1?W5lAZh7wkYD*<2mV3nYjdsE-mYO?&;b?ucWuI zh=)hO9e&a(v7+s{C?{INN5XoEH1|DWRi?3K3Ua`4Ob;tWFZ+f$X3XO z6Qb0fm71t`M5n)wn&&e#W~6U z+Lm9&-N)~m6+1`R@4(7mJ{5dpTu_agl74{rW5WEb6a37T{#~>Vl{%$HwYb9bN8nyODn$K6RP`;YPz`0uY@XQWM?enA|v#-yOZ!8poFDo@(B?QX>AaI)NNw$)~?bGa6oH zQAm(mn}=Hz3h66qVnTI1e3#C3N-SBXkjR8}8!XXq=Q?lLDJ^wIL0HS$Z$gaI z&x*HVq*9uc1s*l#YI=aR@kZ&_R{d1J62r%l`;_)C|GLj`K2Xd&`MU5Q7(e&a1~{lB ziqTTbD}VdVD+dN^C<4ulVWh}jxT^U#L=E|al|sEO8*5CjSV{x->i&3;GuqQr$OB`p z`06en7G-NamBKKclnYk`unfTe%Xp)-G>%=)-PU?8l>F{=S|R`!8f#6iHgrcwG^|a% z61TNU7e(~tqv|Tx<~L&r5rN~C#d>1jON&na3>j+QcD|>Jy<)fcYgOpa=dr)?ddf&H z#iciG>DkOz6NJcdnOun~i5YRhq-_$&tg)(UCHEL$h~|P>e{kSx(`ySPs^_JMF++$= zW&Pqcr+HsYPdlv<$)#SypHGjY5fU;rBQr(beeRrc->i~Q?Zmh1C9w)x zo559?24A#R|G=d#KsCx(wqME*On>O6>f_ zNn+OM+Ajaqhn`D>!Sp$=6?DaByw~K6pk{C%F~lacYu^03`AyyTxJu{K6_nNE88zQl z=CWv%?38UjG4uAoSbHeZ)M z{?L)gQ-|9PBF3?fh)d5&ovHEf%Drn;4&%{{CZ%dH83+F7MCq3*y&y?Mv+6 zJ7mFZDdy=}xJq0N?W<3vsJaJRGZMgoztPh&Z@mZN_dQhc%$ooi%zS`%h)sxMA8c{3 zobm-I1{}59LZH%wYnv}^ZGJo2Gb*;lV>dyv_iJtayaGY&+dE@(o`mZykCKmw)HcMn zMa55u7*C>GYip~d{HAvg+`iwd=uvIVY#CV5EVq5KoGCtC0fyl5=-xLrk=uo-$D-5u zv73vir+)6P`L?^n+xZq4;pqu~NMD)D6Hrom^H~xQQ_-;Nv7n?qNT?3Z(Z-K3k1#?|RF_IvgC)rRp;hx5 zSh`EXvjQRk3gORzC>ZArMW!LHQi|P<eT+3kQV!;wK@5s@epjoP{tX|vmyOp3UOYr-@6>D zW)paVe!7r-oJgM1!Z9{r#RAWcU&Hr` zk-iUSnVVoj^AFn$_&#>f^yFZy`ai73H>Y05XR{4?N9GmuJn4ma@Q8wj*g|em3zw9AQ;l*A z6K=B+gu?rfB0UJB(#XV(b&Tj58R^bW%lSs)%!ZY9VJLI)9=Zn+x?$a77AU+kMXcJ3 z|AT9_3Y{uq@enaq=VDJbbA08B@Grej4Pw79>vG*DA5A}Xlan5rk?mN|%zhMmVd-{+ z)b`0sH(L-#GRCZfI^|YfgC?FVEm3_hBV0o^$0RVp-3u%eySuCk%f7N6uQy;n3W;~S zs7sM=diso3^??CB(qY?DSn6`2ed47fzGQ5%{u{SH^J>${Pzhb!y%oASlFW5BBGTD+PfJcjNpGx8qZ zn3k>@%L-QE_1(YOcbjcU$hJ;DMxvTgBi`#WXU*Z8_zquMxD3(F^yOwhNJG`vU%Lsn zs(H|qvcZ9$Svg*1&oxRzfs;r>I-+k);tto(-TF0PyM#n;k5~T(5=5q0duCUmEVYN& zes1MKR9!tiJz*RzN(!zBu2NXaLHs9)15xG z?gxd3bjuLphJ0BS^?vchdUe$VwkZLh|9AuOfP+rA!Q{;&`g)ptHWA;*-E69{)*Mjj zZ_etN;4h6vt3A(@5z-;tyV+!X=p>5jnbrsS;vmJjTITGG^;y4eezA|%)rPHq+<~0D z@V$VA{Cq6R*-_XD(rDS0xqLMp&JS|;lAaFqZ7r>2I(!7Jf4=Qw=_3JZ@3x-O`}2Kn z9CPyT?QeBC2A1s^T!!GpR>n4cqnqj9A^u-{-c)@xoLBkYf0pwWx^MnA+OanuEywbJ z7NEq65;0i#cI7b^T_kY1OU=R8dbW+B!^-OT>%);vNzx*T6|#<}#aJn;o1%r^JIdgAPb zySA(sHzE19BT$p|oaZvG`A)*trN^DzJSsP;_ndz>zGTgT+dFbo!8ayL;IXUs<$XzO z1FjWCeHvvV4g?sv`plMXXLsIBe6EK$Z<0$-9==RFFWDMZ%XMzHG#zFjXk#=Bj)VOq zXh@z@EAog>RY1$L;}iL?o@JNB9?G!)yH~ECyxr2_D|zr953ywbd2bH7sB)lBaZ@SR zg@y<3^N;v|dA~U?+d`3%9xjzPX=S+Q>-ae)KLwkl$HQQ!*VQxP>mf}hxa*h?GhfY- z%h)VM((2WKZzPjph7+pq)`fzK1&X$G^3q&w74?v4!< z)#k*jSCu5jto;n4ocnrVk@S!6PESlSOp?x_?pIQ0FRzWY^+-9>oumcwP{Hp%7;yU$ zju@O2*Guzf$PA>!oykrQx_{nv#OQTYI<=Zrk}^jSX0v}A04cbk6o8y-znHcMP=1H3yk+lrj)Wuw~4kG`a>uk z>)Y=~g1mv;LamLWS>kstBlVMo!}$$G3ii!@B-;LZQ6nR}c89PHJyrhu;VJYv$Az|? z!C(tK8JiVkCjvo&ol3r<*d(6oSfbj3Svh>kPP7|O*`$HU_vI@yidtNWrU_25+!yYwS#AY`^ z1)NUE&@Xbje;TFn@O;CR-BxE#;_E+dvdUR({dxRkv@)cxFVE^`8V?Lh`ee?bwDgg* zH2%JDsoNWQZ3A68ffEUAJRX}h;I@Ky7EI-{X=T*R55L1FNsZuCE+YF-H+k5Ph!~#R zz7j9xFnDHd9kbalhE5B3OHPB<5Kx3$b;fCmAup^#2t8GHvn=U2=Z&oGo(zh`f_J+X zSuh=LHqW_~K_7;rlAeqS6n%Nxhv_inpX!-ChCCE~Kz8gH_LQ^(+*!`w16SuY>6|)I zb{tu_Y(Ajuv*5NwZ(_IWjvOPk8Ptv88d{jv*AG;Hv>l&WZv2wyT{-zg+nzG7JSpE= zU^H>{rFemd48AT|GI=9~s4}=Y)e)lH^&@HnJXzx4ZN`lR<$}f{D~%Kw5ZZUE|ldm5N>(yVCx!4-`q41QPQ3OEed$Y&FUWa$Vi#3Lkr;+AjHtC%}z z!y!Q#$O+?-vYMzD!%J2ecK+4}A-IX<8d+{zSsAew!_$ET1D1Jgn-5E#QGPyt_T!4s zhYw{^7w%T1^sPu{X*+Iu#;{EUNJ~jwu0!Yfo8CuSKztA66+Dv~6EKkmHU5%)Kt@(& zwf?$d!+2tfQS-UGP*LhBwP4agI zJDt3Ar#VJck;JXrHzWHe?i4!8F@2--zRqm_d#Zjd=O=SMapO&hH7uEd&(O=;Nh6=8 zgrZ{50m32LTFJ{llm1_CieL0~h*Rfm>!v1cTlVX@lA*8lj`C^)l#R3M?-NIaop$TAq3$%Tg8-vvpxFqfrrM$ zSMGC)tkqsG|093<&tN~oyZgaqDhBiqtpI2e93=^zHIxT_%<#X|y?!wCcK=~LLh4Hs zp?`HXJGFy#wl7`~L=KRTmSfAs@{6_X@SbV~WK-#>emJ*qAFdQK z0Yv)=zQb^n1W~g)s%HN0>-G+M3>4W*-5pWW)Y95(`9_dFRs?p|IqMBTCy0JsDyv;ej%&qkt}I(qU=(CUC=Sqv3GYcC|Qbc2A^ zIp^rq+h2`@-t!9x;2^k4|6-4utkGluZ4OuJ%?)E!>y)JJ)o%f5wZHW=;P=@9@|}Oa z?XL>Mue{~=t2d(8M{OBstzlprF>$wJuT3AJn7L*>v&m=9hBboV6P3D@)KPfz5$kb* zFc!81P)6@?Ujw8`(DIRxshhr-F zQCt$+K+n4>tIQfCzIE4U_w@VLu>cE1z+_%S^MLjnkY+@k+h2!TWgPh!FeKf2;d5}+ z!l!+2o6hf?>p>(Eu7r&`ro)X@fC3sAg#=y}x!wdRsapmT{!+yS>nojH z-~K?-_G>>ol?4lUY~pFLUWPwn>5s+q9~1M*jn}oGZCF*TP^|$r<{gMoq;b1TDU#W1 ztDmA(J`tMgPDVfMwSVXgx^u_u6E9bD2h1E!Ab)p~!QIJGHz2Y{IF$K^=>RRXwVVR$6*I2+*x1Fh`q!5w{&E3>P`J@n9ICEIiMF zVy@r4pw!&I|J~=ybs||uqSY)dU+w2r8B{3-K>DD`qV|G?($I1m)pY!9=>WnXk0hFG5s!j{B5Lo47=Wii#~K4xk)5*r4)NG0$29*eR_uyW$te4K;2q$! zYXMaBGl2=ir3H(i-V=ZIvr^+j0ou>Fb^YO;2hU1vAF|cB(h&M1+ugtCa>CbAmjXmj zRsKu~amY+06gp(IK3lTyK4JACyyq?%Ov18nNYH1vFFQTh92je`cN7?|g? zDMNv7s8)uR49BXayCTOyVkL7uZlk0O*wf&j+)=cx*3i(<1gIt<*Xd!QF;lu%qfpsC z7t$#OY3VLhTEys~_VgFPQKVlS6*;y4f4q-vp)rTfE-sj;Tld8m54{bMYggzcXC_*^ zVEkbyGWv1vb?Pk~umrFNy#}gSAbW{X`FINnV3aceVgj$oZ>Us)jXp*EPW|*5KbYKMNR{X=z6d8ji4Ro zUkE@VKdQL>zk8Da{?E>xVCq1vE7j&3M|$hF~onypQ$5Cm00 z5N;R4N&_duoK38tpa-vv_IDnephXRf7rA3BkgmeVf#0W30wUrO?#MFm88ClW*If9- z@&COaJXebd$C}R|#;CK$Fy<2oWPX#QRkp7B?Ytem(Dj@itoTmx=|_X>TJgdSz`n(G zB*!TADmOF^bZuAT38vl#p+1r@2P~grvUF3l0O;(du>e}0YhZ$VvwE;w(RvHnKWLWd zd=`P9rPkn}KGtHVP6bx-q{5Z~=j$+Qx(vN{#I)|X`*3wC>l>Nzp84!>U?-GkfhwD7 zFAOWyN_zDBUh!vS{>Fch-5T|oz;|$IN9EKd#v#wpe@E==4|W{NI(`SqJ90-Fo z5iB~@_&eJDwamy0`6#Z1*LC5zUoiKuoRE;_Y;PW<4##Slo|fj0@Q^uoz?GAe6ZRsi zgP8mX)zQ&WeXCEbjckOu+e@on{Cb>J4e84-JxK*i&)Y}75(J+P_s6ADNsrWS?4Gu; ztcxD1gl2amEsD<`Xpn6Dpyq)(N5{Xj!RPCT?=a69cawfA*?)lLbmun@%!zVwPg$Js?J`30l!(>K(xfO1s zQt$1VOH!v>6r29Af9ad#e0jU2qz(Z>CK@GV;I_VHE59t(}qD zu{};B!j=k?ecfBg!rY6PJ=C`@Uq$I)fO@7(;c{3?chA zV^@|T%M6A*U$+eR>fY!110Fw(dCh$0e9!kR@9+7%&-pZ%%QONEuJ7oD6%ESKS>=77 z&so|>|Jo7Q19XkPy_^)2auOF{CVBx4-;ZfdlFDk3DN4I$3E+Ol_2+m?LxRQv48+NSbvvlK1FoD8cG)(Jtebu$I(U$ z!yB&)Gbv=J!1@H$5wmQ}6~GQBtEnR4#F}{dybhex7$MGr!w4z-dWp-(NY!uXuDiFKrsenGNoko9%Z1;X7Rdu1O=C_5|h_Adnr^O~NWd)2i zJ#HmOaf6cEDj=PhGz0kks*8@UbK8a#0Sc}gUeT>SwJjJG4S^k?zq)x)SWGiRFw*7X zxAk(3au>xWOhWQ$z6tx(HJO*HikFECoRGN1-@N}Y*R=#6mt(1A0?l_ zZrCN-ykHYudWL;NRwIDogJ?sE<*?9@VSwyk>{rX4rBxZF+N`qPpv#|)AN6aW(AyPF(?W)3N2ku87 zCfRyz6d~C1hvN{28gCsRnYIJa9b;q^ULnpm9>|hEiX1JHmPDXX9F8S zH7Hg|i*|ZJrre+U92U!u6wfhJI304!-f53+zl(*aAXX32> z6eW>9;2)jdHd(#_pbYkAgV8Nu+i<83t33retT=wqcezaRy?EvIK62{y7p}h9lF&2OIEpb-wM6pq`;nkE39}wsT8r`rp05h6)~E31 zp9^7qlD~NNd(W}V)n-wACvlW)1~(CsvLBTQflZ(pcH!~0G~GLqB}Qc*^GnoF7xE$V zt1^Ht-3N1=xx3hWw%t z72XJ~Sl?aeQGK^usQ3w1tA?Tt|9Ut;+$rRy@r{khU9{u1@5k3K!h)aybzQtgynBXMeWPNBHp z5$AK%g@-^jwfpRR>&%E#*o}Wa$pR5vrN40noVZg5w_4X)flTtp%#!MA{sT4W_luT6ZV zY<#r`in^sWd=k**4XtQjYL3`;J}4`9>->l14>O`tb2L3AQm0*lHH*uTz9i6XiKFoT zLDZDEX2XDCoqu71az+!liikCPRme@OH7N@+pR+~zFhgdgNdn&U)1<&{>J7-DhoQeoTiRFc(HvP zzkPYsY7rkDJ?eh^(6}lPlpozRol*s{+r?T*~Jrus4g)+y6SSl)71%mv<+#BOO@fvL5k%0L^qAdN{!bR)Nwg^i_+Bz%bqYLdZTDLkzEz zPf0YKx)S&Vu#a}`VZs2@9zDhgK-Xz4YuOFxi`p-wxtL#umn^z`JD$YNN`cuNhPJZJ zvv>xX#csBg`;T2lUiA|3HS<)t|Iwp59=W{BGK2xkDA9_e{KU)nSTE9aJ@vW`Ghi%I zN1ekRcr?qkCSrd^ql(MjPM;45QTP^Qz))d)jK$~V+O#1=$FXDF+xIzVi}WNslfps0 z1=NeW52^=Qn$6K0n)l?4ZX^j*s@u!uyE!+Y?*jch8AVKVA*gTUo7zLumCKd5RrLMo z?=W~PTVaEMAm!tY9oRF~3>;h)xF7TI3EsQT$D$~Jb><##Rcg1U`;g8An-DLkcOPtX znM?G&z|yje)%NZ$wtQLljJyXau*K_Jolk%01i!&L8YDY z+6HNx8iDiV^wm@P%S(mXlqZB(_)no({%1TKRe)i9+YSN?krSCtl&xpkJ~hP!{kk&{4C{FZbL` zw$ldY@&WBt-&X6HE$wrpVm`;?BiWua$Gv*>>LN>0Qj#FRJo#tsE=FeG@2kzf(b&bx zfQblG@VsiM>(_*8)gRU@vINrAlUS^GW4L;P!juC|Bu47Pupx+4?{3br1f&ve6Wiwy`nc3Kh9 z;!_6SI?_u>9$E~vpa-kA=XAdtJSi<`?96jN_N*yNLwNQSo$)YN5-hEY(+BQ>m|;Je?NyBAZYQei%?o3E(m|n&h;cbJmz3yMfA!F z_EUihJ8;0Dtt_$U#B6Gl30yhiZa=m}>y^1?N%g{^Hi)ETE;VuN5}q2z>w$g8pbzjP zTNfb+1z0^XpI=?~aqTedEp&j4?|87^j(x_^`1lqjMoicu2lhG!kH1 z^j7#j&j**pj0(S2@&@`2WaGwVq5&E>&GFW|*dm>PyK^mJ(`$M0MNLC2pa1=!2O<|%TrPmsQNWC90c zAbBX{i-}A4Ylp1<+^iibJL+nvB&Dh`kW71(cKEPV!K9)7CyAT6#)%=AOs3Zb#+NJ8 zKP_o{*(vM|p1=(fjBL~n{dG-P>fZ8EArleM}Ki;fHtJ4oEOm8RSy-`W% zIVk2qY-8TXOD6&q^OYRc%7?wK+H6m$f{x1Q*v~BF$9vitipp^g^v>^qHePL8fFxg{m-U?^f51Z4*w&@$7t<>F z=PUsKhwu%Kk>{-)t1LEozYOtJH8m}&4U%=^eji$n2549}?!I|5jSY14RR;m6&AY~w ze{T@_9*PxxxO?CZ$sPHze0}P6%E})+eQ&Io-~-mGHsOF%Fb`fUYMF?re~y!QGZ){} zlVHkSFkKZMpB?76t4yI7QJRq|Tjk#8u&-DJ#&T#l3Iib&DB-6rGTO3bp87 zrmGtt&x2BS+W4uD8$Yu1Q2K$f)bs0$qpoyYRsdB3O9F~yH7VUaxMz;rr}_& z{r3S$hh6HgI{l}A|Mk&e6!6LS3jCrwCma6cr~eW{$PjP_%M+D568(4uJ;!=oT|GKH zJUqiIDk|x)yV+%mpuj1HL7ASgj*i!sg-o>ZD}8^M(}1Wn*B^ zJp;YfvyzN!qO-?aehVIC*aRK zpe0QoDPQME`Yn)gw`GFW0n>u}6%BCgF|G5^Kc7wEY%U?yJB7dMz?|;^%-j4TS#5gM z2w7p))>zi0*qHN+Kc2@Hi7j*Qb@BA^r})d+r5%CjI?CoRe$^?yi!y!K=HuF^*`2^A z)1G>vdm2TruKZ^3VD8#^fOlFwfmOF2%@wJfs=E4Y3g}Grx*lrvys0966ErJYgJW#` z;A5A5xA0m2Z$7~QH9D4=SEj#t0cpEA`u8%}@F^gl50f>jPwc+3zf5$V{XBB|16p=g zaJ3Gnf8C;ew!9MP=~3NySRo)RjQ!~N$9*8C;jZ55EEK7ObQcq>l?cKM0neYu{U+zt zZ&|%5ReKU>f{748IeNXk6ypE%NyLi+LB6hxZjaN&IH|}k(KLk9p!1d6W~6w3xmNe^ z5mbcR6UIU_3S`_O>JDf)SMzY6%Bop;f2hH3;lNse+UNaB1~~Vqoepdtd10dS$)^ne zd;KcqC3u?}uaZN@(t$p_&Jml*l9?fWgNX{4k+j+ca?*0;0lVVL4az1Ox?6y(rUv}OA*;gmmY48(Ui}p|JajsFz3&y2A0OU|XBH zS6fZ-0q=GRlvqH;83!^a&zB9x+#h+J*jff@ywT7P@MQ-H=+=&l3H?6L!rS%ujbb7I$JSN(RYf+E;@Vk0E&iPg?m4j6mKw;g<79YjFj6OZ=^EZt`GG59v&!B;#5@o4b%M2+|xkYXUJs-(VXO#yi2 zdWkG-wDhm1f$hlOa1CgQc{6F``u9`8w(fdlC?@n+fK7aa%%D6nckluWkKfa`@7`fC z)38VxLZaxV5!|rAppbuqVkY=Cw)TO~Vn3ppO=N7{O)I)vP@^=oQ#7@rtVeIM#%;Au z`aG&+iP)=|8?aKHot>+CMM7by4___pwLxY~!J}-DXDJ>zX6qg0uoZo;OS8(=*^Sjv z1SyKN?ccIxgAQMVpRwebvvc9ez{BL343`J9N=}PisXBGe^UiOF{{Dc8MJlS@EzmtT zx^mR1olvc#8EFEHolu%9s4L9LnMDk{WqRGYvfE3A*g?F~_o6RU9GYRcGB|%uz+)I_ zXwvzVvUgUGlJSuCBa7PO#Y>kGh78DU3N#L#V*hAkRs($gWyhG|PMY|aSBk(mx^HoZ zF6Ql!Tlb{iAD|&j2T09AQnFlo;>Zr1|A7qD0A!Lw*W&Q+aCAGXzXS|dL`^edyDauE zVggnX69s^X)AepYsYh&^)Q^;zAq3PNpXx+g?Qw=5A!X-Ba)8Q_iQ0S$*Z&HPg#KTp z|F6>jiW|3cI3|?!w=HLDC!fs#R<6zL2+(Lh@3+eDPRhd)2*xGW< z+B(?U+Iq~ZqKI0?-i->WX1~G!N_uB680~V#a#`Vn%NLTYg^xZzt2{`ott~34M#0bd zvD}{0=x&Qw(oih_wb@#&knLMs+{HwyHK<~Pn%=4QapiIL|K{HZ3l!_pP*)-b{>fXjZlTAuI;3>oaaW}P@;3smZ$ z^PH`S8h;?Ss{s*yW-y-r=8Ky;)jIU-OpVudb#+(p7rpkf0Cpk{m?Km1>eUeYiaB&P zM}KEI7eVjw(`cZf!(!ZpEv=+AH0(WA(m~tb?1rOc)7ntR%KYNZ5d1Mwny&7pC3jWn zpoqL#t@!Y8jp18-^@NF?ZPA}y&pN&2(XgYEUpz~!jf6O;wE+vy4`E_k?ivETW<_+i+=-T%KKdW=q046g literal 0 HcmV?d00001 diff --git a/docs/my-website/img/a2a_trace_grouping.png b/docs/my-website/img/a2a_trace_grouping.png new file mode 100644 index 0000000000000000000000000000000000000000..05130420aaec27f7e13beeec76c73877069f3491 GIT binary patch literal 396967 zcmZsD1y~%();16V1PD%Whmerqn!!SFC%C%?_rZOD5Ineh2=4Cg?l8E^;5q|8yL3*iBt52PhQ>Uxnde4L^$cev3B}RpVgL^G0A)*KehwK9fhsc0}^n6A9drco4 z9K42wu&{!purQ^9gRQBBl?fc&yJ+Vqe(5d+JkaW_6zmJ>cYhQlz$+Cg;zphs>XLaX zo>;>f^n1M&hsN%VD9 zI;pFZsy*H7a4JlEJn{TWuVT9R`JK>5$l{L+0sG{8O67*~krQB?Zm)U;OE+mx_PX-2^?B*JU`n35dS zl*a*uPK5xmX1Es&rcsn{qI2agc%NGJqKnJ@lMBmN-^C!{1S zDf#@ZWaMCCV&iCT>!fRz8~R+-yoIv5le(-7z{u8`$-vmw(1ZzSZTE)=93K$yoU}G^ zGN1%nTiG}Qfc(^d-T`<{|8bd_n)1(EoGkgN)nyeZg>4;7D7lzem{_Ox! zn!gJ9yBrY{MXm0%OYz9)@S_W4KFJoGf>kyXD26~mQ3?%wSA;6@~~SeW$% z^phn^SgM{Si|$KcIZkJI%GTLNUNi7cO1H(G5nMC1(!Ue%_7ygDU?4itmoLGcSD^b$ zlPZ=cn$Kr*PwH&+|D_3~6475;n7tptxaXgp_g5Mm)-H`N1Q7sQAx@h|cS#4@8E~{= zWxE?i)y@6Z6m+}RCKtSlTDl>ZynKg^=wHq*{O~Zqj)|`zoMai8NX*8govSeS-s z^jO{jDMC*_2nCAomOXBjPryFZtU2Ni?nLtGEi4GG_2nJ%{s9tXY(EQjAyvCnKSII} z|4=#_Oov!zssGc&1RKom%}Y0Rx;cO8)<-MtVEi6}dAV<-NdMJMW7*e@lmIwM7?b z;^IL4o7x~Uh{O1*>HKb{Po%o=e+fm)cZ;KZc@bHDzIhQM_@=7{$jwLiN9rN5bla$b{zMy@-)AMOnu(-R4wp~da}VWIMd6onC$NcwTp|kS70C3Tk90NK9p>pFbQ(5 z&uti%KCJxGoi$+kzozX^=y%NPGE|9gxz!yy<#5$zDKN{VyUcUmL-0NqIN=||F0M*3 zg;W!uR;C-PR4_Ie6qc|(Gn8h=5kyeT>xi0x~}5$??%Bwm9tud*N$R{*4&#=J^Ub%SC3L ze6%A(0UcNUx$y1Se_Q$AiDo+AYsh(=<;olH)%5o}q^W3-)ioBB+u?=_?@8KBqqXIB zJRd43xq#>NrG{rTLmtc;Xa?&ZP;%JnuW-Fao{qrON%zqWF6&w41>mezjS0kxH);zy z{N!71?x_z69!Zsq!DnP(uS<;%M}CZzjuebdh_scs7s1ZeT>q(9WB958c#=vhl{{?% zyV*wx>I#mOn8*&It#v_s8E+6Vx85Z_@X6~ogU^lHV$zeU#oZaR_@I0lQvz;1W&P|> ztLqa_!nHkidEhE49h$`K4-0|PFtqNXLfr>?b_w&_ac@6$v^RgwLJC3nCmhceI?nS| zjko(zv)19KOTV-T5(?r+6XeCJAzN%Zc2eaIGnyJzE-ifSmlEe&1MlNLs9a83`1Z4X zP%VisQhSQ6wwRQ-bI79;`!Qyf06g2EOXBv4CY=%SSSI}wY zHj(xzn2Q;D#1kz0!?Wa@8>h`z7)s_rhL+ANN*|{8*%h1B4c;r4`v$%y=_S>x^^Ajp zo8yL)I7KJ(ogd}6jCQOVykQ_l!Q$>P0=3pM_0b`L46bpE)HeMJ$#bKe``Yv4v5po| zWYLZ8&|Isem>q>GLCseHd#7EZCg;Oij>o*D(EI63 zU2BWEYx&rkqDIZ_rYa{WQ==os)W6nae_Ae(&bRjT6*s?kOZt98kYlvC0)fxhKCQYF zo+iY)>-FXKW;q}<8#;AQu2*R2cGt4N44EcLZ+{};QI2QQqSEtD+G$CXdph7&z@Yea zkViVSd0VGPk^+0wNKfz=7zaI@^S3t4=ncJ|g#K7@DLH2!%)9*T0u0g^m!a!HzwS6^ zc~4ekYWnzq`{Ap7L0NJcBAUptj0Dpr*T&}R60N#{z*n(!UiZu|RG?&^9DWpQRLKp- zeaNAqz>&J#o6w%+&%^}+o5#hD-Ydxr{(Mg-ljv$o)%tF)JcNinUt|`mCcXuD_Jv8O zvDi==kN-{AqV=S1tEWcK@wC`{9a*`SPys&T-R1t2WOoSmaRgAu>vYX;A5k)fwqif3 zT=0HtKU#_273bD*t1aK|$9O|9w7qONiCOugM*SQ4m^-^!dOsWU?g#BwEiv z6MW?Zu^fx73#`7~Bq&rEt$K0T!VX1YD<|+q+Z`ddD(x3c53^o!m4=D64U}3J(S8X$ zee^zdb1=C%yXjsZDC(O84wrkZ@3mUL^G&;+$|SM%Z_o`HUnZVaDo1M3 zWa(_59WAiGS8A=)*SCK5_9n-Tui1_=qS-7u&GA*jcto8cVEzV|5l4(-Gh)Re_i*=0 z%_U(ylR@)Nzi?7c)yIP=VdCks<4aFhR~vAp3NdV2nMtpedZEgsBD78IGVMCWQF6cpO5l~yJ;<$O63f?mCY^(%Ur{hiq{7# zdLT@at@A~4KHxiHkUNZ=f3{-;%Y5@7)zll`$E#8AbmOvUM=f;AR2)#vWlmH2-F_;?ZEHt zFk02(#GRyz&>Y^ec@F#(wPJNf9YD>Lhu+}N!{4P~eq8Wz-4m000_fqNYlvog-y3&N z7R=HdMhy;WBq+pIqsBeWc&7HtuAKGO^Z@(hZ&`XRbA!|X#}ZHfMmThxUiyIRSWfA; zWV8+a)ka5Cjet1;>(3=QX=v+pu6ko!RXK3zRB!q;pBA*QDR^#mXKst0DEG4hB!>1V z!BHsihuzRBKKccpD4lqhLl*;Ae(Hf^i&(lFlJy&@L>4vy11XERJzg3psL4%2N+*L# zb`&F4Y*(xw(uX9`CQY)PLdHuM!A-fsw9G`+Ez!LqX4YGzW=mh%+gwBlAK82M{3xo9 zH3`f7dSGt8XR}nh0=&vLLfloS>8{{&+$qLpV7-3~reKgdS^l(LRK}KMwT2pbc>`Ik zGx1Oq2YR5U)av9zuMW8f&o=2(UFx%@5bmrNt2J28SK?qdt3HZNE?!A&CXF)F5mCvU zhl#yyFgN7O4%_iH`a<272&?(>iN`2(LKcaGX^VF`;*mASkd>wkr^8vL*@ONo%|*Wo zlOe7pR!ftCm~F)pP3w-zZ!?;U<2oi}m5fwJF2{?)2Qv>}rx;@~$Qt+DX<9H7WRr2} z<)p%iosF-L8rZ~nn-tn;Y{gWcy@D)_vmdf@%7&D6hKCYb1cE^3hPhX zaNkP#NC?(}!{!bnb50RCzk4zGL*KAq_OBNQdxIb-ztrj3s5aTn37_lrL&9m8hvRL( zJu@?=>fJ32;C>Xi-00N@ji)Ms*%D8teR7m*Uj(1*L9hTby3N4%eGwTP(uei(V?A*n zo{}!f0fgQ3U9hI?w1lU^gqNd28Z3~LJLX2C>& z#p2x)Xpl5mfTaHgpFYt0bZK)?o1dmMqG>Rr?+>Gt@(zH<23I zyz9-z@_o&a@qYHFO1Ca4rQL|MRWT}uxW4<>DJFdpI&7xXtCjj-nT1-n5|MCX716C% zx=d(Kk0%4=wI4taIgNyKmEQ@-m%H7L{xcc+*YHr8_q5Z_-;J zTLyU*dgMHI5>g4U4xoL$MEdY!6cn6Y(_nkb2X3?oCpvo_ITOB^@5r${l-6|JOoOO5 zcWAMCBLB(WD&v^lYY^Bs)v^LoXwz5{S&e&VI>}?%`3P>V=?=eWAhJLCNW-URzT1H| z4_-F;<`YpPaJbrF*le{c!##$Uo|X$(b2%ONDW)|IH6yy&EEX%PL{A^P<}1growr-> z9H?8}s)$K~AfM2r8@LV^JZ%4#ac!k^6%HT&j=X+Klm3;5>4+^X zLtTSMSTiC#JhHiw!OkRCZ?kH69aH;atT$g)xk>SJd-RRasNvvoE=7}P#2}C_ZS79c zmu#7amd150mV4ff%;{b~I2%F0Forj^Rj=~*y7v}qa<&HJx;PL>xU4>Yaxlh4iP+Qc z`1J!7e^7ELzAc5CiumbT%Mr%rk$8*%&?MO~yE;(Wn$z={9Ut{FIh;MNJy20v#|4cW zZeIF*)yN^;}Ih(rI+!zS5{4uj(>Ant#P+It=t9d>xjP_Cl#Zj%EE-^gy)I6JKcHM zQM}jWX=@0!VE1P1`Tizq`vc#usCuP-veVI|mRLkOEwgTGRQnAL4s*u^zg49`S9M8V>LP0ADz4vN6yh=UJ zhuqR#y*~YEO|Epx{R)aT4sJ;tCh@6!jlzbWZ&pGIIS)AEr577QAw#Y`XhVt70kkrE z@J%xMz@OQX+SC-nIh-h>?F1fQg0i++)80dwOuej!Z+-uBb z%00yh(Ew!9S!8g&A?s8LE)JNnW)D3*9+;+Yave8GbCLOhc2RW|O{56w+^U6@OO^A| zk5*h2z67FEiK1?Ee?{_sDyf(*(V1DG11=B{jzuM)+6DXp)Cy1`cyQ8|_-FuL?*?L0 zcekHHB=%!^M%-h5649o+Gm?L0UU+^+4&1AR<$C53n_hC^WQMc&T;mOtSO+#8OlUT0 za5&nJp4i;}TRZoBH5BNl2EBNq8)Pyfxzz;0kh02Dday$(#ALAJq``KM2@!3~z&AAXQe(Ft8;TNUy7MOJ%skTr` zam6V@&xo(bKsmZPoKZC34E?Cl2u<5!HydGHZzdScpwnr*_T0V2ZF$NYRK=;b&<`=K z0d`oy`?w~y#;&K3sp2slYP`w`DDMiwq@T!X36~3k7ODF1ekL?wPUM}E=CLO~)$eTKG|d~XEt+X}|a>XNa+yS6t`MYEuUM9l8F z1L^E#)fOvXG%W-Jk&5=`c-D0wh>X`KUb{ykJxFqZ2Te4?A03yoQQNUw4qagTkuSayxHPSA&nKWx_a zkfT{AqNa`4t;1fEzk>fo&uVT*-s0ZUsA^82MTbqV#C`Ydc~v|{f@w7Lz~i`6<{4Kf zA3BjP!aMt&(l{@zO+OmS>yZvsDD*V53J`7C`Ht_-eh*psSG~=33>(s|;-3 zb|B2*d8>e1OBgO(yg8L0?ty?yJci|?^n1QmyG#0Ne@chsVd4itrOH6-J={v8vvkme zjhKR5Do@r~Y7iwFrcp><`AU;(N-)*46HeAcrGa9QaD90R&QE5_F`i3@X`D?8HMd`g=nzQRK6fd#T)8RU$l1zx39TF5MOdr@H zigu}55w9jt`X_iAQKjNW$8-QHP_#ebg&A!%^g4*^{cF^~anxWKi%++|T!eXi1C z$CrhL*%atG0}q!J*$5k-KY19|{h;9N4(XOx&h5Sff|0KwCpo8Ko{LU8tF!^kYW}shNCq5yJWh{S4nPZ&2yT6ufgZI&ryu2~UkV)a_T;9zN zLfh--9>e}RnjYq}`;mjZE%?SZri%W?+#I6F=5a!;r5o|#v_FmCF?GRf=ay-IqNao~ z6xI^t+h%v>;AP|9KZ6!*GFflHW;Dz9y3KxGTX_56HLYVlx`Sq!{a6I27!(2p`7w5J ze+co7;&pXta5%~QK{zYVd-aA`-k#KE;dks=1h_#|gCUakKE+LgKW3$(9SB-3B={2; zY7eHwBFu565&uD%P^K3P(%~J7TxsktYgt7#7IcA7j|$M3jh*9Sh{Pvmcdm9ex{aUkv9cwnu94 zd`!GNo)LAwBFfY)et;@dq#~{tgD@C+nnlYk=gKU%(#}ln7{1JP0$da@)sBt(^(2th zVYgwPYK__0G9SG3MoELkKZ;ln@tzLE(%+|V6P*xJC-b`LlhaOjB{LITAXD(WYY!H& zAPILlod4WctdXMIqziQm=la$EP2=2Ha^#@)xT#pj^hD1}{VUJgBD)_BE=6jm@!>@y z?UStlg=zYsD5^AUZ?Y*$P29z=SUZdX`rkkKk@1^TIWTE(^aT!xB{yFA-~=l7HZfU^ zuNlOAvLwF)*cwR2y^SpatG0p}mn_Y2^7Hp|U+AR~fmIf3Ak;HOD%aFvO9ee%otc5w zDRXuYpkLrHkT-g#CEKO=dcxRm+(^==hk%5PS_`G3cZ^c)&{=!P zz3G;Dk#|F(TZ0AkvA7SOF4Pfjy#v(k<0Y{TTs-hgJs`$2C0jC8h@53B)+@j-Z5ztz zqcbp_^~NsYiyw+W(ktwZKq(M>BqLJ6Mm2Bi^PEpT1&!43%{|yL#OW_RTy3KrOr#}w zy}(#smS0cqm!P$y#Abf zTQxUuwFKT|qU)F{b?xtvsmnMaOoM%mbWkK?uhdsHdHN!aG z_UIPSA5)4-BW2+K8d}jH!WWBvKoFKWMk5wqiZFOT+q(wayiV@!Aw8HuGG* z0VT}c$nG4;yq;W?&mXiu_eC5J|GIm|TobYHD~$SLgo)h;z>|3oid}?i+)XYJFin;6 zS3&!YpZlpiUiZbcvdQWP&juP{EAq_9FH?}S{($n6}wjwYL7f3`ai#OTEtZ8aBBkJE#iQTN6aT%pPatJ!7+n!FUGNouvd-JQnHAT>eeJKcSo86I9KgaY+>KR10!p;8V z4Xxj)hh>}|5c!|yk0s_9podA6og7;S?=owD`{Ja<8$&CXn_hEQJmMOEeZy7!`1Yd~ z$CMKW`P{1d(9p(ZlH+|-9vPUpm)JyfE<(d|Ee&Ig!3-49pyzF)&zEwB-WRr{#G6$o zaqnbd+?8)VS*yY>na)@EsYWY-i_QKV-E4tp#f+bxVuQ#*6aM56PJ^F($miePlEX8g zX^Gb%_gGP?Uvdo9)7#$_G@~-0yQo%V4x;B`4xm0z?{q!i_H;xb7d%V1`b%(iGcOJ%xe!i8kUgk ze26J#sdbEMnNbrM^~%vosXb*LV47#WdM!_*VAv#Ew9{*Op4iIU;tm_6?RY>CsU_jI z9gGx&F{p6FOcib-59{lPL|r3cV>lAqD)tfvy|y2#z)-zE;lJ;fCPP^%kw&(hP zdnD|Edjl8nc^nidWR;rzqTq0@C?~6EGtq0x3~Je25`A(T8XLp!p^AI%5h*t8kK9-V zpprrxj*hE(*e;fFJWmk>d&%3~ZV#zd$`vSfUKx^2gq`a65wK)qc4Qw;p6_w;f}uho z4(RTCPioA534+7;ecT1#pV!E5$=>07U3#b=v;SGva;H3ZMZAEN^KjPOfrJT_KA0;p zL6UE}XIf0?aQ@GB?CmtlJX+f|xHX=j9463K{yqzqE1gin21)V$wAwaW(XE5h9&bRF zUG6-*IF|Q>`?>qQc;u?sVtn9Ta6yHN(aR zCjL%-X5#erbLR1ENi4ShR{`Q;LP>u2OCGHWl-=u%px`qQOjDfQ=y9cF@#}bvC4KD9 zV$ETG^ec$2I_zFB*>1@BV47_S3`@!icjHi8*9Zgd=s&|WQuvSG6C-?|K~f8^bRuT+ zBBl00v`&B+rx7A=bIHWIFNkaQm@)3Vule{Q2_Kqbo|J{lI(f%bmT1`O_RVSvafMfO zFL$5zAXfRhpYPc7Fbi+gkdWl=-Gav@T9yUZU8>zqFmB-nL7{A z-J%^0!9``4sUNC>lqBGm3$;B(d9P8Myw7)c*Vj0?5$W1x-0rcqx`5VfCmsEKn5+83dFpYM;K|Yz3P9z%$&}e>G~kM) zC{t1CJKiYs(>HZ>Y4dK<%#d;;B5(q2AO_oXA(sA2w5>R))dcQCI+e@I_f{2>TfGz^ z*>S(8r*9Uk0J|sXDfBGe1PWI7C0 zL;gV)6LU}#GL}izg-9LG>!z-&lB;TZF+K^Pg6<;!n;a$@q@73V=x!ax?wwRg4hze3DcGkXM3YNW`D zAcTlo)uJrzGhh}%rVO!$3hwHZkJ81?Af0;PL|{FL+f>H7Xbr%+MquE!uJd}#HqgPP zSm_NJE!tU~NzwJ&#jnq6Q`zopGy>)%&zrrU!bBX!w>6e?#>HYR-xS&+k~(*@$$fGm zL$@{tC+kNGm5G<;f(9(*CO}u+HiKBn-S6*r3a?AOfm{&>pVt|Q7YTK@QS5aZzF8Np z?wO^r8Mn34r*n#8z&rwFoy6;%Lb3_X^;@{FzK$I!Ff4ODjIgs|f$t0w9UI-G=4u{h;F+3pO#I=`fq}1Z=jBAZKce4*8lK&o+y?63 zTpPGoo`#6cxZaE%H(rQq&uH_$$GvIV_uQOXCFLq}@T_zSD~o~_br~I8TiI#YJ|)Eg zoKo|g7Iu~{a&ORGrOfbIn7bypHo!?M1p+Oc6fHF{xVZuX!Q!Seqxi}>RB@) z{KBvG04+k_+HBrF7JlVXCi>Hu)ld?uHJ3No6N_`!!?J)4C?ySx*0B+jWGbR9UY5a^ zGi>vI%dHy}o!BVj3d!D@!|D@%D?hC+Rzc$n4 zig|2>VgaBW?+A!KjAKwy%4#m4#6&UNyR_dPIm)xM`IQi`JH`cIiKUk|+%dDBUbChT z=Fj$j**b$UYCGcDL?b32Mc(pg29RJkkui%|PYN&qzW_P`*hAXsYiOp32mL6%pmbV* zhYPoXa$+MMxBX`aD-QDFd*bXS!gfwOSqH#USS=mcAOqIuMch{UP|#PV5)A($n5e^H zd(vlw&-S#uWbTyPktYYl*Znyvu4opuIbI(n!zzhW{Gzi#>GA<LfbK_;B%szGAg?aqkS+vfa*^*m-zRP-HZky0oFs!MDA(MCKYguv{y!17L2V@!@tgF>YOHmc;N!!^agJbyKI#4!qG zV*#hzUy@3)yQsZ=I$dy6hyeMs``09S0o7~;)>C(htmDJU{=I{Td2`Me#A+HLhAm1i**2(rT* zOA{=ch~+~bmCFF=(mdg@I(Im)8+lC~1 zBI^_b@DvX zvs$~5$B{R0mW(rfwC$@W-EMwp^c^RhOmjxNG?Teq6mMvw`}f?CzL3@SA~+t}0Q|$v zeM7|BS-|l)E?Zd;c-SnRjU@e4O59Hs{>ZMz@(f!AEIue)u2F!4&P7 zUekwPPa9b8(kYF=S?3h|hJVRfbyFUMYy)Y9jgYpf@>4;t$A$XLBZX3HQM$H1^Kh`r(gz!48n!D(R}$COUlh7uH7mzmI6&_O7KlGYf4n~;Ss*J&O+Z^o zSW6B3QJ6Jy#OL2adunPl_;bHkcm|-ID`9{yKSdIapZ+V1GjQg;b$j;33&Y<{pilO5 zmNX6S&S|*sMcFnD4o?~+5@^I#r%=*ajpFw&=kwOb#(8Rwz%3r z15G3PFPdm=%8&x}39veuncf-yQaJz2A2y!lxqq&5>~ww9-oqN$4dOnDl+`pR-01`) zZl=3ndAR6q05xGuZ)KAuk{>5#hwH*3ns$6#*vJ9Tq$P12ijlL1y#Jq*@NNVUJ=9c!MzR2cBA?k;X_xdj44v#fbeiTQgP(BR`c~LyyY~Fd}A8^ zzCciFT$k6MtfxX8l&tmiiFX0|7A<|P%xE7dEJLB?Hf=gNi3%uj2pM*wFZ zj%?Cy`D&F@zwIf%IN*&qUiNxdAECT5dX#3RaYNFZUYzQ+61215X&9|gO`7fDaqN!7 zV8W~)1}9taWn*mHMTuX*KDAJtH;2B;go!GJ&=x#KMFmhKA>%WcrC>X|2q@`85^9LY z`r#z_blz0x_<^5-`Yj(1cI}(=wmlJ)EbJ_na?7X305M>Xrv~BYJ+&@AIiKIiHqSi9 zaKeQ`X-xKa)ed>zbt{ji^O}enBFu`_Al~^jG;ysrh9VEpmtiA6Nyrvq7D!bt`?J!k zYPkDN_TQM@=56((NOu@(>+Cn_Up1T0mFi}XO%aHRILj!Ni1CN!M@xvIQy3yGu6s@w z=8Li27k>4^e_uBgLDuxVAMMSi(Pa2duXWQs%m2<~cs|sBe2Px`&79dmGX{vPi?VutuuTdQF1t3`OM48Z!vd+C8ymZXETU60&7g~7-C!NhhML%PyyUSs59&d6kH%kmZvAQ|Rd*)hRQKRIHYioZ%db zX32(K9MYbE$r$aRtdaAY+6o=}?i-|?6?Rh$095GKO3k^4GSuMd2ghob6(Er~O>@ch zB!&jrr2)zW!0VI!$4jy?N<9uxhwSDRUh1KKY|ScZvQlA8kMUG~2{G$lxqN|Flo8~^ zy=I&UUe3`1o8<#nipAK`e1kauH~zH#Vh$k#3%7aAPG&y4LvZt_2X5|?NWse)0N@}>ZTbq=O@7~x@*4x9MzyPg2nmKv>UB~M2@&( zUQabS?PmJ1bb+7RL@^R~o^EtLV7}TrJstQ8fIXMh=^~tXfPmwU3`M5 z)r8w#2#84-qvXfFl~u7_kn5eQw_Eo=-;BJnc3bD+^D_JPj@#2tu0Zbi$7z_z>9|gv zO%Nl$>KZv7?J8P1^9uo3)h9<)^t9%=1)7fedpah-ajj>myr5sO`Gyu zPBS+Vo?qv8hm*3hhh%AHlhfoL@!l&+XyCD>_Y>~h=w;N~ZyrGVjFi_JjYg{pI-etA zvUP`6Q!d6e0wYi%KMbDt3SWH1Fu=GVVEPcYBO4cStVv8&5&yjziyZe?Ca;qM1O9Rd2?+lAM7$RLh4*|$jNHr zd1vx1iOV9ed-4H;*+pDfVxvd1&J8V|FmgS9g!2;Y*HsDe-A#3f*caS#`TVM_9tpTO zTl`REJfb1d#VbB(7h~ew-BzIXD&nck$8{hBV%Z_std}cAh0>w39t_|y=3_LKC8H69 zO)5J0XmvtOy)K;P_Gb%gK1Hn3J1H+7jYP&>@$TMgx8r&~bKzqymJHADXDpAqWeRlx zUe*P?T9VP!g=f{U%`uF(!}Cd_f3Y14er7hDPN23F?)-UUY(J!I40`~ z$L^e4`%Ug>Yuol+GmbPSp-mRMxrnrBTvfJ{&aj}Xs_t+&N|O%*M0vxGor)gaOw#Z=uBpEONl-}5dN6k0n;?Q}AQ zJXb7R#pinNn_wL%EKqG*v^>?%cCCa*iQVj5AV+MC^v-RM<3lv3dxQz0U5&?sdqdF+ z9-6>N{YlL}Xr;&{>F@<=09H_>32txrw4EHC$%Mbgxnr#9TT)gL7U0P2xa$V_3Lq(0 z)`?{+iG4TMtgLOgtqfRalSf`Z>zM^awu?jVUOt>FOMz^K0;$A8gpZny&Hi9aJvOBXKiC z^)lRDy=!WU+q9)=EfsWin1~|#gigWuVp@qe=(}s8-axWyr__=Ha$T*(+<*w~mxdgU z*I-^O2e-l8iplx`TgA%Dn|xx6nH-OUEql|I0>O7fU@QPJlDyW3A5})lr|VrwT*T@8 zLu+YaPBn*Iihh9NpUi5Sfa(iRAIF~Q!LEf$kGTlbHH1#Pn<@D2`bZQt*w`w{Ch4H( z4wQFh*j~HE)NAS!0;_9xxzJnQ;q9>UfpDL1r=!|6D@`se*h!SRG$I`7+{3%j?F5Td zm7dzM8Q6K@AM`DDGnp7M;>u@=s_aM;3sP~d+EJjk~7bmUE-W=$lzSnA|_8Od~0BVDImT8}FGkP3-=`&Z1rOKuA2;IZ!FH z9)L)-cx43snr{~6Eg;%lUNanzcqYxRVB2?Fn$%o5bP_`bFe=;QEC39j-H; z$}=NL7R3mq`#JK%Y$xtG=VBBo{#d|HrdLLT5?|^~RHs`NvO1?tApt5N3mY(2xqH9l zcjp=QW`McpJ5WIB7;ydb)5V*CXjn=MG~J(dm^r;PV(ewDy$|*ySf>ltnTh@YPZqJ; zSwt|VVvOIAMifD_)x0A+v~q0 zc3KoxRhlg$*IMAykWkJJidLemWqCwIAZy#uDya0TV#1{k* zy3;{)bm4BgW?ms$R}M89vZ*E8O>YBl-P2kTi-%2h@dakRR)@QY6CimaxY26~h|Bvu zCBovk?irc7-uG&X=oka`o}%C9>k7neVu)v?vqH{YRMfWI)N&9s3_6Z4?5}jH<%j+O zrlUk4mV%oh1&{7++C?)+C$m*;p_F?GeCOUNT7YV6o5gS7mf$Y|c2;_Vo=}-=aeG0< z61@XcABdRONe?`wB5g+W|{PnBqB>ZPOC>-cl8sC z`!<)KSM7<*Im~RbkWpnff%BSOK%6v4FSkO(0QiFDTa-`YSPPfU&!~?o4BU!$J~*BW zP-)_>bpElxC;|7(s0<2t>E-`PNvv$KIz=cxGt@qm>ku_iA-sSgjr zM24IThy z+N(Am(8Z~JU({&aGw*`M=NJS3(7{`2I1r(i@5Skwxk4F;w+B%@`PU+qdYe1ZK=OoH z8R(|Ox9R~)br&3g_ue1$5~?v-xcdyj)NLn^uCBD%Cb&LkU4`vg&McfY*e%yi-c>t^ zmpkLTug=(K4EC`GMxHE}l*uFsECs$7-;)gF3FhVv|1&&zjS;?i*BeFn{pe~4pR|0D zlKjE}hfDLDhni#Cj7V4`FR7P%@6q!fzU#Be?aSPXl9#rIU2of^{UeCE-3-ATcTFi* zL16RF<9wPZL*9<(`=eE=<@Tl>PrvosDHIVq#IDc6tAtMIsU(T2m~@M^0Gx!~v+|Uw=Nw8fc-MJU1EU;Ds_#DT|EV zKD0YjttU}ite50-1dAaUqxxeDATrdqWzDi=iMb*Ivw86J40CL?+~A8F@0V*M!$Tk= zA?#tf%k9_4zUt+-&$s{g0hC@7c7M!Pt`1l)ud#k$(r9pRk^AZ>_V_U7_${@r=DhI@ z_sMQ=^s7$hoxz?p{*Z96hQcXSbY*AI@UAuLFw?lg&l@`@aC*m@>9V_rW?6o+D(}JRs_h z|7r8{=%C;sn9Fy*;HuWAz3gL#6TbDz>V%}YIAyY!W&MZm@mG*NR_d$FZS%!w3ZCyj z>9!hiL>OyNP_ygbKs37&*-&2O3s!45*Tp}66)63Gl)ZIWT+6aP90(8y1ef3ef;$9v zNFaD{cMI+=gG12Z!QI`R0YZSF!JWZf26y4Pi%&#d)7I@lE~++%03F&4LtDQLB$Piphp+CUq* z;^$a*AS&&s0Id9mOWEk1&AMhcH%2q@StK5P$vTtG3v$1&e(Idz|I)vI)%L%X|GFRP zeFVB{h5(4{ic|pkQZ3A~vwkIo=#?m~sOY+z9hdg^@T8+J;I0Qvp@!Ruvn!+4+%}Sb z8K=LV_4hA`hHyC&ku787~pQWW5PQ6&DQ*HAE+5D zx-415+F3QBsBkO0-cjF(-^|r2lHCXdZ8VMYubK6CY~+9V?hD2O_#%!!CX@ZE>iq)+ z{O>>Uas$W_g!mm3KmJc;`k!;=AM_NDa=vSoU<#Apae)80_}^~+?K*T7kp2U7NQ32z^Ri~6o*^+QBKUgI z^IkOeM>Ga@$q4U1Whd;5CH#aQaV!KAl>-0QWjG9gbc5)<4P5DeBM$jDVI7P4t{va~ zT5taU65ro{h5r6GV?@s7KlQ(A)Sox_U6Bc&TzT)DX#ej@_{UEW$>C@o5n>3tEdJ`+ z|MI2t4js^R!E-mJ|LXt)vH~bM`Xlu@{+$ElKVMn#272yI>cOA%UxxVa!~Oere?*ut zu*imZ6~X^ix==wlQSj(b;1$9v7nU(0(V0Kv%t%g$)`I}DlL5Uh0I{mr9fZV)(H#`i zkMUhH6#X$pfSuxho7=yM)i2r~ShS+oI1!dVw0T`fRV;bXkckCgDZ16bW^i2NM#^b}?c!9Ut&!j8MVuizytCqGU&&!{^vRe6{WBgA|<|o&h9(0pm ztj3WFdc4i;lZk&Ti79zglkaaQtHJT7dPDVKJ1{|bOxg^!W}^u&&`6}Z1CicJ#nU+4 zUnBjN5QNRBsZOU-q93ULR8H=QTmpyg&m%q=O4{ZzMj-)E%aDTD){Yyj7fhDsolm{< z!(!P?2GB-Q;s2WnhU51m`!3#pv~-telfGBud?yFQR9X&}8X;7VHjrj5V3$hsTbhVE zt5K6q_5~rQ^a835rNtzT_`UO@3m*j+rf&OfrqyDbtYW?lQ!;p9rx*W-`sDBe(%~$j z*|^UT^l~fr+A?IW^6E1HopdQm1gta2cL$@pcAc?sHdUoS&!$P!ajuPxFQ{8#_&=CF3X) zj=_~XZ0Vr4I}5Fqiyht)M~lrA-nW;R(G1Bi{)5`WnZu@X+HzdnZS60Lv}BYKA;Dq$ z8Gd*v3DMP|bgdw2APLVO!NlnMTY*x3MQQ`QE6@kh-mJ+F@9hLXXtRR-S& z00I`1+wzfY3W;a<_vfKH3OMv`9qVh%4rY)TApyhA$M-%r2JN-Sc2sx8I zS)6u+y#>i7hf^*n&BuGhXZswDZRIls6M!eDvaHR5?k=s}A2i<<#3@A3V41uK)S39j z8$S7cDZ%?fr2viUacek9Es;UD1X7zdw$ko>)sZFu(s*q38PpHEbC;1!eCyW}I^zCK zM}Ui8?$4FGEB#qFe8cgi&XJJYo9K5D%K%V|GDaNEp{|I4tjIIz^7N4F@#)b4$i(2W z->cK^@cMv0!0eFsF_ys`Q!3`e6Kef3(QyH z(~S{YZ%>!%i&qP%4ne;gt4?`1(H2Kseg|gVHipfCgcI`n`OH)@F*)>Z#ywKr-_n;gxM-&i3gJSjoydKZhzWZGJ!70M{ytwr_^|JU@Df|UQ{yaNZL`J zh+WWOqX>YDjUM#s2Z%?eyp~t%bAoA42W(QY8o1){ECE&AH)ygs^6)B&MuR-7)Nl|y zcMSeHz8RjceN)rm?N?u8G-{B{;vHi(-yxqNaK%DeW<(k__LsR7w1GwUkxrzcJ6x!X zcQBEXtSeF&=506>qKYiIu;ugKD(k>2XIn+ZqLzBgQ)80w8!^oZ7PU!Nj)}vE?3q!yCtGuGMtJNZq6%7jy|ZTOQ}kOqH4+N-KTUdPKca&{;bGVOW z?Bg4tjp{`&KfurU-AgA`l0S`{5N#O9{SuOhPXAhiQ!3fkQ#@R#+&tj0166RGE!=M$ zaW!kUxZqW)1md|V+e<3#bSlNx<9w(09S)4OPviN6OyNMjT=E9vb$YYSV&=fqUW#AD zCG{h_VZ;Wr_COx(t&aO#{wmo1sdUOpUwW&gqKINdB=lJD0YPdWg=eFdTQc8xjudVb zaj4MKn7%&}#|_r?_$KKF$U#v1o^Z^uKYKi+`+aabvVHPnPL;y<7lRqZgn5o3oHa&$ zHa8VAl-Kxfo@z6F08_$Y?OtjkY2F;A*p z{T{J?W8&WFNmYE z&Bfl7@$R^Z!v+-Nree}HRtO|`q3Odon8cVA@B($$Sub%mvoCRyfUaG;xn^MPaONnR zvxL)jnf%2i>DN-V3aL}1|(Cr%3I1 ziIgdA<|WTu3X4&7nKoFAEnk{)Ea!cqbLv(9yliW}<6tl*pQ#hI8Qfw;>lMlC=vrTT zKc3%w1j0}SvhlR z^Dj(o%_j<`LB|8L$1fB2t>;~1fFzMNr7K(TPm1;yR{EgiX+Kq)oQf1G!6h>9|u z0#G2uGd`r3>3}7tcMC<@H9Ll>`tw0-mYIQar1ITKa?J7t$1z`7VVU;&0a}KQ{;~Db zAYRo@OmpM+?**GdPaQqsgldMpp$3<^kaC%u5(mY*5{IpR)8!a+0+00q#v1!!#YTSG zN&vq)a9jM76q9RY+uyaceV$q?*M;H>F?~VcOB|`1qJW-hYrc&cQ_#y>Uq|CX^6~|j z#A@4&)G@k^9})OUg3-i-lk8IQ9}6n!q>M+mi#5(T*(`?O)`?<;j%RAz_fa+4P20ab z(-1Fw9muuAbrVh)k~tux{IxHdWH5(vF!HmptmyDHrPaWdkjj2uMztd-m%Gb*q$N2 z_eP1BbzR9K;%k~X*NcA5A?IT|Hhqq7`ZG;ZE|Z7agie`tqH|7S#pwrnj5~Bld&=+a z=#)7{+;SoPULO3&l5!C-pF>gfRe#5_V7b_ePDOS`EiV#GfW`NL4$TfLd z%2$pk@LD!gu)Th;Aux$XkR?+LK^pa;k5991ht2bn$b4qR@jSCun{-!t z=@{G?AN*>6_w4J4M(mqfwBE6pf_MX%l?Rxmz(E~Z$%{N_EKnQ&Xv z=(B{dE40FVW_WjfVq{*i8%4@zL&-XN0j@Qbz93M^H=vM@@p`z8bU4^yJ!3;WaZTrx zlix*t*qtcc-1ri=WrB(?oTpoBS}v2qrXYAXRQuiGyl9N=!wXsU2J>~Qxf+wwG(Jz& z3_))ysFRDtz4!e_aT%md>*dxk6Azo`a_V{^zXVEwTyjrnSGMwsUadjlu5e@#^Vqw8 z9H#x`qdWaSNW-VQ!WbZ4M2I*=bu$l$^1%_$0K|FYu6ecoa=e)+7&6l(vs&54Fb^AC zlE;>l*<0xdgTdvV`G&=?rlbfB=>nh+ITqWS+tq?+v710T!sb9d;ps}3k>u+q$3y<} zgM06D^+NXMr%!x>LhRc)KI@)-N8pcsYPHvjeH%gV zmFe*U%@sJfdy&JT4}gxq087=@;#L^i;gUu7-HV=0ib-~qZsz&1O5KjwL0%TVwC``o z&sn`urb{-D#eLfg1EM+@KWU3UvVU^e9IANQdjE+!stI=5uD4V88aP&^IEO}#)kVJ` z$4Bs6YW7yU!^Cv&f}wtOeoW?6%5GV{`8Zbgh3EYJ9iDER7g>x`2?93~H{bUCO*k*S zHa~N~cKRma>pT8S-Podsfs~xgN&)jkc|4+6mSilcKq)=R&?1-_QZ}PK?&5{2FUe<( z5;K<#JRq_?v1{v@f*>b1tXS8T6;PgY>&Pj%>wBJS^oUKa|1&PorSb$=E8jyPxlz9w zAEnys#L7`uzOW#Z+Fwxl0!hCAtR-nm&!_ct&=n zXao&&4C1{$!O`tN_k8+1H{B*=$b!%#9UA=n?uu<&Hj_t!({_$(`<+yl>x?aC%gKwJ z&pa1&y-oqrxI=8m;YX9DQk%#5S9;F@>NgY46W6g=lY$<)1o{>Rd`M(VeW~U9_vgRf@g{=v;-7>v#K;`{Y>pAp3Jh)yk<~ZYo;vO-gF?hZAO_#{0nu zu~g1<>9NNxc`~UV5*c)g177L5c}ABxE@^bTzv!;4MgIjw=(UGvN)hXaL7tZOP9j7o z{?JsvD+=H&LL@MPu2XydnGk*xqxmkAZcg%d*F8kAsE!a)MAN0o}5!3Gnh0-3Mr zylnJh!RMz-u0Mv4(rz6zKL%A1^SQKBJZf&wF+;Ar?%JA;Ql9BDJYIpjsM4;Yi22Up zStAw!gtunhXX~v;1T5YbXprgP1IBr6)DjaW#$ur>Mufs>S zH-5%?oLtvevhtSN6YXk$0Yk~f`Yzd9MM@PYBx1py^;N?cZs$Eb_$-DgS#bo3bnb@c zOLd8X6E{~R7O91!zkbpkS$q@n-VT_$S>>ZmV-B&JDQ2M>(I&T7zHj%s2v#orB-25k zCQ&e~Lnf_eixdB9FyltrT=B}&TOQS;>v#G~0BM!? z%kPmsX@or~^1_#G=ma?$JhJ405A#kjFOzrNd^L`)_=4_kP6)E>y9x&5ev#4Vw`7TSk0h~C1u52Ks zo-m@%u(lvFAMzC3k98sbgMSG9`Rc1%u*mm3%h8Ut?B}JiRFVwgTf@H|F)F?B1w60f zoC!GxZ>Pei?y4$-nRJ-|Z+ZeU9uxkm<>P_5IGlLVP8c0Qjy#ea&C~vjl0^x%gZ{#q z^|p+gncIC>pEOeT19w%Z5QxH{BZ9ut`B!IcLf_^Xgpkr9m7KJ#B{Tw7I)N?d%YeVL zv@)b3+sWHV$V+c|%Q>1yo$N7@Nn??!$EfOAkDkmGLcr`om5(*W)~)i0jq{pcm#2H& zrJe>tH6E!9BuO~BtDt1Yf#^bzNt*@irI#I{tiY_FiISZ=vwvn{n+YOWpb9h+3e*b} z3{E;Pa2|}5V7P2mVn!?qMW~YgPC)U_bFs-jf|_Nd^1j_{iPve*0NFe8p$dSertT_Q z6bHNzY!XLo+DR27Sria@@!AFx*X=NY>(@~2+J*xl{)TQ9i zsH$HT%W>uWutrE@gi6PMo(PvSeYMt(lk^HyDu>h=i^X4H}G4<`SNuX$U0{wCQoA08UNa4-yRb-#e*x5 zORu01!AeaM3tWsUOE(`(EN96M2Xd3&03<(N)FCMNzEWng`A(xWX z^xW|@kxpk^wH`2`{Tsztlo2nN?a%Rp@})CJw4VSzhs`376LRA-fWLOAnofnjw9uBL zHbX$dWt|7~)aC70bP#tPjy`fY-{`%Lp)IV}JNRt`Akk$`Xh&?^5MRK3L>$ z_73xnTSDI_v)blQD#l!ezWi>WoOQUA{pDnjn9Dk5NViS(<>s(K$&1Rcpx0!3(Z^fQ8V2p^FKd}K6j+Jb)Aq9-!jOEPDaf3-lXll9BZLmrn_0DJl{e4 zV)?KA)rAEocb(Amqsi?0b3&H)El&H^f_AtT<4xIh zHgiKK*bAJZ3P$K5?IMVcZCTY2Os#4gW~LS;=E>|5k0(RB?zMdS4bKN_(I&UR*#-n& znH1jjbe>k$UpdBKa>VV*XNta@eEx6~g@ER!?sd`8*a+t`(P9ARbB-(`xnK!}T;gsI zH*g@1J$`H5w?h>}vCv;k^<`^`86N4?LmoZ7I=~}s8Y{vOXbtI@2u$z#49=5` z8{mBCTU=%tEoMhkq>p?M`V63C2STJFSe=U<;pZl(hGsxUKR%4ZY!yZUOp=&hR2u$P zM<@YDNu9-%sK>>vG{B;j^@@MgT_i0Zjqc82^O8={$Y%w*+D&M?Xw(-q_~3ap#kUb- z;KvJ|go*=>@psROs?s?uRT(14;tj4cmda#Flg!5pSi6}qSKB7d$G`m=MQnr<`}kRX zZ?f3Bo4LVp&#U`&IRB@1w9K1t^d1zG3&}zPCSqs1}K= ziCrDU7WdWZaA_UVs?o*l31s7i$TioRpvP9-VxH}cy%`pKm0~D&1>fxUow^^16yHKU%jDnd_XVV zXR0d4V3_j}`<^P*3wM~kj3&x0SI(j6-$5p7YA!=_$@j{TWG<|M2(I^;~@w@gbVf?DmkScgZeEVy_XZoIU70m)F6~xkP zxxoA7HLHJ8jaU%MrU_paXW6G!L|L773rZ~x=zUf+orsrwC4>|7Xw&wE^_Z&z6jw0x z71+5Vb;GDtC@;HYJV>Rg4o^vUR6H;pCVA4UYrOz~+O$T!vauEf<)#Z;DwsOo+gr6N zNjsRS5i28qjqZTYp-|{rOq=NsSa#o0I%H{jHq-B!DFmyHlIsXtjc_9}>8+QX0VH3U zyj$wj?=#zLeWTYr)~?@vw4*0@CtSUD#PnmSUfBM(5)7^(h94fev0Xm{e<21!Ga=H; z)y-)?-uNZUbJELSwR(Db+Aa?jSt62X?xIQ?<#LbDIBq|2;37>Pn#y)w@4rvzEFwB; zTXkN+mZ!t#^(w3BXHsU-(^qD6MuZ`I1Lxxbi%JVR$ydr1S4k1@B%$9F|MUg(N3pP9 z+uk6mYQ(1j8%T$e_er~_*%Ku|$QB>4)N-My7p79Gs;cJz1VOTJ=v9?kUCNa&7n>bv z=~vv(aL12{*wnB`qp)#u@?UmmqvG}@wBqmMmLB{7U9LTKO3AfMsuI*Q z{(g$4n7guxZ&n6r@sF~ShW-3*4`lte|@?&Mlm+!`v0 zfOIWxW#JT|tHQvBE-oKo!x6j6g)hXh&f&53f<5iej49; ze)n5{L-DKPccGSBDwHK6=8>E=6a?a zJ27I;D;l5D=^}Z1jk%kscF(SP+s$$J0;E|OYuqC1^?^(Mj?XY}hn@n(%=cjMyWmU#pztFc|WAyVFsyjp- z&c1!8(ogzyu8yYdXen}_LIc7OYp_Wt*kkEsD;!RfMw(5iQ6<>B_iOImHahNjzW0D^ zpGMXaEpEBMklbdtB$^Bf$LYKkOz9&b1uU0Lx#qp(6A{0R*=!t2JgDkfAMDkXfG3*r zv2SlnW{a+T5RgDGus-m-!9&njd(qhJ7#-a?9CRRSh8tLqHQpDvKsX| zYELH6!Mv<5kR`;5??P{aJDMsb98Tj20hXno(?3{?cv>H5H0!FQxSrI~bS^qEn|0g8 z(?FQ5gmSjE_c0WGlMHg@_Z&w?oD|rLpEScxujtLG9TWo;Z-Wjk!_=%^I#Mz(`e`{L zWqi?tt^T|_Q<=1UUf&yzHIG_R<8sKGe;xGUZY4WFrXrO-u`hlzpE}wTI8!LRF-a#kdCBVrMQ@Gn=sB`JIt!=kD=?UAH;cBI zVRj~4UL5h3*zNy$mbd=6C!(N(Hm=+5Lw|(Cfv$o4n+^I+$A2O+=x`6_5Q00qpOuDM z&e)C{_}KQXpc~#>_^r9VdXoDxq8r5GW-6~ge0Mbxpj>Go>7T>#PCjKYiJjt**Dfss z>{ZU-t02+0RZpXv_N|0Bm(ArN(Hon>1Djx~^3{h3^r%ZBeo1z`irRUrd$;P{+1)3v zHonZeW4b<_2#XSkg@NSn6aPLCu0pp}?uV2It?EcRe-ZX`ksyQaJoEddHFl;wj>q)J z#PwD*;zjv~DBFn+dh0s~6CK7!+@dS)5o&&!&we$oWB2$LYVhhRAde4tR0d*XBk^rbzGomr zYN2BXySo_*KYBGM46ekQltNud@`ZbP!WcBz=o&|Wl>Z#2r8}Ar^kp&t{zF))U|7}J zV&7JJ+tx|i8lV_Da3HwCNGz}u5HJ{bn&R?&7i=fCn3)k2X?!-MvWckCi74xnd+>OpD!(Xb>VdOh^Lw^GjB7K35z0 z1b5Sk?;&VY;Vh=-`I~M980}`8EBUt5WzF}ecwzdq`$gFFs)1Gds;_kkPI7Y0(D!(y z5*b9)^*N9%rLJYqw7f6+B>Xb%s2RYE zEuj0M3gvqzLilgk^Y0hBR7e2EgO3rfS!Kc?QpK5vhv%G(hW z1658o8=A%Lq7FEBkzbLpu?P=9(hip0G2|!Ro*th&@BK;+OQPw`Oy{aIco28$lE?I; zHp1?Y3%We%+%k(Eji=Z0i2Hy-$Ln^E^6(w`^i5^xpGy`D8PpMzMyD= z=jqaJ-82jg=<9eD83rfFKaPP~9#dKD4Ek1*ZQS5r_Nu+zDvrRhKOXjaqgi_3hvSq( z5Uss`lN2kTQ5SECMsbsa9hccp1RO}C*1&gSfJb6hi^*MgP zeMi@GEN#ZDt#T5uz*R~+pqIMwR^hibH0GJ1plX?7h~ncONAimWP`QRE^ce;=W+o$r zQsL?8V*Wm`$5C5N1!%3hAneRHP&`r+VyBKy?K=qrf?t>Qq9_;Fi(znUdfDb+Vh)l~NU155gvaY6h=9|9;o?w8nfSW^ z2WaG-3dswGbTGw$oZesnD!v56>&AD*31+_6U%7xtDjAGd28r*S*ot~l{%e4Ja{Qx5*H#GQ>4D?RM9&zCZ1b3RB< z;a`8axjU58(0s`NTM22ISU@ACJz{RaIq{pysMzkBn89Y%Ru3Z@D_k&2ub7!R7RYsD z1#1TGtovw;rn5&U)FLYnt;vEwDk(>h#!Qck^Av&R-Q!mUKhcUjM-H0n^dCj1P!^*p z5THP;V^W$?o8@V&N^r{dQ>I+)LedCv>#x3O(kW?f(_w=Z%vgX+Ed^{>!Mj{$j@;6D zG&QJ3BXP)Am)ra5DUY7tv({pYZnCC+Mw)-XX?HRqiik%lC>*;$(7TE$*3&u z012dszwea;I~&RLz0zkEdN~@Z-vqx-OgiT8ALa-K^QvWiG^f+4;ii;MRHijhtJIOF z2u6jf%uJQe#D@^X0u9v`;44zwG?W?UnM>!}kQ7|aAzy{s;L z_IN!0Dy2dHm4J7!h__TsX3BIZoA%+OF8xCbnA50hc}Cu)hBblgq{X0Z(YBi`Hp6QwOD{<1D<|y z^>%8yBz)i_qbq1OKGZHOyn?uz&MXtCS#y`@WUM+LNZOrPz_d~i z`td87v~CzSEv8PhUH2Z3mL*yy1~rMiSeb$2?g9u=>lU2LM7*GAb$ks0vKT1bh>QAq zRoDw|i56;S)Xr|L4}s;T;Z!>14?`M=0xM!zLn{UOYJc*4UYbS^(&ku*R|!$7>tB7Y znJ%_DHjUR1R$qAST*UT*ZTA~zm2o507W2f#-V6}WBN+n}camTLg3FjX(c%mmTjF!o zu-{Wr0}3^ncV<1-eeNP}aRay)@4HPrwiuF&wXT>7NLxHqGj#WTR)WT8MwZ#x#N7LS ziV$G;&bhg40;PO*PICL;)PA|2ZDrTw4;JU#-bY-_&IdbixsL}rJ#6Wi?E1I4I~u=j z>^Y$ouk)pyx2~r*|4VO$p>J4jqENNjkaEdHveYLyq z2)qU*8a}fKI(}{|&(JV0pH7YxNjfRg?Cx`Q^qdT#a;%%ur%nA`l_l1t)0t#DD0uy6 zh$avjlUPS+Fe|Nc#m*3D$S+$=2?83`n=0dfgEVu4FX{o8HQK24?RIv8x396&HLmhY(0MMZBe?GbuU;y zRRJ1@l|Bh?V5IH4pD4_t!=h>=bQkmx1H1uLJk&+zyYdm1X~hGF%jf%vxEaxO>(U?*l+52e=`4OEP#Ep@B15iE)icOsCrJ# zGoRzfFN+$I$R^hMFXMkQl_{ehV+NZ|H@ivrS3|n5R3GP$4SsF8-Ja7<6{*G<#khT9 zaKVpbHA09AxC$J};3-@K10|TE*EbnY4V*FS1Y+ld{yLRsy~)C9FVgzGo8$wKtSn~d zmoR^90nuT*(tT+_0e3jDk4S%A^OF^h2m8q??;&%-`M7K{Gxhw8EBw3xjd40&_MUL| z)9OB$t5s5SVFZ$RR(jT1Rha%}@VTggw|!Rs$J+p0b)LvSUMBkHH9GpHElU&PIQ(DN zR#Gt$W50nR=O}rsz{N7m{&-pnM%|WBBQzmXc&I?wYcg0$dudUF?>>EZ6>I)DEB0u-St#|0-PV*bxt|H~7}f_xo6?iQUZ z{iQO0_&NUTD}R4Z85a6xr88&jpNHH3)4LE^;ojd68Zsp~DgXa?m;P^KS6&-~{g*8N zvF!eL;RuJ4y%~U@I~M2V{-0X*XOH)R_F1M!=KU8*{l`a%qQEFT27i;LB*uaLk2m}= z5B^7+)v3|vJ!1duMNkUNCZFTEXg5si~z_C^es(zDT)qb z#+l^c;*bLr4Lw;aYhZMS#Mws3lXz9Sc~Mz;dMq&|)(lh&zeVSbXK#1E^IHbpzmK5^ z&i$1w3U7Fbs=WEW2eepGtJw{mpTn2%3iruygVw?!zt5oV;0em3IQ2r5RHKL9?d@Ek z-6uZi=F)&3Mr5S^RW^R;vYo>m;-N=iC*8k|X%r@OFprDIQ^@PK4BI1Wn)$|uANJFl z$2gwqv^(_eGqaa?RPlsYWFz`87TfYZ*;>zs(Yt! zFnGvU{bn68f?o04NM9d58hQ!3LC?Cz>-z-um>`rw<0f3`;S@8F_!~ak(9tT=JxG5^~u{yuZO9AO8hYSrz1 z9FNGdMNpvoB0lFcUP5ov0?t`KBNci2mkZSQpS_Q}KAG7XeSY>pn%Oz(9o%)}5q^5L z-NCha@Rx=A`&0iIgid++X9ENnWcrc5Cyy*PT7%4eAVFB(0_Ks$riZhb>zk3;YZ(@s zC$G0YBkZUZGun%SPia@VY4v{{3*W%~yLK+ap&zTgM^vZKZxf1Gm_EJRyavj0e!j}^ zj%PZwjTiLR1Y;+(b%pvWtXeLjitEHzz+u3wvv)Ne&TIj--^6DsA)kK4woqmR=JU4x z<%fE50shq?Wj{I8oesQmyP~B#~AfEtt zHuR*^^!^1J>4hV+TA8Kf{t!8C#=%?}k&Pk0j2~-3StWPtu|I^$@vF&|_%~WNeEOaG77Gn=npKSdp)+WHh4L8+ zwW^0IV;6)^1s|kUOAhgvbrnYipC784GuSRRXtBVVTzd|>q_DfjERo26dzb$BaGXO6 z2~}9%nf;rwhn2I4VuwZrG^pv8yQBNA*$A`!-&)!Akn>@h02jySN-Wjo30Y3=oRpIqhU z=JpFn>5-iy74pf6N=2QW^`$%sPh$4ogr1-00ri(}c%zav_q7khz8I^y5N>rn{T#3{$ z&t6GSGtXr!c8rG48+M9weT$kG4cfmT^qG-PdyA2P+DaPxroG6Tq> zSM2h?A==CNeb}5>;y@J!F**6gPrlix4bU@_J4$gBmkZBy&4xYntT;%6H?>Z)L!{|w zhCIM1S-_;@skGXi|2e-gBp>bQ=p4FAaocmX9L)qsNqPJB=;2P^yQFGQr@;z`QG-9p zLb-CSw353ae!@vm4}S>tdb3&oc#c@{bqX0G^eFng?KJN63jDNw$&yyCG4FgJSE&mw08+u}C~Zre z=5|)HDWv=~fe^Y>1|2)4%q=0{9O>E8KwT5518!0nsGFlP4?CaCc9d5!qarzXl1)pA zB5t(7K>qM~2|<=7d%<=ik^FfAom#^AN*BP>P3xycAeGL@Z=A z?@)3MAD&pUzWvlL{3SL&zuPK5E^(rEi{azL3)EcY#Y#9y#fh)0Mlv^;)bbLWvzriG ze8*zm>9U2a@rb9aj}1N9263uRQ7{_e$EE^g}?M$cm>POENBPts$V->hgVNgDdTf78UuF87#m1)2T(S407_m-KbCQ*FNAgoy=ak zyCN;RtkeTb0`wYeI3fhME_Wk36V@_1sS*%m9i7`8RNL{tI)207c)tBGmfN>?<3CEDq4ilTynY)ce!TY+2Tl0p`7yKBRb2() zfK*+`rC1n{tsm!cc_0I%VOP(aQ_sm%gn(k*tbfn?f<@zi` zf@C=^$GOF3Vf<`t`b;VbP0|wZIeT*NcmZ>QR>c2W>LisxLvh00knp8`9vRx{?T4+Q z}01^C&+_ zixI#?c{?~qN;Fnx7T$3&myjm%xgO>t^9xVsUJ1{)`A`b9Iewv2p{a6lqWlLJfEY!e z%%=-s4Q;TltcTqldAU}7;Cv0{-83V!nq^f3F=rlWqj!dA2x|FSb2ce`;z({WKf4|> zf-wLo$luH0bZ6kOneTnKlYOSXUZp?sPO2~9IeS4=p~!QO-GhydjXdm0fjg9(Ly#ki z{t@Z?=W8>1B@&c|H13*^3O#;V>gyL5FfN3DL_B|A6yXH?fG{~t&_J8}#1vn53)oBU zes8)Q&16)=x8!uAOf*P(oTCB#U0AzQ`W1-JMG5Hiluf1X^P&&Zm0t;MAszV^Q~QcX ziyw+C>RaMjm6%f4&HR|QEUilgXkJ)O*?bHNk1x=yf6OA{U$wqQtdz8wp3meqComaR z_-Zk2)p=AlSaRJss^{iT+vTZSu^6O0v{=KBQTcI<&FN-9MJcm4I#V>+ja>JF;DXjM zk^h}9^^8c%)s8eUEAyj|NQ*yLvlVFq;R=8KoI!vkHGF=!!x9$L@A0Kvz58U>#y{ z)fFJIM^vuE7xE15&BQg5(&zqPF&!4Z3p#n;%wI4lS|ni>>oih@cg4eivKjedo0G)M;?0jDplbCvspmp_*;KxG(kF@TTu5QMC zi}9|McZ%u^bemq@^r++^*`u-oI-pk5jQ zr$t2t`<}ljt}fL;e0k1MoOUyED%Hy!Gvzx}9a_&z*uA;v;|6%-q)*FUKc-w?WM~l1 z5+b}8s)eQpdFD7I%-_pch%6ET`|JN;g-x4^*Q4xjphy|J5DTn>&9g} zFC=C}fAZ4u)GZDZTM;soxNWnXvDurir%s?zi0F+XmW*+K)2nTVV%{In)_VPek_N6e zwnDdk%d%krNIah$zSxZmNs-Mm>-N5eifG`h!x%9Y?E`2>K~tgR?U+BKSO44wc3|2u zs;VDG=yGRPSzF&|l0zE`hQCPziC*j6ozLUDafG0#B!U*Ten1+jLJuMajdKY$HkHil zsAg5+P5I0tuJPyL>(p{eiIr78Km0`^1CiG0;dj5;#}#Xh`ZxuY{ zkH^&3vR~{^q;CyRMq?A4{us! z7O>&~Ia(WyITGGT5W!?=zDssi6i}Hx>_y>3^(9&eP`1^rYMcbd&WKOrTESsaTh zLNP=g{ydoAhPJoJd))2(?Y`$ zz77mGlO}g~B17_E9PRhh3*EA~NdhCFURrtKa(ip_#WCgWLhAnI)8U$@0f9=TYVzgL zoKzFlr*1SOd5**iGCHk#3*vm^59?7+)*F_M!9cNec`RyKwL^cKxiU{r_@)&^zs%RM=W(13(4YYCJd#Tr3utN6PXFVn_ZQs|OwI9Rxc*rH} zsc97+P%xSdVDsN>2S*$A5^IgZdyd+G*#dLi2IBDn0(Q#zT2J~AhMhr#>^t+5SR9Kr z2MV7NASXYL(^^}0f0`+mg+H5cz`(jX+()m)DF}#Ai?ZJ|zGLu}hf`G(QAN^$bu7Nk+RNeE`mxvqZjWICp8fZ zctm&@9&^blvrbEzj`@&+4GlDCvc=i4M7_E#Kp@8IuN~&^F0++ws$bPM-rc8+l(?#w?sEMu8O9x;bKKcKR^zrAaesi>#%k5ixHxh+F+=K@F9O$-wzyudmr$ zg7Yt5gWnqp-!GqEv)E1+Wmx3CqwhyA#8S2W)X_<7s{ROY3l>$T2wz&B8pCa-p|+Ya zFU{KH;o)(NA@>=+kFKElWTm z^kw1)c{S>DGO|GIca zvdANOtwsx}pRp|pij8mIeJQU*I}04R<%hwL!dZ0mzI7@5b^i!(PJb}*yF!CdPakC) zd`Bo^y`<;&!<5QPD(mNQzKyUTeE9~UvLd9T1?sec3u;$1C+es66JFcmh%Z+^} z)yIsVOr5t_I3fwAjrPy?9*IXKWMG0pv_v- z#_0X)qpvixz@Zp}3O-1r-$zNx@yIinEoQ{1PW1MGTc9{-Nf;y)bh$I|deL+01ecF6 zOOk7nv7OsQDqx7Ubb0dS`GH8&qpe`%aellVQM1kx(wt5FjpcUbsr&|-5ATUq1v2OH z*M0vXfw-K4eD?BaQHX~^FD0E*St1mL5jtb%;TD4rHt?bcRmweZ4d5=0%X+c(L}Ex1 zl>AcJTUd7TR8{p3q{w@`J1=DRyyQ6H1(QCtk zn$Lpoj`wj@pD^3IM1BHU2b*Knuv0hYoF}V~Gsk3-qcny@f(!LR5MAz985!+JDjl*n zfL%)JH6FHDp>BKRo+KvIntUIF{d$i${l?_*TSEHw$Mq|a&kqv|{+PuU7XZ>-N~!x8 z_xNg0MEp(?UP2GfbEx|XU`E;%3Wu?BYw9tNn&OpM=ki(-R2mI@0X+(bq#3b%ME|_A38d z;PcB0e?{x8pI{rb5kuVbekoDEqlR4*pNoq_aTQ9)wS$_mQ`nLJQ*XtqD((t6&KXk~AwfkJ$9Ec{ZU2_Y`kkU^S;@QdrZPUCb)pYRZWs zJ^#M<_j%-`4pwCbq6p3VRA@`)z_?4Bpa(j{qg9_Vr2rPBUnqGP|sos=p1CE}0*2S7So|S*H#^_=4i(_4W|aqfYStZ#0p+H=QX&02(|FWw*y^wqc}oyi zW?72}6~f+lULd7pd6*^3+r4gmy72Ym=gvlp1;B-cDQ$4DJz!ZjQw~n@`#_7al{gWRKe=ab!Kp_5C^q{)zeRCb)wwVLNLpZDX>Fb%DTs|EGaPrk4@mlpl-dSbTn zk0eNrfNo6LbJjPVkXIH(s(N=Ur|ukEPbUjJs-u3*&+PhH^SU~KqVxpyJ60SSZ(|G1 zpbTYH-B+UkBJ#J`z_iy*820uW!9HNL)@&(oO2348d$9fEou>vT-T~w4v(Amb=ENrz zL+i8~)Q8G3Q5;EwlfSAyN2-AhHmk&xb`hf??;r6#K+C>DSz^<;WHs0~-(qMpsnzRp zcCA00hK|zS&IO}#T^L!4v9s>};KvGiw}7$)cr5Y{PTs0v2-VIqSZcN;HIjUK`Me%| zKKp2ybNh6;M~dw0stx0LYiBu@?Y*r|umXhDRog=u(E6q+_@H)9i#0o%%?tOOP)h<7 zN7oqz{jD7>8lQ{p;a;%_fu*>RnE}6W%6K1J(f$I#q1R z`~#f9%RvP%tXKF`%u!ZUN0WnXO!e0ccK>`K4qPCDoJH}o;Ez+j_;akR4f>2``?1T( zeGnToGJd&kyPv@+!diS$++3ZERxi{s5?zx#vb9S;hx6iOi3!pEazTNDUY^h0#g5_` zs=uZ#i0{wSEQkx$=ox4v6%!k}`Agh=)s@h@3cfGZe>uG8XN}hfjjrMQv zXbdzb?k-*wVmJ4uA3V--1Lm&OL|9CV1|JFsTQV!Iyz3l=W35FC@Bj&kQf>fu9($sN zeds8kR@`a00UWJ05Yj6(ZO$qes*bN)?;0tg*+buFK5ZqHHz!Q|R)(U+q8H}fdX41n z?7nCb#ONB?>$5YH`=#j*S92bBL|2c=r!v@ z=~9}h^RU#4yFk=hJA(8&t)(-!uzA>;d->tt@CdVbreff@U6ByLl1XiSEhdH9QcJBP_PX+-q zq8}md&(27{-NXIOGKQs=b+tbq5c^5|aOe7PnaR6+tn^i1UnlM?bR0Z!5`*p)%eV3h z;&qEI9+wa_VYAyxzkM)<`IrR2I zWK8gN&x#2$WEt?2ja?scC7>bCO08B{i^tmj8U-KbHk19v@#j9~_M1*+KTr3oK3M@j z8^XVSXsmwKLS@_c|!~ zv3Iq}K{UkzZ}2x6bU9`1F2koop$(gKJ2cMAS;gKV>PBc^mP&a+e?g$kK9A%M4bUKn zX`{^)^Unrv;58m*%_qYLfpz_SsBzRh5dYh%o-MLUwH#Wv{S#BWBe|1k z1M-?Td59+3)hS~>pTWTt@SY;r+@`RO9ej$d8M;ie?(aEg>s}cGhO{SHM^%P>RJ}G~ ziNi$_(~x~8$L%3?=ag|_s(_uLG^=V?fu|EUa>R9;4PpG(aUz{qyz6G&Sw3jq#Gk#N zqemC+emfv}pT78f*YyN~*1p=Tf{n{{O)P#to~cjQG_6UzEoDqY>_0_&IzHm+-F?#{ z+wAhfOSVQtkIhZ5RG7`c7O{J{lQpzk4f7LKWjRrOIf zE^wzQ+Pw!&HnR_B9kEbhz@Db{%`x=gYJd%LLW$ppeOsnqlC|hu3noJnt57WhaRgP>-uzhNd zT2{iOO_uHDu^g`^m@d-(e(llEF%_!kv6n9aW~&W2fh1VWpHl^fuBrn#j#MreROwW1 zZ7Q;YDy+Cl?o37BGK1k>9S=&_!4ikk_<(a8=>ABSP`8KsCnQ623R&{(Cj1Rl!*3|> zXLbfuuKGwp>hzw+l8ok+89VwvAK5KtD z4(3do#wyND0@z|l`>;U0Qv$ObqKWODb+`altzr(6OVM8OH{tJ{F_E1`Y-lZ; z|3Wm|4is$eKlekd%1iSByJkV@+3#b`Srdp+z5WSDTsp;ExmJ^i`gXT6K$Ou*-267J zwj@2=UYG5N&udUB(ZAz8v5A9u@wVan=f3KGq~=m${2(xFOIX9FNN%h{o|Y#_rPyz1 z>Ol7c){H{p7An3T>&}8IlOkfFdwF4J4rGD>+sF?{HxF62?oxUTt-AbedL^@qzIlu?jDDre&KU;ry0l$NyuvH?$oSX%PE*3N=3zi2wLPG9+ zA!m(Xs~#?2d)L13f$M6CW|T^CyZr<0MN$C&x$azWb?~WD=vIb%a${F4w z5sCqWuHckm9AG|52$o`!Mq$(cHP#vLPvk3C=&bLu{p)o|M>*01@~-53wTa?`qB;~f z9b?S3==}0g(CvJ4yBW6dLEZRthp$!bWWFY;x`wO6e7YpnTzu5-68BL)D_=HEV75Yc zCxuI=#(`e9S&F52HaCeur?^e&+s!PUrW>Ld5FZ(Se|02#;z2_;#W-GE>#OtDvL?JgwQh3L}6^I9~eo8 zMa22VXWumexO?G@FSbSp`5LcF9tUE{K&V=L+-P&0vLE>WZWNz>NBi8c&$5bqILZ1V zU>PopH)oYHTVObuLe$?Te`Xui+Ix7?=uh*Z z!1^gu`nNrHUoZp=@E$t}l3umMB+;(^=h7(@G!KfqTSPZ7>D=x6#CaK*S^24GJj` z08=ciV(g)shG$kotI%wS2}HyzLx=dVTJuNX&8lLyU#Jb>M{0+&u8G^N5yV56G^Vjx z7bUmVF9;A?37F7jk=}%>JgRyTOe7!!gk1W=#ap9&K60zi-=}$6O>R`GU5*@^vWy7; zy33?j$>`l#9tC7wZH#p!q`W3}ikKMOw!vfBuJ z*lnvj*dzULvg_IRfaR7=#26y8`P!9GVDz)~qtR9`be~Rl5R%c>MFn|pP5Fndh#R!) z;Vjj6XfU4DK+Y)PdXEHA#hwzY1~6YMBnY@0+ch4XRz;?%i!A3M+y}+=%7d$@q=92V zam;O7h35WZH1Ls_as>JN26vnu3?lYekO>0DHjdqL!giZszjLun53I;zn0Q=Y(G#E| zzd&S-*?1`5X&$lDE^|}S{&3~j3?yNCp zp;5-`+usXqq%XT-X^AG;BL&MX*JG8aLR2Or_*1QB2*wdiW)PSy12;;VUpcMi04i_z zqC2n9a_=0nEDZaMFQksotL0j(p2x~!u@Y}SRa#CPSfX4cAf5Ik4w6VBISs;tRWl*- z?{b+FGau!asP?#h4f~w)>;)?an3>~a@fpUnTO66Fe2@?MIwWpalrjwiXN#5NBD2^9 zNQ0u*iO?}zoeeFXiEHJld>pn$goibmL3yH)<2~=2P&4sMqfL+%-1FTV`upY1D*CNz6H+fvymRr7u8pb z5;fDv;m87q;Fng{0~sTi_$d`hfuukecFMQmcJL8p^O9`ay{t>5LbWYMmWBpT2W%As zGd*mZ-{&k&a6A;ky5Q*ypLEE;&uITfG#2u&VzhXR;4vMQ5U<13caFNPZkDxoYcqkX!4)P5ds4MDi3)80~KwWi&H zdE!&rVHXdp*08yApU7|p@iCF>+G|xw|5eh;ZPs>?`tl5r`(@Qm#Y*w;u6$b`;PkMWa$si~N|_cG2k z8>iXJ4w2S69&AhBMT#FTfVd|dYe^vJ`T zb`3`}-L?eW0aepHfjCY=okNmLt;vm!ib9q=MAws}n~o*E0BCc9LgFZri-GO`KCH}f zFIK70mRJ$TQ|AUaw#2u~&8^pH)vC!~3G-T9zxUSnDK-%7IAVecwY(J2Tv|gQVi?=@ zfA{GZtT02Vp+o|85&AwwWY%d6hJ;09mQ3TUIs++gkFT~riXG#}NPhf@(r>gjW~ zwAy$cTTk+M16fk0!P?6uHjikmnCW@MU4O31zZE9H9%X9BWVb$8Am;fL;&T#n;ubl> z>k+)lW3@o*UvgD%)!NFl@7?8(X1zZ9R43mg+uz7)0F77n-AU)74!jdy<}uPrFZlpP zXHz628hN*~pjx4#uAK47&HxfaTCx!60iZ;!PhkUp4bz28W4BY+@I7;!YyVaatUo{a zEd9J|?i;qI6NYnvSnY2;pYJUadRxJ2^A_>3WRfVD$yTD6~ zys$(COPt_0HQS$=hB7UfwPj`mJJR`;GW`tWL6V8%>GKX##67YC=}>f>wqBNzs=06M zJgPi_W-fvMB0qc9Ci^@sYpOm?52f~cElXzB|px1J7DYRsrBw6!90&uC6!r|!h!(XSI*sI%IPBQPIKYL$q zoH}th+=oZ4Yuq97CR>4Cw`p>X)|QrHqWHv+`F9@{_@V4{ z8eVV8co>)c<56-_FMm}~&_*A__LlKWKe_LNP}mYp>W|V07(u*aR7)TD&e0E)4jxzg z5^i&(xlN0UU57~bK8tLWY{R4T3tVra?!M_K9VW&|lHsC^a0 zgxa`5mf-=u$OqW|#~)fv_R?j;7!`e9ltDSS)5c1E{Ldzq4B5)vu&u!;aJ10DW?UXK z_>e3)`_K`u@Je_qWJ$h;vxZ7g_!eL(Z9czf209GU#(KALkr4s0I_x}_L&b? zB)^at1kCk|ISNMyEm6f)^X2P;MKtVcGr_Px|j zBl8^P4CvF-#WUGzO9j^ii}Elk)PSTAvU%M*a|bkY2iM)cMxv$IZ$k$B*0F50bBbQk zv=h$-YPC3Lpd`6o6;INT6UV(`pKRdr9=GbC(8n zWbd)br$|4KFMOWXdXY;uEMPPH{}xNHeTFJ~B?7fk-;Ht0n5VECfHXhj?#*pHaQxBl zv!|}!xW84@sC|VgVKupv4>kt>Irp90F+4Eh+_MW4DXF@EL#=I=5m1S(mVBQmM}f13 zS$m#MZES3myTBYay|2ZYYF5_7NMke14|jZ+u~LSCAB@Qp9b5AgGW|$Hps$_=s0!j( zXdqqC&d2F)mx;@`qQ--cJt#7%%v4@>4}#Ohs*0HHB`W3lw!gIsfg)IZ|A-W=g%=B7 zCaI|N{z@JVolfl!kw|P%tYL4YaNWU_QGlrs(R`TQ&~l#Tbc?~A1V&n(^df6~pJo$$ z*v>d_I3_= zW8ZREhAi&ak7csv4mYtpmCNQ+uiuu~$UUr)oiGAg0kB9r(OL-ceEWpI zO@cA6xZlx?ei+^m)lMr12kg8aQE!v;O60(XStw>doYsJ<`38Pd;|m@Cp78_JFZjXxuS|yt`RtL+Z@O}#L3Nc z!nIZ5x($G=x$`)Bm0ESI9zsH-RiL@wZ$U^2aMnxhy{vSC$}X5jEo_LYd@^pgAZViT z)7Dva2bPjooe|FHggteRgo)>PQS+R#hP?BCT6ri+FyR#!?u(6mteBoJ#V2bngqz#A zq;f6aZ_0gV?o9in+&_Dh1bjm#k>e!a1zKX2{U5@*cI=zJS-JNU6MJie{YidGmsEpI zY(CDWvUXGAyS2UW%ZFm-^yG;oll!Qb4vuuzq}0Sxtgv-?X0WBXFRH+A;EsxlQ-+)% z;Yy9ZXjDY@Tg?WpGg}ld1o~e~WVmm7KfU$3yA1Izl8;!wdBoioQoT&1nANtK$E_K? zCF_eriz1MYajVAb(O7r_Dl@3E_{{HW{LZas^Gbc>w3YfMr;DU!>Z zdPmhJ1oE!zPbBCZ&k5&{2$QtgQ4UOrqcbX!D>79R!~942@bM=~hX;JmxC@3W#zW6) zw;JyS^lw$Fn5^Je+qVLpc!A(~ecRQ-TNZ=UO}y8T3|YdgcZ-jZPv?km9pLk{2BO`k zepz%519o_;bhvxOh5i;!o!N0@+RF1fqapwD-JK9vKFLb{O}E_7KjwS@|4vmBy&UH; z;NOYwgH{`uMGb$Y@~Iavl-x?ZI?i%hTB;EBvJNn87@hf=5QVyI@C7}d(E#Syx6Dmw zw*~y17hc9~J8LOznUPiZWhT->QqN+qKEAD4YO3%#>dESW+v(|FMPSPhw(WM`kE3uz z2ewD$F>5NE4}Yc+aLOB9U;ZA{NGNe{)gyLm^A;KjyeVSH;+q_f%uv_Y3R$mOznbh8 zbp)wcxjSqI55V6{eustlvq&Az)pHq%Md;+e&+!31v99Q=_h)ZtuT}@uD-L`b^{h%Z zjHIt2lp1>qmwH{FSRfaRd=Gn*Pacj{TEd|kg($+1jKL|id!G^y*--TY)?Ta0P{QF% zp$3oZT%}Ue!1Z|zjnt?)Twx*C2V5?&n9;|_r9Dj1~2n- z-xeeROq_e_G8ZLtyUWV)bP%C*hKw~+{@ynuy8nK)Ye8hM$RZIu#(l}Mf>A1k`88h+ zf(^nH#(oOJpG*qLjMbu@YHYco*#;8Vy>;XLF-3E;ak*GsQBAb-xGD9wFb3*B9yhpc zn3W8!QTkMEX^90&07^jNA@1g|Sy++j)9NBirTF1JA-~L_@z=rrv<9``555Tnb#n$z z1q(7)?N-GyQ*QD#dSi`uH4Kr&e`lKo(gdyDy6zzH=roG48QVRbU0a0$Y9E0! zJSr0;kS*e%KIKQ7XAZHd{aHify0B_UL?1Do&IMy$c0`oRiNYay#I*iq5KGm=G)=LW zg;^gbuU7L{hL?u#25cr_hL{xAqa4sdLu(-+w!}w6#1iS+t>hmUB*Nn9@W^zl)u_DX zks&E9*?o4X|F?(l<1H%6;Od%-^iR=03+8`@WUYV%<#=|}67|7%C5un?x6i}y&&vS8 zX{}=QQ&mqaRyhp5N&wg~ZJU+Y+|5x@dhys>$oJQb2h%xtbc?PuWl_=s zv#>X8V)^+s-A{Ld&~!Ei(0oIhpdEV%auWTdkFexe3zG?0OStCY7ei?>>i|~djWK50 zP{^{RJ-H&LCGhu*DAbM?#3tXMoZL=lf_3Zy!N|Nu4Wm8AhOC9Mj0ZC++>TNPnr6)- zg#iePQwGB0AKaTAQ+R3r|BnFi+Cmvk@BId{eY;a!SAhgbi@D{K!-d^_)XtD1eXxzw zUVfxUn}_I4;QO8A1_DZ2%?H8k!hjBU49wnRz&%sDDk*2~4E1EbL%)T2XV3&6Z?J66 z0IGxl)SjK$ioM|+QuLO+EEOi+bk^?%mBRMnkc9X}lO8(ndgl!LH;5McYS$t|>Ea14 z?amopO?TXESPh>p_r?tcHFHQrzX{iKb@tXF?0ny`Sr)g71Hu zl+4IYs52?~*rJrDWzlO2FcvGi;t$%@V>^cLgfdVEOT z((^u`Oe0NhiM1@@3l_X~qex^tDW2xL{(@6L*VfP%wKJl6=DC{5Eq)@C@$F^|XLtH| z+0kasHWX6j{JU$O!_)QN@uaQW^#l<|gkF4^@>^M|%3z1_RT;hZeD9^aJJ^K?%WVy}!zlwDZ`-ChRc^pCPc5{O@V=U$>Dz2UGzAZD(uL1P}2V1N48;Bzd>r+oYc+yCEyJo?bXtk3)NBW*XsgScS{X{wlPH3cCG?;Wj5stT0;!m4lY$*Q z)`^U^C(7YWZ3xNC+>V2KwPN*~3w9Y>T<kvkwr#>5X}&8E;O-Lq0qzW5#QnT64*h zkxb(^CV1503RW8?~S6IudBFGwPe8znmIj>zGe{FW*^v73D;7TY3{kZUMbx7*! z36Yker{@j*NM0G50~|o3HtL<9X|&=6g`;F*E;i-o)6>)AA53=OP-!tefTM-5SlZ0y z`g}6L1Z1+0#P&uTy;c2HAkL~Agnub&vY*!OCT4NPFB%^dDkSxAZ^dKaqK z!}xav1VsV(kJ*0eaO^ewed$}%g+{xWZQuO4ge;J)FmS-v<2J_?!s7D~PG!Q-{__u~ z47iN1d7#)L?W}8_g+;O#-(HR2vBs!A>RvdU<~Xv*)>adN1>YDqAv8>)fTV72Ey>vA zOWmEy@`;hE7^-Zo^|iIVj3;3&L3`ZW7Ck8SVLi9|NNy=l7ESJQTP*%;1|CKS)KXA=goljIjI+Uv?IG) z`4Pntq5t0MI!47_F`CxxS^?}j4UD|Rw&(&1Oj&p$-qsQN|Gi5vL2CkxNvlPdiJj5R zOOFteOF%7^kMCNs&~icq$Vx;)iTDVWOSEFpC}d0}`UA_(#rT{b(XHkhQ!=@|M1Y{M zyyAqxjY@5|r)|WiI&Y>UKHF&c%~8oMNaD|6RFYdtm+eEhg(?T+X#iQa-WRb!I_$ag z^nhGzd-jFX{qPf+6riEIV{!YU$O=dr!dLKS%U81#0E29IP*jmZz?XP7S$ZP%^3_K1 zlG*YC1S|%{R3)k+vp7D_t5r3~QhR-fS`92KJ261E zRIyw+^D07lK5gU@>CC-;@z=j4*D%q(AAE?t2)!I_)mSNhHzA$bHjkw+oXY zoHtZ>o~LOynC3JeE99Udbg1fLfhyCgOT=X@lr$7YteR(Q9ZaCr3>bOw@C(JD`>NS+ zlwGR+Wn8x;snA|5i`kgm>0~;Ko15G8q`aNVV`fO@07%C9@T8OfWx2^CX%qxQ!0Vn~ zuH7QgQg4$zRiqFNcDx9+S!tC{aX`-o6oHC@DnG1Osx!!CvBd$on}T{yyog8n*}6jH zq57T=my6=uXZ^jk=OaKyI_t3qNHM51Y76s=Cx4C##E^>SVl(EZMJg95W#T@`&(=mo zM5Hw+BJRVnsgD;CGMr%vd$ZgS?iPlq^Ij#V}_TOTbj7wCU~DDrG1M|`mykl0$< z+{cY#eE~;!OU9+vTWd&i7z*y0t~ky_CO~v5x>8RTaKx%S=$2gmTu@YxAapMnzgZT$0}f*%vUw0bpiD6{;~^73Jvct10W^VlkC4;*; zNiXB!#0QH?vs|#&b4#OGr;Y>>hc_^xoyqhvSYWDNi0xv%?HZYoQ!pqBKab`mBipq! z+R5cbZ12lXF38d<>=|g{Ra9#CTgS&Hl*2mP5K~Z4OlQexKgczG0mYLY7czdJq|zKX zo~zE(((0lv*#UBZCjT-x$&S)HUN5!Blggq_zidn673~ALhEfhDvN=GabuydDg3sN4 zf&qNMDewmA{whYjQ#f2kb8c;Jm-x&YgC^6EbD*Cp#A$n48RfYF7ucjHIMZLdu%SyP>RMO^yh?y2`LWm(2!T`tt~s7cPHo_tG(PpdDA}G)T@Iols$0pjD{HYplMM ztz$Kf1nGSwdmG?jm-BKoR~FwMf<`7spXRUw$tm`FI3@sZ0YOC{g0eqH;8Vpi+${W> zD;fP5igAIp4^YV&wrs|`-oQcT)T#{5SUe?55=RTrdPC)YuWu>g-RnBmvmz02#;+*9 zulm4~YI8Hr9(ZtkxM_@9TJOe}>Z0Ru16LmP*EIR~?`cBm^BO8w3Dxu6ZqmrwqR{`E zB5jC%6_8b%$;{e+K^^>}zrKPW3*8z_ZhoKCshB^SYpzUPXb89$jg8IlfvqW>O7`4H zd=D^pQLk7^sR%Am`@|S7HpONCS>M^4zp&{j>Ie%ys@nQ zXUNzLL0Tj@vH#GzqF zY={PB+_(*;k7E99LSz+L8K&A0iO6ZmY{hg=p?vOGd`O)Jl^pr75=aL1ViM+me|0cc(SH9N ztAw+e^{=JsUo+v)f#oAMnlFaUm4=U8{I8fI8yf~T$Y>@X1tnDkTFNA`*!OeQFwnWn z$+F^cL`hZJHmnPMk=@KT9hY1HwbSm%mCwLa9v9uWn-LMJu9*_si^ueXS*yLvLU|IJ z-kOz$+Q6-&oNiICPb_9j9iqX^jnU=W?eFSr7X5)po?}u5=R**m;T9WAX*jeBXPJ6j zpiWj9Wu75v-OAxz+x0WNtl}E!eu&YVE8~orA-g4Mp~K&6g$@^%78}w1x8l ztRsN09jN7BYfDbEJ04zVa6y_MSo<%$MiZ9-N0MQ~l&td71`y(SwC%tytLO+nKYNhWS^jN-`?ve2nCzZ8W-%xJUy%f$6H>cj}SjS{#Sn zw>1Ks3*eX29BKp_BP;3fN{UKIJ=w1Z(G5&|gho^XQqO@AGdaS)=LaH{(efM-?1Crg)t0%*6$iy>wJ
      YwW(PtiXoGSH(F0J9qfo)#z@BK&Unp1WnBB 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 Date: Sat, 24 Jan 2026 09:28:49 +0530 Subject: [PATCH 12/38] fix(ui): Change default key type from 'Default' to 'LLM API' for improved security (#19516) - Changed initial keyType state to 'llm_api' instead of 'default' - Updated reset functions (handleOk, handleCancel) to use 'llm_api' - Updated form initialValue and Select defaultValue to 'llm_api' Addresses #19492 --- .../src/components/organisms/create_key_button.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx index 90ed9a62cc..7664393a9e 100644 --- a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx @@ -159,7 +159,7 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { const [userSearchLoading, setUserSearchLoading] = useState(false); const [mcpAccessGroups, setMcpAccessGroups] = useState([]); const [disabledCallbacks, setDisabledCallbacks] = useState([]); - const [keyType, setKeyType] = useState("default"); + const [keyType, setKeyType] = useState("llm_api"); const [modelAliases, setModelAliases] = useState<{ [key: string]: string }>({}); const [autoRotationEnabled, setAutoRotationEnabled] = useState(false); const [rotationInterval, setRotationInterval] = useState("30d"); @@ -168,7 +168,7 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { form.resetFields(); setLoggingSettings([]); setDisabledCallbacks([]); - setKeyType("default"); + setKeyType("llm_api"); setModelAliases({}); setAutoRotationEnabled(false); setRotationInterval("30d"); @@ -181,7 +181,7 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { form.resetFields(); setLoggingSettings([]); setDisabledCallbacks([]); - setKeyType("default"); + setKeyType("llm_api"); setModelAliases({}); setAutoRotationEnabled(false); setRotationInterval("30d"); @@ -676,11 +676,11 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { } name="key_type" - initialValue="default" + initialValue="llm_api" className="mt-4" > onChange(e.target.value)} + data-placeholder={placeholder} + > + {children} + + ); + Select.Option = Option; + return { + Select, + Tooltip: ({ children, title }: any) => ( +
      + {children} +
      + ), + Switch: ({ checked, onChange }: any) => ( + onChange(e.target.checked)} + /> + ), + Divider: () =>
      , + }; +}); + +vi.mock("@ant-design/icons", () => ({ + InfoCircleOutlined: () => , +})); + +vi.mock("@tremor/react", () => ({ + TextInput: ({ value, onValueChange, onChange, placeholder, name, className }: any) => { + const handleChange = (e: React.ChangeEvent) => { + if (onChange) { + onChange(e); + } + if (onValueChange) { + onValueChange(e.target.value); + } + }; + return ( + + ); + }, +})); + +describe("KeyLifecycleSettings", () => { + const mockForm = { + getFieldValue: vi.fn(), + setFieldValue: vi.fn(), + setFieldsValue: vi.fn(), + }; + + const defaultProps = { + form: mockForm, + autoRotationEnabled: false, + onAutoRotationChange: vi.fn(), + rotationInterval: "", + onRotationIntervalChange: vi.fn(), + isCreateMode: false, + }; + + beforeEach(() => { + vi.clearAllMocks(); + mockForm.getFieldValue.mockReturnValue(""); + }); + + it("should render without crashing", () => { + renderWithProviders(); + + expect(screen.getByText("Key Expiry Settings")).toBeInTheDocument(); + expect(screen.getByText("Auto-Rotation Settings")).toBeInTheDocument(); + }); + + describe("Key Expiry Settings", () => { + it("should render expiry input field", () => { + renderWithProviders(); + + expect(screen.getByText("Expire Key")).toBeInTheDocument(); + expect(screen.getByTestId("duration-input")).toBeInTheDocument(); + }); + + it("should show correct placeholder in create mode", () => { + renderWithProviders(); + + const input = screen.getByTestId("duration-input"); + expect(input).toHaveAttribute( + "placeholder", + "e.g., 30d or leave empty to never expire" + ); + }); + + it("should show correct placeholder in edit mode", () => { + renderWithProviders(); + + const input = screen.getByTestId("duration-input"); + expect(input).toHaveAttribute("placeholder", "e.g., 30d or -1 to never expire"); + }); + + it("should show correct tooltip in create mode", () => { + renderWithProviders(); + + const tooltips = screen.getAllByTestId("tooltip"); + const expiryTooltip = tooltips.find((tooltip) => + tooltip.getAttribute("title")?.includes("Leave empty to never expire") + ); + expect(expiryTooltip).toBeInTheDocument(); + expect(expiryTooltip).toHaveAttribute( + "title", + "Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Leave empty to never expire." + ); + }); + + it("should show correct tooltip in edit mode", () => { + renderWithProviders(); + + const tooltips = screen.getAllByTestId("tooltip"); + const expiryTooltip = tooltips.find((tooltip) => + tooltip.getAttribute("title")?.includes("Use -1 to never expire") + ); + expect(expiryTooltip).toBeInTheDocument(); + expect(expiryTooltip).toHaveAttribute( + "title", + "Set when this key should expire. Format: 30s (seconds), 30m (minutes), 30h (hours), 30d (days). Use -1 to never expire." + ); + }); + + it("should initialize with form value if present", () => { + mockForm.getFieldValue.mockReturnValue("30d"); + renderWithProviders(); + + const input = screen.getByTestId("duration-input") as HTMLInputElement; + expect(input.value).toBe("30d"); + }); + + it("should update form using setFieldValue when duration changes", async () => { + const user = userEvent.setup(); + renderWithProviders(); + + const input = screen.getByTestId("duration-input"); + await user.type(input, "60d"); + + expect(mockForm.setFieldValue).toHaveBeenCalledWith("duration", "60d"); + }); + + it("should update form using setFieldsValue when setFieldValue is not available", async () => { + const user = userEvent.setup(); + const formWithoutSetFieldValue = { + getFieldValue: vi.fn().mockReturnValue(""), + setFieldsValue: vi.fn(), + }; + renderWithProviders( + + ); + + const input = screen.getByTestId("duration-input"); + await user.type(input, "90d"); + + expect(formWithoutSetFieldValue.setFieldsValue).toHaveBeenCalledWith({ duration: "90d" }); + }); + }); + + describe("Auto-Rotation Settings", () => { + it("should render auto-rotation switch", () => { + renderWithProviders(); + + expect(screen.getByText("Enable Auto-Rotation")).toBeInTheDocument(); + expect(screen.getByTestId("switch")).toBeInTheDocument(); + }); + + it("should show switch as unchecked when autoRotationEnabled is false", () => { + renderWithProviders(); + + const switchElement = screen.getByTestId("switch") as HTMLInputElement; + expect(switchElement.checked).toBe(false); + }); + + it("should show switch as checked when autoRotationEnabled is true", () => { + renderWithProviders(); + + const switchElement = screen.getByTestId("switch") as HTMLInputElement; + expect(switchElement.checked).toBe(true); + }); + + it("should call onAutoRotationChange when switch is toggled", async () => { + const user = userEvent.setup(); + const onAutoRotationChange = vi.fn(); + renderWithProviders( + + ); + + const switchElement = screen.getByTestId("switch"); + await user.click(switchElement); + + expect(onAutoRotationChange).toHaveBeenCalledWith(true); + }); + + it("should not show rotation interval section when auto-rotation is disabled", () => { + renderWithProviders(); + + expect(screen.queryByText("Rotation Interval")).not.toBeInTheDocument(); + expect(screen.queryByTestId("select")).not.toBeInTheDocument(); + }); + + it("should show rotation interval section when auto-rotation is enabled", () => { + renderWithProviders( + + ); + + expect(screen.getByText("Rotation Interval")).toBeInTheDocument(); + expect(screen.getByTestId("select")).toBeInTheDocument(); + }); + + it("should show all predefined interval options", () => { + renderWithProviders( + + ); + + expect(screen.getByText("7 days")).toBeInTheDocument(); + expect(screen.getByText("30 days")).toBeInTheDocument(); + expect(screen.getByText("90 days")).toBeInTheDocument(); + expect(screen.getByText("180 days")).toBeInTheDocument(); + expect(screen.getByText("365 days")).toBeInTheDocument(); + expect(screen.getByText("Custom interval")).toBeInTheDocument(); + }); + + it("should display current rotation interval in select", () => { + renderWithProviders( + + ); + + const select = screen.getByTestId("select") as HTMLSelectElement; + expect(select.value).toBe("90d"); + }); + + it("should call onRotationIntervalChange when predefined interval is selected", async () => { + const user = userEvent.setup(); + const onRotationIntervalChange = vi.fn(); + renderWithProviders( + + ); + + const select = screen.getByTestId("select"); + await user.selectOptions(select, "30d"); + + expect(onRotationIntervalChange).toHaveBeenCalledWith("30d"); + }); + + it("should show custom input when custom option is selected", async () => { + const user = userEvent.setup(); + renderWithProviders( + + ); + + const select = screen.getByTestId("select"); + await user.selectOptions(select, "custom"); + + expect(screen.getByTestId("custom-interval-input")).toBeInTheDocument(); + expect(screen.getByText("Supported formats: seconds (s), minutes (m), hours (h), days (d)")).toBeInTheDocument(); + }); + + it("should hide custom input when predefined interval is selected after custom", async () => { + const user = userEvent.setup(); + const onRotationIntervalChange = vi.fn(); + renderWithProviders( + + ); + + const select = screen.getByTestId("select"); + await user.selectOptions(select, "7d"); + + expect(screen.queryByTestId("custom-interval-input")).not.toBeInTheDocument(); + expect(onRotationIntervalChange).toHaveBeenCalledWith("7d"); + }); + + it("should call onRotationIntervalChange when custom interval is entered", async () => { + const user = userEvent.setup(); + const onRotationIntervalChange = vi.fn(); + renderWithProviders( + + ); + + const select = screen.getByTestId("select"); + await user.selectOptions(select, "custom"); + + const customInput = screen.getByTestId("custom-interval-input"); + await user.type(customInput, "14d"); + + expect(onRotationIntervalChange).toHaveBeenCalledWith("14d"); + }); + + it("should show info message when auto-rotation is enabled", () => { + renderWithProviders(); + + expect( + screen.getByText( + "When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period." + ) + ).toBeInTheDocument(); + }); + + it("should not show info message when auto-rotation is disabled", () => { + renderWithProviders(); + + expect( + screen.queryByText( + "When rotation occurs, you'll receive a notification with the new key. The old key will be deactivated after a brief grace period." + ) + ).not.toBeInTheDocument(); + }); + + it("should initialize with custom interval input visible when custom interval is provided", () => { + renderWithProviders( + + ); + + expect(screen.getByTestId("custom-interval-input")).toBeInTheDocument(); + const customInput = screen.getByTestId("custom-interval-input") as HTMLInputElement; + expect(customInput.value).toBe("14d"); + }); + + it("should show custom option selected when custom interval is provided", () => { + renderWithProviders( + + ); + + const select = screen.getByTestId("select") as HTMLSelectElement; + expect(select.value).toBe("custom"); + }); + + it("should not call onRotationIntervalChange when selecting custom option", async () => { + const user = userEvent.setup(); + const onRotationIntervalChange = vi.fn(); + renderWithProviders( + + ); + + const select = screen.getByTestId("select"); + await user.selectOptions(select, "custom"); + + expect(onRotationIntervalChange).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx b/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx index 81d22b5634..0f29a47d1d 100644 --- a/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx +++ b/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx @@ -11,6 +11,7 @@ interface KeyLifecycleSettingsProps { onAutoRotationChange: (enabled: boolean) => void; rotationInterval: string; onRotationIntervalChange: (interval: string) => void; + isCreateMode?: boolean; // If true, shows "leave empty to never expire" instead of "-1 to never expire" } const KeyLifecycleSettings: React.FC = ({ @@ -19,6 +20,7 @@ const KeyLifecycleSettings: React.FC = ({ onAutoRotationChange, rotationInterval, onRotationIntervalChange, + isCreateMode = false, }) => { // Predefined intervals const predefinedIntervals = ["7d", "30d", "90d", "180d", "365d"]; @@ -64,13 +66,19 @@ const KeyLifecycleSettings: React.FC = ({
      = ({ team, teams, data, addKey }) => { formValues.rotation_interval = rotationInterval; } - // Handle duration field for key expiry - if (formValues.duration) { - formValues.duration = formValues.duration; + // Handle duration field for key expiry - convert empty string to null + if (!formValues.duration || formValues.duration.trim() === "") { + formValues.duration = null; } // Update the formValues with the final metadata @@ -1270,6 +1270,7 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { onAutoRotationChange={setAutoRotationEnabled} rotationInterval={rotationInterval} onRotationIntervalChange={setRotationInterval} + isCreateMode={true} />
      From 9ff0daa24defccc9a6aa049e8a4c6f4a98b0f846 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 16:58:38 -0800 Subject: [PATCH 28/38] Add dont ask me again option in nudges --- .../hooks/useDisableShowPrompts.ts | 35 +++++++++ .../src/components/navbar.tsx | 24 +++++- .../src/components/survey/NudgePrompt.tsx | 73 +++++++++++++++++-- 3 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.ts diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.ts new file mode 100644 index 0000000000..801fbdbb99 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowPrompts.ts @@ -0,0 +1,35 @@ +// hooks/useDisableShowPrompts.ts +import { useSyncExternalStore } from "react"; +import { getLocalStorageItem } from "@/utils/localStorageUtils"; +import { LOCAL_STORAGE_EVENT } from "@/utils/localStorageUtils"; + +function subscribe(callback: () => void) { + const onStorage = (e: StorageEvent) => { + if (e.key === "disableShowPrompts") { + callback(); + } + }; + + const onCustom = (e: Event) => { + const { key } = (e as CustomEvent).detail; + if (key === "disableShowPrompts") { + callback(); + } + }; + + window.addEventListener("storage", onStorage); + window.addEventListener(LOCAL_STORAGE_EVENT, onCustom); + + return () => { + window.removeEventListener("storage", onStorage); + window.removeEventListener(LOCAL_STORAGE_EVENT, onCustom); + }; +} + +function getSnapshot() { + return getLocalStorageItem("disableShowPrompts") === "true"; +} + +export function useDisableShowPrompts() { + return useSyncExternalStore(subscribe, getSnapshot); +} diff --git a/ui/litellm-dashboard/src/components/navbar.tsx b/ui/litellm-dashboard/src/components/navbar.tsx index 6dac073b3a..8179bb8a53 100644 --- a/ui/litellm-dashboard/src/components/navbar.tsx +++ b/ui/litellm-dashboard/src/components/navbar.tsx @@ -1,4 +1,5 @@ import { useHealthReadiness } from "@/app/(dashboard)/hooks/healthReadiness/useHealthReadiness"; +import { useDisableShowPrompts } from "@/app/(dashboard)/hooks/useDisableShowPrompts"; import { getProxyBaseUrl } from "@/components/networking"; import { useTheme } from "@/contexts/ThemeContext"; import { clearTokenCookies } from "@/utils/cookieUtils"; @@ -51,9 +52,9 @@ const Navbar: React.FC = ({ onToggleSidebar, }) => { const baseUrl = getProxyBaseUrl(); - console.log("baseUrl", baseUrl); const [logoutUrl, setLogoutUrl] = useState(""); const [disableShowNewBadge, setDisableShowNewBadge] = useState(false); + const disableShowPrompts = useDisableShowPrompts(); const { logoUrl } = useTheme(); const { data: healthData } = useHealthReadiness(); const version = healthData?.litellm_version; @@ -152,6 +153,27 @@ const Navbar: React.FC = ({ aria-label="Toggle hide new feature indicators" /> +
      e.stopPropagation()} + > + Hide All Prompts + { + if (checked) { + setLocalStorageItem("disableShowPrompts", "true"); + emitLocalStorageChange("disableShowPrompts"); + } else { + removeLocalStorageItem("disableShowPrompts"); + emitLocalStorageChange("disableShowPrompts"); + } + }} + aria-label="Toggle hide all prompts" + /> +
      ), diff --git a/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx b/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx index 9095c6c21c..ef72144b89 100644 --- a/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx +++ b/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx @@ -1,6 +1,8 @@ import React, { useEffect, useState } from "react"; -import { X, LucideIcon } from "lucide-react"; +import { X, LucideIcon, Check } from "lucide-react"; import { Button } from "antd"; +import { useDisableShowPrompts } from "@/app/(dashboard)/hooks/useDisableShowPrompts"; +import { setLocalStorageItem, emitLocalStorageChange } from "@/utils/localStorageUtils"; interface NudgePromptProps { onOpen: () => void; @@ -15,6 +17,7 @@ interface NudgePromptProps { } const DISMISS_DURATION = 15000; // 15 seconds +const CONFIRMATION_DURATION = 5000; // 5 seconds export function NudgePrompt({ onOpen, @@ -27,11 +30,14 @@ export function NudgePrompt({ accentColor, buttonStyle, }: NudgePromptProps) { + const disableShowPrompts = useDisableShowPrompts(); const [progress, setProgress] = useState(100); + const [showConfirmation, setShowConfirmation] = useState(false); useEffect(() => { if (!isVisible) { setProgress(100); + setShowConfirmation(false); return; } @@ -49,13 +55,53 @@ export function NudgePrompt({ return () => clearInterval(interval); }, [isVisible]); - if (!isVisible) return null; + useEffect(() => { + if (showConfirmation) { + const timer = setTimeout(() => { + setShowConfirmation(false); + onDismiss(); + }, CONFIRMATION_DURATION); + + return () => clearTimeout(timer); + } + }, [showConfirmation, onDismiss]); + + const handleDontAskAgain = () => { + setLocalStorageItem("disableShowPrompts", "true"); + emitLocalStorageChange("disableShowPrompts"); + setShowConfirmation(true); + }; + + // Show confirmation even if disableShowPrompts is true (since we just set it) + if (showConfirmation) { + return ( +
      +
      +
      +
      + +
      +
      +

      + Got it, we will not ask again. Reactivate this at any time in the User Menu. +

      +
      +
      +
      +
      + ); + } + + // Don't show the prompt if disabled (unless we're showing confirmation) + if (!isVisible || disableShowPrompts) return null; return (
      {/* Progress bar at top showing time remaining */}
      @@ -81,9 +127,20 @@ export function NudgePrompt({

      {description}

      - +
      + + +
      ); From c442fcd922635d2c4b43ee7e14990e79029cb1a2 Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Mon, 26 Jan 2026 17:00:18 -0800 Subject: [PATCH 29/38] CI/CD: Increase retries and stabilize litellm_mapped_tests_core (#19826) * Fix PLR0915: Extract system message handling to reduce statement count * fix mypy * fix: add host_progress_callback parameter to mock_call_tool in test The test_call_tool_without_broken_pipe_error was failing because the mock function did not accept the host_progress_callback keyword argument that the actual implementation passes to client.call_tool(). Updated the mock to accept this parameter to match the real implementation signature. * fixing flaky tests around oidc and email * Add documentation comment to test file * add retry * add dependency * increase retry --------- Co-authored-by: yuneng-jiang --- .circleci/requirements.txt | 3 +- .../adapters/transformation.py | 106 +++++++++++------- pyproject.toml | 3 + .../send_emails/test_resend_email.py | 2 + .../mcp_server/test_mcp_server_manager.py | 2 +- 5 files changed, 72 insertions(+), 44 deletions(-) diff --git a/.circleci/requirements.txt b/.circleci/requirements.txt index 8c44dc1830..a5ec74424f 100644 --- a/.circleci/requirements.txt +++ b/.circleci/requirements.txt @@ -16,4 +16,5 @@ uvloop==0.21.0 mcp==1.25.0 # for MCP server semantic_router==0.1.10 # for auto-routing with litellm fastuuid==0.12.0 -responses==0.25.7 # for proxy client tests \ No newline at end of file +responses==0.25.7 # for proxy client tests +pytest-retry==1.6.3 # for automatic test retries \ No newline at end of file diff --git a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py index 58120bab1f..5ba0754b74 100644 --- a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py @@ -170,21 +170,33 @@ class LiteLLMAnthropicMessagesAdapter: def _add_cache_control_if_applicable( self, - source: Dict[str, Any], - target: Dict[str, Any], + source: Any, + target: Any, model: Optional[str], ) -> None: """ Extract cache_control from source and add to target if it should be preserved. + This method accepts Any type to support both regular dicts and TypedDict objects. + TypedDict objects (like ChatCompletionTextObject, ChatCompletionImageObject, etc.) + are dicts at runtime but have specific types at type-check time. Using Any allows + this method to work with both while maintaining runtime correctness. + Args: - source: Dict containing potential cache_control field - target: Dict to add cache_control to + source: Dict or TypedDict containing potential cache_control field + target: Dict or TypedDict to add cache_control to model: Model name to check if cache_control should be preserved """ - cache_control = source.get("cache_control") + # TypedDict objects are dicts at runtime, so .get() works + cache_control = source.get("cache_control") if isinstance(source, dict) else getattr(source, "cache_control", None) if cache_control and model and self.is_anthropic_claude_model(model): - target["cache_control"] = cache_control + # TypedDict objects support dict operations at runtime + # Use type ignore consistent with codebase pattern (see anthropic/chat/transformation.py:432) + if isinstance(target, dict): + target["cache_control"] = cache_control # type: ignore[typeddict-item] + else: + # Fallback for non-dict objects (shouldn't happen in practice) + cast(Dict[str, Any], target)["cache_control"] = cache_control def translatable_anthropic_params(self) -> List: """ @@ -220,7 +232,7 @@ class LiteLLMAnthropicMessagesAdapter: elif message_content and isinstance(message_content, list): for content in message_content: if content.get("type") == "text": - text_obj: Dict[str, Any] = ChatCompletionTextObject( + text_obj = ChatCompletionTextObject( type="text", text=content.get("text", "") ) self._add_cache_control_if_applicable(content, text_obj, model) @@ -236,7 +248,7 @@ class LiteLLMAnthropicMessagesAdapter: image_url_obj = ChatCompletionImageUrlObject( url=openai_image_url ) - image_obj: Dict[str, Any] = ChatCompletionImageObject( + image_obj = ChatCompletionImageObject( type="image_url", image_url=image_url_obj ) self._add_cache_control_if_applicable(content, image_obj, model) @@ -245,21 +257,21 @@ class LiteLLMAnthropicMessagesAdapter: # Convert Anthropic document format (PDF, etc.) to OpenAI format source = content.get("source", {}) openai_image_url = ( - self._translate_anthropic_image_to_openai(source) + self._translate_anthropic_image_to_openai(cast(dict, source)) ) if openai_image_url: image_url_obj = ChatCompletionImageUrlObject( url=openai_image_url ) - doc_obj: Dict[str, Any] = ChatCompletionImageObject( + doc_obj = ChatCompletionImageObject( type="image_url", image_url=image_url_obj ) self._add_cache_control_if_applicable(content, doc_obj, model) new_user_content_list.append(doc_obj) # type: ignore elif content.get("type") == "tool_result": if "content" not in content: - tool_result: Dict[str, Any] = ChatCompletionToolMessage( + tool_result = ChatCompletionToolMessage( role="tool", tool_call_id=content.get("tool_use_id", ""), content="", @@ -383,7 +395,7 @@ class LiteLLMAnthropicMessagesAdapter: assistant_message_str: Optional[str] = None assistant_content_list: List[Dict[str, Any]] = [] # For content blocks with cache_control has_cache_control_in_text = False - tool_calls: List[Dict[str, Any]] = [] + tool_calls: List[ChatCompletionAssistantToolCall] = [] thinking_blocks: List[ Union[ChatCompletionThinkingBlock, ChatCompletionRedactedThinkingBlock] ] = [] @@ -427,7 +439,7 @@ class LiteLLMAnthropicMessagesAdapter: provider_specific_fields ) - tool_call: Dict[str, Any] = ChatCompletionAssistantToolCall( + tool_call = ChatCompletionAssistantToolCall( id=content.get("id", ""), type="function", function=function_chunk, @@ -603,7 +615,7 @@ class LiteLLMAnthropicMessagesAdapter: for k, v in tool.items(): if k not in mapped_tool_params: # pass additional computer kwargs function_chunk.setdefault("parameters", {}).update({k: v}) - tool_param: Dict[str, Any] = ChatCompletionToolParam(type="function", function=function_chunk) + tool_param = ChatCompletionToolParam(type="function", function=function_chunk) self._add_cache_control_if_applicable(tool, tool_param, model) new_tools.append(tool_param) # type: ignore[arg-type] @@ -645,6 +657,41 @@ class LiteLLMAnthropicMessagesAdapter: }, } + def _add_system_message_to_messages( + self, + new_messages: List[AllMessageValues], + anthropic_message_request: AnthropicMessagesRequest, + ) -> None: + """Add system message to messages list if present in request.""" + if "system" not in anthropic_message_request: + return + system_content = anthropic_message_request["system"] + if not system_content: + return + # Handle system as string or array of content blocks + if isinstance(system_content, str): + new_messages.insert( + 0, + ChatCompletionSystemMessage(role="system", content=system_content), + ) + elif isinstance(system_content, list): + # Convert Anthropic system content blocks to OpenAI format + openai_system_content: List[Dict[str, Any]] = [] + model_name = anthropic_message_request.get("model", "") + for block in system_content: + if isinstance(block, dict) and block.get("type") == "text": + text_block: Dict[str, Any] = { + "type": "text", + "text": block.get("text", ""), + } + self._add_cache_control_if_applicable(block, text_block, model_name) + openai_system_content.append(text_block) + if openai_system_content: + new_messages.insert( + 0, + ChatCompletionSystemMessage(role="system", content=openai_system_content), # type: ignore + ) + def translate_anthropic_to_openai( self, anthropic_message_request: AnthropicMessagesRequest ) -> ChatCompletionRequest: @@ -673,32 +720,7 @@ class LiteLLMAnthropicMessagesAdapter: model=anthropic_message_request.get("model"), ) ## ADD SYSTEM MESSAGE TO MESSAGES - if "system" in anthropic_message_request: - system_content = anthropic_message_request["system"] - if system_content: - # Handle system as string or array of content blocks - if isinstance(system_content, str): - new_messages.insert( - 0, - ChatCompletionSystemMessage(role="system", content=system_content), - ) - elif isinstance(system_content, list): - # Convert Anthropic system content blocks to OpenAI format - openai_system_content: List[Dict[str, Any]] = [] - model_name = anthropic_message_request.get("model", "") - for block in system_content: - if isinstance(block, dict) and block.get("type") == "text": - text_block: Dict[str, Any] = { - "type": "text", - "text": block.get("text", ""), - } - self._add_cache_control_if_applicable(block, text_block, model_name) - openai_system_content.append(text_block) - if openai_system_content: - new_messages.insert( - 0, - ChatCompletionSystemMessage(role="system", content=openai_system_content), # type: ignore - ) + self._add_system_message_to_messages(new_messages, anthropic_message_request) new_kwargs: ChatCompletionRequest = { "model": anthropic_message_request["model"], @@ -902,7 +924,7 @@ class LiteLLMAnthropicMessagesAdapter: ) # extract usage usage: Usage = getattr(response, "usage") - anthropic_usage: Dict[str, Any] = AnthropicUsage( + anthropic_usage = AnthropicUsage( input_tokens=usage.prompt_tokens or 0, output_tokens=usage.completion_tokens or 0, ) @@ -1055,7 +1077,7 @@ class LiteLLMAnthropicMessagesAdapter: else: litellm_usage_chunk = None if litellm_usage_chunk is not None: - usage_delta: Dict[str, Any] = UsageDelta( + usage_delta = UsageDelta( input_tokens=litellm_usage_chunk.prompt_tokens or 0, output_tokens=litellm_usage_chunk.completion_tokens or 0, ) diff --git a/pyproject.toml b/pyproject.toml index cae519b480..1e4836ed19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -145,6 +145,7 @@ mypy = "^1.0" pytest = "^7.4.3" pytest-mock = "^3.12.0" pytest-asyncio = "^0.21.1" +pytest-retry = "^1.6.3" requests-mock = "^1.12.1" responses = "^0.25.7" respx = "^0.22.0" @@ -183,6 +184,8 @@ plugins = "pydantic.mypy" [tool.pytest.ini_options] asyncio_mode = "auto" +retries = 20 +retry_delay = 5 markers = [ "asyncio: mark test as an asyncio test", "limit_leaks: mark test with memory limit for leak detection (e.g., '40 MB')", diff --git a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py index 31bcaff532..439da882fe 100644 --- a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py +++ b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py @@ -11,6 +11,8 @@ from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import ( ResendEmailLogger, ) +# Test file for Resend email integration + @pytest.fixture def mock_env_vars(): diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index ecdc75ede5..f241b2aa0d 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -1885,7 +1885,7 @@ class TestMCPServerManager: # Create mock client that tracks call_tool usage mock_client = AsyncMock() - async def mock_call_tool(params): + async def mock_call_tool(params, host_progress_callback=None): # Return a mock CallToolResult result = MagicMock(spec=CallToolResult) result.content = [{"type": "text", "text": "Tool executed successfully"}] From f95572e3ed5e8dedcb4ba34ce9ac562d26894a3d Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Mon, 26 Jan 2026 17:39:40 -0800 Subject: [PATCH 30/38] Fix broken mocks in 6 flaky tests to prevent real API calls (#19829) * Fix broken mocks in 6 flaky tests to prevent real API calls Added network-level HTTP blocking using respx to prevent tests from making real API calls when Python-level mocks fail. This makes tests more reliable and retryable in CI. Changes: - Azure OIDC test: Added Azure Identity SDK mock to prevent real Azure calls - Vector store test: Added @respx.mock decorator to block HTTP requests - Resend email tests (3): Added @respx.mock decorator for all 3 test functions - SendGrid email test: Added @respx.mock decorator All test assertions and verification logic remain unchanged - only added safety nets to catch leaked API calls. * Fix failing OIDC secret manager tests Fixed two test failures in test_secret_managers_main.py: 1. test_oidc_azure_ad_token_success: Corrected the patch path for get_bearer_token_provider from 'litellm.secret_managers.get_azure_ad_token_provider.get_bearer_token_provider' to 'azure.identity.get_bearer_token_provider' since the function is imported from azure.identity. 2. test_oidc_google_success: Added @patch('httpx.Client') decorator to prevent any real HTTP connections during test execution, resolving httpx.ConnectError issues. Both tests now pass successfully. --- .../send_emails/test_resend_email.py | 20 +++++++++++++++ .../send_emails/test_sendgrid_email.py | 8 ++++++ .../test_secret_managers_main.py | 25 ++++++++++++------- .../test_vector_store_registry.py | 4 +++ 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py index 439da882fe..8db6d98f13 100644 --- a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py +++ b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py @@ -2,7 +2,9 @@ import os import sys import unittest.mock as mock +import httpx import pytest +import respx from httpx import Response sys.path.insert(0, os.path.abspath("../../..")) @@ -39,7 +41,13 @@ def mock_httpx_client(): @pytest.mark.asyncio +@respx.mock async def test_send_email_success(mock_env_vars, mock_httpx_client): + # Block all HTTP requests at network level to prevent real API calls + respx.post("https://api.resend.com/emails").mock( + return_value=httpx.Response(200, json={"id": "test_email_id"}) + ) + # Initialize the logger logger = ResendEmailLogger() @@ -73,7 +81,13 @@ async def test_send_email_success(mock_env_vars, mock_httpx_client): @pytest.mark.asyncio +@respx.mock async def test_send_email_missing_api_key(mock_httpx_client): + # Block all HTTP requests at network level to prevent real API calls + respx.post("https://api.resend.com/emails").mock( + return_value=httpx.Response(200, json={"id": "test_email_id"}) + ) + # Remove the API key from environment before initializing logger original_key = os.environ.pop("RESEND_API_KEY", None) @@ -111,7 +125,13 @@ async def test_send_email_missing_api_key(mock_httpx_client): @pytest.mark.asyncio +@respx.mock async def test_send_email_multiple_recipients(mock_env_vars, mock_httpx_client): + # Block all HTTP requests at network level to prevent real API calls + respx.post("https://api.resend.com/emails").mock( + return_value=httpx.Response(200, json={"id": "test_email_id"}) + ) + # Initialize the logger logger = ResendEmailLogger() diff --git a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py index f8b5e40bf3..836b717bd6 100644 --- a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py +++ b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py @@ -2,7 +2,9 @@ import os import sys import unittest.mock as mock +import httpx import pytest +import respx from httpx import Response sys.path.insert(0, os.path.abspath("../../..")) @@ -101,7 +103,13 @@ async def test_send_email_missing_api_key(): @pytest.mark.asyncio +@respx.mock async def test_send_email_multiple_recipients(mock_env_vars, mock_httpx_client): + # Block all HTTP requests at network level to prevent real API calls + respx.post("https://api.sendgrid.com/v3/mail/send").mock( + return_value=httpx.Response(202, text="accepted") + ) + logger = SendGridEmailLogger() from_email = "test@example.com" diff --git a/tests/test_litellm/secret_managers/test_secret_managers_main.py b/tests/test_litellm/secret_managers/test_secret_managers_main.py index cadbd883cc..eaef6956cd 100644 --- a/tests/test_litellm/secret_managers/test_secret_managers_main.py +++ b/tests/test_litellm/secret_managers/test_secret_managers_main.py @@ -48,7 +48,8 @@ def mock_env(): @patch("litellm.secret_managers.main.oidc_cache") @patch("litellm.secret_managers.main._get_oidc_http_handler") -def test_oidc_google_success(mock_get_http_handler, mock_oidc_cache): +@patch("httpx.Client") # Prevent any real HTTP connections +def test_oidc_google_success(mock_httpx_client, mock_get_http_handler, mock_oidc_cache): mock_oidc_cache.get_cache.return_value = None mock_handler = MockHTTPHandler(timeout=600.0) mock_get_http_handler.return_value = mock_handler @@ -144,7 +145,7 @@ def test_oidc_azure_file_success(mock_env, tmp_path): mock_env["AZURE_FEDERATED_TOKEN_FILE"] = str(token_file) secret_name = "oidc/azure/azure-audience" - result = get_secret(secret_name) + result = get_secret(secret_name) assert result == "azure_token" @@ -156,16 +157,22 @@ def test_oidc_azure_ad_token_success(mock_get_azure_ad_token_provider): if "AZURE_FEDERATED_TOKEN_FILE" in os.environ: del os.environ["AZURE_FEDERATED_TOKEN_FILE"] + # Mock the token provider function that gets returned and called mock_token_provider = Mock(return_value="azure_ad_token") mock_get_azure_ad_token_provider.return_value = mock_token_provider - secret_name = "oidc/azure/api://azure-audience" - result = get_secret(secret_name) + + # Also mock the Azure Identity SDK to prevent any real Azure calls + with patch("azure.identity.get_bearer_token_provider") as mock_bearer: + mock_bearer.return_value = mock_token_provider + + secret_name = "oidc/azure/api://azure-audience" + result = get_secret(secret_name) - assert result == "azure_ad_token" - mock_get_azure_ad_token_provider.assert_called_once_with( - azure_scope="api://azure-audience" - ) - mock_token_provider.assert_called_once_with() + assert result == "azure_ad_token" + mock_get_azure_ad_token_provider.assert_called_once_with( + azure_scope="api://azure-audience" + ) + mock_token_provider.assert_called_once_with() def test_oidc_file_success(tmp_path): diff --git a/tests/test_litellm/vector_stores/test_vector_store_registry.py b/tests/test_litellm/vector_stores/test_vector_store_registry.py index 3c4308dd3a..a3af476bc7 100644 --- a/tests/test_litellm/vector_stores/test_vector_store_registry.py +++ b/tests/test_litellm/vector_stores/test_vector_store_registry.py @@ -119,8 +119,12 @@ def test_add_vector_store_to_registry(): +@respx.mock def test_search_uses_registry_credentials(): """search() should pull credentials from vector_store_registry when available""" + # Block all HTTP requests at the network level to prevent real API calls + respx.route().mock(return_value=httpx.Response(200, json={"object": "list", "data": []})) + vector_store = LiteLLM_ManagedVectorStore( vector_store_id="vs1", custom_llm_provider="bedrock", From aa4b3ba87addedf3f7869909e13a63e8d9687f82 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 17:53:01 -0800 Subject: [PATCH 31/38] Adding tests: --- .../src/components/navbar.test.tsx | 6 ++ .../components/survey/NudgePrompt.test.tsx | 101 ++++++++++++++++++ .../src/components/survey/NudgePrompt.tsx | 2 +- 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 ui/litellm-dashboard/src/components/survey/NudgePrompt.test.tsx diff --git a/ui/litellm-dashboard/src/components/navbar.test.tsx b/ui/litellm-dashboard/src/components/navbar.test.tsx index 5d3c7254ff..4db814d897 100644 --- a/ui/litellm-dashboard/src/components/navbar.test.tsx +++ b/ui/litellm-dashboard/src/components/navbar.test.tsx @@ -16,6 +16,7 @@ vi.mock("@/utils/proxyUtils", () => ({ let mockUseThemeImpl = () => ({ logoUrl: null as string | null }); let mockUseHealthReadinessImpl = () => ({ data: null as any }); let mockGetLocalStorageItemImpl = () => null as string | null; +let mockUseDisableShowPromptsImpl = () => false; vi.mock("@/contexts/ThemeContext", () => ({ useTheme: () => mockUseThemeImpl(), @@ -25,7 +26,12 @@ vi.mock("@/app/(dashboard)/hooks/healthReadiness/useHealthReadiness", () => ({ useHealthReadiness: () => mockUseHealthReadinessImpl(), })); +vi.mock("@/app/(dashboard)/hooks/useDisableShowPrompts", () => ({ + useDisableShowPrompts: () => mockUseDisableShowPromptsImpl(), +})); + vi.mock("@/utils/localStorageUtils", () => ({ + LOCAL_STORAGE_EVENT: "local-storage-change", getLocalStorageItem: () => mockGetLocalStorageItemImpl(), setLocalStorageItem: vi.fn(), removeLocalStorageItem: vi.fn(), diff --git a/ui/litellm-dashboard/src/components/survey/NudgePrompt.test.tsx b/ui/litellm-dashboard/src/components/survey/NudgePrompt.test.tsx new file mode 100644 index 0000000000..26db8a680c --- /dev/null +++ b/ui/litellm-dashboard/src/components/survey/NudgePrompt.test.tsx @@ -0,0 +1,101 @@ +import { render, screen } from "@testing-library/react"; +import { MessageSquare } from "lucide-react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { NudgePrompt } from "./NudgePrompt"; + +vi.mock("@/app/(dashboard)/hooks/useDisableShowPrompts", () => ({ + useDisableShowPrompts: vi.fn(), +})); + +vi.mock("@/utils/localStorageUtils", () => ({ + setLocalStorageItem: vi.fn(), + emitLocalStorageChange: vi.fn(), + LOCAL_STORAGE_EVENT: "local-storage-change", +})); + +import { useDisableShowPrompts } from "@/app/(dashboard)/hooks/useDisableShowPrompts"; +import { emitLocalStorageChange, setLocalStorageItem } from "@/utils/localStorageUtils"; + +const mockUseDisableShowPrompts = vi.mocked(useDisableShowPrompts); +const mockSetLocalStorageItem = vi.mocked(setLocalStorageItem); +const mockEmitLocalStorageChange = vi.mocked(emitLocalStorageChange); + +const defaultProps = { + onOpen: vi.fn(), + onDismiss: vi.fn(), + isVisible: true, + title: "Test Title", + description: "Test Description", + buttonText: "Open Modal", + icon: MessageSquare, + accentColor: "#3b82f6", +}; + +describe("NudgePrompt", () => { + beforeEach(() => { + vi.clearAllMocks(); + mockUseDisableShowPrompts.mockReturnValue(false); + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should render", () => { + render(); + + expect(screen.getByText("Test Title")).toBeInTheDocument(); + }); + + it("should render with all provided props", () => { + const { container } = render(); + + expect(screen.getByText("Test Title")).toBeInTheDocument(); + expect(screen.getByText("Test Description")).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Open Modal" })).toBeInTheDocument(); + expect(container.querySelector("svg")).toBeInTheDocument(); + }); + + it("should not render when isVisible is false", () => { + render(); + + expect(screen.queryByText("Test Title")).not.toBeInTheDocument(); + }); + + it("should not render when disableShowPrompts is true", () => { + mockUseDisableShowPrompts.mockReturnValue(true); + + render(); + + expect(screen.queryByText("Test Title")).not.toBeInTheDocument(); + }); + + it("should display progress bar with correct accent color", () => { + const { container } = render(); + + const progressBar = container.querySelector("div[style*='width']"); + expect(progressBar).toHaveStyle({ backgroundColor: "#ff0000" }); + }); + + it("should reset progress when isVisible becomes false", () => { + const { rerender, container } = render(); + + vi.advanceTimersByTime(5000); + + rerender(); + + rerender(); + + const progressBar = container.querySelector("div[style*='width']"); + expect(progressBar?.getAttribute("style")).toContain("width: 100%"); + }); + + it("should apply custom button style when provided", () => { + const buttonStyle = { backgroundColor: "#custom-color" }; + render(); + + const openButton = screen.getByRole("button", { name: "Open Modal" }); + expect(openButton).toHaveStyle(buttonStyle); + }); +}); diff --git a/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx b/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx index ef72144b89..3c7f10af74 100644 --- a/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx +++ b/ui/litellm-dashboard/src/components/survey/NudgePrompt.tsx @@ -138,7 +138,7 @@ export function NudgePrompt({ onClick={handleDontAskAgain} className="text-xs" > - Don't ask me again + Don't ask me again From c70d04d85f7a6dbc1170b492cbd80640c5dbe5a8 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 08:07:36 +0530 Subject: [PATCH 32/38] Fix: A2A Python SDK URL --- docs/my-website/docs/a2a.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/my-website/docs/a2a.md b/docs/my-website/docs/a2a.md index d7145e4b83..2b4a710c7d 100644 --- a/docs/my-website/docs/a2a.md +++ b/docs/my-website/docs/a2a.md @@ -68,7 +68,7 @@ Follow [this guide, to add your pydantic ai agent to LiteLLM Agent Gateway](./pr ## Invoking your Agents -Use the [A2A Python SDK](https://pypi.org/project/a2a/) to invoke agents through LiteLLM. +Use the [A2A Python SDK](https://pypi.org/project/a2a-sdk) to invoke agents through LiteLLM. This example shows how to: 1. **List available agents** - Query `/v1/agents` to see which agents your key can access From 52d73c2c16a25c477fad33260f968b4bc4eae5e8 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 26 Jan 2026 19:23:43 -0800 Subject: [PATCH 33/38] [Feat] Add UI for /rag/ingest API - upload docs, pdfs etc to create vector stores (#19822) * feat: _save_vector_store_to_db_from_rag_ingest * UI features for RAG ingest * fix: Endpoints * ragIngestCall * _save_vector_store_to_db_from_rag_ingest * fix: rag_ingest Code QA CHECK * UI fixes unit tests --- litellm/proxy/rag_endpoints/endpoints.py | 198 ++++++++++ .../management_endpoints.py | 185 +++++++--- .../src/components/networking.tsx | 56 +++ .../CreateVectorStore.test.tsx | 166 +++++++++ .../CreateVectorStore.tsx | 340 ++++++++++++++++++ .../DocumentsTable.test.tsx | 102 ++++++ .../DocumentsTable.tsx | 98 +++++ .../TestVectorStoreTab.test.tsx | 90 +++++ .../TestVectorStoreTab.tsx | 75 ++++ .../VectorStoreTable.test.tsx | 12 +- .../VectorStoreTable.tsx | 26 ++ .../vector_store_management/index.tsx | 56 ++- .../vector_store_management/types.tsx | 45 ++- 13 files changed, 1374 insertions(+), 75 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.test.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.test.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.tsx diff --git a/litellm/proxy/rag_endpoints/endpoints.py b/litellm/proxy/rag_endpoints/endpoints.py index 79b4fd6873..79f182817f 100644 --- a/litellm/proxy/rag_endpoints/endpoints.py +++ b/litellm/proxy/rag_endpoints/endpoints.py @@ -26,6 +26,184 @@ from litellm.proxy.common_utils.http_parsing_utils import ( router = APIRouter() +def _build_file_metadata_entry( + response: Any, + file_data: Optional[Tuple[str, bytes, str]] = None, + file_url: Optional[str] = None, +) -> Dict[str, Any]: + """ + Build a file metadata entry for storing in vector_store_metadata. + + Args: + response: The response from litellm.aingest containing file_id + file_data: Optional tuple of (filename, content, content_type) + file_url: Optional URL if file was ingested from URL + + Returns: + Dictionary with file metadata (file_id, filename, file_url, ingested_at, etc.) + """ + from datetime import datetime, timezone + + # Extract file_id from response + file_id = None + if hasattr(response, "get"): + file_id = response.get("file_id") + elif hasattr(response, "file_id"): + file_id = response.file_id + + # Extract file information from file_data tuple + filename = None + file_size = None + content_type = None + + if file_data: + filename = file_data[0] + file_size = len(file_data[1]) if len(file_data) > 1 else None + content_type = file_data[2] if len(file_data) > 2 else None + + # Build file metadata entry + file_entry = { + "file_id": file_id, + "filename": filename, + "file_url": file_url, + "ingested_at": datetime.now(timezone.utc).isoformat(), + } + + # Add optional fields if available + if file_size is not None: + file_entry["file_size"] = file_size + if content_type is not None: + file_entry["content_type"] = content_type + + return file_entry + + +async def _save_vector_store_to_db_from_rag_ingest( + response: Any, + ingest_options: Dict[str, Any], + prisma_client, + user_api_key_dict: UserAPIKeyAuth, + file_data: Optional[Tuple[str, bytes, str]] = None, + file_url: Optional[str] = None, +) -> None: + """ + Helper function to save a newly created vector store from RAG ingest to the database. + + This function: + - Extracts vector store ID and config from the ingest response + - Checks if the vector store already exists in the database + - Creates a new database entry if it doesn't exist + - Adds the vector store to the registry + + Args: + response: The response from litellm.aingest() + ingest_options: The ingest options containing vector store config + prisma_client: The Prisma database client + user_api_key_dict: User API key authentication info + """ + from litellm.proxy.vector_store_endpoints.management_endpoints import ( + create_vector_store_in_db, + ) + + # Handle both dict and object responses + if hasattr(response, "get"): + vector_store_id = response.get("vector_store_id") + elif hasattr(response, "vector_store_id"): + vector_store_id = response.vector_store_id + else: + verbose_proxy_logger.warning( + f"Unable to extract vector_store_id from response type: {type(response)}" + ) + return + + if vector_store_id is None or not isinstance(vector_store_id, str): + verbose_proxy_logger.warning( + "Vector store ID is None or not a string, skipping database save" + ) + return + + vector_store_config = ingest_options.get("vector_store", {}) + custom_llm_provider = vector_store_config.get("custom_llm_provider") + + # Extract litellm_vector_store_params for custom name and description + litellm_vector_store_params = ingest_options.get("litellm_vector_store_params", {}) + custom_vector_store_name = litellm_vector_store_params.get("vector_store_name") + custom_vector_store_description = litellm_vector_store_params.get("vector_store_description") + + # Build file metadata entry using helper + file_entry = _build_file_metadata_entry( + response=response, + file_data=file_data, + file_url=file_url, + ) + + try: + # Check if vector store already exists in database + existing_vector_store = ( + await prisma_client.db.litellm_managedvectorstorestable.find_unique( + where={"vector_store_id": vector_store_id} + ) + ) + + # Only create if it doesn't exist + if existing_vector_store is None: + verbose_proxy_logger.info( + f"Saving newly created vector store {vector_store_id} to database" + ) + + # Initialize metadata with first file + initial_metadata = { + "ingested_files": [file_entry] + } + + # Use custom name if provided, otherwise default + vector_store_name = custom_vector_store_name or f"RAG Vector Store - {vector_store_id[:8]}" + vector_store_description = custom_vector_store_description or "Created via RAG ingest endpoint" + + await create_vector_store_in_db( + vector_store_id=vector_store_id, + custom_llm_provider=custom_llm_provider or "openai", + prisma_client=prisma_client, + vector_store_name=vector_store_name, + vector_store_description=vector_store_description, + vector_store_metadata=initial_metadata, + ) + + verbose_proxy_logger.info( + f"Vector store {vector_store_id} saved to database successfully" + ) + else: + verbose_proxy_logger.info( + f"Vector store {vector_store_id} already exists, appending file to metadata" + ) + + # Update existing vector store with new file + existing_metadata = existing_vector_store.vector_store_metadata or {} + if isinstance(existing_metadata, str): + import json + existing_metadata = json.loads(existing_metadata) + + ingested_files = existing_metadata.get("ingested_files", []) + ingested_files.append(file_entry) + existing_metadata["ingested_files"] = ingested_files + + # Update the vector store + from litellm.proxy.utils import safe_dumps + await prisma_client.db.litellm_managedvectorstorestable.update( + where={"vector_store_id": vector_store_id}, + data={"vector_store_metadata": safe_dumps(existing_metadata)} + ) + + verbose_proxy_logger.info( + f"Added file {file_entry.get('filename') or file_entry.get('file_url', 'Unknown')} to vector store {vector_store_id} metadata" + ) + except Exception as db_error: + # Log the error but don't fail the request since ingestion succeeded + verbose_proxy_logger.exception( + f"Failed to save vector store {vector_store_id} to database: {db_error}" + ) + + async def parse_rag_ingest_request( request: Request, ) -> Tuple[Dict[str, Any], Optional[Tuple[str, bytes, str]], Optional[str], Optional[str]]: @@ -158,6 +336,7 @@ async def rag_ingest( add_litellm_data_to_request, general_settings, llm_router, + prisma_client, proxy_config, version, ) @@ -189,6 +368,25 @@ async def rag_ingest( **request_data, ) + # Save vector store to database if it was newly created and prisma_client is available + verbose_proxy_logger.debug( + f"RAG Ingest - Checking database save conditions: prisma_client={prisma_client is not None}, response={response is not None}, response_type={type(response)}" + ) + + if prisma_client is not None and response is not None: + await _save_vector_store_to_db_from_rag_ingest( + response=response, + ingest_options=ingest_options, + prisma_client=prisma_client, + user_api_key_dict=user_api_key_dict, + file_data=file_data, + file_url=file_url, + ) + else: + verbose_proxy_logger.warning( + f"Skipping database save: prisma_client={prisma_client is not None}, response={response is not None}" + ) + return response except HTTPException: diff --git a/litellm/proxy/vector_store_endpoints/management_endpoints.py b/litellm/proxy/vector_store_endpoints/management_endpoints.py index bc61a60fe5..f3787e62f4 100644 --- a/litellm/proxy/vector_store_endpoints/management_endpoints.py +++ b/litellm/proxy/vector_store_endpoints/management_endpoints.py @@ -133,6 +133,112 @@ async def _resolve_embedding_config_from_db( return None +######################################################## +# Helper Functions +######################################################## +async def create_vector_store_in_db( + vector_store_id: str, + custom_llm_provider: str, + prisma_client, + vector_store_name: Optional[str] = None, + vector_store_description: Optional[str] = None, + vector_store_metadata: Optional[Dict] = None, + litellm_params: Optional[Dict] = None, + litellm_credential_name: Optional[str] = None, +) -> LiteLLM_ManagedVectorStore: + """ + Helper function to create a vector store in the database. + + This function handles: + - Checking if vector store already exists + - Creating the vector store in the database + - Adding it to the vector store registry + + Returns: + LiteLLM_ManagedVectorStore: The created vector store object + + Raises: + HTTPException: If vector store already exists or database error occurs + """ + from litellm.types.router import GenericLiteLLMParams + + if prisma_client is None: + raise HTTPException(status_code=500, detail="Database not connected") + + # Check if vector store already exists + existing_vector_store = ( + await prisma_client.db.litellm_managedvectorstorestable.find_unique( + where={"vector_store_id": vector_store_id} + ) + ) + if existing_vector_store is not None: + raise HTTPException( + status_code=400, + detail=f"Vector store with ID {vector_store_id} already exists", + ) + + # Prepare data for database + data_to_create: Dict[str, Any] = { + "vector_store_id": vector_store_id, + "custom_llm_provider": custom_llm_provider, + } + + if vector_store_name is not None: + data_to_create["vector_store_name"] = vector_store_name + if vector_store_description is not None: + data_to_create["vector_store_description"] = vector_store_description + if vector_store_metadata is not None: + data_to_create["vector_store_metadata"] = safe_dumps(vector_store_metadata) + if litellm_credential_name is not None: + data_to_create["litellm_credential_name"] = litellm_credential_name + + # Handle litellm_params - always provide at least an empty dict + if litellm_params: + # Auto-resolve embedding config if embedding model is provided but config is not + embedding_model = litellm_params.get("litellm_embedding_model") + if embedding_model and not litellm_params.get("litellm_embedding_config"): + resolved_config = await _resolve_embedding_config_from_db( + embedding_model=embedding_model, + prisma_client=prisma_client + ) + if resolved_config: + litellm_params["litellm_embedding_config"] = resolved_config + verbose_proxy_logger.info( + f"Auto-resolved embedding config for model {embedding_model}" + ) + + litellm_params_dict = GenericLiteLLMParams( + **litellm_params + ).model_dump(exclude_none=True) + data_to_create["litellm_params"] = safe_dumps(litellm_params_dict) + else: + # Provide empty dict if no litellm_params provided + data_to_create["litellm_params"] = safe_dumps({}) + + # Create in database + _new_vector_store = ( + await prisma_client.db.litellm_managedvectorstorestable.create( + data=data_to_create + ) + ) + + new_vector_store: LiteLLM_ManagedVectorStore = LiteLLM_ManagedVectorStore( + **_new_vector_store.model_dump() + ) + + # Add vector store to registry + if litellm.vector_store_registry is not None: + litellm.vector_store_registry.add_vector_store_to_registry( + vector_store=new_vector_store + ) + + verbose_proxy_logger.info( + f"Vector store {vector_store_id} created in database successfully" + ) + + return new_vector_store + + ######################################################## # Management Endpoints ######################################################## @@ -156,71 +262,34 @@ async def new_vector_store( - vector_store_metadata: Optional[Dict] - Additional metadata for the vector store """ from litellm.proxy.proxy_server import prisma_client - from litellm.types.router import GenericLiteLLMParams - - if prisma_client is None: - raise HTTPException(status_code=500, detail="Database not connected") try: - # Check if vector store already exists - existing_vector_store = ( - await prisma_client.db.litellm_managedvectorstorestable.find_unique( - where={"vector_store_id": vector_store.get("vector_store_id")} - ) - ) - if existing_vector_store is not None: + vector_store_id = vector_store.get("vector_store_id") + custom_llm_provider = vector_store.get("custom_llm_provider") + + if not vector_store_id or not custom_llm_provider: raise HTTPException( status_code=400, - detail=f"Vector store with ID {vector_store.get('vector_store_id')} already exists", - ) - - if vector_store.get("vector_store_metadata") is not None: - vector_store["vector_store_metadata"] = safe_dumps( - vector_store.get("vector_store_metadata") - ) - - # Safely handle JSON serialization of litellm_params - litellm_params_json: Optional[str] = None - _input_litellm_params: dict = vector_store.get("litellm_params", {}) or {} - if _input_litellm_params is not None: - # Auto-resolve embedding config if embedding model is provided but config is not - embedding_model = _input_litellm_params.get("litellm_embedding_model") - if embedding_model and not _input_litellm_params.get("litellm_embedding_config"): - resolved_config = await _resolve_embedding_config_from_db( - embedding_model=embedding_model, - prisma_client=prisma_client - ) - if resolved_config: - _input_litellm_params["litellm_embedding_config"] = resolved_config - verbose_proxy_logger.info( - f"Auto-resolved embedding config for model {embedding_model}" - ) - - litellm_params_dict = GenericLiteLLMParams( - **_input_litellm_params - ).model_dump(exclude_none=True) - litellm_params_json = safe_dumps(litellm_params_dict) - del vector_store["litellm_params"] - - _new_vector_store = ( - await prisma_client.db.litellm_managedvectorstorestable.create( - data={ - **vector_store, - "litellm_params": litellm_params_json, - } + detail="vector_store_id and custom_llm_provider are required" ) + + # Extract and validate metadata + metadata = vector_store.get("vector_store_metadata") + validated_metadata: Optional[Dict] = None + if metadata is not None and isinstance(metadata, dict): + validated_metadata = metadata + + new_vector_store = await create_vector_store_in_db( + vector_store_id=vector_store_id, + custom_llm_provider=custom_llm_provider, + prisma_client=prisma_client, + vector_store_name=vector_store.get("vector_store_name"), + vector_store_description=vector_store.get("vector_store_description"), + vector_store_metadata=validated_metadata, + litellm_params=vector_store.get("litellm_params"), + litellm_credential_name=vector_store.get("litellm_credential_name"), ) - new_vector_store: LiteLLM_ManagedVectorStore = LiteLLM_ManagedVectorStore( - **_new_vector_store.model_dump() - ) - - # Add vector store to registry - if litellm.vector_store_registry is not None: - litellm.vector_store_registry.add_vector_store_to_registry( - vector_store=new_vector_store - ) - return { "status": "success", "message": f"Vector store {vector_store.get('vector_store_id')} created successfully", diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 6c8fb6f834..a1625b6ffb 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -6948,6 +6948,62 @@ export const vectorStoreUpdateCall = async (accessToken: string, formValues: Rec } }; +export const ragIngestCall = async ( + accessToken: string, + file: File, + customLlmProvider: string, + vectorStoreId?: string, + vectorStoreName?: string, + vectorStoreDescription?: string +): Promise => { + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/rag/ingest` : `/rag/ingest`; + + const formData = new FormData(); + formData.append("file", file); + + const ingestOptions: any = { + ingest_options: { + vector_store: { + custom_llm_provider: customLlmProvider, + ...(vectorStoreId && { vector_store_id: vectorStoreId }), + }, + }, + }; + + // Add litellm_vector_store_params if name or description provided + if (vectorStoreName || vectorStoreDescription) { + ingestOptions.ingest_options.litellm_vector_store_params = {}; + if (vectorStoreName) { + ingestOptions.ingest_options.litellm_vector_store_params.vector_store_name = vectorStoreName; + } + if (vectorStoreDescription) { + ingestOptions.ingest_options.litellm_vector_store_params.vector_store_description = vectorStoreDescription; + } + } + + formData.append("request", JSON.stringify(ingestOptions)); + + const response = await fetch(url, { + method: "POST", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + }, + body: formData, + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error?.message || error.detail || "Failed to ingest document"); + } + + return await response.json(); + } catch (error) { + console.error("Error ingesting document:", error); + throw error; + } +}; + export const getEmailEventSettings = async (accessToken: string): Promise => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/email/event_settings` : `/email/event_settings`; diff --git a/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx new file mode 100644 index 0000000000..db2975781b --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx @@ -0,0 +1,166 @@ +import { render, screen, fireEvent, waitFor, act } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import CreateVectorStore from "./CreateVectorStore"; +import * as networking from "../networking"; + +// Mock the networking module +vi.mock("../networking", () => ({ + ragIngestCall: vi.fn(), +})); + +// Mock NotificationsManager +vi.mock("../molecules/notifications_manager", () => ({ + default: { + success: vi.fn(), + fromBackend: vi.fn(), + }, +})); + +// Mock vector_store_providers +vi.mock("../vector_store_providers", () => ({ + VectorStoreProviders: { + BEDROCK: "Amazon Bedrock", + OPENAI: "OpenAI", + AZURE_OPENAI: "Azure OpenAI", + }, + vectorStoreProviderMap: { + BEDROCK: "bedrock", + OPENAI: "openai", + AZURE_OPENAI: "azure_openai", + }, + vectorStoreProviderLogoMap: { + "Amazon Bedrock": "https://example.com/bedrock.png", + "OpenAI": "https://example.com/openai.png", + "Azure OpenAI": "https://example.com/azure.png", + }, +})); + +describe("CreateVectorStore", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render the component successfully", () => { + render(); + + expect(screen.getByText("Create Vector Store")).toBeInTheDocument(); + expect(screen.getByText("Step 1: Upload Documents")).toBeInTheDocument(); + expect(screen.getByText("Step 2: Select Provider")).toBeInTheDocument(); + }); + + it("should display upload area with correct text", () => { + render(); + + expect(screen.getByText("Click or drag files to this area to upload")).toBeInTheDocument(); + expect(screen.getByText(/Support for single or bulk upload/)).toBeInTheDocument(); + }); + + it("should have provider selection dropdown", () => { + render(); + + expect(screen.getByText("Provider")).toBeInTheDocument(); + }); + + it("should have create button disabled initially when no documents", () => { + render(); + + const createButton = screen.getByRole("button", { name: /Create Vector Store/i }); + expect(createButton).toBeDisabled(); + }); + + it("should show uploaded documents table when files are added", async () => { + render(); + + // Create a mock file + const file = new File(["test content"], "test.pdf", { type: "application/pdf" }); + + // Find the upload input (it's hidden but accessible) + const uploadInput = document.querySelector('input[type="file"]') as HTMLInputElement; + + await act(async () => { + if (uploadInput) { + fireEvent.change(uploadInput, { target: { files: [file] } }); + } + }); + + await waitFor(() => { + expect(screen.getByText("Uploaded Documents (1)")).toBeInTheDocument(); + }); + }); + + it("should call ragIngestCall when create button is clicked", async () => { + const mockRagIngestCall = vi.spyOn(networking, "ragIngestCall"); + mockRagIngestCall.mockResolvedValue({ + id: "test-id", + status: "completed", + vector_store_id: "vs_123", + file_id: "file_123", + }); + + const onSuccess = vi.fn(); + render(); + + // Create a mock file + const file = new File(["test content"], "test.pdf", { type: "application/pdf" }); + const uploadInput = document.querySelector('input[type="file"]') as HTMLInputElement; + + await act(async () => { + if (uploadInput) { + fireEvent.change(uploadInput, { target: { files: [file] } }); + } + }); + + // Wait for file to be added + await waitFor(() => { + expect(screen.getByText("Uploaded Documents (1)")).toBeInTheDocument(); + }); + + // Click create button + const createButton = screen.getByRole("button", { name: /Create Vector Store/i }); + + await act(async () => { + fireEvent.click(createButton); + }); + + await waitFor(() => { + expect(mockRagIngestCall).toHaveBeenCalledWith("test-token", expect.any(File), "bedrock", undefined); + }); + }); + + it("should display success message after successful creation", async () => { + const mockRagIngestCall = vi.spyOn(networking, "ragIngestCall"); + mockRagIngestCall.mockResolvedValue({ + id: "test-id", + status: "completed", + vector_store_id: "vs_123", + file_id: "file_123", + }); + + render(); + + // Create and upload a mock file + const file = new File(["test content"], "test.pdf", { type: "application/pdf" }); + const uploadInput = document.querySelector('input[type="file"]') as HTMLInputElement; + + await act(async () => { + if (uploadInput) { + fireEvent.change(uploadInput, { target: { files: [file] } }); + } + }); + + await waitFor(() => { + expect(screen.getByText("Uploaded Documents (1)")).toBeInTheDocument(); + }); + + // Click create button + const createButton = screen.getByRole("button", { name: /Create Vector Store/i }); + + await act(async () => { + fireEvent.click(createButton); + }); + + await waitFor(() => { + expect(screen.getByText("Vector Store Created Successfully")).toBeInTheDocument(); + }); + }); +}); diff --git a/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx new file mode 100644 index 0000000000..685e37ac73 --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx @@ -0,0 +1,340 @@ +import React, { useState } from "react"; +import { Card, Title, Text } from "@tremor/react"; +import { Upload, Button, Select, Form, message, Alert, Tooltip, Input } from "antd"; +import { InboxOutlined, InfoCircleOutlined } from "@ant-design/icons"; +import type { UploadProps } from "antd"; +import { ragIngestCall } from "../networking"; +import { DocumentUpload, RAGIngestResponse } from "./types"; +import DocumentsTable from "./DocumentsTable"; +import { + VectorStoreProviders, + vectorStoreProviderLogoMap, + vectorStoreProviderMap, +} from "../vector_store_providers"; +import NotificationsManager from "../molecules/notifications_manager"; + +const { Dragger } = Upload; + +interface CreateVectorStoreProps { + accessToken: string | null; + onSuccess?: (vectorStoreId: string) => void; +} + +const CreateVectorStore: React.FC = ({ accessToken, onSuccess }) => { + const [form] = Form.useForm(); + const [documents, setDocuments] = useState([]); + const [isCreating, setIsCreating] = useState(false); + const [selectedProvider, setSelectedProvider] = useState("bedrock"); + const [vectorStoreName, setVectorStoreName] = useState(""); + const [vectorStoreDescription, setVectorStoreDescription] = useState(""); + const [ingestResults, setIngestResults] = useState([]); + + const uploadProps: UploadProps = { + name: "file", + multiple: true, + accept: ".pdf,.txt,.docx,.md,.doc", + beforeUpload: (file) => { + const isValidType = [ + "application/pdf", + "text/plain", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/msword", + "text/markdown", + ].includes(file.type); + + if (!isValidType) { + message.error(`${file.name} is not a supported file type. Please upload PDF, TXT, DOCX, or MD files.`); + return Upload.LIST_IGNORE; + } + + const isLt50M = file.size / 1024 / 1024 < 50; + if (!isLt50M) { + message.error(`${file.name} must be smaller than 50MB!`); + return Upload.LIST_IGNORE; + } + + const newDoc: DocumentUpload = { + uid: file.uid, + name: file.name, + status: "done", + size: file.size, + type: file.type, + originFileObj: file, + }; + + setDocuments((prev) => [...prev, newDoc]); + return false; // Prevent auto upload + }, + onRemove: (file) => { + setDocuments((prev) => prev.filter((doc) => doc.uid !== file.uid)); + }, + fileList: documents.map((doc) => ({ + uid: doc.uid, + name: doc.name, + status: doc.status, + size: doc.size, + })), + showUploadList: false, // We'll use our custom table + }; + + const handleRemoveDocument = (uid: string) => { + setDocuments((prev) => prev.filter((doc) => doc.uid !== uid)); + }; + + const handleCreateVectorStore = async () => { + if (documents.length === 0) { + message.warning("Please upload at least one document"); + return; + } + + if (!selectedProvider) { + message.warning("Please select a provider"); + return; + } + + if (!accessToken) { + message.error("No access token available"); + return; + } + + setIsCreating(true); + const results: RAGIngestResponse[] = []; + let vectorStoreId: string | undefined; + + try { + // Ingest each document + for (const doc of documents) { + if (!doc.originFileObj) continue; + + // Update document status to uploading + setDocuments((prev) => + prev.map((d) => (d.uid === doc.uid ? { ...d, status: "uploading" as const } : d)) + ); + + try { + const result = await ragIngestCall( + accessToken, + doc.originFileObj, + selectedProvider, + vectorStoreId, // Use the same vector store ID for subsequent uploads + vectorStoreName || undefined, + vectorStoreDescription || undefined + ); + + // Store the vector store ID from the first successful ingest + if (!vectorStoreId && result.vector_store_id) { + vectorStoreId = result.vector_store_id; + } + + results.push(result); + + // Update document status to done + setDocuments((prev) => + prev.map((d) => (d.uid === doc.uid ? { ...d, status: "done" as const } : d)) + ); + } catch (error) { + console.error(`Error ingesting ${doc.name}:`, error); + // Update document status to error + setDocuments((prev) => + prev.map((d) => (d.uid === doc.uid ? { ...d, status: "error" as const } : d)) + ); + throw error; // Stop processing on first error + } + } + + setIngestResults(results); + NotificationsManager.success( + `Successfully created vector store with ${results.length} document(s). Vector Store ID: ${vectorStoreId}` + ); + + if (onSuccess && vectorStoreId) { + onSuccess(vectorStoreId); + } + + // Clear documents after successful creation + setTimeout(() => { + setDocuments([]); + setIngestResults([]); + }, 3000); + } catch (error) { + console.error("Error creating vector store:", error); + NotificationsManager.fromBackend(`Failed to create vector store: ${error}`); + } finally { + setIsCreating(false); + } + }; + + return ( +
      +
      + Create Vector Store + + Upload documents and select a provider to create a new vector store with embedded content. + +
      + + {/* Upload Area */} + +
      + Step 1: Upload Documents + + Upload one or more documents (PDF, TXT, DOCX, MD). Maximum file size: 50MB per file. + +
      + +

      + +

      +

      Click or drag files to this area to upload

      +

      + Support for single or bulk upload. Supported formats: PDF, TXT, DOCX, MD +

      +
      +
      + + {/* Documents Table */} + {documents.length > 0 && ( + +
      + Uploaded Documents ({documents.length}) +
      + +
      + )} + + {/* Provider Selection and Vector Store Details */} + +
      +
      + Step 2: Configure Vector Store + + Choose the provider and optionally provide a name and description for your vector store. + +
      + +
      + + Vector Store Name{" "} + + + + + } + > + setVectorStoreName(e.target.value)} + placeholder="e.g., Product Documentation, Customer Support KB" + size="large" + className="rounded-md" + /> + + + + Description{" "} + + + + + } + > + setVectorStoreDescription(e.target.value)} + placeholder="e.g., Contains all product documentation and user guides" + rows={2} + size="large" + className="rounded-md" + /> + + + + Provider{" "} + + + + + } + required + > + + +
      + +
      + +
      +
      +
      + + {/* Success Message */} + {ingestResults.length > 0 && ( + +

      + Vector Store ID: {ingestResults[0]?.vector_store_id} +

      +

      + Documents Ingested: {ingestResults.length} +

      +
      + } + type="success" + showIcon + closable + /> + )} + + ); +}; + +export default CreateVectorStore; diff --git a/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.test.tsx b/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.test.tsx new file mode 100644 index 0000000000..761bc2b7df --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.test.tsx @@ -0,0 +1,102 @@ +import { render, screen, fireEvent, act } from "@testing-library/react"; +import { describe, it, expect, vi } from "vitest"; +import DocumentsTable from "./DocumentsTable"; +import { DocumentUpload } from "./types"; + +// Mock antd message +vi.mock("antd", async () => { + const actual = await vi.importActual("antd"); + return { + ...actual, + message: { + success: vi.fn(), + }, + }; +}); + +describe("DocumentsTable", () => { + const mockDocuments: DocumentUpload[] = [ + { + uid: "1", + name: "test1.pdf", + status: "done", + size: 1024000, + type: "application/pdf", + }, + { + uid: "2", + name: "test2.txt", + status: "uploading", + size: 2048000, + type: "text/plain", + }, + { + uid: "3", + name: "test3.docx", + status: "error", + size: 512000, + type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + }, + ]; + + it("should render the table successfully", () => { + const onRemove = vi.fn(); + render(); + + expect(screen.getByText("test1.pdf")).toBeInTheDocument(); + expect(screen.getByText("test2.txt")).toBeInTheDocument(); + expect(screen.getByText("test3.docx")).toBeInTheDocument(); + }); + + it("should display correct status badges", () => { + const onRemove = vi.fn(); + render(); + + expect(screen.getByText("Ready")).toBeInTheDocument(); + expect(screen.getByText("Uploading")).toBeInTheDocument(); + expect(screen.getByText("Error")).toBeInTheDocument(); + }); + + it("should display file sizes", () => { + const onRemove = vi.fn(); + render(); + + expect(screen.getByText(/1000.00 KB/)).toBeInTheDocument(); + expect(screen.getByText(/2.00 MB/)).toBeInTheDocument(); + expect(screen.getByText(/500.00 KB/)).toBeInTheDocument(); + }); + + it("should call onRemove when delete button is clicked", () => { + const onRemove = vi.fn(); + render(); + + const deleteButtons = screen.getAllByLabelText(/delete/i); + + act(() => { + fireEvent.click(deleteButtons[0]); + }); + + expect(onRemove).toHaveBeenCalledWith("1"); + }); + + it("should show empty state when no documents", () => { + const onRemove = vi.fn(); + render(); + + expect(screen.getByText(/No documents uploaded yet/)).toBeInTheDocument(); + }); + + it("should have action buttons for each document", () => { + const onRemove = vi.fn(); + render(); + + // Each document should have 3 action buttons (view, copy, delete) + const viewButtons = screen.getAllByLabelText(/eye/i); + const copyButtons = screen.getAllByLabelText(/copy/i); + const deleteButtons = screen.getAllByLabelText(/delete/i); + + expect(viewButtons).toHaveLength(3); + expect(copyButtons).toHaveLength(3); + expect(deleteButtons).toHaveLength(3); + }); +}); diff --git a/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.tsx b/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.tsx new file mode 100644 index 0000000000..aeb4240d36 --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/DocumentsTable.tsx @@ -0,0 +1,98 @@ +import React from "react"; +import { Table, Badge, Tooltip, message } from "antd"; +import { EyeOutlined, CopyOutlined, DeleteOutlined } from "@ant-design/icons"; +import { DocumentUpload } from "./types"; + +interface DocumentsTableProps { + documents: DocumentUpload[]; + onRemove: (uid: string) => void; +} + +const DocumentsTable: React.FC = ({ documents, onRemove }) => { + const handleCopyId = (uid: string) => { + navigator.clipboard.writeText(uid); + message.success("Document ID copied to clipboard"); + }; + + const getStatusBadge = (status: DocumentUpload["status"]) => { + const statusConfig = { + uploading: { color: "blue", text: "Uploading" }, + done: { color: "green", text: "Ready" }, + error: { color: "red", text: "Error" }, + removed: { color: "default", text: "Removed" }, + }; + + const config = statusConfig[status]; + return ; + }; + + const formatFileSize = (bytes?: number) => { + if (!bytes) return "-"; + const kb = bytes / 1024; + if (kb < 1024) return `${kb.toFixed(2)} KB`; + return `${(kb / 1024).toFixed(2)} MB`; + }; + + const columns = [ + { + title: "Name", + dataIndex: "name", + key: "name", + render: (name: string, record: DocumentUpload) => ( +
      + {name} + {record.size && ({formatFileSize(record.size)})} +
      + ), + }, + { + title: "Status", + dataIndex: "status", + key: "status", + width: 150, + render: (status: DocumentUpload["status"]) => getStatusBadge(status), + }, + { + title: "Actions", + key: "actions", + width: 120, + render: (_: any, record: DocumentUpload) => ( +
      + + console.log("View", record)} + /> + + + handleCopyId(record.uid)} + /> + + + onRemove(record.uid)} + /> + +
      + ), + }, + ]; + + return ( + + ); +}; + +export default DocumentsTable; diff --git a/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.test.tsx b/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.test.tsx new file mode 100644 index 0000000000..ad6ef02e87 --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.test.tsx @@ -0,0 +1,90 @@ +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi } from "vitest"; +import TestVectorStoreTab from "./TestVectorStoreTab"; +import { VectorStore } from "./types"; + +// Mock VectorStoreTester component +vi.mock("./VectorStoreTester", () => ({ + VectorStoreTester: ({ vectorStoreId, accessToken }: { vectorStoreId: string; accessToken: string }) => ( +
      +
      {vectorStoreId}
      +
      {accessToken}
      +
      + ), +})); + +const mockVectorStores: VectorStore[] = [ + { + vector_store_id: "vs_123", + custom_llm_provider: "openai", + vector_store_name: "Test Store 1", + vector_store_description: "Description 1", + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }, + { + vector_store_id: "vs_456", + custom_llm_provider: "bedrock", + vector_store_name: "Test Store 2", + vector_store_description: "Description 2", + created_at: "2024-01-02T00:00:00Z", + updated_at: "2024-01-02T00:00:00Z", + }, +]; + +describe("TestVectorStoreTab", () => { + it("should render the component successfully", () => { + render(); + + expect(screen.getByText("Select Vector Store")).toBeInTheDocument(); + expect(screen.getByText("Choose a vector store to test search queries against")).toBeInTheDocument(); + }); + + it("should show message when no access token", () => { + render(); + + expect(screen.getByText("Access token is required to test vector stores.")).toBeInTheDocument(); + }); + + it("should show message when no vector stores available", () => { + render(); + + expect(screen.getByText("No vector stores available. Create one first to test it.")).toBeInTheDocument(); + }); + + it("should render VectorStoreTester with first vector store by default", () => { + render(); + + expect(screen.getByTestId("vector-store-tester")).toBeInTheDocument(); + expect(screen.getByTestId("tester-vector-store-id")).toHaveTextContent("vs_123"); + expect(screen.getByTestId("tester-access-token")).toHaveTextContent("test-token"); + }); + + it("should update VectorStoreTester when selecting different vector store", () => { + render(); + + // Find the select component + const selectElement = screen.getByRole("combobox"); + + // Change selection + fireEvent.mouseDown(selectElement); + + // Wait for options to appear and click the second one + const option2 = screen.getByText("Test Store 2"); + fireEvent.click(option2); + + // Verify the tester component updated + expect(screen.getByTestId("tester-vector-store-id")).toHaveTextContent("vs_456"); + }); + + it("should display vector store names in select options", () => { + render(); + + const selectElement = screen.getByRole("combobox"); + fireEvent.mouseDown(selectElement); + + // Use getAllByText since the selected value also shows the name + expect(screen.getAllByText("Test Store 1").length).toBeGreaterThan(0); + expect(screen.getByText("Test Store 2")).toBeInTheDocument(); + }); +}); diff --git a/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.tsx b/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.tsx new file mode 100644 index 0000000000..da005491ca --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/TestVectorStoreTab.tsx @@ -0,0 +1,75 @@ +import React, { useState } from "react"; +import { Card, Select, Typography } from "antd"; +import { VectorStoreTester } from "./VectorStoreTester"; +import { VectorStore } from "./types"; + +const { Text, Title } = Typography; + +interface TestVectorStoreTabProps { + accessToken: string | null; + vectorStores: VectorStore[]; +} + +const TestVectorStoreTab: React.FC = ({ accessToken, vectorStores }) => { + const [selectedVectorStoreId, setSelectedVectorStoreId] = useState( + vectorStores.length > 0 ? vectorStores[0].vector_store_id : undefined + ); + + if (!accessToken) { + return ( + + Access token is required to test vector stores. + + ); + } + + if (vectorStores.length === 0) { + return ( + +
      + No vector stores available. Create one first to test it. +
      +
      + ); + } + + return ( +
      + +
      +
      + Select Vector Store + Choose a vector store to test search queries against +
      + + +
      +
      + + {selectedVectorStoreId && ( + + )} +
      + ); +}; + +export default TestVectorStoreTab; diff --git a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.test.tsx b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.test.tsx index 65d15260c4..0e2be7f62d 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.test.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.test.tsx @@ -130,9 +130,9 @@ describe("VectorStoreTable", () => { expect(screen.getByText("Provider")).toBeInTheDocument(); expect(screen.getByText("Created At")).toBeInTheDocument(); expect(screen.getByText("Updated At")).toBeInTheDocument(); - // Check that we have the expected number of header cells (6 data + 1 actions) + // Check that we have the expected number of header cells (7 data + 1 actions) const headers = screen.getAllByRole("columnheader"); - expect(headers).toHaveLength(7); + expect(headers).toHaveLength(8); }); it("should render all vector store rows", () => { @@ -183,7 +183,7 @@ describe("VectorStoreTable", () => { it("should render fallback for missing name", () => { renderComponent(); const fallbackElements = screen.getAllByText("-"); - expect(fallbackElements.length).toBe(2); // One for missing name, one for missing description + expect(fallbackElements.length).toBe(3); // One for missing name, one for missing description, one for missing files }); it("should wrap name in tooltip", () => { @@ -203,7 +203,7 @@ describe("VectorStoreTable", () => { it("should render fallback for missing description", () => { renderComponent(); const fallbackElements = screen.getAllByText("-"); - expect(fallbackElements.length).toBe(2); // One for missing name, one for missing description + expect(fallbackElements.length).toBe(3); // One for missing name, one for missing description, one for missing files }); it("should wrap description in tooltip", () => { @@ -386,7 +386,7 @@ describe("VectorStoreTable", () => { it("should span all columns in empty state", () => { renderComponent({ data: [] }); const emptyCell = screen.getByText("No vector stores found").closest("td"); - expect(emptyCell).toHaveAttribute("colSpan", "7"); // 6 data columns + 1 actions column + expect(emptyCell).toHaveAttribute("colSpan", "8"); // 7 data columns + 1 actions column }); }); @@ -403,7 +403,7 @@ describe("VectorStoreTable", () => { renderComponent({ data: minimalData }); expect(screen.getByText("minimal")).toBeInTheDocument(); - expect(screen.getAllByText("-")).toHaveLength(2); // Name and description fallbacks + expect(screen.getAllByText("-")).toHaveLength(3); // Name, description, and files fallbacks }); it("should handle single vector store", () => { diff --git a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.tsx b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.tsx index 52462c02e9..41e2b63112 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/VectorStoreTable.tsx @@ -66,6 +66,32 @@ const VectorStoreTable: React.FC = ({ data, onView, onEdi ); }, }, + { + header: "Files", + accessorKey: "vector_store_metadata", + cell: ({ row }) => { + const vectorStore = row.original; + const ingestedFiles = vectorStore.vector_store_metadata?.ingested_files || []; + + if (ingestedFiles.length === 0) { + return -; + } + + const filenames = ingestedFiles + .map((file) => file.filename || file.file_url || "Unknown") + .join(", "); + + const displayText = ingestedFiles.length === 1 + ? ingestedFiles[0].filename || ingestedFiles[0].file_url || "1 file" + : `${ingestedFiles.length} files`; + + return ( + + {displayText} + + ); + }, + }, { header: "Provider", accessorKey: "custom_llm_provider", diff --git a/ui/litellm-dashboard/src/components/vector_store_management/index.tsx b/ui/litellm-dashboard/src/components/vector_store_management/index.tsx index 6d21e861d4..9cb57b8b9f 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/index.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/index.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { Icon, Button as TremorButton, Col, Text, Grid } from "@tremor/react"; +import { Icon, Button as TremorButton, Col, Text, Grid, TabGroup, TabList, Tab, TabPanels, TabPanel } from "@tremor/react"; import { RefreshIcon } from "@heroicons/react/outline"; import { vectorStoreListCall, vectorStoreDeleteCall, credentialListCall, CredentialItem } from "../networking"; import { VectorStore } from "./types"; @@ -7,6 +7,8 @@ import VectorStoreTable from "./VectorStoreTable"; import VectorStoreForm from "./VectorStoreForm"; import DeleteResourceModal from "../common_components/DeleteResourceModal"; import VectorStoreInfoView from "./vector_store_info"; +import CreateVectorStore from "./CreateVectorStore"; +import TestVectorStoreTab from "./TestVectorStoreTab"; import { isAdminRole } from "@/utils/roles"; import NotificationsManager from "../molecules/notifications_manager"; @@ -101,6 +103,12 @@ const VectorStoreManagement: React.FC = ({ accessToken, userID fetchVectorStores(); }; + const handleVectorStoreCreated = (vectorStoreId: string) => { + console.log("Vector store created:", vectorStoreId); + fetchVectorStores(); + // Optionally switch to the manage tab + }; + useEffect(() => { fetchVectorStores(); fetchCredentials(); @@ -134,18 +142,46 @@ const VectorStoreManagement: React.FC = ({ accessToken, userID -

      You can use vector stores to store and retrieve LLM embeddings..

      +

      You can use vector stores to store and retrieve LLM embeddings.

      - setIsCreateModalVisible(true)}> - + Add Vector Store - + + + Create Vector Store + Manage Vector Stores + Test Vector Store + - -
      - - - + + {/* Tab 1: Create Vector Store */} + + + + + {/* Tab 2: Manage Vector Stores */} + + setIsCreateModalVisible(true)}> + + Add Vector Store + + + + + + + + + + {/* Tab 3: Test Vector Store */} + + + + + {/* Create Vector Store Modal */} ; + vector_store_metadata?: VectorStoreMetadata; created_at: string; updated_at: string; created_by?: string; @@ -41,3 +55,32 @@ export interface VectorStoreListResponse { current_page: number; total_pages: number; } + +// Document ingestion types +export interface DocumentUpload { + uid: string; + name: string; + status: "uploading" | "done" | "error" | "removed"; + size?: number; + type?: string; + originFileObj?: File; +} + +export interface RAGIngestRequest { + file_url?: string; + file_id?: string; + ingest_options: { + vector_store: { + custom_llm_provider: string; + vector_store_id?: string; + }; + }; +} + +export interface RAGIngestResponse { + id: string; + status: "completed" | "processing" | "failed"; + vector_store_id: string; + file_id: string; + error?: string; +} From 014f783cc973f7dcdd0675bec53d50602e116fc6 Mon Sep 17 00:00:00 2001 From: Cesar Garcia <128240629+Chesars@users.noreply.github.com> Date: Tue, 27 Jan 2026 00:24:46 -0300 Subject: [PATCH 34/38] docs(readme): add OpenAI Agents SDK to OSS Adopters (#19820) * docs(readme): add OpenAI Agents SDK to OSS Adopters * docs(readme): add OpenAI Agents SDK logo --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 914fda384b..77adddf897 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,7 @@ Support for more providers. Missing a provider or LLM Platform, raise a [feature +
      Greptile OpenHands

      Netflix

      OpenAI Agents SDK
      From 664715b68efe539fd4dc38c3d1452f56cb134802 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Mon, 26 Jan 2026 20:11:56 -0800 Subject: [PATCH 35/38] Litellm release notes 01 26 2026 (#19836) * docs: document new models/endpoints * docs: cleanup * feat: update model table --- .../release_notes/v1.81.3-stable/index.md | 429 ++++++++++++++++++ 1 file changed, 429 insertions(+) create mode 100644 docs/my-website/release_notes/v1.81.3-stable/index.md diff --git a/docs/my-website/release_notes/v1.81.3-stable/index.md b/docs/my-website/release_notes/v1.81.3-stable/index.md new file mode 100644 index 0000000000..accacd0abd --- /dev/null +++ b/docs/my-website/release_notes/v1.81.3-stable/index.md @@ -0,0 +1,429 @@ +--- +title: "v1.81.3-stable - Performance - 25% CPU Usage Reduction" +slug: "v1-81-3" +date: 2026-01-26T10:00:00 +authors: + - name: Krrish Dholakia + title: CEO, LiteLLM + url: https://www.linkedin.com/in/krish-d/ + image_url: https://pbs.twimg.com/profile_images/1298587542745358340/DZv3Oj-h_400x400.jpg + - name: Ishaan Jaff + title: CTO, LiteLLM + url: https://www.linkedin.com/in/reffajnaahsi/ + image_url: https://pbs.twimg.com/profile_images/1613813310264340481/lz54oEiB_400x400.jpg +hide_table_of_contents: false +--- + +import Image from '@theme/IdealImage'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Deploy this version + + + + +``` showLineNumbers title="docker run litellm" +docker run \ +-e STORE_MODEL_IN_DB=True \ +-p 4000:4000 \ +docker.litellm.ai/berriai/litellm:v1.81.3.rc.2 +``` + + + + + +``` showLineNumbers title="pip install litellm" +pip install litellm==1.81.3.rc.2 +``` + + + + +--- + +## Key Highlights +[TODO] +--- + +[TODO] + +## New Models / Updated Models + +### New Model Support + +| Provider | Model | Context Window | Input ($/1M tokens) | Output ($/1M tokens) | Deprecation Date | +| -------- | ----- | -------------- | ------------------- | -------------------- | ---------------- | +| OpenAI | `gpt-audio`, `gpt-audio-2025-08-28` | 128K | $32/1M audio tokens, $2.5/1M text tokens | $64/1M audio tokens, $10/1M text tokens | - | +| OpenAI | `gpt-audio-mini`, `gpt-audio-mini-2025-08-28` | 128K | $10/1M audio tokens, $0.6/1M text tokens | $20/1M audio tokens, $2.4/1M text tokens | - | +| Deepinfra, Vertex AI, Google AI Studio, OpenRouter, Vercel AI Gateway | `gemini-2.0-flash-001`, `gemini-2.0-flash` | - | - | - | 2026-03-31 | +| Groq | `openai/gpt-oss-120b` | 131K | 0.075/1M cache read | 0.6/1M output tokens | - | +| Groq | `groq/openai/gpt-oss-20b` | 131K | 0.0375/1M cache read, $0.075/1M text tokens | 0.3/1M output tokens | - | +| Vertex AI | `gemini-2.5-computer-use-preview-10-2025` | 128K | $1.25 | $10 | - | +| Azure AI | `claude-haiku-4-5` | $1.25/1M cache read, $2/1M cache read above 1 hr, $0.1/1M text tokens | $5/1M output tokens | - | +| Azure AI | `claude-sonnet-4-5` | $3.75/1M cache read, $6/1M cache read above 1 hr, $3/1M text tokens | $15/1M output tokens | - | +| Azure AI | `claude-opus-4-5` | $6.25/1M cache read, $10/1M cache read above 1 hr, $0.5/1M text tokens | $25/1M output tokens | - | +| Azure AI | `claude-opus-4-1` | $18.75/1M cache read, $30/1M cache read above 1 hr, $1.5/1M text tokens | $75/1M output tokens | - | + +### Features + +- **[OpenAI](../../docs/providers/openai)** + - Add gpt-audio and gpt-audio-mini models to pricing - [PR #19509](https://github.com/BerriAI/litellm/pull/19509) + - correct audio token costs for gpt-4o-audio-preview models - [PR #19500](https://github.com/BerriAI/litellm/pull/19500) + - Limit stop sequence as per openai spec (ensures JetBrains IDE compatibility) - [PR #19562](https://github.com/BerriAI/litellm/pull/19562) + +- **[VertexAI](../../docs/providers/vertex)** + - Docs - Google Workload Identity Federation (WIF) support - [PR #19320](https://github.com/BerriAI/litellm/pull/19320) + +- **[Agentcore](../../docs/providers/bedrock_agentcore)** + - Fixes streaming issues with AWS Bedrock AgentCore where responses would stop after the first chunk, particularly affecting OAuth-enabled agents - [PR #17141](https://github.com/BerriAI/litellm/pull/17141) + +- **[Chatgpt](../../docs/providers/chatgpt)** + - Adds support for calling chatgpt subscription via LiteLLM - [PR #19030](https://github.com/BerriAI/litellm/pull/19030) + - Adds responses API bridge support for chatgpt subscription provider - [PR #19030](https://github.com/BerriAI/litellm/pull/19030) + +- **[Bedrock](../../docs/providers/bedrock)** + - support for output format for bedrock invoke via v1/messages - [PR #19560](https://github.com/BerriAI/litellm/pull/19560) + +- **[Azure](../../docs/providers/azure/azure)** + - Add support for Azure OpenAI v1 API - [PR #19313](https://github.com/BerriAI/litellm/pull/19313) + - preserve content_policy_violation details for images (#19328) - [PR #19372](https://github.com/BerriAI/litellm/pull/19372) + - Support OpenAI-format nested tool definitions for Responses API - [PR #19526](https://github.com/BerriAI/litellm/pull/19526) + +- **Gemini([Vertex AI](../../docs/providers/vertex), [Google AI Studio](../../docs/providers/gemini))** + - use responseJsonSchema for Gemini 2.0+ models - [PR #19314](https://github.com/BerriAI/litellm/pull/19314) + +- **[Volcengine](../../docs/providers/volcano)** + - Support Volcengine responses api - [PR #18508](https://github.com/BerriAI/litellm/pull/18508) + +- **[Anthropic](../../docs/providers/anthropic)** + - Add Support for calling Claude Code Max subscriptions via LiteLLM - [PR #19453](https://github.com/BerriAI/litellm/pull/19453) + - Add Structured output for /v1/messages with Anthropic API, Azure Anthropic API, Bedrock Converse - [PR #19545](https://github.com/BerriAI/litellm/pull/19545) + +- **[Brave Search](../../docs/search/brave)** + - New Search provider - [PR #19433](https://github.com/BerriAI/litellm/pull/19433) + +- **Sarvam ai** [TODO: MISSING DOCS] + - Add support for new sarvam models - [PR #19479](https://github.com/BerriAI/litellm/pull/19479) + +- **[GMI](../../docs/providers/gmi)** + - add GMI Cloud provider support - [PR #19376](https://github.com/BerriAI/litellm/pull/19376) + + +### Bug Fixes + +- **[Anthropic](../../docs/providers/anthropic)** + - Fix anthropic-beta sent client side being overridden instead of appended to - [PR #19343](https://github.com/BerriAI/litellm/pull/19343) + - Filter out unsupported fields from JSON schema for Anthropic's output_format API - [PR #19482](https://github.com/BerriAI/litellm/pull/19482) + +- **[Bedrock](../../docs/providers/bedrock)** + - Expose stability models via /image_edits endpoint and ensure proper request transformation - [PR #19323](https://github.com/BerriAI/litellm/pull/19323) + - Claude Code x Bedrock Invoke fails with advanced-tool-use-2025-11-20 - [PR #19373](https://github.com/BerriAI/litellm/pull/19373) + - deduplicate tool calls in assistant history - [PR #19324](https://github.com/BerriAI/litellm/pull/19324) + - fix: correct us.anthropic.claude-opus-4-5 In-region pricing - [PR #19310](https://github.com/BerriAI/litellm/pull/19310) + - Fix request validation errors when using Claude 4 via bedrock invoke - [PR #19381](https://github.com/BerriAI/litellm/pull/19381) + - Handle thinking with tool calls for Claude 4 models - [PR #19506](https://github.com/BerriAI/litellm/pull/19506) + - correct streaming choice index for tool calls - [PR #19506](https://github.com/BerriAI/litellm/pull/19506) + +- **[Ollama](../../docs/providers/ollama)** + - Fix tool call errors due with improved message extraction - [PR #19369](https://github.com/BerriAI/litellm/pull/19369) + +- **[VertexAI](../../docs/providers/vertex)** + - Removed optional vertex_count_tokens_location param before request is sent to vertex - [PR #19359](https://github.com/BerriAI/litellm/pull/19359) + +- **Gemini([Vertex AI](../../docs/providers/vertex), [Google AI Studio](../../docs/providers/gemini))** + - Supports setting media_resolution and fps parameters on each video file, when using Gemini video understanding - [PR #19273](https://github.com/BerriAI/litellm/pull/19273) + - handle reasoning_effort as dict from OpenAI Agents SDK - [PR #19419](https://github.com/BerriAI/litellm/pull/19419) + - add file content support in tool results - [PR #19416](https://github.com/BerriAI/litellm/pull/19416) + +- **[Azure](../../docs/providers/azure_ai)** + - Fix Azure AI costs for Anthropic models - [PR #19530](https://github.com/BerriAI/litellm/pull/19530) + +- **[Giga Chat](../../docs/providers/gigachat)** + - Add tool choice mapping - [PR #19645](https://github.com/BerriAI/litellm/pull/19645) +--- + +## AI API Endpoints (LLMs, MCP, Agents) + +### Features + +- **[Files API](../../docs/files_endpoints)** + - Add managed files support when load_balancing is True - [PR #19338](https://github.com/BerriAI/litellm/pull/19338) + +- **[Claude Plugin Marketplace](../../docs/tutorials/claude_code_plugin_marketplace)** + - Add self hosted Claude Code Plugin Marketplace - [PR #19378](https://github.com/BerriAI/litellm/pull/19378) + +- **[MCP](../../docs/mcp)** + - Add MCP Protocol version 2025-11-25 support - [PR #19379](https://github.com/BerriAI/litellm/pull/19379) + - Log MCP tool calls and list tools in the LiteLLM Spend Logs table for easier debugging - [PR #19469](https://github.com/BerriAI/litellm/pull/19469) + +- **[Vertex AI](../../docs/providers/vertex)** + - Ensure only anthropic betas are forwarded down to LLM API (by default) - [PR #19542](https://github.com/BerriAI/litellm/pull/19542) + - Allow overriding to support forwarding incoming headers are forwarded down to target - [PR #19524](https://github.com/BerriAI/litellm/pull/19524) + +- **[Chat/Completions](../../docs/completion/input)** + - Add MCP tools response to chat completions - [PR #19552](https://github.com/BerriAI/litellm/pull/19552) + - Add custom vertex ai finish reasons to the output - [PR #19558](https://github.com/BerriAI/litellm/pull/19558) + - Return MCP execution in /chat/completions before model output during streaming - [PR #19623](https://github.com/BerriAI/litellm/pull/19623) + +### Bugs + +- **[Responses API](../../docs/response_api)** + - Fix duplicate messages during MCP streaming tool execution - [PR #19317](https://github.com/BerriAI/litellm/pull/19317) + - Fix pickle error when using OpenAI's Responses API with stream=True and tool_choice of type allowed_tools (an OpenAI-native parameter) - [PR #17205](https://github.com/BerriAI/litellm/pull/17205) + - stream tool call events for non-openai models - [PR #19368](https://github.com/BerriAI/litellm/pull/19368) + - preserve tool output ordering for gemini in responses bridge - [PR #19360](https://github.com/BerriAI/litellm/pull/19360) + - Add ID caching to prevent ID mismatch text-start and text-delta - [PR #19390](https://github.com/BerriAI/litellm/pull/19390) + - Include output_item, reasoning_summary_Text_done and reasoning_summary_part_done events for non-openai models - [PR #19472](https://github.com/BerriAI/litellm/pull/19472) + +- **[Chat/Completions](../../docs/completion/input)** + - fix: drop_params not dropping prompt_cache_key for non-OpenAI providers - [PR #19346](https://github.com/BerriAI/litellm/pull/19346) + +- **[Realtime API](../../docs/realtime)** + - disable SSL for ws:// WebSocket connections - [PR #19345](https://github.com/BerriAI/litellm/pull/19345) + +- **[Generate Content](../../docs/generateContent)** + - Log actual user input when google genai/vertex endpoints are called client-side - [PR #19156](https://github.com/BerriAI/litellm/pull/19156) + +- **[/messages/count_tokens Anthropic Token Counting](../../docs/anthropic_count_tokens)** + - ensure it works for Anthropic, Azure AI Anthropic on AI Gateway - [PR #19432](https://github.com/BerriAI/litellm/pull/19432) + +- **[MCP](../../docs/mcp)** + - forward static_headers to MCP servers - [PR #19366](https://github.com/BerriAI/litellm/pull/19366) + +- **[Batch API](../../docs/batches)** + - Fix: generation config empty for batch - [PR #19556](https://github.com/BerriAI/litellm/pull/19556) + +- **[Pass Through Endpoints](../../docs/proxy/pass_through)** + - Always reupdate registry - [PR #19420](https://github.com/BerriAI/litellm/pull/19420) +--- + +## Management Endpoints / UI + +### Features + +- **Cost Estimator** + - Fix model dropdown - [PR #19529](https://github.com/BerriAI/litellm/pull/19529) + +- **Claude Code Plugins** + - Allow Adding Claude Code Plugins via UI - [PR #19387](https://github.com/BerriAI/litellm/pull/19387) + +- **Guardrails** + - New Policy management UI - [PR #19668](https://github.com/BerriAI/litellm/pull/19668) + - Allow adding policies on Keys/Teams + Viewing on Info panels - [PR #19688](https://github.com/BerriAI/litellm/pull/19688) + +- **General** + - respects custom authentication header override - [PR #19276](https://github.com/BerriAI/litellm/pull/19276) + +- **Playground** + - Button to Fill Custom API Base - [PR #19440](https://github.com/BerriAI/litellm/pull/19440) + - display mcp output on the play ground - [PR #19553](https://github.com/BerriAI/litellm/pull/19553) + +- **Models** + - Paginate /v2/models/info - [PR #19521](https://github.com/BerriAI/litellm/pull/19521) + - All Model Tab Pagination - [PR #19525](https://github.com/BerriAI/litellm/pull/19525) + - Adding Optional scope Param to /models - [PR #19539](https://github.com/BerriAI/litellm/pull/19539) + - Model Search - [PR #19622](https://github.com/BerriAI/litellm/pull/19622) + - Filter by Model ID and Team ID - [PR #19713](https://github.com/BerriAI/litellm/pull/19713) + +- **MCP Servers** + - MCP Tools Tab Resetting to Overview - [PR #19468](https://github.com/BerriAI/litellm/pull/19468) + +- **Organizations** + - Prevent org admin from creating a new user with proxy_admin permissions - [PR #19296](https://github.com/BerriAI/litellm/pull/19296) + - Edit Page: Reusable Model Select - [PR #19601](https://github.com/BerriAI/litellm/pull/19601) + +- **Teams** + - Reusable Model Select - [PR #19543](https://github.com/BerriAI/litellm/pull/19543) + - [Fix] Team Update with Organization having All Proxy Models - [PR #19604](https://github.com/BerriAI/litellm/pull/19604) + +- **Logs** + - Include tool arguments in spend logs table - [PR #19640](https://github.com/BerriAI/litellm/pull/19640) + +- **Fallbacks / Loadbalancing** + - New fallbacks modal - [PR #19673](https://github.com/BerriAI/litellm/pull/19673) + - Set fallbacks/loadbalancing by team/key - [PR #19686](https://github.com/BerriAI/litellm/pull/19686) + +### Bugs + +- **Playground** + - increase model selector width in playground Compare view - [PR #19423](https://github.com/BerriAI/litellm/pull/19423) + +- **Virtual Keys** + - Sorting Shows Incorrect Entries - [PR #19534](https://github.com/BerriAI/litellm/pull/19534) + +- **General** + - UI 404 error when SERVER_ROOT_PATH is set - [PR #19467](https://github.com/BerriAI/litellm/pull/19467) + - Redirect to ui/login on expired JWT - [PR #19687](https://github.com/BerriAI/litellm/pull/19687) + +- **SSO** + - Fix SSO user roles not updating for existing users - [PR #19621](https://github.com/BerriAI/litellm/pull/19621) + +- **Guardrails** + - ensure guardrail patterns persist on edit and mode toggle - [PR #19265](https://github.com/BerriAI/litellm/pull/19265) +--- + +## AI Integrations + +### Logging + +- **General Logging** + - prevent printing duplicate StandardLoggingPayload logs - [PR #19325](https://github.com/BerriAI/litellm/pull/19325) + - Fix: log duplication when json_logs is enabled - [PR #19705](https://github.com/BerriAI/litellm/pull/19705) +- **Langfuse OTEL** + - ignore service logs and fix callback shadowing - [PR #19298](https://github.com/BerriAI/litellm/pull/19298) +- **Langfuse** + - Send litellm_trace_id - [PR #19528](https://github.com/BerriAI/litellm/pull/19528) + - Add Langfuse mock mode for testing without API calls - [PR #19676](https://github.com/BerriAI/litellm/pull/19676) +- **GCS Bucket** + - prevent unbounded queue growth due to slow API calls - [PR #19297](https://github.com/BerriAI/litellm/pull/19297) + - Add GCS mock mode for testing without API calls - [PR #19683](https://github.com/BerriAI/litellm/pull/19683) +- **Responses API Logging** + - Fix pydantic serialization error - [PR #19486](https://github.com/BerriAI/litellm/pull/19486) +- **Arize Phoenix** + - add openinference span kinds to arize phoenix - [PR #19267](https://github.com/BerriAI/litellm/pull/19267) +- **Prometheus** + - Added new prometheus metrics for user count and team count - [PR #19520](https://github.com/BerriAI/litellm/pull/19520) + +### Guardrails + +- **Bedrock Guardrails** + - Ensure post_call guardrail checks input+output - [PR #19151](https://github.com/BerriAI/litellm/pull/19151) +- **Prompt Security** + - fixing prompt-security's guardrail implementation - [PR #19374](https://github.com/BerriAI/litellm/pull/19374) +- **Presidio** + - Fixes crash in Presidio Guardrail when running in background threads (logging_hook) - [PR #19714](https://github.com/BerriAI/litellm/pull/19714) +- **Pillar Security** + - Migrate Pillar Security to Generic Guardrail API - [PR #19364](https://github.com/BerriAI/litellm/pull/19364) +- **Policy Engine** + - New LiteLLM Policy engine - create policies to manage guardrails, conditions - permissions per Key, Team - [PR #19612](https://github.com/BerriAI/litellm/pull/19612) +- **General** + - add case-insensitive support for guardrail mode and actions - [PR #19480](https://github.com/BerriAI/litellm/pull/19480) + +### Prompt Management + +- **General** + - fix prompt info lookup and delete using correct IDs - [PR #19358](https://github.com/BerriAI/litellm/pull/19358) + +### Secret Manager + +- **AWS Secret Manager** + - ensure auto-rotation updates existing AWS secret instead of creating new one - [PR #19455](https://github.com/BerriAI/litellm/pull/19455) +- **Hashicorp Vault** + - Ensure key rotations work with Vault - [PR #19634](https://github.com/BerriAI/litellm/pull/19634) + +--- + +## Spend Tracking, Budgets and Rate Limiting + +- **Pricing Updates** + - Add openai/dall-e base pricing entries - [PR #19133](https://github.com/BerriAI/litellm/pull/19133) + - Add `input_cost_per_video_per_second` in ModelInfoBase - [PR #19398](https://github.com/BerriAI/litellm/pull/19398) + +--- + +## Performance / Loadbalancing / Reliability improvements + + +- **General** + - Fix date overflow/division by zero in proxy utils - [PR #19527](https://github.com/BerriAI/litellm/pull/19527) + - Fix in-flight request termination on SIGTERM when health-check runs in a separate process - [PR #19427](https://github.com/BerriAI/litellm/pull/19427) + - Fix Pass through routes to work with server root path - [PR #19383](https://github.com/BerriAI/litellm/pull/19383) + - Fix logging error for stop iteration - [PR #19649](https://github.com/BerriAI/litellm/pull/19649) + - prevent retrying 4xx client errors - [PR #19275](https://github.com/BerriAI/litellm/pull/19275) + - add better error handling for misconfig on health check - [PR #19441](https://github.com/BerriAI/litellm/pull/19441) + +- **Router** + - Fix Azure RPM calculation formula - [PR #19513](https://github.com/BerriAI/litellm/pull/19513) + - Persist scheduler request queue to redis - [PR #19304](https://github.com/BerriAI/litellm/pull/19304) + - pass search_tools to Router during DB-triggered initialization - [PR #19388](https://github.com/BerriAI/litellm/pull/19388) + - Fixed PromptCachingCache to correctly handle messages where cache_control is a sibling key of string content - [PR #19266](https://github.com/BerriAI/litellm/pull/19266) + +- **Memory Leaks/OOM** + - prevent OOM with nested $defs in tool schemas - [PR #19112](https://github.com/BerriAI/litellm/pull/19112) + - fix: HTTP client memory leaks in Presidio, OpenAI, and Gemini - [PR #19190](https://github.com/BerriAI/litellm/pull/19190) + +- **Non root** + - fix logfile and pidfile of supervisor for non root environment - [PR #17267](https://github.com/BerriAI/litellm/pull/17267) + - resolve Read-only file system error in non-root images - [PR #19449](https://github.com/BerriAI/litellm/pull/19449) + +- **Dockerfile** + - Redis Semantic Caching - add missing redisvl dependency to requirements.txt - [PR #19417](https://github.com/BerriAI/litellm/pull/19417) + - Bump OTEL versions to support a2a dependency - resolves modulenotfounderror for Microsoft Agents by @Harshit28j in #18991 + +- **DB** + - Handle PostgreSQL cached plan errors during rolling deployments - [PR #19424](https://github.com/BerriAI/litellm/pull/19424) + +- **Timeouts** + - Fix: total timeout is not respected - [PR #19389](https://github.com/BerriAI/litellm/pull/19389) + +- **SDK** + - Field-Existence Checks to Type Classes to Prevent Attribute Errors - [PR #18321](https://github.com/BerriAI/litellm/pull/18321) + - add google-cloud-aiplatform as optional dependency with clear error message - [PR #19437](https://github.com/BerriAI/litellm/pull/19437) + - Make grpc dependency optional - [PR #19447](https://github.com/BerriAI/litellm/pull/19447) + - Add support for retry policies - [PR #19645](https://github.com/BerriAI/litellm/pull/19645) + +- **Performance** + - Cut chat_completion latency by ~21% by reducing pre-call processing time - [PR #19535](https://github.com/BerriAI/litellm/pull/19535) + - Optimize strip_trailing_slash with O(1) index check - [PR #19679](https://github.com/BerriAI/litellm/pull/19679) + - Optimize use_custom_pricing_for_model with set intersection - [PR #19677](https://github.com/BerriAI/litellm/pull/19677) + - perf: skip pattern_router.route() for non-wildcard models - [PR #19664](https://github.com/BerriAI/litellm/pull/19664) + - perf: Add LRU caching to get_model_info for faster cost lookups - [PR #19606](https://github.com/BerriAI/litellm/pull/19606) + +--- + +## General Proxy Improvements + +### Doc Improvements + - new tutorial for adding MCPs to Cursor via LiteLLM - [PR #19317](https://github.com/BerriAI/litellm/pull/19317) + - fix vertex_region to vertex_location in Vertex AI pass-through docs - [PR #19380](https://github.com/BerriAI/litellm/pull/19380) + - clarify Gemini and Vertex AI model prefix in json file - [PR #19443](https://github.com/BerriAI/litellm/pull/19443) + - update Claude Code integration guides - [PR #19415](https://github.com/BerriAI/litellm/pull/19415) + - adjust opencode tutorial - [PR #19605](https://github.com/BerriAI/litellm/pull/19605) + - add spend-queue-troubleshooting docs - [PR #19659](https://github.com/BerriAI/litellm/pull/19659) + - docs: add litellm-enterprise requirement for managed files - [PR #19689](https://github.com/BerriAI/litellm/pull/19689) + +### Helm + - Add support for keda in helm chart - [PR #19337](https://github.com/BerriAI/litellm/pull/19337) + - sync Helm chart version with LiteLLM release version - [PR #19438](https://github.com/BerriAI/litellm/pull/19438) + - Enable PreStop hook configuration in values.yaml - [PR #19613](https://github.com/BerriAI/litellm/pull/19613) + +### General + - Add health check scripts and parallel execution support - [PR #19295](https://github.com/BerriAI/litellm/pull/19295) + + +--- + +## New Contributors + + +* @dushyantzz made their first contribution in [PR #19158](https://github.com/BerriAI/litellm/pull/19158) +* @obod-mpw made their first contribution in [PR #19133](https://github.com/BerriAI/litellm/pull/19133) +* @msexxeta made their first contribution in [PR #19030](https://github.com/BerriAI/litellm/pull/19030) +* @rsicart made their first contribution in [PR #19337](https://github.com/BerriAI/litellm/pull/19337) +* @cluebbehusen made their first contribution in [PR #19311](https://github.com/BerriAI/litellm/pull/19311) +* @Lucky-Lodhi2004 made their first contribution in [PR #19315](https://github.com/BerriAI/litellm/pull/19315) +* @binbandit made their first contribution in [PR #19324](https://github.com/BerriAI/litellm/pull/19324) +* @flex-myeonghyeon made their first contribution in [PR #19381](https://github.com/BerriAI/litellm/pull/19381) +* @Lrakotoson made their first contribution in [PR #18321](https://github.com/BerriAI/litellm/pull/18321) +* @bensi94 made their first contribution in [PR #18787](https://github.com/BerriAI/litellm/pull/18787) +* @victorigualada made their first contribution in [PR #19368](https://github.com/BerriAI/litellm/pull/19368) +* @VedantMadane made their first contribution in #19266 +* @stiyyagura0901 made their first contribution in #19276 +* @kamilio made their first contribution in [PR #19447](https://github.com/BerriAI/litellm/pull/19447) +* @jonathansampson made their first contribution in [PR #19433](https://github.com/BerriAI/litellm/pull/19433) +* @rynecarbone made their first contribution in [PR #19416](https://github.com/BerriAI/litellm/pull/19416) +* @jayy-77 made their first contribution in #19366 +* @davida-ps made their first contribution in [PR #19374](https://github.com/BerriAI/litellm/pull/19374) +* @joaodinissf made their first contribution in [PR #19506](https://github.com/BerriAI/litellm/pull/19506) +* @ecao310 made their first contribution in [PR #19520](https://github.com/BerriAI/litellm/pull/19520) +* @mpcusack-altos made their first contribution in [PR #19577](https://github.com/BerriAI/litellm/pull/19577) +* @milan-berri made their first contribution in [PR #19602](https://github.com/BerriAI/litellm/pull/19602) +* @xqe2011 made their first contribution in #19621 + +--- + +## Full Changelog + +**[View complete changelog on GitHub](https://github.com/BerriAI/litellm/releases/tag/v1.81.3.rc)** From 7ba0235a502349d8069e0146d23377bcd41b7210 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Mon, 26 Jan 2026 20:20:20 -0800 Subject: [PATCH 36/38] Litellm release notes 01 26 2026 (#19838) * docs: document new models/endpoints * docs: cleanup * feat: update model table * fix: cleanup --- docs/my-website/release_notes/v1.81.3-stable/index.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/my-website/release_notes/v1.81.3-stable/index.md b/docs/my-website/release_notes/v1.81.3-stable/index.md index accacd0abd..22b6f43dee 100644 --- a/docs/my-website/release_notes/v1.81.3-stable/index.md +++ b/docs/my-website/release_notes/v1.81.3-stable/index.md @@ -43,12 +43,6 @@ pip install litellm==1.81.3.rc.2 --- -## Key Highlights -[TODO] ---- - -[TODO] - ## New Models / Updated Models ### New Model Support @@ -104,7 +98,7 @@ pip install litellm==1.81.3.rc.2 - **[Brave Search](../../docs/search/brave)** - New Search provider - [PR #19433](https://github.com/BerriAI/litellm/pull/19433) -- **Sarvam ai** [TODO: MISSING DOCS] +- **Sarvam ai** - Add support for new sarvam models - [PR #19479](https://github.com/BerriAI/litellm/pull/19479) - **[GMI](../../docs/providers/gmi)** From 154ad179af74f03c756be6e0c5bc262f4c9bbb5c Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 16:39:56 +0530 Subject: [PATCH 37/38] Revert poetry lock --- poetry.lock | 67 +++++++++++++++++++---------------------------------- 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/poetry.lock b/poetry.lock index e5ef1750da..462a56fe42 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.0 and should not be changed by hand. [[package]] name = "a2a-sdk" @@ -343,7 +343,7 @@ zookeeper = ["kazoo"] name = "async-timeout" version = "5.0.1" description = "Timeout context manager for asyncio programs" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] markers = "python_full_version < \"3.11.3\" and (extra == \"extra-proxy\" or extra == \"proxy\" or python_version < \"3.11\")" @@ -593,8 +593,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -902,7 +902,7 @@ files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\" and python_version < \"3.14\" and (extra == \"utils\" or extra == \"semantic-router\") or sys_platform == \"win32\" and extra == \"utils\" or python_version < \"3.14\" and extra == \"semantic-router\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", proxy-dev = "platform_system == \"Windows\""} +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\" and python_version < \"3.14\" and (extra == \"utils\" or extra == \"semantic-router\") or sys_platform == \"win32\" and extra == \"utils\" or python_version <= \"3.13\" and extra == \"semantic-router\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", proxy-dev = "platform_system == \"Windows\""} [[package]] name = "coloredlogs" @@ -2028,7 +2028,7 @@ description = "Google API client core library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\") or python_version < \"3.14\" and (extra == \"extra-proxy\" or extra == \"google\")" +markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\"" files = [ {file = "google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c"}, {file = "google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8"}, @@ -2038,12 +2038,12 @@ files = [ google-auth = ">=2.14.1,<3.0.0" googleapis-common-protos = ">=1.56.2,<2.0.0" grpcio = [ - {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.0", optional = true, markers = "extra == \"grpc\""}, ] proto-plus = [ {version = ">=1.22.3,<2.0.0"}, @@ -2457,7 +2457,7 @@ files = [ {file = "googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038"}, {file = "googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5"}, ] -markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or python_version == \"3.9\" and (extra == \"google\" or extra == \"extra-proxy\")"} +markers = {main = "extra == \"extra-proxy\" or extra == \"google\""} [package.dependencies] grpcio = {version = ">=1.44.0,<2.0.0", optional = true, markers = "extra == \"grpc\""} @@ -2687,7 +2687,7 @@ files = [ {file = "grpcio-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a"}, {file = "grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73"}, ] -markers = {main = "extra == \"extra-proxy\" or extra == \"grpc\""} +markers = {main = "extra == \"extra-proxy\" or extra == \"google\" or extra == \"grpc\""} [package.dependencies] typing-extensions = ">=4.12,<5.0" @@ -2720,7 +2720,7 @@ description = "WSGI HTTP Server for UNIX" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(python_version < \"3.14\" or extra == \"mlflow\" or extra == \"proxy\") and (platform_system != \"Windows\" or extra == \"proxy\") and (python_version >= \"3.10\" or extra == \"proxy\") and (extra == \"proxy\" or extra == \"mlflow\")" +markers = "extra == \"proxy\" or python_version >= \"3.10\" and (extra == \"proxy\" or extra == \"mlflow\") and platform_system != \"Windows\"" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -3426,15 +3426,15 @@ files = [ [[package]] name = "litellm-proxy-extras" -version = "0.4.25" +version = "0.4.27" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_proxy_extras-0.4.25-py3-none-any.whl", hash = "sha256:da79e1a7a999020a82ec33c45d8fd35eb390ff3d0bc3d7686542b3529aff2cda"}, - {file = "litellm_proxy_extras-0.4.25.tar.gz", hash = "sha256:a03790e574ec6b8098c74d49836313651c0a0e72354a716c76c50ed16b087815"}, + {file = "litellm_proxy_extras-0.4.27-py3-none-any.whl", hash = "sha256:752c1faabc86ce3d2b1fa451495d34de82323798e37b9cb5c0fea93deae1c5c8"}, + {file = "litellm_proxy_extras-0.4.27.tar.gz", hash = "sha256:81059120016cfc03c82aa9664424912bdcffad103f66a5f925fef6b26f2cc151"}, ] [[package]] @@ -3777,10 +3777,10 @@ files = [ [package.dependencies] numpy = [ - {version = ">1.20"}, {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">1.20"}, + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, ] [package.extras] @@ -4191,7 +4191,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or python_version >= \"3.10\") and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or extra == \"mlflow\")" +markers = "(python_version >= \"3.10\" or extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\") and python_version < \"3.12\" and (extra == \"extra-proxy\" or extra == \"semantic-router\" or extra == \"google\" or extra == \"mlflow\")" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -4708,8 +4708,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -5169,7 +5169,7 @@ description = "Beautiful, Pythonic protocol buffers" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"google\" or extra == \"extra-proxy\"" +markers = "extra == \"extra-proxy\" or extra == \"google\"" files = [ {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, @@ -5316,7 +5316,7 @@ files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] -markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", proxy-dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} +markers = {main = "implementation_name != \"PyPy\" and (platform_python_implementation != \"PyPy\" or extra == \"proxy\")", dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\"", proxy-dev = "implementation_name != \"PyPy\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -5617,7 +5617,7 @@ description = "A python implementation of GNU readline." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"extra-proxy\" and sys_platform == \"win32\" and python_version < \"3.14\"" +markers = "sys_platform == \"win32\" and extra == \"extra-proxy\" and python_version < \"3.14\"" files = [ {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, @@ -7450,26 +7450,6 @@ examples = ["aiosqlite (>=0.21.0)", "fastapi (>=0.115.12)", "sqlalchemy[asyncio] granian = ["granian (>=2.3.1)"] uvicorn = ["uvicorn (>=0.34.0)"] -[[package]] -name = "starlette" -version = "0.49.3" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.9" -groups = ["main", "dev"] -files = [ - {file = "starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"}, - {file = "starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284"}, -] -markers = {main = "python_version == \"3.9\" and extra == \"proxy\"", dev = "python_version == \"3.9\""} - -[package.dependencies] -anyio = ">=3.6.2,<5" -typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} - -[package.extras] -full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] - [[package]] name = "starlette" version = "0.50.0" @@ -7481,7 +7461,7 @@ files = [ {file = "starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca"}, {file = "starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca"}, ] -markers = {main = "python_version >= \"3.10\" and (extra == \"mlflow\" or extra == \"proxy\")", dev = "python_version >= \"3.10\""} +markers = {main = "(extra == \"mlflow\" or extra == \"proxy\") and python_version >= \"3.10\" or extra == \"proxy\""} [package.dependencies] anyio = ">=3.6.2,<5" @@ -7530,7 +7510,7 @@ description = "Retry code until it succeeds" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"extra-proxy\" or extra == \"google\") and (python_version < \"3.14\" or extra == \"google\")" +markers = "(extra == \"extra-proxy\" or extra == \"google\") and python_version < \"3.14\" or extra == \"google\"" files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, @@ -8483,6 +8463,7 @@ type = ["pytest-mypy"] caching = ["diskcache"] extra-proxy = ["a2a-sdk", "azure-identity", "azure-keyvault-secrets", "google-cloud-iam", "google-cloud-kms", "prisma", "redisvl", "resend"] google = ["google-cloud-aiplatform"] +grpc = ["grpcio", "grpcio"] mlflow = ["mlflow"] proxy = ["PyJWT", "apscheduler", "azure-identity", "azure-storage-blob", "backoff", "boto3", "cryptography", "fastapi", "fastapi-sso", "gunicorn", "litellm-enterprise", "litellm-proxy-extras", "mcp", "orjson", "polars", "pynacl", "python-multipart", "pyyaml", "rich", "rq", "soundfile", "uvicorn", "uvloop", "websockets"] semantic-router = ["semantic-router"] @@ -8491,4 +8472,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "76f5b5fb10667c2dcf428976292672e7a1f3f2eb5f5bf78998e2192899f5037e" +content-hash = "73b5e1ab0badbee6c564d5e056e4f9c320c2f722bf176ce97d42e77110e37d60" From f30742fe6e8e0ae3a753f37631f1c20fd0124f0f Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 16:49:39 +0530 Subject: [PATCH 38/38] Fix mypy and code quality issues --- .../integrations/datadog/datadog_cost_management.py | 10 ++++++---- litellm/llms/bedrock/chat/converse_transformation.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/litellm/integrations/datadog/datadog_cost_management.py b/litellm/integrations/datadog/datadog_cost_management.py index 9bfb2aba71..2eb94b59dd 100644 --- a/litellm/integrations/datadog/datadog_cost_management.py +++ b/litellm/integrations/datadog/datadog_cost_management.py @@ -2,7 +2,7 @@ import asyncio import os import time from datetime import datetime -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Tuple from litellm._logging import verbose_logger from litellm.integrations.custom_batch_logger import CustomBatchLogger @@ -93,7 +93,7 @@ class DatadogCostManagementLogger(CustomBatchLogger): Aggregates costs by Provider, Model, and Date. Returns a list of DatadogFOCUSCostEntry. """ - aggregator: Dict[str, DatadogFOCUSCostEntry] = {} + aggregator: Dict[Tuple[str, str, str, Tuple[Tuple[str, str], ...]], DatadogFOCUSCostEntry] = {} for log in logs: try: @@ -171,8 +171,10 @@ class DatadogCostManagementLogger(CustomBatchLogger): tags["user"] = str(metadata["user_api_key_alias"]) if "user_api_key_team_alias" in metadata: tags["team"] = str(metadata["user_api_key_team_alias"]) - if "model_group" in metadata: - tags["model_group"] = str(metadata["model_group"]) + # model_group is not in StandardLoggingMetadata TypedDict, so we need to access it via dict.get() + model_group = metadata.get("model_group") # type: ignore[misc] + if model_group: + tags["model_group"] = str(model_group) return tags diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index 2ec27a7af0..ec66514207 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -1501,7 +1501,7 @@ class AmazonConverseConfig(BaseConfig): return content_str, tools, reasoningContentBlocks, citationsContentBlocks - def _transform_response( + def _transform_response( # noqa: PLR0915 self, model: str, response: httpx.Response,

    Z3RRRTdgXr<_kSJx{nms! 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�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 z zMtRHQ#jR?Qzx$^bz>BT(faQSuM(2aX7ujBpgD>M&&FOBP=3$n(@{j^2_y~i2%oisKc3up;$`VEsV3w=dAt)-!Gt!I3daAeh} zQ1iqK`-Zb3N?yoP4t849Oe%X@H`NPe13)X^`-W4v%H3AC%$8j%+uDih3mS}?aB4H! z)J>j_`AP1kK9_ncA|n&X|{Z?RB^AU`&KLUB(x@wFO*m7<-r;g-FgS8%ffh{#rD z@8HS1AmMY8Q?3kZy;dWM_DbrW3aVq6V5#HwpDyRr2ium{<@8XZ)KVh4s4rK)pn