From 0622ce3f2c44c7602bbafba707cee4aee4df328b Mon Sep 17 00:00:00 2001 From: jquinter Date: Fri, 23 Jan 2026 00:34:29 -0300 Subject: [PATCH 01/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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/62] 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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
  • 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 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 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
      YwW(PtiXoGSH(F0J9qfo)#z@BK&Unp1WnBB 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 Date: Sat, 24 Jan 2026 09:28:49 +0530 Subject: [PATCH 12/62] 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 f879b8b1cbf9e81be5896135ea7cad391d02f6c2 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 14:35:35 -0800 Subject: [PATCH 30/62] fixing team member add --- .../management_endpoints/team_endpoints.py | 123 ++++++++++++++++++ .../test_team_endpoints.py | 120 +++++++++++++++++ 2 files changed, 243 insertions(+) diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index d0afb62e8b..2c31b59b79 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -1771,6 +1771,116 @@ async def _add_team_members_to_team( return updated_team, updated_users, updated_team_memberships +async def _validate_and_populate_member_user_info( + member: Member, + prisma_client: PrismaClient, +) -> Member: + """ + Validate and populate user_email/user_id for a member. + + Logic: + 1. If both user_email and user_id are provided, verify they belong to the same user (use user_email as source of truth) + 2. If only user_email is provided, populate user_id from DB + 3. If only user_id is provided, populate user_email from DB + 4. If only user_id is provided and doesn't exist, throw error + 5. If user_email and user_id mismatch, throw error + + Returns a Member with both user_email and user_id populated. + """ + if member.user_email is None and member.user_id is None: + raise HTTPException( + status_code=400, + detail={"error": "Either user_id or user_email must be provided"}, + ) + + # Case 1: Both user_email and user_id provided - verify they match + if member.user_email is not None and member.user_id is not None: + # Use user_email as source of truth + # Check for multiple users with same email first + users_by_email = await prisma_client.get_data( + key_val={"user_email": member.user_email}, + table_name="user", + query_type="find_all", + ) + + if users_by_email is None or ( + isinstance(users_by_email, list) and len(users_by_email) == 0 + ): + # User doesn't exist yet - this is fine, will be created later + return member + + if isinstance(users_by_email, list) and len(users_by_email) > 1: + raise HTTPException( + status_code=400, + detail={ + "error": f"Multiple users found with email '{member.user_email}'. Please use 'user_id' instead." + }, + ) + + # Get the single user + user_by_email = users_by_email[0] + + # Verify the user_id matches + if user_by_email.user_id != member.user_id: + raise HTTPException( + status_code=400, + detail={ + "error": f"user_email '{member.user_email}' and user_id '{member.user_id}' do not belong to the same user." + }, + ) + + # Both match, return as is + return member + + # Case 2: Only user_email provided - populate user_id from DB + if member.user_email is not None and member.user_id is None: + user_by_email = await prisma_client.db.litellm_usertable.find_first( + where={"user_email": {"equals": member.user_email, "mode": "insensitive"}} + ) + + if user_by_email is None: + # User doesn't exist yet - this is fine, will be created later + return member + + # Check for multiple users with same email + users_by_email = await prisma_client.get_data( + key_val={"user_email": member.user_email}, + table_name="user", + query_type="find_all", + ) + + if users_by_email and isinstance(users_by_email, list) and len(users_by_email) > 1: + raise HTTPException( + status_code=400, + detail={ + "error": f"Multiple users found with email '{member.user_email}'. Please use 'user_id' instead." + }, + ) + + # Populate user_id + member.user_id = user_by_email.user_id + return member + + # Case 3: Only user_id provided - populate user_email from DB + if member.user_id is not None and member.user_email is None: + user_by_id = await prisma_client.db.litellm_usertable.find_unique( + where={"user_id": member.user_id} + ) + + if user_by_id is None: + raise HTTPException( + status_code=404, + detail={ + "error": f"User with user_id '{member.user_id}' not found in database" + }, + ) + + # Populate user_email + member.user_email = user_by_id.user_email + return member + + return member + @router.post( "/team/member_add", tags=["team management"], @@ -1846,6 +1956,19 @@ async def team_member_add( complete_team_data=complete_team_data, ) + # Validate and populate user_email/user_id for members before processing + if isinstance(data.member, Member): + await _validate_and_populate_member_user_info( + member=data.member, + prisma_client=prisma_client, + ) + elif isinstance(data.member, List): + for m in data.member: + await _validate_and_populate_member_user_info( + member=m, + prisma_client=prisma_client, + ) + updated_team, updated_users, updated_team_memberships = ( await _add_team_members_to_team( data=data, diff --git a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py index a97ed93a85..a586457690 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py @@ -36,6 +36,7 @@ from litellm.proxy.management_endpoints.team_endpoints import ( _persist_deleted_team_records, _save_deleted_team_records, _transform_teams_to_deleted_records, + _validate_and_populate_member_user_info, delete_team, router, team_member_add_duplication_check, @@ -5466,3 +5467,122 @@ async def test_get_team_daily_activity_team_admin_sees_all_spend(mock_db_client) ) and mock_db_client.db.litellm_verificationtoken.find_many.called: # If it was called, that's unexpected for admin users assert False, "API keys should not be fetched for team admin users" + + +@pytest.mark.asyncio +async def test_validate_and_populate_member_user_info_both_provided_match(): + """ + Test _validate_and_populate_member_user_info when both user_email and user_id + are provided and they match the same user in the database. + """ + # Create member with both user_email and user_id + member = Member(user_email="test@example.com", user_id="user-123", role="user") + + # Mock prisma client + mock_prisma_client = MagicMock() + + # Mock user object that matches both email and user_id + mock_user = MagicMock() + mock_user.user_id = "user-123" + mock_user.user_email = "test@example.com" + + # Mock get_data to return single user matching email + mock_prisma_client.get_data = AsyncMock(return_value=[mock_user]) + + # Call the function + result = await _validate_and_populate_member_user_info( + member=member, + prisma_client=mock_prisma_client, + ) + + # Verify result matches input (both already provided and match) + assert result.user_email == "test@example.com" + assert result.user_id == "user-123" + + # Verify get_data was called with correct parameters + mock_prisma_client.get_data.assert_called_once_with( + key_val={"user_email": "test@example.com"}, + table_name="user", + query_type="find_all", + ) + + +@pytest.mark.asyncio +async def test_validate_and_populate_member_user_info_only_email_provided(): + """ + Test _validate_and_populate_member_user_info when only user_email is provided. + Should populate user_id from database. + """ + # Create member with only user_email + member = Member(user_email="test@example.com", user_id=None, role="user") + + # Mock prisma client + mock_prisma_client = MagicMock() + + # Mock user object from find_first + mock_user_find_first = MagicMock() + mock_user_find_first.user_id = "user-456" + mock_user_find_first.user_email = "test@example.com" + + # Mock find_first to return the user + mock_prisma_client.db.litellm_usertable.find_first = AsyncMock( + return_value=mock_user_find_first + ) + + # Mock get_data to return single user (no duplicates) + mock_prisma_client.get_data = AsyncMock(return_value=[mock_user_find_first]) + + # Call the function + result = await _validate_and_populate_member_user_info( + member=member, + prisma_client=mock_prisma_client, + ) + + # Verify user_id was populated + assert result.user_email == "test@example.com" + assert result.user_id == "user-456" + + # Verify find_first was called with correct parameters + mock_prisma_client.db.litellm_usertable.find_first.assert_called_once_with( + where={"user_email": {"equals": "test@example.com", "mode": "insensitive"}} + ) + + # Verify get_data was called to check for duplicates + mock_prisma_client.get_data.assert_called_once_with( + key_val={"user_email": "test@example.com"}, + table_name="user", + query_type="find_all", + ) + + +@pytest.mark.asyncio +async def test_validate_and_populate_member_user_info_only_user_id_not_found(): + """ + Test _validate_and_populate_member_user_info when only user_id is provided + but the user doesn't exist in the database. Should raise HTTPException. + """ + # Create member with only user_id + member = Member(user_email=None, user_id="nonexistent-user", role="user") + + # Mock prisma client + mock_prisma_client = MagicMock() + + # Mock find_unique to return None (user not found) + mock_prisma_client.db.litellm_usertable.find_unique = AsyncMock(return_value=None) + + # Call the function and expect HTTPException + with pytest.raises(HTTPException) as exc_info: + await _validate_and_populate_member_user_info( + member=member, + prisma_client=mock_prisma_client, + ) + + # Verify the exception details + assert exc_info.value.status_code == 404 + assert "not found" in exc_info.value.detail["error"].lower() + assert "nonexistent-user" in exc_info.value.detail["error"] + + # Verify find_unique was called with correct parameters + mock_prisma_client.db.litellm_usertable.find_unique.assert_called_once_with( + where={"user_id": "nonexistent-user"} + ) From 9ff0daa24defccc9a6aa049e8a4c6f4a98b0f846 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 16:58:38 -0800 Subject: [PATCH 31/62] 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 aa4b3ba87addedf3f7869909e13a63e8d9687f82 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 17:53:01 -0800 Subject: [PATCH 32/62] 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 b10f71d5833e5af3c972caafec799cee4a62c906 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 18:10:51 -0800 Subject: [PATCH 33/62] fixing breaking change: just user_id provided should upsert still --- .../management_endpoints/team_endpoints.py | 17 ++++++-------- .../test_team_endpoints.py | 22 +++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index 2c31b59b79..63db2d72fe 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -1781,11 +1781,11 @@ async def _validate_and_populate_member_user_info( Logic: 1. If both user_email and user_id are provided, verify they belong to the same user (use user_email as source of truth) 2. If only user_email is provided, populate user_id from DB - 3. If only user_id is provided, populate user_email from DB - 4. If only user_id is provided and doesn't exist, throw error + 3. If only user_id is provided, populate user_email from DB (if user exists) + 4. If only user_id is provided and doesn't exist, allow it to pass with user_email as None (will be upserted later) 5. If user_email and user_id mismatch, throw error - Returns a Member with both user_email and user_id populated. + Returns a Member with user_email and user_id populated (user_email may be None if only user_id provided and user doesn't exist). """ if member.user_email is None and member.user_id is None: raise HTTPException( @@ -1861,19 +1861,16 @@ async def _validate_and_populate_member_user_info( member.user_id = user_by_email.user_id return member - # Case 3: Only user_id provided - populate user_email from DB + # Case 3: Only user_id provided - populate user_email from DB if user exists if member.user_id is not None and member.user_email is None: user_by_id = await prisma_client.db.litellm_usertable.find_unique( where={"user_id": member.user_id} ) if user_by_id is None: - raise HTTPException( - status_code=404, - detail={ - "error": f"User with user_id '{member.user_id}' not found in database" - }, - ) + # User doesn't exist yet - allow it to pass with user_email as None + # Will be upserted later with just user_id and null email + return member # Populate user_email member.user_email = user_by_id.user_email diff --git a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py index a586457690..467ee3661d 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py @@ -5559,7 +5559,8 @@ async def test_validate_and_populate_member_user_info_only_email_provided(): async def test_validate_and_populate_member_user_info_only_user_id_not_found(): """ Test _validate_and_populate_member_user_info when only user_id is provided - but the user doesn't exist in the database. Should raise HTTPException. + but the user doesn't exist in the database. Should allow it to pass with + user_email as None (will be upserted later). """ # Create member with only user_id member = Member(user_email=None, user_id="nonexistent-user", role="user") @@ -5570,17 +5571,16 @@ async def test_validate_and_populate_member_user_info_only_user_id_not_found(): # Mock find_unique to return None (user not found) mock_prisma_client.db.litellm_usertable.find_unique = AsyncMock(return_value=None) - # Call the function and expect HTTPException - with pytest.raises(HTTPException) as exc_info: - await _validate_and_populate_member_user_info( - member=member, - prisma_client=mock_prisma_client, - ) + # Call the function - should NOT raise an exception + result = await _validate_and_populate_member_user_info( + member=member, + prisma_client=mock_prisma_client, + ) - # Verify the exception details - assert exc_info.value.status_code == 404 - assert "not found" in exc_info.value.detail["error"].lower() - assert "nonexistent-user" in exc_info.value.detail["error"] + # Verify the result - should return member with user_id set and user_email as None + assert result.user_id == "nonexistent-user" + assert result.user_email is None + assert result.role == "user" # Verify find_unique was called with correct parameters mock_prisma_client.db.litellm_usertable.find_unique.assert_called_once_with( From c70d04d85f7a6dbc1170b492cbd80640c5dbe5a8 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 08:07:36 +0530 Subject: [PATCH 34/62] 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 35/62] [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 36/62] 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 ef7261d0eb4d214c43f47a1f3d095073efc85623 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 20:07:30 -0800 Subject: [PATCH 37/62] Fixing tests --- tests/proxy_unit_tests/test_proxy_server.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/proxy_unit_tests/test_proxy_server.py b/tests/proxy_unit_tests/test_proxy_server.py index 839d09b52d..d864a0d986 100644 --- a/tests/proxy_unit_tests/test_proxy_server.py +++ b/tests/proxy_unit_tests/test_proxy_server.py @@ -1117,7 +1117,10 @@ async def test_create_team_member_add(prisma_client, new_member_method): ) as mock_litellm_usertable, patch( "litellm.proxy.auth.auth_checks._get_team_object_from_user_api_key_cache", new=AsyncMock(return_value=team_obj), - ) as mock_team_obj: + ) as mock_team_obj, patch( + "litellm.proxy.proxy_server.prisma_client.get_data", + new=AsyncMock(return_value=[]), + ) as mock_get_data: mock_client = AsyncMock( return_value=LiteLLM_UserTable( @@ -1126,6 +1129,10 @@ async def test_create_team_member_add(prisma_client, new_member_method): ) mock_litellm_usertable.upsert = mock_client mock_litellm_usertable.find_many = AsyncMock(return_value=None) + # Mock find_first for user_email validation (returns None for new users) + mock_litellm_usertable.find_first = AsyncMock(return_value=None) + # Mock find_unique for user_id validation (returns None for new users) + mock_litellm_usertable.find_unique = AsyncMock(return_value=None) team_mock_client = AsyncMock() original_val = getattr( litellm.proxy.proxy_server.prisma_client.db, "litellm_teamtable" @@ -1299,7 +1306,10 @@ async def test_create_team_member_add_team_admin( ) as mock_litellm_usertable, patch( "litellm.proxy.auth.auth_checks._get_team_object_from_user_api_key_cache", new=AsyncMock(return_value=team_obj), - ) as mock_team_obj: + ) as mock_team_obj, patch( + "litellm.proxy.proxy_server.prisma_client.get_data", + new=AsyncMock(return_value=[]), + ) as mock_get_data: mock_client = AsyncMock( return_value=LiteLLM_UserTable( user_id="1234", max_budget=100, user_email="1234" @@ -1307,6 +1317,10 @@ async def test_create_team_member_add_team_admin( ) mock_litellm_usertable.upsert = mock_client mock_litellm_usertable.find_many = AsyncMock(return_value=None) + # Mock find_first for user_email validation (returns None for new users) + mock_litellm_usertable.find_first = AsyncMock(return_value=None) + # Mock find_unique for user_id validation (returns None for new users) + mock_litellm_usertable.find_unique = AsyncMock(return_value=None) team_mock_client = AsyncMock() original_val = getattr( From 664715b68efe539fd4dc38c3d1452f56cb134802 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Mon, 26 Jan 2026 20:11:56 -0800 Subject: [PATCH 38/62] 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 7307992cea72d9e3c338bd2a160f9c040f8d40f2 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 26 Jan 2026 20:17:53 -0800 Subject: [PATCH 39/62] fixing tests --- tests/proxy_unit_tests/test_auth_checks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/proxy_unit_tests/test_auth_checks.py b/tests/proxy_unit_tests/test_auth_checks.py index 24c005443a..05c6e4984a 100644 --- a/tests/proxy_unit_tests/test_auth_checks.py +++ b/tests/proxy_unit_tests/test_auth_checks.py @@ -584,7 +584,7 @@ async def test_get_fuzzy_user_object(): ) assert result == test_user mock_prisma.db.litellm_usertable.find_first.assert_called_with( - where={"user_email": "test@example.com"}, + where={"user_email": {"equals": "test@example.com", "mode": "insensitive"}}, include={"organization_memberships": True}, ) @@ -612,7 +612,7 @@ async def test_get_fuzzy_user_object(): ) assert result == test_user mock_prisma.db.litellm_usertable.find_first.assert_called_with( - where={"user_email": "test@example.com"}, + where={"user_email": {"equals": "test@example.com", "mode": "insensitive"}}, include={"organization_memberships": True}, ) From 7ba0235a502349d8069e0146d23377bcd41b7210 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Mon, 26 Jan 2026 20:20:20 -0800 Subject: [PATCH 40/62] 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 1bf33c4e41f829f24316d614c2eec98fb9643b9d Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 11:19:31 +0530 Subject: [PATCH 41/62] Fix:Support both JSON array format and comma-separated values from user headers --- litellm/llms/bedrock/common_utils.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/litellm/llms/bedrock/common_utils.py b/litellm/llms/bedrock/common_utils.py index 89b42f5e94..65d237bdbd 100644 --- a/litellm/llms/bedrock/common_utils.py +++ b/litellm/llms/bedrock/common_utils.py @@ -797,7 +797,7 @@ class BedrockEventStreamDecoderBase: def get_anthropic_beta_from_headers(headers: dict) -> List[str]: """ Extract anthropic-beta header values and convert them to a list. - Supports comma-separated values from user headers. + Supports both JSON array format and comma-separated values from user headers. Used by both converse and invoke transformations for consistent handling of anthropic-beta headers that should be passed to AWS Bedrock. @@ -812,8 +812,25 @@ def get_anthropic_beta_from_headers(headers: dict) -> List[str]: if not anthropic_beta_header: return [] - # Split comma-separated values and strip whitespace - return [beta.strip() for beta in anthropic_beta_header.split(",")] + # If it's already a list, return it + if isinstance(anthropic_beta_header, list): + return anthropic_beta_header + + # Try to parse as JSON array first (e.g., '["interleaved-thinking-2025-05-14", "claude-code-20250219"]') + if isinstance(anthropic_beta_header, str): + anthropic_beta_header = anthropic_beta_header.strip() + if anthropic_beta_header.startswith("[") and anthropic_beta_header.endswith("]"): + try: + parsed = json.loads(anthropic_beta_header) + if isinstance(parsed, list): + return [str(beta).strip() for beta in parsed] + except json.JSONDecodeError: + pass # Fall through to comma-separated parsing + + # Fall back to comma-separated values + return [beta.strip() for beta in anthropic_beta_header.split(",")] + + return [] class CommonBatchFilesUtils: From 3f32562587f0945cd73d09ebe7820d147b465512 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 11:20:16 +0530 Subject: [PATCH 42/62] Translate advanced-tool-use to Bedrock-specific headers for Claude Opus 4.5 --- .../anthropic_claude3_transformation.py | 38 +++- ...ations_anthropic_claude3_transformation.py | 185 ++++++++++++++++++ .../bedrock/test_anthropic_beta_support.py | 63 ++++++ 3 files changed, 282 insertions(+), 4 deletions(-) diff --git a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py index a7065caece..67ca9d5024 100644 --- a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py +++ b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py @@ -162,6 +162,22 @@ class AmazonAnthropicClaudeMessagesConfig( return any(pattern in model_lower for pattern in supported_patterns) + def _is_claude_opus_4_5(self, model: str) -> bool: + """ + Check if the model is Claude Opus 4.5. + + Args: + model: The model name + + Returns: + True if the model is Claude Opus 4.5 + """ + model_lower = model.lower() + opus_4_5_patterns = [ + "opus-4.5", "opus_4.5", "opus-4-5", "opus_4_5", + ] + return any(pattern in model_lower for pattern in opus_4_5_patterns) + def _filter_unsupported_beta_headers_for_bedrock( self, model: str, beta_set: set ) -> None: @@ -169,25 +185,32 @@ class AmazonAnthropicClaudeMessagesConfig( Remove beta headers that are not supported on Bedrock for the given model. Extended thinking beta headers are only supported on specific Claude 4+ models. - Advanced tool use headers are not supported on Bedrock Invoke API. + Advanced tool use headers are not supported on Bedrock Invoke API, but need to be + translated to Bedrock-specific headers for Claude Opus 4.5. This prevents 400 "invalid beta flag" errors on Bedrock. Note: Bedrock Invoke API fails with a 400 error when unsupported beta headers are sent, returning: {"message":"invalid beta flag"} + Translation for Claude Opus 4.5: + - advanced-tool-use-2025-11-20 -> tool-search-tool-2025-10-19 + tool-examples-2025-10-29 + Args: model: The model name beta_set: The set of beta headers to filter in-place """ beta_headers_to_remove = set() + has_advanced_tool_use = False - # 1. Filter out beta headers that are universally unsupported on Bedrock Invoke + # 1. Filter out beta headers that are universally unsupported on Bedrock Invoke and track if advanced-tool-use header is present for beta in beta_set: for unsupported_pattern in self.UNSUPPORTED_BEDROCK_INVOKE_BETA_PATTERNS: if unsupported_pattern in beta.lower(): beta_headers_to_remove.add(beta) + has_advanced_tool_use = True break - + + # 2. Filter out extended thinking headers for models that don't support them extended_thinking_patterns = [ "extended-thinking", @@ -203,6 +226,13 @@ class AmazonAnthropicClaudeMessagesConfig( # Remove all filtered headers for beta in beta_headers_to_remove: beta_set.discard(beta) + + # 3. Translate advanced-tool-use to Bedrock-specific headers for Claude Opus 4.5 + # Ref: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html + if has_advanced_tool_use and self._is_claude_opus_4_5(model): + beta_set.add("tool-search-tool-2025-10-19") + beta_set.add("tool-examples-2025-10-29") + def _get_tool_search_beta_header_for_bedrock( self, @@ -256,7 +286,7 @@ class AmazonAnthropicClaudeMessagesConfig( Ref: https://aws.amazon.com/blogs/machine-learning/structured-data-response-with-amazon-bedrock-prompt-engineering-and-tool-use/ """ import json - + # Extract schema from output_format schema = output_format.get("schema") if not schema: diff --git a/tests/test_litellm/llms/bedrock/chat/invoke_transformations/test_bedrock_chat_invoke_transformations_anthropic_claude3_transformation.py b/tests/test_litellm/llms/bedrock/chat/invoke_transformations/test_bedrock_chat_invoke_transformations_anthropic_claude3_transformation.py index 1cb84d32c1..98b392a353 100644 --- a/tests/test_litellm/llms/bedrock/chat/invoke_transformations/test_bedrock_chat_invoke_transformations_anthropic_claude3_transformation.py +++ b/tests/test_litellm/llms/bedrock/chat/invoke_transformations/test_bedrock_chat_invoke_transformations_anthropic_claude3_transformation.py @@ -279,3 +279,188 @@ def test_output_format_with_no_schema(): # Content should remain as string (not converted to list) assert isinstance(last_user_message["content"], str) assert last_user_message["content"] == "Hello" + + +def test_advanced_tool_use_header_translation_for_opus_4_5(): + """ + Test that advanced-tool-use-2025-11-20 header is translated to Bedrock-specific headers + for Claude Opus 4.5. + + Regression test for: Claude Code sends advanced-tool-use header which needs to be + translated to tool-search-tool-2025-10-19 and tool-examples-2025-10-29 for Bedrock + Invoke API on Claude Opus 4.5. + + Ref: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html + """ + from litellm.llms.bedrock.messages.invoke_transformations.anthropic_claude3_transformation import ( + AmazonAnthropicClaudeMessagesConfig, + ) + + config = AmazonAnthropicClaudeMessagesConfig() + + messages = [ + {"role": "user", "content": "What's the weather like?"} + ] + + anthropic_messages_optional_request_params = { + "max_tokens": 100, + } + + # Simulate advanced-tool-use header from Claude Code + headers = { + "anthropic-beta": "advanced-tool-use-2025-11-20" + } + + # Test with Claude Opus 4.5 + result = config.transform_anthropic_messages_request( + model="anthropic.claude-opus-4-5-20250514-v1:0", + messages=messages, + anthropic_messages_optional_request_params=anthropic_messages_optional_request_params, + litellm_params={}, + headers=headers, + ) + + # Verify advanced-tool-use header was removed + assert "anthropic_beta" in result + beta_headers = result["anthropic_beta"] + assert "advanced-tool-use-2025-11-20" not in beta_headers, \ + "advanced-tool-use header should be removed for Bedrock" + + # Verify Bedrock-specific headers were added + assert "tool-search-tool-2025-10-19" in beta_headers, \ + "tool-search-tool-2025-10-19 should be added for Opus 4.5" + assert "tool-examples-2025-10-29" in beta_headers, \ + "tool-examples-2025-10-29 should be added for Opus 4.5" + + +def test_advanced_tool_use_header_filtered_for_non_opus_4_5(): + """ + Test that advanced-tool-use-2025-11-20 header is filtered out for non-Opus 4.5 models + without adding Bedrock-specific headers. + + The translation to tool-search-tool-2025-10-19 and tool-examples-2025-10-29 should + only happen for Claude Opus 4.5. + """ + from litellm.llms.bedrock.messages.invoke_transformations.anthropic_claude3_transformation import ( + AmazonAnthropicClaudeMessagesConfig, + ) + + config = AmazonAnthropicClaudeMessagesConfig() + + messages = [ + {"role": "user", "content": "What's the weather like?"} + ] + + anthropic_messages_optional_request_params = { + "max_tokens": 100, + } + + # Simulate advanced-tool-use header from Claude Code + headers = { + "anthropic-beta": "advanced-tool-use-2025-11-20" + } + + # Test with Claude Sonnet 4.5 (not Opus 4.5) + result = config.transform_anthropic_messages_request( + model="anthropic.claude-sonnet-4-5-20250929-v1:0", + messages=messages, + anthropic_messages_optional_request_params=anthropic_messages_optional_request_params, + litellm_params={}, + headers=headers, + ) + + # Verify advanced-tool-use header was removed + beta_headers = result.get("anthropic_beta", []) + assert "advanced-tool-use-2025-11-20" not in beta_headers, \ + "advanced-tool-use header should be removed for Bedrock" + + # Verify Bedrock-specific headers were NOT added (only for Opus 4.5) + assert "tool-search-tool-2025-10-19" not in beta_headers, \ + "tool-search-tool should not be added for non-Opus 4.5 models" + assert "tool-examples-2025-10-29" not in beta_headers, \ + "tool-examples should not be added for non-Opus 4.5 models" + + +def test_advanced_tool_use_header_translation_with_multiple_beta_headers(): + """ + Test that advanced-tool-use header translation works correctly when multiple + beta headers are present. + """ + from litellm.llms.bedrock.messages.invoke_transformations.anthropic_claude3_transformation import ( + AmazonAnthropicClaudeMessagesConfig, + ) + + config = AmazonAnthropicClaudeMessagesConfig() + + messages = [ + {"role": "user", "content": "What's the weather like?"} + ] + + anthropic_messages_optional_request_params = { + "max_tokens": 100, + } + + # Multiple beta headers including advanced-tool-use + headers = { + "anthropic-beta": "claude-code-20250219,advanced-tool-use-2025-11-20,interleaved-thinking-2025-05-14" + } + + # Test with Claude Opus 4.5 + result = config.transform_anthropic_messages_request( + model="anthropic.claude-opus-4-5-20250514-v1:0", + messages=messages, + anthropic_messages_optional_request_params=anthropic_messages_optional_request_params, + litellm_params={}, + headers=headers, + ) + + beta_headers = result.get("anthropic_beta", []) + + # Verify advanced-tool-use was removed + assert "advanced-tool-use-2025-11-20" not in beta_headers + + # Verify Bedrock-specific headers were added + assert "tool-search-tool-2025-10-19" in beta_headers + assert "tool-examples-2025-10-29" in beta_headers + + # Verify other beta headers are preserved + assert "claude-code-20250219" in beta_headers + assert "interleaved-thinking-2025-05-14" in beta_headers + + +def test_opus_4_5_model_detection(): + """ + Test that the _is_claude_opus_4_5 method correctly identifies Opus 4.5 models + with various naming conventions. + """ + from litellm.llms.bedrock.messages.invoke_transformations.anthropic_claude3_transformation import ( + AmazonAnthropicClaudeMessagesConfig, + ) + + config = AmazonAnthropicClaudeMessagesConfig() + + # Test various Opus 4.5 naming patterns + opus_4_5_models = [ + "anthropic.claude-opus-4-5-20250514-v1:0", + "anthropic.claude-opus-4.5-20250514-v1:0", + "anthropic.claude-opus_4_5-20250514-v1:0", + "anthropic.claude-opus_4.5-20250514-v1:0", + "us.anthropic.claude-opus-4-5-20250514-v1:0", + "ANTHROPIC.CLAUDE-OPUS-4-5-20250514-V1:0", # Case insensitive + ] + + for model in opus_4_5_models: + assert config._is_claude_opus_4_5(model), \ + f"Should detect {model} as Opus 4.5" + + # Test non-Opus 4.5 models + non_opus_4_5_models = [ + "anthropic.claude-sonnet-4-5-20250929-v1:0", + "anthropic.claude-opus-4-20250514-v1:0", # Opus 4, not 4.5 + "anthropic.claude-opus-4-1-20250514-v1:0", # Opus 4.1, not 4.5 + "anthropic.claude-haiku-4-5-20251001-v1:0", + ] + + for model in non_opus_4_5_models: + assert not config._is_claude_opus_4_5(model), \ + f"Should not detect {model} as Opus 4.5" diff --git a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py index b9324e4966..0955636de6 100644 --- a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py +++ b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py @@ -390,3 +390,66 @@ class TestAnthropicBetaHeaderSupport: "anthropic_beta SHOULD be added for Anthropic models with cross-region prefix." ) assert "context-1m-2025-08-07" in additional_fields["anthropic_beta"] + + def test_messages_advanced_tool_use_translation_opus_4_5(self): + """Test that advanced-tool-use header is translated to Bedrock-specific headers for Opus 4.5. + + Regression test for: Claude Code sends advanced-tool-use-2025-11-20 header which needs + to be translated to tool-search-tool-2025-10-19 and tool-examples-2025-10-29 for + Bedrock Invoke API on Claude Opus 4.5. + + Ref: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html + """ + config = AmazonAnthropicClaudeMessagesConfig() + headers = {"anthropic-beta": "advanced-tool-use-2025-11-20"} + + result = config.transform_anthropic_messages_request( + model="us.anthropic.claude-opus-4-5-20250514-v1:0", + messages=[{"role": "user", "content": "Test"}], + anthropic_messages_optional_request_params={"max_tokens": 100}, + litellm_params={}, + headers=headers + ) + + assert "anthropic_beta" in result + beta_headers = result["anthropic_beta"] + + # advanced-tool-use should be removed + assert "advanced-tool-use-2025-11-20" not in beta_headers, ( + "advanced-tool-use-2025-11-20 should be removed for Bedrock Invoke API" + ) + + # Bedrock-specific headers should be added for Opus 4.5 + assert "tool-search-tool-2025-10-19" in beta_headers, ( + "tool-search-tool-2025-10-19 should be added for Opus 4.5" + ) + assert "tool-examples-2025-10-29" in beta_headers, ( + "tool-examples-2025-10-29 should be added for Opus 4.5" + ) + + def test_messages_advanced_tool_use_filtered_non_opus_4_5(self): + """Test that advanced-tool-use header is filtered out for non-Opus 4.5 models. + + The translation to Bedrock-specific headers should only happen for Opus 4.5. + For other models, the advanced-tool-use header should just be removed. + """ + config = AmazonAnthropicClaudeMessagesConfig() + headers = {"anthropic-beta": "advanced-tool-use-2025-11-20"} + + # Test with Sonnet 4.5 (not Opus 4.5) + result = config.transform_anthropic_messages_request( + model="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + messages=[{"role": "user", "content": "Test"}], + anthropic_messages_optional_request_params={"max_tokens": 100}, + litellm_params={}, + headers=headers + ) + + beta_headers = result.get("anthropic_beta", []) + + # advanced-tool-use should be removed + assert "advanced-tool-use-2025-11-20" not in beta_headers + + # Bedrock-specific headers should NOT be added for non-Opus 4.5 + assert "tool-search-tool-2025-10-19" not in beta_headers + assert "tool-examples-2025-10-29" not in beta_headers From faf9c9ba768ac446352d4f7329b762dd48c630ae Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 13:11:29 +0530 Subject: [PATCH 43/62] Add sarvam doc --- docs/my-website/docs/providers/sarvam.md | 89 ++++++++++++++++++++++++ docs/my-website/sidebars.js | 1 + 2 files changed, 90 insertions(+) create mode 100644 docs/my-website/docs/providers/sarvam.md diff --git a/docs/my-website/docs/providers/sarvam.md b/docs/my-website/docs/providers/sarvam.md new file mode 100644 index 0000000000..d77e9c0c75 --- /dev/null +++ b/docs/my-website/docs/providers/sarvam.md @@ -0,0 +1,89 @@ +# Sarvam.ai + +LiteLLM supports all the text models from [Sarvam ai](https://docs.sarvam.ai/api-reference-docs/chat/chat-completions) + +## Usage + +```python +import os +from litellm import completion + +# Set your Sarvam API key +os.environ["SARVAM_API_KEY"] = "" + +messages = [{"role": "user", "content": "Hello"}] + +response = completion( + model="sarvam/sarvam-m", + messages=messages, +) +print(response) +``` + +## Usage with LiteLLM Proxy Server + +Here's how to call a Sarvam.ai model with the LiteLLM Proxy Server + +1. **Modify the `config.yaml`:** + + ```yaml + model_list: + - model_name: my-model + litellm_params: + model: sarvam/ # add sarvam/ prefix to route as Sarvam provider + api_key: api-key # api key to send your model + ``` + +2. **Start the proxy:** + + ```bash + $ litellm --config /path/to/config.yaml + ``` + +3. **Send a request to LiteLLM Proxy Server:** + + + + + + ```python + import openai + + client = openai.OpenAI( + api_key="sk-1234", # pass litellm proxy key, if you're using virtual keys + base_url="http://0.0.0.0:4000" # litellm-proxy-base url + ) + + response = client.chat.completions.create( + model="my-model", + messages=[ + { + "role": "user", + "content": "what llm are you" + } + ], + ) + + print(response) + ``` + + + + + ```shell + curl --location 'http://0.0.0.0:4000/chat/completions' \ + --header 'Authorization: Bearer sk-1234' \ + --header 'Content-Type: application/json' \ + --data '{ + "model": "my-model", + "messages": [ + { + "role": "user", + "content": "what llm are you" + } + ] + }' + ``` + + + diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 85573599e4..41854a4177 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -775,6 +775,7 @@ const sidebars = { "providers/oci", "providers/ollama", "providers/openrouter", + "providers/sarvam", "providers/ovhcloud", "providers/perplexity", "providers/petals", From cf012a2f657dab12f8fdda9d10de827517975f09 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 13:50:47 +0530 Subject: [PATCH 44/62] Add gemini-robotics-er-1.5-preview model in model map --- ...odel_prices_and_context_window_backup.json | 37 +++++++++++++++++++ model_prices_and_context_window.json | 37 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d958ea4503..7f33e96dbb 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -13480,6 +13480,43 @@ "supports_vision": true, "supports_web_search": true }, + "gemini-robotics-er-1.5-preview": { + "cache_read_input_token_cost": 0, + "input_cost_per_token": 3e-07, + "input_cost_per_audio_token": 1e-06, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_token": 2.5e-06, + "output_cost_per_reasoning_token": 2.5e-06, + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-robotics-er-1-5-preview", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "supported_modalities": [ + "text", + "image", + "video", + "audio" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_vision": true, + "supports_web_search": true + }, "gemini-2.5-computer-use-preview-10-2025": { "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d958ea4503..7f33e96dbb 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -13480,6 +13480,43 @@ "supports_vision": true, "supports_web_search": true }, + "gemini-robotics-er-1.5-preview": { + "cache_read_input_token_cost": 0, + "input_cost_per_token": 3e-07, + "input_cost_per_audio_token": 1e-06, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_token": 2.5e-06, + "output_cost_per_reasoning_token": 2.5e-06, + "source": "https://ai.google.dev/gemini-api/docs/models#gemini-robotics-er-1-5-preview", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "supported_modalities": [ + "text", + "image", + "video", + "audio" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_vision": true, + "supports_web_search": true + }, "gemini-2.5-computer-use-preview-10-2025": { "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, From e273c858487b4c1b59deb92e918974c845544fcd Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 13:56:05 +0530 Subject: [PATCH 45/62] Add gemini-robotics-er-1.5-preview model documentation --- docs/my-website/docs/providers/gemini.md | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/my-website/docs/providers/gemini.md b/docs/my-website/docs/providers/gemini.md index 23a02f7365..b9ad7820dd 100644 --- a/docs/my-website/docs/providers/gemini.md +++ b/docs/my-website/docs/providers/gemini.md @@ -1840,6 +1840,57 @@ content = response.get('choices', [{}])[0].get('message', {}).get('content') print(content) ``` +## gemini-robotics-er-1.5-preview Usage + +```python +from litellm import api_base +from openai import OpenAI +import os +import base64 + +client = OpenAI(base_url="http://0.0.0.0:4000", api_key="sk-12345") +base64_image = base64.b64encode(open("closeup-object-on-table-many-260nw-1216144471.webp", "rb").read()).decode() + +import json +import re +tools = [{"codeExecution": {}}] +response = client.chat.completions.create( + model="gemini/gemini-robotics-er-1.5-preview", + messages=[ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "Point to no more than 10 items in the image. The label returned should be an identifying name for the object detected. The answer should follow the json format: [{\"point\": [y, x], \"label\": }, ...]. The points are in [y, x] format normalized to 0-1000." + }, + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"} + } + ] + } + ], + tools=tools +) + +# Extract JSON from markdown code block if present +content = response.choices[0].message.content +# Look for triple-backtick JSON block +match = re.search(r'```json\s*(.*?)\s*```', content, re.DOTALL) +if match: + json_str = match.group(1) +else: + json_str = content + +try: + data = json.loads(json_str) + print(json.dumps(data, indent=2)) +except Exception as e: + print("Error parsing response as JSON:", e) + print("Response content:", content) +``` + ## Usage - PDF / Videos / etc. Files ### Inline Data (e.g. audio stream) From 988dd2a911aaae4ef67f401eb5613a5ab960cac8 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 14:35:54 +0530 Subject: [PATCH 46/62] Fix: Stream the download in chunks --- .../prompt_templates/image_handling.py | 14 ++-- .../litellm_core_utils/test_image_handling.py | 79 +++++++++++++++++++ 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/litellm/litellm_core_utils/prompt_templates/image_handling.py b/litellm/litellm_core_utils/prompt_templates/image_handling.py index 5d0bedb776..7137a4e422 100644 --- a/litellm/litellm_core_utils/prompt_templates/image_handling.py +++ b/litellm/litellm_core_utils/prompt_templates/image_handling.py @@ -31,15 +31,19 @@ def _process_image_response(response: Response, url: str) -> str: f"Error: Image size ({size_mb:.2f}MB) exceeds maximum allowed size ({MAX_IMAGE_URL_DOWNLOAD_SIZE_MB}MB). url={url}" ) - image_bytes = response.content + # Stream download with size checking to prevent downloading huge files + max_bytes = int(MAX_IMAGE_URL_DOWNLOAD_SIZE_MB * 1024 * 1024) + image_bytes = bytearray() + bytes_downloaded = 0 - # Check actual size after download if Content-Length was not available - if content_length is None: - size_mb = len(image_bytes) / (1024 * 1024) - if size_mb > MAX_IMAGE_URL_DOWNLOAD_SIZE_MB: + for chunk in response.iter_bytes(chunk_size=8192): + bytes_downloaded += len(chunk) + if bytes_downloaded > max_bytes: + size_mb = bytes_downloaded / (1024 * 1024) raise litellm.ImageFetchError( f"Error: Image size ({size_mb:.2f}MB) exceeds maximum allowed size ({MAX_IMAGE_URL_DOWNLOAD_SIZE_MB}MB). url={url}" ) + image_bytes.extend(chunk) base64_image = base64.b64encode(image_bytes).decode("utf-8") diff --git a/tests/test_litellm/litellm_core_utils/test_image_handling.py b/tests/test_litellm/litellm_core_utils/test_image_handling.py index b15d75a414..9c2939b2da 100644 --- a/tests/test_litellm/litellm_core_utils/test_image_handling.py +++ b/tests/test_litellm/litellm_core_utils/test_image_handling.py @@ -66,6 +66,41 @@ class LargeImageClient: ) +class StreamingLargeImageClient: + """ + Client that streams a large image to test streaming download protection. + This simulates a huge file without actually creating it all in memory. + """ + + def __init__(self, size_mb=100, include_content_length=False): + self.size_mb = size_mb + self.include_content_length = include_content_length + + def get(self, url, follow_redirects=True): + size_bytes = int(self.size_mb * 1024 * 1024) + headers = {"Content-Type": "image/jpeg"} + if self.include_content_length: + headers["Content-Length"] = str(size_bytes) + + # Create a generator that yields chunks without creating the whole file in memory + def generate_chunks(total_size, chunk_size=8192): + bytes_sent = 0 + while bytes_sent < total_size: + chunk = b"x" * min(chunk_size, total_size - bytes_sent) + bytes_sent += len(chunk) + yield chunk + + # Create response with streaming content + response = Response( + status_code=200, + headers=headers, + request=Request("GET", url), + ) + # Mock the iter_bytes method to return our generator + response.iter_bytes = lambda chunk_size=8192: generate_chunks(size_bytes, chunk_size) + return response + + def test_image_exceeds_size_limit_with_content_length(monkeypatch): """ Test that images exceeding MAX_IMAGE_URL_DOWNLOAD_SIZE_MB are rejected when Content-Length header is present. @@ -83,6 +118,7 @@ def test_image_exceeds_size_limit_with_content_length(monkeypatch): def test_image_exceeds_size_limit_without_content_length(monkeypatch): """ Test that images exceeding MAX_IMAGE_URL_DOWNLOAD_SIZE_MB are rejected even without Content-Length header. + This uses the old non-streaming mock for backward compatibility. """ monkeypatch.setattr( litellm, "module_level_client", LargeImageClient(size_mb=100, include_content_length=False) @@ -94,6 +130,29 @@ def test_image_exceeds_size_limit_without_content_length(monkeypatch): assert "exceeds maximum allowed size" in str(excinfo.value) +def test_streaming_download_protects_against_huge_files(monkeypatch): + """ + Test that streaming download aborts early when file exceeds size limit, + preventing memory exhaustion from huge files (e.g., petabyte-sized files). + + This test verifies that the streaming implementation doesn't download the entire + file into memory before checking size. Instead, it should abort as soon as the + limit is exceeded during streaming. + """ + # Simulate a 1GB file - far larger than the 50MB default limit + client = StreamingLargeImageClient(size_mb=1024, include_content_length=False) + monkeypatch.setattr(litellm, "module_level_client", client) + + with pytest.raises(litellm.ImageFetchError) as excinfo: + convert_url_to_base64("https://example.com/huge-image.jpg") + + # Verify the error message shows it was caught during streaming + assert "exceeds maximum allowed size" in str(excinfo.value) + + # The error should be raised after downloading just slightly more than the limit + # not after downloading the full 1GB + + class SmallImageClient: """ Client that returns a small valid image. @@ -124,6 +183,26 @@ def test_image_within_size_limit(monkeypatch): assert result.startswith("data:image/jpeg;base64,") +def test_streaming_download_handles_petabyte_file(monkeypatch): + """ + Test that streaming download can handle extremely large file URLs (e.g., petabyte-sized) + without attempting to download the entire file or causing memory exhaustion. + + This simulates what happens if a malicious actor or misconfiguration provides + a URL to an extremely large file. + """ + # Simulate a 1 petabyte file (1,000,000 GB) + # Without streaming protection, this would cause OOM or hang indefinitely + client = StreamingLargeImageClient(size_mb=1_000_000_000, include_content_length=False) + monkeypatch.setattr(litellm, "module_level_client", client) + + with pytest.raises(litellm.ImageFetchError) as excinfo: + convert_url_to_base64("https://example.com/petabyte-file.jpg") + + # Should fail fast without downloading anywhere near 1 petabyte + assert "exceeds maximum allowed size" in str(excinfo.value) + + def test_image_size_limit_disabled(monkeypatch): """ Test that setting MAX_IMAGE_URL_DOWNLOAD_SIZE_MB to 0 disables all image URL downloads. From e695cb53674c62d433bb8b3c5a5d335ce833e326 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 16:34:57 +0530 Subject: [PATCH 47/62] Add grok reasoning content --- litellm/llms/groq/chat/transformation.py | 8 ++ tests/llm_translation/test_groq.py | 126 ++++++++++++++++++++++- 2 files changed, 133 insertions(+), 1 deletion(-) diff --git a/litellm/llms/groq/chat/transformation.py b/litellm/llms/groq/chat/transformation.py index a75ecd8cc7..34ea7b03dd 100644 --- a/litellm/llms/groq/chat/transformation.py +++ b/litellm/llms/groq/chat/transformation.py @@ -323,4 +323,12 @@ class GroqChatCompletionStreamingHandler(OpenAIChatCompletionStreamingHandler): status_code=error.get("code"), message=error.get("message"), body=error ) + # Map Groq's 'reasoning' field to LiteLLM's 'reasoning_content' field + # Groq returns delta.reasoning, but LiteLLM expects delta.reasoning_content + choices = chunk.get("choices", []) + for choice in choices: + delta = choice.get("delta", {}) + if "reasoning" in delta: + delta["reasoning_content"] = delta.pop("reasoning") + return super().chunk_parser(chunk) diff --git a/tests/llm_translation/test_groq.py b/tests/llm_translation/test_groq.py index 33c1a42587..b82cffd418 100644 --- a/tests/llm_translation/test_groq.py +++ b/tests/llm_translation/test_groq.py @@ -11,7 +11,10 @@ import pytest import litellm from base_llm_unit_tests import BaseLLMChatTest -from litellm.llms.groq.chat.transformation import GroqChatConfig +from litellm.llms.groq.chat.transformation import ( + GroqChatConfig, + GroqChatCompletionStreamingHandler, +) class TestGroq(BaseLLMChatTest): def get_base_completion_call_args(self) -> dict: @@ -164,3 +167,124 @@ class TestGroqStructuredOutputs: if "tools" in result: tool_names = [t.get("function", {}).get("name") for t in result["tools"]] assert "json_tool_call" not in tool_names + + +class TestGroqReasoning: + """ + Tests for Groq reasoning field mapping. + + Groq returns 'reasoning' field in delta, but LiteLLM expects 'reasoning_content'. + """ + + def test_reasoning_field_mapping_in_streaming_chunks(self): + """ + Test that Groq's 'reasoning' field in streaming chunks is properly mapped + to LiteLLM's 'reasoning_content' field. + """ + handler = GroqChatCompletionStreamingHandler( + streaming_response=None, sync_stream=True + ) + + # Simulate a chunk with reasoning field as returned by Groq + groq_chunk = { + "id": "chatcmpl-test", + "object": "chat.completion.chunk", + "created": 1769511767, + "model": "qwen/qwen3-32b", + "choices": [ + { + "delta": { + "reasoning": "This is reasoning content", + "role": None, + }, + "finish_reason": None, + "index": 0, + } + ], + } + + # Parse the chunk + parsed_chunk = handler.chunk_parser(groq_chunk) + + # Verify that reasoning was mapped to reasoning_content + assert parsed_chunk.choices[0].delta.reasoning_content == "This is reasoning content" + # Verify that the original 'reasoning' field was removed + assert not hasattr(parsed_chunk.choices[0].delta, "reasoning") + + def test_reasoning_field_not_present(self): + """ + Test that chunks without reasoning field still work correctly. + """ + handler = GroqChatCompletionStreamingHandler( + streaming_response=None, sync_stream=True + ) + + # Simulate a chunk without reasoning field + groq_chunk = { + "id": "chatcmpl-test", + "object": "chat.completion.chunk", + "created": 1769511767, + "model": "qwen/qwen3-32b", + "choices": [ + { + "delta": { + "content": "Regular content", + "role": "assistant", + }, + "finish_reason": None, + "index": 0, + } + ], + } + + # Parse the chunk + parsed_chunk = handler.chunk_parser(groq_chunk) + + # Verify that content is present + assert parsed_chunk.choices[0].delta.content == "Regular content" + assert parsed_chunk.choices[0].delta.role == "assistant" + # Verify that reasoning_content is not set (it should be deleted by Delta.__init__) + assert not hasattr(parsed_chunk.choices[0].delta, "reasoning_content") + + def test_reasoning_with_tool_calls(self): + """ + Test that reasoning field is properly mapped even when tool_calls are present. + """ + handler = GroqChatCompletionStreamingHandler( + streaming_response=None, sync_stream=True + ) + + # Simulate a chunk with both reasoning and tool_calls + groq_chunk = { + "id": "chatcmpl-test", + "object": "chat.completion.chunk", + "created": 1769511767, + "model": "qwen/qwen3-32b", + "choices": [ + { + "delta": { + "reasoning": "Reasoning before tool call", + "tool_calls": [ + { + "index": 0, + "id": "call_123", + "function": {"name": "test_function", "arguments": "{}"}, + "type": "function", + } + ], + }, + "finish_reason": None, + "index": 0, + } + ], + } + + # Parse the chunk + parsed_chunk = handler.chunk_parser(groq_chunk) + + # Verify that reasoning was mapped to reasoning_content + assert parsed_chunk.choices[0].delta.reasoning_content == "Reasoning before tool call" + # Verify tool_calls are still present + assert parsed_chunk.choices[0].delta.tool_calls is not None + assert len(parsed_chunk.choices[0].delta.tool_calls) == 1 + assert parsed_chunk.choices[0].delta.tool_calls[0]["function"]["name"] == "test_function" From 154ad179af74f03c756be6e0c5bc262f4c9bbb5c Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Tue, 27 Jan 2026 16:39:56 +0530 Subject: [PATCH 48/62] 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 49/62] 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, From 0f0b71e6d9755f74b94520977b55f066ee27891f Mon Sep 17 00:00:00 2001 From: Harshit Jain <48647625+Harshit28j@users.noreply.github.com> Date: Tue, 27 Jan 2026 22:46:53 +0530 Subject: [PATCH 50/62] feat: add feature to make silent calls (#19544) * feat: add feature to make silent calls * add test or silent feat * add docs for silent feat * fix lint issues and UI logs * add docs of ab testing and deep copy --- docs/my-website/docs/routing.md | 7 +- docs/my-website/docs/traffic_mirroring.md | 83 +++++++++ docs/my-website/sidebars.js | 1 + litellm/router.py | 138 +++++++++++++-- .../test_router_silent_experiment.py | 157 ++++++++++++++++++ 5 files changed, 373 insertions(+), 13 deletions(-) create mode 100644 docs/my-website/docs/traffic_mirroring.md create mode 100644 tests/test_litellm/test_router_silent_experiment.py diff --git a/docs/my-website/docs/routing.md b/docs/my-website/docs/routing.md index 47967775e1..b5ece7237a 100644 --- a/docs/my-website/docs/routing.md +++ b/docs/my-website/docs/routing.md @@ -828,7 +828,12 @@ asyncio.run(router_acompletion()) ``` - + +## Traffic Mirroring / Silent Experiments + +Traffic mirroring allows you to "mimic" production traffic to a secondary (silent) model for evaluation purposes. The silent model's response is gathered in the background and does not affect the latency or result of the primary request. + +[**See detailed guide on A/B Testing - Traffic Mirroring here**](./traffic_mirroring.md) ## Basic Reliability diff --git a/docs/my-website/docs/traffic_mirroring.md b/docs/my-website/docs/traffic_mirroring.md new file mode 100644 index 0000000000..3bdcb0f161 --- /dev/null +++ b/docs/my-website/docs/traffic_mirroring.md @@ -0,0 +1,83 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# A/B Testing - Traffic Mirroring + +Traffic mirroring allows you to "mimic" production traffic to a secondary (silent) model for evaluation purposes. The silent model's response is gathered in the background and does not affect the latency or result of the primary request. + +This is useful for: +- Testing a new model's performance on production prompts before switching. +- Comparing costs and latency between different providers. +- Debugging issues by mirroring traffic to a more verbose model. + +## Quick Start + +To enable traffic mirroring, add `silent_model` to the `litellm_params` of a deployment. + + + + +```python +from litellm import Router + +model_list = [ + { + "model_name": "gpt-3.5-turbo", + "litellm_params": { + "model": "azure/chatgpt-v-2", + "api_key": "...", + "silent_model": "gpt-4" # 👈 Mirror traffic to gpt-4 + }, + }, + { + "model_name": "gpt-4", + "litellm_params": { + "model": "openai/gpt-4", + "api_key": "..." + }, + } +] + +router = Router(model_list=model_list) + +# The request to "gpt-3.5-turbo" will trigger a background call to "gpt-4" +response = await router.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "How does traffic mirroring work?"}] +) +``` + + + + +Add `silent_model` to your `config.yaml`: + +```yaml +model_list: + - model_name: primary-model + litellm_params: + model: azure/gpt-35-turbo + api_key: os.environ/AZURE_API_KEY + silent_model: evaluation-model # 👈 Mirror traffic here + - model_name: evaluation-model + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY +``` + + + + +## How it works +1. **Request Received**: A request is made to a model group (e.g. `primary-model`). +2. **Deployment Picked**: LiteLLM picks a deployment from the group. +3. **Primary Call**: LiteLLM makes the call to the primary deployment. +4. **Mirroring**: If `silent_model` is present, LiteLLM triggers a background call to that model. + - For **Sync** calls: Uses a shared thread pool. + - For **Async** calls: Uses `asyncio.create_task`. +5. **Isolation**: The background call uses a `deepcopy` of the original request parameters and sets `metadata["is_silent_experiment"] = True`. It also strips out logging IDs to prevent collisions in usage tracking. + +## Key Features +- **Latency Isolation**: The primary request returns as soon as it's ready. The background (silent) call does not block. +- **Unified Logging**: Background calls are processed via the Router, meaning they are automatically logged to your configured observability tools (Langfuse, S3, etc.). +- **Evaluation**: Use the `is_silent_experiment: True` flag in your logs to filter and compare results between the primary and mirrored calls. diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 41854a4177..ef7573e9ce 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -364,6 +364,7 @@ const sidebars = { label: "Load Balancing, Routing, Fallbacks", href: "https://docs.litellm.ai/docs/routing-load-balancing", }, + "traffic_mirroring", { type: "category", label: "Logging, Alerting, Metrics", diff --git a/litellm/router.py b/litellm/router.py index 9fe37efa3a..09d71b6b49 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -58,6 +58,7 @@ from litellm.litellm_core_utils.core_helpers import ( _get_parent_otel_span_from_kwargs, get_metadata_variable_name_from_kwargs, ) +from litellm.litellm_core_utils.thread_pool_executor import executor from litellm.litellm_core_utils.coroutine_checker import coroutine_checker from litellm.litellm_core_utils.credential_accessor import CredentialAccessor from litellm.litellm_core_utils.dd_tracing import tracer @@ -1250,10 +1251,25 @@ class Router: specific_deployment=kwargs.pop("specific_deployment", None), request_kwargs=kwargs, ) - self._update_kwargs_with_deployment(deployment=deployment, kwargs=kwargs) + # Check for silent model experiment + # Make a local copy of litellm_params to avoid mutating the Router's state + litellm_params = deployment["litellm_params"].copy() + silent_model = litellm_params.pop("silent_model", None) + if silent_model is not None: + # Mirroring traffic to a secondary model + # Use shared thread pool for background calls + executor.submit( + self._silent_experiment_completion, + silent_model, + messages, + **kwargs, + ) + + self._update_kwargs_with_deployment(deployment=deployment, kwargs=kwargs) + kwargs.pop("silent_model", None) # Ensure it's not in kwargs either # No copy needed - data is only read and spread into new dict below - data = deployment["litellm_params"] + data = litellm_params.copy() # Use the local copy of litellm_params model_name = data["model"] potential_model_client = self._get_client( deployment=deployment, kwargs=kwargs @@ -1274,15 +1290,14 @@ class Router: if not self.has_model_id(model): self.routing_strategy_pre_call_checks(deployment=deployment) - response = litellm.completion( - **{ - **data, - "messages": messages, - "caching": self.cache_responses, - "client": model_client, - **kwargs, - } - ) + input_kwargs = { + **data, + "messages": messages, + "caching": self.cache_responses, + "client": model_client, + **kwargs, + } + response = litellm.completion(**input_kwargs) verbose_router_logger.info( f"litellm.completion(model={model_name})\033[32m 200 OK\033[0m" ) @@ -1309,6 +1324,56 @@ class Router: self._set_deployment_num_retries_on_exception(e, deployment) raise e + def _get_silent_experiment_kwargs(self, **kwargs) -> dict: + """ + Prepare kwargs for a silent experiment by ensuring isolation from the primary call. + """ + # Copy kwargs to ensure isolation + silent_kwargs = copy.deepcopy(kwargs) + if "metadata" not in silent_kwargs: + silent_kwargs["metadata"] = {} + + silent_kwargs["metadata"]["is_silent_experiment"] = True + + # Pop logging objects and call IDs to ensure a fresh logging context + # This prevents collisions in the Proxy's database (spend_logs) + silent_kwargs.pop("litellm_call_id", None) + silent_kwargs.pop("litellm_logging_obj", None) + silent_kwargs.pop("standard_logging_object", None) + silent_kwargs.pop("proxy_server_request", None) + + return silent_kwargs + + def _silent_experiment_completion( + self, silent_model: str, messages: List[Any], **kwargs + ): + """ + Run a silent experiment in the background (thread). + """ + try: + # Prevent infinite recursion if silent model also has a silent model + if kwargs.get("metadata", {}).get("is_silent_experiment", False): + return + + messages = copy.deepcopy(messages) + + verbose_router_logger.info( + f"Starting silent experiment for model {silent_model}" + ) + + silent_kwargs = self._get_silent_experiment_kwargs(**kwargs) + + # Trigger the silent request + self.completion( + model=silent_model, + messages=cast(List[Dict[str, str]], messages), + **silent_kwargs, + ) + except Exception as e: + verbose_router_logger.error( + f"Silent experiment failed for model {silent_model}: {str(e)}" + ) + # fmt: off @overload @@ -1517,6 +1582,36 @@ class Router: return FallbackStreamWrapper(stream_with_fallbacks()) + async def _silent_experiment_acompletion( + self, silent_model: str, messages: List[Any], **kwargs + ): + """ + Run a silent experiment in the background. + """ + try: + # Prevent infinite recursion if silent model also has a silent model + if kwargs.get("metadata", {}).get("is_silent_experiment", False): + return + + messages = copy.deepcopy(messages) + + verbose_router_logger.info( + f"Starting silent experiment for model {silent_model}" + ) + + silent_kwargs = self._get_silent_experiment_kwargs(**kwargs) + + # Trigger the silent request + await self.acompletion( + model=silent_model, + messages=cast(List[AllMessageValues], messages), + **silent_kwargs, + ) + except Exception as e: + verbose_router_logger.error( + f"Silent experiment failed for model {silent_model}: {str(e)}" + ) + async def _acompletion( # noqa: PLR0915 self, model: str, messages: List[Dict[str, str]], **kwargs ) -> Union[ModelResponse, CustomStreamWrapper,]: @@ -1563,9 +1658,27 @@ class Router: self._track_deployment_metrics( deployment=deployment, parent_otel_span=parent_otel_span ) + + # Check for silent model experiment + # Make a local copy of litellm_params to avoid mutating the Router's state + litellm_params = deployment["litellm_params"].copy() + silent_model = litellm_params.pop("silent_model", None) + + if silent_model is not None: + # Mirroring traffic to a secondary model + # This is a silent experiment, so we don't want to block the primary request + asyncio.create_task( + self._silent_experiment_acompletion( + silent_model=silent_model, + messages=messages, # Use messages instead of *args + **kwargs, + ) + ) + self._update_kwargs_with_deployment(deployment=deployment, kwargs=kwargs) + kwargs.pop("silent_model", None) # Ensure it's not in kwargs either # No copy needed - data is only read and spread into new dict below - data = deployment["litellm_params"] + data = litellm_params.copy() # Use the local copy of litellm_params model_name = data["model"] @@ -1582,6 +1695,7 @@ class Router: "client": model_client, **kwargs, } + input_kwargs.pop("silent_model", None) _response = litellm.acompletion(**input_kwargs) diff --git a/tests/test_litellm/test_router_silent_experiment.py b/tests/test_litellm/test_router_silent_experiment.py new file mode 100644 index 0000000000..9b82cde13c --- /dev/null +++ b/tests/test_litellm/test_router_silent_experiment.py @@ -0,0 +1,157 @@ +import asyncio +from unittest.mock import MagicMock, patch + +import pytest + +import litellm +from litellm.router import Router + + +@pytest.mark.asyncio +async def test_router_silent_experiment_acompletion(): + """ + Test that silent_model triggers a background acompletion call + and that the silent_model parameter is stripped from both calls. + """ + model_list = [ + { + "model_name": "primary-model", + "litellm_params": { + "model": "openai/gpt-3.5-turbo", + "api_key": "fake-key", + "silent_model": "silent-model", + }, + }, + { + "model_name": "silent-model", + "litellm_params": { + "model": "openai/gpt-4", + "api_key": "fake-key", + }, + }, + ] + + router = Router(model_list=model_list) + + # Mock litellm.acompletion + mock_acompletion = MagicMock() + # Create a future that resolves to a ModelResponse + mock_response = litellm.ModelResponse(choices=[{"message": {"content": "hello"}}]) + future = asyncio.Future() + future.set_result(mock_response) + mock_acompletion.return_value = future + + with patch("litellm.acompletion", mock_acompletion): + response = await router.acompletion( + model="primary-model", + messages=[{"role": "user", "content": "hi"}], + ) + + assert response.choices[0].message.content == "hello" + + # Give the background task a moment to trigger (it's an asyncio task) + await asyncio.sleep(0.1) + + # Should have 2 calls: one for primary, one for silent + assert mock_acompletion.call_count == 2 + + # Check call arguments + call_args_list = mock_acompletion.call_args_list + + # Verify no silent_model in any call to litellm.acompletion + for call in call_args_list: + args, kwargs = call + assert "silent_model" not in kwargs + if "metadata" in kwargs: + # One call should have is_silent_experiment=True + pass + + # Find the silent call + silent_call = next( + ( + c + for c in call_args_list + if c[1].get("metadata", {}).get("is_silent_experiment") is True + ), + None, + ) + assert silent_call is not None + assert silent_call[1]["model"] == "openai/gpt-4" + + # Find the primary call + primary_call = next( + ( + c + for c in call_args_list + if not c[1].get("metadata", {}).get("is_silent_experiment") + ), + None, + ) + assert primary_call is not None + assert primary_call[1]["model"] == "openai/gpt-3.5-turbo" + + +def test_router_silent_experiment_completion(): + """ + Test that silent_model triggers a background completion call (sync) + and that the silent_model parameter is stripped. + """ + model_list = [ + { + "model_name": "primary-model", + "litellm_params": { + "model": "openai/gpt-3.5-turbo", + "api_key": "fake-key", + "silent_model": "silent-model", + }, + }, + { + "model_name": "silent-model", + "litellm_params": { + "model": "openai/gpt-4", + "api_key": "fake-key", + }, + }, + ] + + router = Router(model_list=model_list) + + # Mock litellm.completion + mock_completion = MagicMock() + mock_response = litellm.ModelResponse(choices=[{"message": {"content": "hello"}}]) + mock_completion.return_value = mock_response + + with patch("litellm.completion", mock_completion): + response = router.completion( + model="primary-model", + messages=[{"role": "user", "content": "hi"}], + ) + + assert response.choices[0].message.content == "hello" + + # The sync background call uses a thread pool. We might need to wait a bit. + import time + + time.sleep(0.5) + + # Should have 2 calls + assert mock_completion.call_count == 2 + + call_args_list = mock_completion.call_args_list + + # Verify no silent_model in any call + for call in call_args_list: + args, kwargs = call + assert "silent_model" not in kwargs + + # Find the silent call + silent_call = next( + ( + c + for c in call_args_list + if c[1].get("metadata", {}).get("is_silent_experiment") is True + ), + None, + ) + assert silent_call is not None + assert silent_call[1]["model"] == "openai/gpt-4" From fc7a9b4cb076e91b42e427df54fcac6513faac65 Mon Sep 17 00:00:00 2001 From: michelligabriele Date: Tue, 27 Jan 2026 18:34:30 +0100 Subject: [PATCH 51/62] fix(enterprise): correct error message for DISABLE_ADMIN_ENDPOINTS (#19861) The error message for DISABLE_ADMIN_ENDPOINTS incorrectly said "DISABLING LLM API ENDPOINTS is an Enterprise feature" instead of "DISABLING ADMIN ENDPOINTS is an Enterprise feature". This was a copy-paste bug from the is_llm_api_route_disabled() function. Added regression tests to verify both error messages are correct. --- .../proxy/auth/route_checks.py | 2 +- .../proxy/auth/test_route_checks.py | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/enterprise/litellm_enterprise/proxy/auth/route_checks.py b/enterprise/litellm_enterprise/proxy/auth/route_checks.py index 6cce781faf..6f7cf9143f 100644 --- a/enterprise/litellm_enterprise/proxy/auth/route_checks.py +++ b/enterprise/litellm_enterprise/proxy/auth/route_checks.py @@ -36,7 +36,7 @@ class EnterpriseRouteChecks: if not premium_user: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=f"🚨🚨🚨 DISABLING LLM API ENDPOINTS is an Enterprise feature\n🚨 {CommonProxyErrors.not_premium_user.value}", + detail=f"🚨🚨🚨 DISABLING ADMIN ENDPOINTS is an Enterprise feature\n🚨 {CommonProxyErrors.not_premium_user.value}", ) return get_secret_bool("DISABLE_ADMIN_ENDPOINTS") is True diff --git a/tests/enterprise/litellm_enterprise/proxy/auth/test_route_checks.py b/tests/enterprise/litellm_enterprise/proxy/auth/test_route_checks.py index ce77ff69e0..706e3b7187 100644 --- a/tests/enterprise/litellm_enterprise/proxy/auth/test_route_checks.py +++ b/tests/enterprise/litellm_enterprise/proxy/auth/test_route_checks.py @@ -180,3 +180,68 @@ class TestEnterpriseRouteChecks: # Should not raise exception since management routes are enabled EnterpriseRouteChecks.should_call_route("/config/update") + + +class TestEnterpriseRouteChecksErrorMessages: + """Test that error messages correctly identify which feature requires Enterprise license""" + + @patch("litellm.secret_managers.main.get_secret_bool") + @patch("litellm.proxy.proxy_server.premium_user", False) + def test_disable_llm_api_endpoints_error_message(self, mock_get_secret_bool): + """ + Test that when DISABLE_LLM_API_ENDPOINTS is set without Enterprise license, + the error message correctly mentions 'LLM API ENDPOINTS' + """ + with patch.dict(os.environ, {"DISABLE_LLM_API_ENDPOINTS": "true"}): + with pytest.raises(HTTPException) as exc_info: + EnterpriseRouteChecks.is_llm_api_route_disabled() + + assert exc_info.value.status_code == 500 + assert "DISABLING LLM API ENDPOINTS is an Enterprise feature" in str( + exc_info.value.detail + ) + + @patch("litellm.secret_managers.main.get_secret_bool") + @patch("litellm.proxy.proxy_server.premium_user", False) + def test_disable_admin_endpoints_error_message(self, mock_get_secret_bool): + """ + Test that when DISABLE_ADMIN_ENDPOINTS is set without Enterprise license, + the error message correctly mentions 'ADMIN ENDPOINTS' (not 'LLM API ENDPOINTS') + + This is a regression test for a bug where the error message incorrectly said + 'DISABLING LLM API ENDPOINTS' when the actual issue was DISABLE_ADMIN_ENDPOINTS. + """ + with patch.dict(os.environ, {"DISABLE_ADMIN_ENDPOINTS": "true"}): + with pytest.raises(HTTPException) as exc_info: + EnterpriseRouteChecks.is_management_routes_disabled() + + assert exc_info.value.status_code == 500 + assert "DISABLING ADMIN ENDPOINTS is an Enterprise feature" in str( + exc_info.value.detail + ) + # Ensure it does NOT mention LLM API ENDPOINTS (the old buggy message) + assert "LLM API ENDPOINTS" not in str(exc_info.value.detail) + + @patch("litellm.secret_managers.main.get_secret_bool") + @patch("litellm.proxy.proxy_server.premium_user", True) + def test_disable_llm_api_endpoints_with_premium_user(self, mock_get_secret_bool): + """ + Test that premium users can use DISABLE_LLM_API_ENDPOINTS without error + """ + mock_get_secret_bool.return_value = True + with patch.dict(os.environ, {"DISABLE_LLM_API_ENDPOINTS": "true"}): + # Should not raise exception for premium users + result = EnterpriseRouteChecks.is_llm_api_route_disabled() + assert result is True + + @patch("litellm.secret_managers.main.get_secret_bool") + @patch("litellm.proxy.proxy_server.premium_user", True) + def test_disable_admin_endpoints_with_premium_user(self, mock_get_secret_bool): + """ + Test that premium users can use DISABLE_ADMIN_ENDPOINTS without error + """ + mock_get_secret_bool.return_value = True + with patch.dict(os.environ, {"DISABLE_ADMIN_ENDPOINTS": "true"}): + # Should not raise exception for premium users + result = EnterpriseRouteChecks.is_management_routes_disabled() + assert result is True From 388b4c90b6df3e7bacda5bb3097e2f713a82658f Mon Sep 17 00:00:00 2001 From: michelligabriele Date: Tue, 27 Jan 2026 18:34:58 +0100 Subject: [PATCH 52/62] fix(proxy): handle agent parameter in /interactions endpoint (#19866) --- litellm/proxy/google_endpoints/endpoints.py | 2 +- litellm/proxy/route_llm_request.py | 3 +- .../test_interactions_agent_param.py | 75 +++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 tests/test_litellm/proxy/google_endpoints/test_interactions_agent_param.py diff --git a/litellm/proxy/google_endpoints/endpoints.py b/litellm/proxy/google_endpoints/endpoints.py index bba5b87024..5c41b371ca 100644 --- a/litellm/proxy/google_endpoints/endpoints.py +++ b/litellm/proxy/google_endpoints/endpoints.py @@ -264,7 +264,7 @@ async def create_interaction( general_settings=general_settings, proxy_config=proxy_config, select_data_generator=select_data_generator, - model=data.get("model"), + model=data.get("model") or data.get("agent"), user_model=user_model, user_temperature=user_temperature, user_request_timeout=user_request_timeout, diff --git a/litellm/proxy/route_llm_request.py b/litellm/proxy/route_llm_request.py index 236f58bb82..af441ee43e 100644 --- a/litellm/proxy/route_llm_request.py +++ b/litellm/proxy/route_llm_request.py @@ -221,8 +221,9 @@ async def route_request( "aretrieve_container_file_content", ]: return getattr(llm_router, f"{route_type}")(**data) - # Interactions API: get/delete/cancel don't need model routing + # Interactions API: create with agent, get/delete/cancel don't need model routing if route_type in [ + "acreate_interaction", "aget_interaction", "adelete_interaction", "acancel_interaction", diff --git a/tests/test_litellm/proxy/google_endpoints/test_interactions_agent_param.py b/tests/test_litellm/proxy/google_endpoints/test_interactions_agent_param.py new file mode 100644 index 0000000000..1063f59afb --- /dev/null +++ b/tests/test_litellm/proxy/google_endpoints/test_interactions_agent_param.py @@ -0,0 +1,75 @@ +""" +Test for interactions endpoint agent parameter handling. + +Tests that the /v1beta/interactions endpoint correctly extracts +the `agent` parameter as a fallback when `model` is not provided. +""" + +import pytest + + +class TestInteractionsAgentParameter: + """Test agent parameter handling in interactions endpoint.""" + + def test_agent_parameter_fallback_logic(self): + """ + Test the core logic: model or agent extraction. + + This tests the fix in endpoints.py line ~267: + model=data.get("model") or data.get("agent") + """ + # Case 1: Only agent provided (Deep Research use case) + data = { + "agent": "deep-research-pro-preview-12-2025", + "input": "Research quantum computing", + "background": True, + } + model = data.get("model") or data.get("agent") + assert model == "deep-research-pro-preview-12-2025" + + # Case 2: Only model provided (normal use case) + data = { + "model": "gemini-2.5-flash", + "input": "Hello world", + } + model = data.get("model") or data.get("agent") + assert model == "gemini-2.5-flash" + + # Case 3: Both provided (model takes precedence) + data = { + "model": "gemini-2.5-flash", + "agent": "deep-research-pro-preview-12-2025", + "input": "Test", + } + model = data.get("model") or data.get("agent") + assert model == "gemini-2.5-flash" + + # Case 4: Neither provided + data = { + "input": "Test", + } + model = data.get("model") or data.get("agent") + assert model is None + + def test_route_type_in_skip_model_routing_list(self): + """ + Test that acreate_interaction is in the list of routes + that skip model-based routing. + + This tests the fix in route_llm_request.py. + """ + # The list of routes that skip model routing for interactions + skip_model_routing_routes = [ + "acreate_interaction", + "aget_interaction", + "adelete_interaction", + "acancel_interaction", + ] + + # acreate_interaction should be in the list (this is the fix) + assert "acreate_interaction" in skip_model_routing_routes + + # All interaction routes should be covered + assert "aget_interaction" in skip_model_routing_routes + assert "adelete_interaction" in skip_model_routing_routes + assert "acancel_interaction" in skip_model_routing_routes From 7d5439addac7a291d5e37a5e261a6557d37bed11 Mon Sep 17 00:00:00 2001 From: michelligabriele Date: Tue, 27 Jan 2026 21:17:09 +0100 Subject: [PATCH 53/62] fix(bedrock): support tool search header translation for Sonnet 4.5 (#19871) Extend advanced-tool-use header translation to include Claude Sonnet 4.5 in addition to Opus 4.5 on Bedrock Invoke API. When Claude Code sends the advanced-tool-use-2025-11-20 header, it now gets correctly translated to Bedrock-specific headers for both: - Claude Opus 4.5 - Claude Sonnet 4.5 Headers translated: - tool-search-tool-2025-10-19 - tool-examples-2025-10-29 Fixes defer_loading validation error on Bedrock with Sonnet 4.5. Ref: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool --- .../anthropic_claude3_transformation.py | 39 ++++++++++-- .../bedrock/test_anthropic_beta_support.py | 59 +++++++++++++++---- 2 files changed, 82 insertions(+), 16 deletions(-) diff --git a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py index 67ca9d5024..fc4220c054 100644 --- a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py +++ b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py @@ -178,6 +178,33 @@ class AmazonAnthropicClaudeMessagesConfig( ] return any(pattern in model_lower for pattern in opus_4_5_patterns) + def _supports_tool_search_on_bedrock(self, model: str) -> bool: + """ + Check if the model supports tool search on Bedrock. + + On Amazon Bedrock, server-side tool search is supported on Claude Opus 4.5 + and Claude Sonnet 4.5 with the tool-search-tool-2025-10-19 beta header. + + Ref: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool + + Args: + model: The model name + + Returns: + True if the model supports tool search on Bedrock + """ + model_lower = model.lower() + + # Supported models for tool search on Bedrock + supported_patterns = [ + # Opus 4.5 + "opus-4.5", "opus_4.5", "opus-4-5", "opus_4_5", + # Sonnet 4.5 + "sonnet-4.5", "sonnet_4.5", "sonnet-4-5", "sonnet_4_5", + ] + + return any(pattern in model_lower for pattern in supported_patterns) + def _filter_unsupported_beta_headers_for_bedrock( self, model: str, beta_set: set ) -> None: @@ -186,13 +213,14 @@ class AmazonAnthropicClaudeMessagesConfig( Extended thinking beta headers are only supported on specific Claude 4+ models. Advanced tool use headers are not supported on Bedrock Invoke API, but need to be - translated to Bedrock-specific headers for Claude Opus 4.5. + translated to Bedrock-specific headers for models that support tool search + (Claude Opus 4.5, Sonnet 4.5). This prevents 400 "invalid beta flag" errors on Bedrock. Note: Bedrock Invoke API fails with a 400 error when unsupported beta headers are sent, returning: {"message":"invalid beta flag"} - Translation for Claude Opus 4.5: + Translation for models supporting tool search (Opus 4.5, Sonnet 4.5): - advanced-tool-use-2025-11-20 -> tool-search-tool-2025-10-19 + tool-examples-2025-10-29 Args: @@ -226,10 +254,11 @@ class AmazonAnthropicClaudeMessagesConfig( # Remove all filtered headers for beta in beta_headers_to_remove: beta_set.discard(beta) - - # 3. Translate advanced-tool-use to Bedrock-specific headers for Claude Opus 4.5 + + # 3. Translate advanced-tool-use to Bedrock-specific headers for models that support tool search # Ref: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html - if has_advanced_tool_use and self._is_claude_opus_4_5(model): + # Ref: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool + if has_advanced_tool_use and self._supports_tool_search_on_bedrock(model): beta_set.add("tool-search-tool-2025-10-19") beta_set.add("tool-examples-2025-10-29") diff --git a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py index 0955636de6..e7b6de29b6 100644 --- a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py +++ b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py @@ -427,16 +427,18 @@ class TestAnthropicBetaHeaderSupport: "tool-examples-2025-10-29 should be added for Opus 4.5" ) - def test_messages_advanced_tool_use_filtered_non_opus_4_5(self): - """Test that advanced-tool-use header is filtered out for non-Opus 4.5 models. - - The translation to Bedrock-specific headers should only happen for Opus 4.5. - For other models, the advanced-tool-use header should just be removed. + def test_messages_advanced_tool_use_translation_sonnet_4_5(self): + """Test that advanced-tool-use header is translated to Bedrock-specific headers for Sonnet 4.5. + + Regression test for: Claude Code sends advanced-tool-use-2025-11-20 header which needs + to be translated to tool-search-tool-2025-10-19 and tool-examples-2025-10-29 for + Bedrock Invoke API on Claude Sonnet 4.5. + + Ref: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool """ config = AmazonAnthropicClaudeMessagesConfig() headers = {"anthropic-beta": "advanced-tool-use-2025-11-20"} - - # Test with Sonnet 4.5 (not Opus 4.5) + result = config.transform_anthropic_messages_request( model="us.anthropic.claude-sonnet-4-5-20250929-v1:0", messages=[{"role": "user", "content": "Test"}], @@ -444,12 +446,47 @@ class TestAnthropicBetaHeaderSupport: litellm_params={}, headers=headers ) - + + assert "anthropic_beta" in result + beta_headers = result["anthropic_beta"] + + # advanced-tool-use should be removed + assert "advanced-tool-use-2025-11-20" not in beta_headers, ( + "advanced-tool-use-2025-11-20 should be removed for Bedrock Invoke API" + ) + + # Bedrock-specific headers should be added for Sonnet 4.5 + assert "tool-search-tool-2025-10-19" in beta_headers, ( + "tool-search-tool-2025-10-19 should be added for Sonnet 4.5" + ) + assert "tool-examples-2025-10-29" in beta_headers, ( + "tool-examples-2025-10-29 should be added for Sonnet 4.5" + ) + + def test_messages_advanced_tool_use_filtered_unsupported_model(self): + """Test that advanced-tool-use header is filtered out for models that don't support tool search. + + The translation to Bedrock-specific headers should only happen for models that + support tool search on Bedrock (Opus 4.5, Sonnet 4.5). + For other models, the advanced-tool-use header should just be removed. + """ + config = AmazonAnthropicClaudeMessagesConfig() + headers = {"anthropic-beta": "advanced-tool-use-2025-11-20"} + + # Test with Claude 3.5 Sonnet (does NOT support tool search on Bedrock) + result = config.transform_anthropic_messages_request( + model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + messages=[{"role": "user", "content": "Test"}], + anthropic_messages_optional_request_params={"max_tokens": 100}, + litellm_params={}, + headers=headers + ) + beta_headers = result.get("anthropic_beta", []) - + # advanced-tool-use should be removed assert "advanced-tool-use-2025-11-20" not in beta_headers - - # Bedrock-specific headers should NOT be added for non-Opus 4.5 + + # Bedrock-specific headers should NOT be added for unsupported models assert "tool-search-tool-2025-10-19" not in beta_headers assert "tool-examples-2025-10-29" not in beta_headers From fe444f3ed5cae334d013450f96befdad113a09a2 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 27 Jan 2026 14:45:26 -0800 Subject: [PATCH 54/62] [Feat] RAG API - Add support for using s3 Vectors as Vector Store Provider for /rag/ingest (#19888) * init S3VectorsRAGIngestion as a supported ingestion provider for RAG API * test: TestRAGS3Vectors * init S3VectorsVectorStoreOptions * init s3 vectors * code clean up + QA * fix: get_credentials * S3VectorsRAGIngestion * TestRAGS3Vectors * docs: AWS S3 Vectors * add asyncio QA checks * fix: S3_VECTORS_DEFAULT_DIMENSION --- docs/my-website/docs/rag_ingest.md | 78 ++- litellm/constants.py | 7 + ...odel_prices_and_context_window_backup.json | 42 ++ litellm/rag/ingestion/s3_vectors_ingestion.py | 546 ++++++++++++++++++ litellm/rag/main.py | 2 + litellm/types/rag.py | 46 +- .../rag/test_rag_s3_vectors.py | 107 ++++ 7 files changed, 826 insertions(+), 2 deletions(-) create mode 100644 litellm/rag/ingestion/s3_vectors_ingestion.py create mode 100644 tests/vector_store_tests/rag/test_rag_s3_vectors.py diff --git a/docs/my-website/docs/rag_ingest.md b/docs/my-website/docs/rag_ingest.md index 1133b85f20..7adc2d70b5 100644 --- a/docs/my-website/docs/rag_ingest.md +++ b/docs/my-website/docs/rag_ingest.md @@ -5,7 +5,7 @@ All-in-one document ingestion pipeline: **Upload → Chunk → Embed → Vector | Feature | Supported | |---------|-----------| | Logging | Yes | -| Supported Providers | `openai`, `bedrock`, `vertex_ai`, `gemini` | +| Supported Providers | `openai`, `bedrock`, `vertex_ai`, `gemini`, `s3_vectors` | :::tip After ingesting documents, use [/rag/query](./rag_query.md) to search and generate responses with your ingested content. @@ -75,6 +75,31 @@ curl -X POST "http://localhost:4000/v1/rag/ingest" \ }" ``` +### AWS S3 Vectors + +```bash showLineNumbers title="Ingest to S3 Vectors" +curl -X POST "http://localhost:4000/v1/rag/ingest" \ + -H "Authorization: Bearer sk-1234" \ + -H "Content-Type: application/json" \ + -d "{ + \"file\": { + \"filename\": \"document.txt\", + \"content\": \"$(base64 -i document.txt)\", + \"content_type\": \"text/plain\" + }, + \"ingest_options\": { + \"embedding\": { + \"model\": \"text-embedding-3-small\" + }, + \"vector_store\": { + \"custom_llm_provider\": \"s3_vectors\", + \"vector_bucket_name\": \"my-embeddings\", + \"aws_region_name\": \"us-west-2\" + } + } + }" +``` + ## Response ```json @@ -265,6 +290,57 @@ When `vector_store_id` is omitted, LiteLLM automatically creates: 4. Install: `pip install 'google-cloud-aiplatform>=1.60.0'` ::: +### vector_store (AWS S3 Vectors) + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `custom_llm_provider` | string | - | `"s3_vectors"` | +| `vector_bucket_name` | string | **required** | S3 vector bucket name | +| `index_name` | string | auto-create | Vector index name | +| `dimension` | integer | auto-detect | Vector dimension (auto-detected from embedding model) | +| `distance_metric` | string | `cosine` | Distance metric: `cosine` or `euclidean` | +| `non_filterable_metadata_keys` | array | `["source_text"]` | Metadata keys excluded from filtering | +| `aws_region_name` | string | `us-west-2` | AWS region | +| `aws_access_key_id` | string | env | AWS access key | +| `aws_secret_access_key` | string | env | AWS secret key | + +:::info S3 Vectors Auto-Creation +When `index_name` is omitted, LiteLLM automatically creates: +- S3 vector bucket (if it doesn't exist) +- Vector index with auto-detected dimensions from your embedding model + +**Dimension Auto-Detection**: The vector dimension is automatically detected by making a test embedding request to your specified model. No need to manually specify dimensions! + +**Supported Embedding Models**: Works with any LiteLLM-supported embedding model (OpenAI, Cohere, Bedrock, Azure, etc.) +::: + +**Example with auto-detection:** +```json +{ + "embedding": { + "model": "text-embedding-3-small" // Dimension auto-detected as 1536 + }, + "vector_store": { + "custom_llm_provider": "s3_vectors", + "vector_bucket_name": "my-embeddings" + } +} +``` + +**Example with custom embedding provider:** +```json +{ + "embedding": { + "model": "cohere/embed-english-v3.0" // Dimension auto-detected as 1024 + }, + "vector_store": { + "custom_llm_provider": "s3_vectors", + "vector_bucket_name": "my-embeddings", + "distance_metric": "cosine" + } +} +``` + ## Input Examples ### File (Base64) diff --git a/litellm/constants.py b/litellm/constants.py index 0525bf3843..0c9d1d941b 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -1327,6 +1327,13 @@ COROUTINE_CHECKER_MAX_SIZE_IN_MEMORY = int( DEFAULT_CHUNK_SIZE = int(os.getenv("DEFAULT_CHUNK_SIZE", 1000)) DEFAULT_CHUNK_OVERLAP = int(os.getenv("DEFAULT_CHUNK_OVERLAP", 200)) +########################### S3 Vectors RAG Constants ########################### +S3_VECTORS_DEFAULT_DIMENSION = int(os.getenv("S3_VECTORS_DEFAULT_DIMENSION", 1024)) +S3_VECTORS_DEFAULT_DISTANCE_METRIC = str( + os.getenv("S3_VECTORS_DEFAULT_DISTANCE_METRIC", "cosine") +) +S3_VECTORS_DEFAULT_NON_FILTERABLE_METADATA_KEYS = ["source_text"] + ########################### Microsoft SSO Constants ########################### MICROSOFT_USER_EMAIL_ATTRIBUTE = str( os.getenv("MICROSOFT_USER_EMAIL_ATTRIBUTE", "userPrincipalName") diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 7f33e96dbb..4ac4159558 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -10232,6 +10232,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", diff --git a/litellm/rag/ingestion/s3_vectors_ingestion.py b/litellm/rag/ingestion/s3_vectors_ingestion.py new file mode 100644 index 0000000000..13964cd89a --- /dev/null +++ b/litellm/rag/ingestion/s3_vectors_ingestion.py @@ -0,0 +1,546 @@ +""" +S3 Vectors-specific RAG Ingestion implementation. + +S3 Vectors is AWS's native vector storage service that provides: +- Purpose-built vector buckets for storing and querying vectors +- Vector indexes with configurable dimensions and distance metrics +- Metadata filtering for semantic search + +This implementation: +1. Auto-creates vector buckets and indexes if not provided +2. Uses LiteLLM's embedding API (supports any provider) +3. Uses httpx + AWS SigV4 signing (no boto3 dependency for S3 Vectors APIs) +4. Stores vectors with metadata using PutVectors API +""" + +from __future__ import annotations + +import hashlib +import uuid +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple + +import litellm +from litellm._logging import verbose_logger +from litellm.constants import ( + S3_VECTORS_DEFAULT_DIMENSION, + S3_VECTORS_DEFAULT_DISTANCE_METRIC, + S3_VECTORS_DEFAULT_NON_FILTERABLE_METADATA_KEYS, +) +from litellm.litellm_core_utils.safe_json_dumps import safe_dumps +from litellm.llms.bedrock.base_aws_llm import BaseAWSLLM +from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + httpxSpecialProvider, +) +from litellm.rag.ingestion.base_ingestion import BaseRAGIngestion + +if TYPE_CHECKING: + from litellm import Router + from litellm.types.rag import RAGIngestOptions + + +class S3VectorsRAGIngestion(BaseRAGIngestion, BaseAWSLLM): + """ + S3 Vectors RAG ingestion using httpx + AWS SigV4 signing. + + Workflow: + 1. Auto-create vector bucket if needed (CreateVectorBucket API) + 2. Auto-create vector index if needed (CreateVectorIndex API) + 3. Generate embeddings using LiteLLM (supports any provider) + 4. Store vectors with PutVectors API + + Configuration: + - vector_bucket_name: S3 vector bucket name (required) + - index_name: Vector index name (auto-creates if not provided) + - dimension: Vector dimension (default: S3_VECTORS_DEFAULT_DIMENSION) + - distance_metric: "cosine" or "euclidean" (default: S3_VECTORS_DEFAULT_DISTANCE_METRIC) + - non_filterable_metadata_keys: List of metadata keys to exclude from filtering + """ + + def __init__( + self, + ingest_options: "RAGIngestOptions", + router: Optional["Router"] = None, + ): + BaseRAGIngestion.__init__(self, ingest_options=ingest_options, router=router) + BaseAWSLLM.__init__(self) + + # Extract config + self.vector_bucket_name = self.vector_store_config["vector_bucket_name"] + self.index_name = self.vector_store_config.get("index_name") + self.distance_metric = self.vector_store_config.get( + "distance_metric", S3_VECTORS_DEFAULT_DISTANCE_METRIC + ) + self.non_filterable_metadata_keys = self.vector_store_config.get( + "non_filterable_metadata_keys", + S3_VECTORS_DEFAULT_NON_FILTERABLE_METADATA_KEYS, + ) + + # Get dimension from config (will be auto-detected on first use if not provided) + self.dimension = self._get_dimension_from_config() + + # Get AWS region using BaseAWSLLM method + _aws_region = self.vector_store_config.get("aws_region_name") + self.aws_region_name = self.get_aws_region_name_for_non_llm_api_calls( + aws_region_name=str(_aws_region) if _aws_region else None + ) + + # Create httpx client (similar to s3_v2.py) + ssl_verify = self._get_ssl_verify( + ssl_verify=self.vector_store_config.get("ssl_verify") + ) + self.async_httpx_client = get_async_httpx_client( + llm_provider=httpxSpecialProvider.RAG, + params={"ssl_verify": ssl_verify} if ssl_verify is not None else None, + ) + + # Track if infrastructure is initialized + self._config_initialized = False + + async def _get_dimension_from_embedding_request(self) -> int: + """ + Auto-detect dimension by making a test embedding request. + + Makes a single embedding request with a test string to determine + the output dimension of the embedding model. + """ + if not self.embedding_config or "model" not in self.embedding_config: + return S3_VECTORS_DEFAULT_DIMENSION + + try: + model_name = self.embedding_config["model"] + verbose_logger.debug( + f"Auto-detecting dimension by making test embedding request to {model_name}" + ) + + # Make a test embedding request + test_input = "test" + if self.router: + response = await self.router.aembedding(model=model_name, input=[test_input]) + else: + response = await litellm.aembedding(model=model_name, input=[test_input]) + + # Get dimension from the response + if response.data and len(response.data) > 0: + dimension = len(response.data[0]["embedding"]) + verbose_logger.debug( + f"Auto-detected dimension {dimension} for embedding model {model_name}" + ) + return dimension + except Exception as e: + verbose_logger.warning( + f"Could not auto-detect dimension from embedding model: {e}. " + f"Using default dimension of {S3_VECTORS_DEFAULT_DIMENSION}." + ) + + return S3_VECTORS_DEFAULT_DIMENSION + + def _get_dimension_from_config(self) -> Optional[int]: + """ + Get vector dimension from config if explicitly provided. + + Returns None if dimension should be auto-detected. + """ + if "dimension" in self.vector_store_config: + return int(self.vector_store_config["dimension"]) + return None + + async def _ensure_config_initialized(self): + """Lazily initialize S3 Vectors infrastructure.""" + if self._config_initialized: + return + + # Auto-detect dimension if not provided + if self.dimension is None: + self.dimension = await self._get_dimension_from_embedding_request() + + # Ensure vector bucket exists + await self._ensure_vector_bucket_exists() + + # Ensure vector index exists + if not self.index_name: + # Auto-generate index name + unique_id = uuid.uuid4().hex[:8] + self.index_name = f"litellm-index-{unique_id}" + + await self._ensure_vector_index_exists() + + self._config_initialized = True + + async def _sign_and_execute_request( + self, + method: str, + url: str, + data: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + ) -> Any: + """ + Helper to sign and execute AWS API requests using httpx + SigV4. + + Pattern from litellm/integrations/s3_v2.py + """ + try: + import requests + from botocore.auth import SigV4Auth + from botocore.awsrequest import AWSRequest + except ImportError: + raise ImportError( + "Missing botocore to call S3 Vectors. Run 'pip install boto3'." + ) + + # Get AWS credentials using BaseAWSLLM's get_credentials method + credentials = self.get_credentials( + aws_access_key_id=self.vector_store_config.get("aws_access_key_id"), + aws_secret_access_key=self.vector_store_config.get("aws_secret_access_key"), + aws_session_token=self.vector_store_config.get("aws_session_token"), + aws_region_name=self.aws_region_name, + aws_session_name=self.vector_store_config.get("aws_session_name"), + aws_profile_name=self.vector_store_config.get("aws_profile_name"), + aws_role_name=self.vector_store_config.get("aws_role_name"), + aws_web_identity_token=self.vector_store_config.get("aws_web_identity_token"), + aws_sts_endpoint=self.vector_store_config.get("aws_sts_endpoint"), + aws_external_id=self.vector_store_config.get("aws_external_id"), + ) + + # Prepare headers + if headers is None: + headers = {} + + if data: + headers["Content-Type"] = "application/json" + # Calculate SHA256 hash of the content + content_hash = hashlib.sha256(data.encode("utf-8")).hexdigest() + headers["x-amz-content-sha256"] = content_hash + else: + # For requests without body, use hash of empty string + headers["x-amz-content-sha256"] = hashlib.sha256(b"").hexdigest() + + # Prepare the request + req = requests.Request(method, url, data=data, headers=headers) + prepped = req.prepare() + + # Sign the request + aws_request = AWSRequest( + method=prepped.method, + url=prepped.url, + data=prepped.body, + headers=prepped.headers, + ) + SigV4Auth(credentials, "s3vectors", self.aws_region_name).add_auth(aws_request) + + # Prepare the signed headers + signed_headers = dict(aws_request.headers.items()) + + # Make the request using specific method (pattern from s3_v2.py) + method_upper = method.upper() + if method_upper == "PUT": + response = await self.async_httpx_client.put( + url, data=data, headers=signed_headers + ) + elif method_upper == "POST": + response = await self.async_httpx_client.post( + url, data=data, headers=signed_headers + ) + elif method_upper == "GET": + response = await self.async_httpx_client.get(url, headers=signed_headers) + else: + raise ValueError(f"Unsupported HTTP method: {method}") + + return response + + async def _ensure_vector_bucket_exists(self): + """Create vector bucket if it doesn't exist using GetVectorBucket and CreateVectorBucket APIs.""" + verbose_logger.debug( + f"Ensuring S3 vector bucket exists: {self.vector_bucket_name}" + ) + + # Try to get bucket info using GetVectorBucket API + get_url = f"https://s3vectors.{self.aws_region_name}.api.aws/GetVectorBucket" + get_body = safe_dumps({"vectorBucketName": self.vector_bucket_name}) + + try: + response = await self._sign_and_execute_request("POST", get_url, data=get_body) + if response.status_code == 200: + verbose_logger.debug(f"Vector bucket {self.vector_bucket_name} exists") + return + except Exception as e: + verbose_logger.debug( + f"Bucket check failed (may not exist): {e}, attempting to create" + ) + + # Create vector bucket using CreateVectorBucket API + try: + verbose_logger.debug(f"Creating vector bucket: {self.vector_bucket_name}") + create_url = f"https://s3vectors.{self.aws_region_name}.api.aws/CreateVectorBucket" + create_body = safe_dumps({ + "vectorBucketName": self.vector_bucket_name + }) + + response = await self._sign_and_execute_request("POST", create_url, data=create_body) + + if response.status_code in (200, 201): + verbose_logger.info(f"Created vector bucket: {self.vector_bucket_name}") + elif response.status_code == 409: + # Bucket already exists (ConflictException) + verbose_logger.debug( + f"Vector bucket {self.vector_bucket_name} already exists" + ) + else: + verbose_logger.error(f"CreateVectorBucket failed: {response.status_code} - {response.text}") + response.raise_for_status() + except Exception as e: + verbose_logger.exception(f"Error creating vector bucket: {e}") + raise + + async def _ensure_vector_index_exists(self): + """Create vector index if it doesn't exist using GetIndex and CreateIndex APIs.""" + verbose_logger.debug( + f"Ensuring vector index exists: {self.vector_bucket_name}/{self.index_name}" + ) + + # Try to get index info using GetIndex API + get_url = f"https://s3vectors.{self.aws_region_name}.api.aws/GetIndex" + get_body = safe_dumps({ + "vectorBucketName": self.vector_bucket_name, + "indexName": self.index_name + }) + + try: + response = await self._sign_and_execute_request("POST", get_url, data=get_body) + if response.status_code == 200: + verbose_logger.debug(f"Vector index {self.index_name} exists") + return + except Exception as e: + verbose_logger.debug( + f"Index check failed (may not exist): {e}, attempting to create" + ) + + # Create vector index using CreateIndex API + try: + verbose_logger.debug( + f"Creating vector index: {self.index_name} with dimension={self.dimension}, metric={self.distance_metric}" + ) + + # Prepare index configuration per AWS API docs + index_config = { + "vectorBucketName": self.vector_bucket_name, + "indexName": self.index_name, + "dataType": "float32", + "dimension": self.dimension, + "distanceMetric": self.distance_metric, + } + + if self.non_filterable_metadata_keys: + index_config["metadataConfiguration"] = { + "nonFilterableMetadataKeys": self.non_filterable_metadata_keys + } + + create_url = f"https://s3vectors.{self.aws_region_name}.api.aws/CreateIndex" + response = await self._sign_and_execute_request( + "POST", create_url, data=safe_dumps(index_config) + ) + + if response.status_code in (200, 201): + verbose_logger.info(f"Created vector index: {self.index_name}") + elif response.status_code == 409: + verbose_logger.debug(f"Vector index {self.index_name} already exists") + else: + verbose_logger.error(f"CreateIndex failed: {response.status_code} - {response.text}") + response.raise_for_status() + except Exception as e: + verbose_logger.exception(f"Error creating vector index: {e}") + raise + + async def _put_vectors(self, vectors: List[Dict[str, Any]]): + """ + Call PutVectors API to store vectors in S3 Vectors. + + Args: + vectors: List of vector objects with keys: "key", "data", "metadata" + """ + verbose_logger.debug( + f"Storing {len(vectors)} vectors in {self.vector_bucket_name}/{self.index_name}" + ) + + url = f"https://s3vectors.{self.aws_region_name}.api.aws/PutVectors" + + # Prepare request body per AWS API docs + request_body = { + "vectorBucketName": self.vector_bucket_name, + "indexName": self.index_name, + "vectors": vectors + } + + try: + response = await self._sign_and_execute_request( + "POST", url, data=safe_dumps(request_body) + ) + + if response.status_code in (200, 201): + verbose_logger.info( + f"Successfully stored {len(vectors)} vectors in index {self.index_name}" + ) + else: + verbose_logger.error( + f"PutVectors failed with status {response.status_code}: {response.text}" + ) + response.raise_for_status() + except Exception as e: + verbose_logger.exception(f"Error storing vectors: {e}") + raise + + async def embed( + self, + chunks: List[str], + ) -> Optional[List[List[float]]]: + """ + Generate embeddings using LiteLLM's embedding API. + + Supports any embedding provider (OpenAI, Bedrock, Cohere, etc.) + """ + if not chunks: + return None + + # Use embedding config from ingest_options or default + if not self.embedding_config: + verbose_logger.warning( + "No embedding config provided, using default text-embedding-3-small" + ) + self.embedding_config = {"model": "text-embedding-3-small"} + + embedding_model = self.embedding_config.get("model", "text-embedding-3-small") + + verbose_logger.debug( + f"Generating embeddings for {len(chunks)} chunks using {embedding_model}" + ) + + # Convert to list to ensure type compatibility + input_chunks: List[str] = list(chunks) + + if self.router: + response = await self.router.aembedding(model=embedding_model, input=input_chunks) + else: + response = await litellm.aembedding(model=embedding_model, input=input_chunks) + + return [item["embedding"] for item in response.data] + + async def store( + self, + file_content: Optional[bytes], + filename: Optional[str], + content_type: Optional[str], + chunks: List[str], + embeddings: Optional[List[List[float]]], + ) -> Tuple[Optional[str], Optional[str]]: + """ + Store vectors in S3 Vectors using PutVectors API. + + Steps: + 1. Ensure vector bucket exists (auto-create if needed) + 2. Ensure vector index exists (auto-create if needed) + 3. Prepare vector data with metadata + 4. Call PutVectors API with httpx + SigV4 signing + + Args: + file_content: Raw file bytes (not used for S3 Vectors) + filename: Name of the file + content_type: MIME type (not used for S3 Vectors) + chunks: Text chunks + embeddings: Vector embeddings + + Returns: + Tuple of (index_name, filename) + """ + # Ensure infrastructure exists + await self._ensure_config_initialized() + + if not embeddings or not chunks: + verbose_logger.warning("No embeddings or chunks to store") + return self.index_name, None + + # Prepare vectors for PutVectors API + vectors = [] + for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)): + vector_obj = { + "key": f"{filename}_{i}" if filename else f"chunk_{i}", + "data": {"float32": embedding}, + "metadata": { + "source_text": chunk, # Non-filterable (for reference) + "chunk_index": str(i), # Filterable + }, + } + + if filename: + vector_obj["metadata"]["filename"] = filename # Filterable + + vectors.append(vector_obj) + + # Call PutVectors API + await self._put_vectors(vectors) + + return self.index_name, filename + + async def query_vector_store( + self, vector_store_id: str, query: str, top_k: int = 5 + ) -> Optional[Dict[str, Any]]: + """ + Query S3 Vectors using QueryVectors API. + + Args: + vector_store_id: Index name + query: Query text + top_k: Number of results to return + + Returns: + Query results with vectors and metadata + """ + verbose_logger.debug(f"Querying index {vector_store_id} with query: {query}") + + # Generate query embedding + if not self.embedding_config: + self.embedding_config = {"model": "text-embedding-3-small"} + + embedding_model = self.embedding_config.get("model", "text-embedding-3-small") + + response = await litellm.aembedding(model=embedding_model, input=[query]) + query_embedding = response.data[0]["embedding"] + + # Call QueryVectors API + url = f"https://s3vectors.{self.aws_region_name}.api.aws/QueryVectors" + + request_body = { + "vectorBucketName": self.vector_bucket_name, + "indexName": vector_store_id, + "queryVector": {"float32": query_embedding}, + "topK": top_k, + "returnDistance": True, + "returnMetadata": True, + } + + try: + response = await self._sign_and_execute_request( + "POST", url, data=safe_dumps(request_body) + ) + + if response.status_code == 200: + results = response.json() + verbose_logger.debug(f"Query returned {len(results.get('vectors', []))} results") + + # Check if query terms appear in results + if results.get("vectors"): + for result in results["vectors"]: + metadata = result.get("metadata", {}) + source_text = metadata.get("source_text", "") + if query.lower() in source_text.lower(): + return results + + # Return results even if exact match not found + return results + else: + verbose_logger.error( + f"QueryVectors failed with status {response.status_code}: {response.text}" + ) + return None + except Exception as e: + verbose_logger.exception(f"Error querying vectors: {e}") + return None diff --git a/litellm/rag/main.py b/litellm/rag/main.py index 620097f83d..571f78f2f7 100644 --- a/litellm/rag/main.py +++ b/litellm/rag/main.py @@ -31,6 +31,7 @@ from litellm.rag.ingestion.base_ingestion import BaseRAGIngestion from litellm.rag.ingestion.bedrock_ingestion import BedrockRAGIngestion from litellm.rag.ingestion.gemini_ingestion import GeminiRAGIngestion from litellm.rag.ingestion.openai_ingestion import OpenAIRAGIngestion +from litellm.rag.ingestion.s3_vectors_ingestion import S3VectorsRAGIngestion from litellm.rag.rag_query import RAGQuery from litellm.types.rag import ( RAGIngestOptions, @@ -48,6 +49,7 @@ INGESTION_REGISTRY: Dict[str, Type[BaseRAGIngestion]] = { "openai": OpenAIRAGIngestion, "bedrock": BedrockRAGIngestion, "gemini": GeminiRAGIngestion, + "s3_vectors": S3VectorsRAGIngestion, } diff --git a/litellm/types/rag.py b/litellm/types/rag.py index fe237a1343..cae0770868 100644 --- a/litellm/types/rag.py +++ b/litellm/types/rag.py @@ -129,9 +129,53 @@ class VertexAIVectorStoreOptions(TypedDict, total=False): import_timeout: Optional[int] # Timeout in seconds (default: 600) +class S3VectorsVectorStoreOptions(TypedDict, total=False): + """ + AWS S3 Vectors configuration. + + Example (auto-create): + {"custom_llm_provider": "s3_vectors", "vector_bucket_name": "my-embeddings"} + + Example (use existing): + {"custom_llm_provider": "s3_vectors", "vector_bucket_name": "my-embeddings", + "index_name": "my-index"} + + Example (with credentials): + {"custom_llm_provider": "s3_vectors", "vector_bucket_name": "my-embeddings", + "litellm_credential_name": "my-aws-creds"} + + Auto-creation creates: S3 vector bucket and vector index (if not provided). + Embeddings are generated using LiteLLM's embedding API (supports any provider). + """ + + custom_llm_provider: Literal["s3_vectors"] + vector_bucket_name: str # Required - S3 vector bucket name + index_name: Optional[str] # Vector index name (auto-creates if not provided) + + # Index configuration (for auto-creation) + dimension: Optional[int] # Vector dimension (auto-detected from embedding model, or default: 1024) + distance_metric: Optional[Literal["cosine", "euclidean"]] # Default: cosine + non_filterable_metadata_keys: Optional[List[str]] # Keys excluded from filtering (e.g., ["source_text"]) + + # Credentials (loaded from litellm.credential_list if litellm_credential_name is provided) + litellm_credential_name: Optional[str] # Credential name to load from litellm.credential_list + + # AWS auth (uses BaseAWSLLM) + aws_access_key_id: Optional[str] + aws_secret_access_key: Optional[str] + aws_session_token: Optional[str] + aws_region_name: Optional[str] # default: us-west-2 + aws_role_name: Optional[str] + aws_session_name: Optional[str] + aws_profile_name: Optional[str] + aws_web_identity_token: Optional[str] + aws_sts_endpoint: Optional[str] + aws_external_id: Optional[str] + + # Union type for vector store options RAGIngestVectorStoreOptions = Union[ - OpenAIVectorStoreOptions, BedrockVectorStoreOptions, VertexAIVectorStoreOptions + OpenAIVectorStoreOptions, BedrockVectorStoreOptions, VertexAIVectorStoreOptions, S3VectorsVectorStoreOptions ] diff --git a/tests/vector_store_tests/rag/test_rag_s3_vectors.py b/tests/vector_store_tests/rag/test_rag_s3_vectors.py new file mode 100644 index 0000000000..cd8a362a7b --- /dev/null +++ b/tests/vector_store_tests/rag/test_rag_s3_vectors.py @@ -0,0 +1,107 @@ +""" +S3 Vectors RAG ingestion tests. + +Requires environment variables: +- AWS_ACCESS_KEY_ID +- AWS_SECRET_ACCESS_KEY +- AWS_REGION_NAME (optional, defaults to us-west-2) + +Optional: +- S3_VECTOR_BUCKET_NAME (optional, auto-generates if not set) +""" + +import os +import sys +from typing import Any, Dict, Optional + +import pytest + +sys.path.insert(0, os.path.abspath("../../..")) + +import litellm +from litellm.types.rag import RAGIngestOptions +from tests.vector_store_tests.rag.base_rag_tests import BaseRAGTest + + +class TestRAGS3Vectors(BaseRAGTest): + """Test RAG Ingest with AWS S3 Vectors.""" + + @pytest.fixture(autouse=True) + def check_env_vars(self): + """Check required environment variables before each test.""" + aws_key = os.environ.get("AWS_ACCESS_KEY_ID") + aws_secret = os.environ.get("AWS_SECRET_ACCESS_KEY") + + if not aws_key or not aws_secret: + pytest.skip("Skipping S3 Vectors test: AWS credentials required") + + def get_base_ingest_options(self) -> RAGIngestOptions: + """ + Return S3 Vectors-specific ingest options. + + Chunking is configured via chunking_strategy (unified interface). + Embeddings are generated using LiteLLM's embedding API. + """ + vector_bucket_name = os.environ.get( + "S3_VECTOR_BUCKET_NAME", "test-litellm-vectors" + ) + aws_region = os.environ.get("AWS_REGION_NAME", "us-west-2") + + return { + "chunking_strategy": { + "chunk_size": 512, + "chunk_overlap": 100, + }, + "embedding": { + "model": "text-embedding-3-small" # Can use any LiteLLM-supported model + }, + "vector_store": { + "custom_llm_provider": "s3_vectors", + "vector_bucket_name": vector_bucket_name, + "index_name": "test-index", + # dimension is auto-detected from embedding model (text-embedding-3-small = 1536) + "distance_metric": "cosine", + "non_filterable_metadata_keys": ["source_text"], + "aws_region_name": aws_region, + }, + } + + async def query_vector_store( + self, + vector_store_id: str, + query: str, + ) -> Optional[Dict[str, Any]]: + """Query S3 Vectors index.""" + try: + # Import the ingestion class to use its query method + from litellm.rag.ingestion.s3_vectors_ingestion import ( + S3VectorsRAGIngestion, + ) + except ImportError: + pytest.skip("S3 Vectors ingestion not available") + + vector_bucket_name = os.environ.get( + "S3_VECTOR_BUCKET_NAME", "test-litellm-vectors" + ) + aws_region = os.environ.get("AWS_REGION_NAME", "us-west-2") + + # Create ingestion instance to use query method + ingest_options = { + "embedding": {"model": "text-embedding-3-small"}, + "vector_store": { + "custom_llm_provider": "s3_vectors", + "vector_bucket_name": vector_bucket_name, + "aws_region_name": aws_region, + }, + } + + ingestion = S3VectorsRAGIngestion(ingest_options=ingest_options) + + # Query the index + results = await ingestion.query_vector_store( + vector_store_id=vector_store_id, + query=query, + top_k=5, + ) + + return results From 51339f5ef189e1b3f79d9b04e1f61859e2373675 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 27 Jan 2026 16:30:59 -0800 Subject: [PATCH 55/62] [Feat] RAG API - Add s3_vectors as provider on /vector_store/search API + UI for creating + PDF support for /rag/ingest (#19895) * init S3VectorsRAGIngestion as a supported ingestion provider for RAG API * test: TestRAGS3Vectors * init S3VectorsVectorStoreOptions * init s3 vectors * code clean up + QA * fix: get_credentials * S3VectorsRAGIngestion * TestRAGS3Vectors * docs: AWS S3 Vectors * add asyncio QA checks * fix: S3_VECTORS_DEFAULT_DIMENSION * init ui for bedrock s3 vectors * fix add /search support for s3_vectors * init atransform_search_vector_store_request * feat: S3VectorsVectorStoreConfig * TestS3VectorsVectorStoreConfig * atransform_search_vector_store_request * fix: S3VectorsVectorStoreConfig * add validation for bucket name etd * fix UI validation for s3 vector store * init extract_text_from_pdf * add pypdf * fix code QA checks * fix navbar * init s3_vector.png * fix QA code --- .../base_llm/vector_store/transformation.py | 26 +- litellm/llms/bedrock/base_aws_llm.py | 2 +- litellm/llms/custom_httpx/llm_http_handler.py | 36 ++- litellm/llms/s3_vectors/__init__.py | 1 + .../llms/s3_vectors/vector_stores/__init__.py | 1 + .../vector_stores/transformation.py | 254 ++++++++++++++++++ .../out/assets/logos/s3_vector.png | Bin 0 -> 191076 bytes litellm/proxy/rag_endpoints/endpoints.py | 9 + litellm/rag/ingestion/base_ingestion.py | 17 +- .../rag/ingestion/file_parsers/__init__.py | 9 + .../rag/ingestion/file_parsers/pdf_parser.py | 70 +++++ litellm/rag/ingestion/s3_vectors_ingestion.py | 47 +++- litellm/types/router.py | 4 + litellm/types/utils.py | 11 +- litellm/utils.py | 8 +- requirements.txt | 1 + .../test_litellm/llms/s3_vectors/__init__.py | 1 + .../llms/s3_vectors/vector_stores/__init__.py | 1 + .../test_s3_vectors_transformation.py | 115 ++++++++ .../test_s3_vectors_vector_store.py | 42 +++ .../public/assets/logos/s3_vector.png | Bin 0 -> 191076 bytes .../src/components/navbar.tsx | 2 +- .../src/components/networking.tsx | 4 +- .../CreateVectorStore.test.tsx | 116 +++++++- .../CreateVectorStore.tsx | 96 ++++++- .../S3VectorsConfig.test.tsx | 203 ++++++++++++++ .../S3VectorsConfig.tsx | 192 +++++++++++++ .../src/components/vector_store_providers.tsx | 37 +++ 28 files changed, 1269 insertions(+), 36 deletions(-) create mode 100644 litellm/llms/s3_vectors/__init__.py create mode 100644 litellm/llms/s3_vectors/vector_stores/__init__.py create mode 100644 litellm/llms/s3_vectors/vector_stores/transformation.py create mode 100644 litellm/proxy/_experimental/out/assets/logos/s3_vector.png create mode 100644 litellm/rag/ingestion/file_parsers/__init__.py create mode 100644 litellm/rag/ingestion/file_parsers/pdf_parser.py create mode 100644 tests/test_litellm/llms/s3_vectors/__init__.py create mode 100644 tests/test_litellm/llms/s3_vectors/vector_stores/__init__.py create mode 100644 tests/test_litellm/llms/s3_vectors/vector_stores/test_s3_vectors_transformation.py create mode 100644 tests/vector_store_tests/test_s3_vectors_vector_store.py create mode 100644 ui/litellm-dashboard/public/assets/logos/s3_vector.png create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.test.tsx create mode 100644 ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.tsx diff --git a/litellm/llms/base_llm/vector_store/transformation.py b/litellm/llms/base_llm/vector_store/transformation.py index 89f2094d5d..935fd53c19 100644 --- a/litellm/llms/base_llm/vector_store/transformation.py +++ b/litellm/llms/base_llm/vector_store/transformation.py @@ -5,8 +5,8 @@ import httpx from litellm.types.router import GenericLiteLLMParams from litellm.types.vector_stores import ( - BaseVectorStoreAuthCredentials, VECTOR_STORE_OPENAI_PARAMS, + BaseVectorStoreAuthCredentials, VectorStoreCreateOptionalRequestParams, VectorStoreCreateResponse, VectorStoreIndexEndpoints, @@ -64,6 +64,30 @@ class BaseVectorStoreConfig: pass + async def atransform_search_vector_store_request( + self, + vector_store_id: str, + query: Union[str, List[str]], + vector_store_search_optional_params: VectorStoreSearchOptionalRequestParams, + api_base: str, + litellm_logging_obj: LiteLLMLoggingObj, + litellm_params: dict, + ) -> Tuple[str, Dict]: + """ + Optional async version of transform_search_vector_store_request. + If not implemented, the handler will fall back to the sync version. + Providers that need to make async calls (e.g., generating embeddings) should override this. + """ + # Default implementation: call the sync version + return self.transform_search_vector_store_request( + vector_store_id=vector_store_id, + query=query, + vector_store_search_optional_params=vector_store_search_optional_params, + api_base=api_base, + litellm_logging_obj=litellm_logging_obj, + litellm_params=litellm_params, + ) + @abstractmethod def transform_search_vector_store_response( self, response: httpx.Response, litellm_logging_obj: LiteLLMLoggingObj diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index 642d15fe3e..1de1c40c43 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -1163,7 +1163,7 @@ class BaseAWSLLM: def _sign_request( self, - service_name: Literal["bedrock", "sagemaker", "bedrock-agentcore"], + service_name: Literal["bedrock", "sagemaker", "bedrock-agentcore", "s3vectors"], headers: dict, optional_params: dict, request_data: dict, diff --git a/litellm/llms/custom_httpx/llm_http_handler.py b/litellm/llms/custom_httpx/llm_http_handler.py index 6a87967c3a..d2ea7e872a 100644 --- a/litellm/llms/custom_httpx/llm_http_handler.py +++ b/litellm/llms/custom_httpx/llm_http_handler.py @@ -7033,17 +7033,31 @@ class BaseLLMHTTPHandler: litellm_params=dict(litellm_params), ) - ( - url, - request_body, - ) = vector_store_provider_config.transform_search_vector_store_request( - vector_store_id=vector_store_id, - query=query, - vector_store_search_optional_params=vector_store_search_optional_params, - api_base=api_base, - litellm_logging_obj=logging_obj, - litellm_params=dict(litellm_params), - ) + # Check if provider has async transform method + if hasattr(vector_store_provider_config, "atransform_search_vector_store_request"): + ( + url, + request_body, + ) = await vector_store_provider_config.atransform_search_vector_store_request( + vector_store_id=vector_store_id, + query=query, + vector_store_search_optional_params=vector_store_search_optional_params, + api_base=api_base, + litellm_logging_obj=logging_obj, + litellm_params=dict(litellm_params), + ) + else: + ( + url, + request_body, + ) = vector_store_provider_config.transform_search_vector_store_request( + vector_store_id=vector_store_id, + query=query, + vector_store_search_optional_params=vector_store_search_optional_params, + api_base=api_base, + litellm_logging_obj=logging_obj, + litellm_params=dict(litellm_params), + ) all_optional_params: Dict[str, Any] = dict(litellm_params) all_optional_params.update(vector_store_search_optional_params or {}) headers, signed_json_body = vector_store_provider_config.sign_request( diff --git a/litellm/llms/s3_vectors/__init__.py b/litellm/llms/s3_vectors/__init__.py new file mode 100644 index 0000000000..e8367949c3 --- /dev/null +++ b/litellm/llms/s3_vectors/__init__.py @@ -0,0 +1 @@ +# S3 Vectors LLM integration diff --git a/litellm/llms/s3_vectors/vector_stores/__init__.py b/litellm/llms/s3_vectors/vector_stores/__init__.py new file mode 100644 index 0000000000..ac24b4a38d --- /dev/null +++ b/litellm/llms/s3_vectors/vector_stores/__init__.py @@ -0,0 +1 @@ +# S3 Vectors vector store integration diff --git a/litellm/llms/s3_vectors/vector_stores/transformation.py b/litellm/llms/s3_vectors/vector_stores/transformation.py new file mode 100644 index 0000000000..df81a78289 --- /dev/null +++ b/litellm/llms/s3_vectors/vector_stores/transformation.py @@ -0,0 +1,254 @@ +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union + +import httpx + +from litellm.llms.base_llm.vector_store.transformation import BaseVectorStoreConfig +from litellm.llms.bedrock.base_aws_llm import BaseAWSLLM +from litellm.types.router import GenericLiteLLMParams +from litellm.types.vector_stores import ( + VECTOR_STORE_OPENAI_PARAMS, + BaseVectorStoreAuthCredentials, + VectorStoreIndexEndpoints, + VectorStoreResultContent, + VectorStoreSearchOptionalRequestParams, + VectorStoreSearchResponse, + VectorStoreSearchResult, +) + +if TYPE_CHECKING: + from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj +else: + LiteLLMLoggingObj = Any + + +class S3VectorsVectorStoreConfig(BaseVectorStoreConfig, BaseAWSLLM): + """Vector store configuration for AWS S3 Vectors.""" + + def __init__(self) -> None: + BaseVectorStoreConfig.__init__(self) + BaseAWSLLM.__init__(self) + + def get_auth_credentials( + self, litellm_params: dict + ) -> BaseVectorStoreAuthCredentials: + return {} + + def get_vector_store_endpoints_by_type(self) -> VectorStoreIndexEndpoints: + return { + "read": [("POST", "/QueryVectors")], + "write": [], + } + + def get_supported_openai_params( + self, model: str + ) -> List[VECTOR_STORE_OPENAI_PARAMS]: + return ["max_num_results"] + + def map_openai_params( + self, + non_default_params: dict, + optional_params: dict, + drop_params: bool, + ) -> dict: + for param, value in non_default_params.items(): + if param == "max_num_results": + optional_params["maxResults"] = value + return optional_params + + def validate_environment( + self, headers: dict, litellm_params: Optional[GenericLiteLLMParams] + ) -> dict: + headers = headers or {} + headers.setdefault("Content-Type", "application/json") + return headers + + def get_complete_url(self, api_base: Optional[str], litellm_params: dict) -> str: + aws_region_name = litellm_params.get("aws_region_name") + if not aws_region_name: + raise ValueError("aws_region_name is required for S3 Vectors") + return f"https://s3vectors.{aws_region_name}.api.aws" + + def transform_search_vector_store_request( + self, + vector_store_id: str, + query: Union[str, List[str]], + vector_store_search_optional_params: VectorStoreSearchOptionalRequestParams, + api_base: str, + litellm_logging_obj: LiteLLMLoggingObj, + litellm_params: dict, + ) -> Tuple[str, Dict]: + """Sync version - generates embedding synchronously.""" + # For S3 Vectors, vector_store_id should be in format: bucket_name:index_name + # If not in that format, try to construct it from litellm_params + bucket_name: str + index_name: str + + if ":" in vector_store_id: + bucket_name, index_name = vector_store_id.split(":", 1) + else: + # Try to get bucket_name from litellm_params + bucket_name_from_params = litellm_params.get("vector_bucket_name") + if not bucket_name_from_params or not isinstance(bucket_name_from_params, str): + raise ValueError( + "vector_store_id must be in format 'bucket_name:index_name' for S3 Vectors, " + "or vector_bucket_name must be provided in litellm_params" + ) + bucket_name = bucket_name_from_params + index_name = vector_store_id + + if isinstance(query, list): + query = " ".join(query) + + # Generate embedding for the query + embedding_model = litellm_params.get("embedding_model", "text-embedding-3-small") + + import litellm as litellm_module + embedding_response = litellm_module.embedding(model=embedding_model, input=[query]) + query_embedding = embedding_response.data[0]["embedding"] + + url = f"{api_base}/QueryVectors" + + request_body: Dict[str, Any] = { + "vectorBucketName": bucket_name, + "indexName": index_name, + "queryVector": {"float32": query_embedding}, + "topK": vector_store_search_optional_params.get("max_num_results", 5), # Default to 5 + "returnDistance": True, + "returnMetadata": True, + } + + litellm_logging_obj.model_call_details["query"] = query + return url, request_body + + async def atransform_search_vector_store_request( + self, + vector_store_id: str, + query: Union[str, List[str]], + vector_store_search_optional_params: VectorStoreSearchOptionalRequestParams, + api_base: str, + litellm_logging_obj: LiteLLMLoggingObj, + litellm_params: dict, + ) -> Tuple[str, Dict]: + """Async version - generates embedding asynchronously.""" + # For S3 Vectors, vector_store_id should be in format: bucket_name:index_name + # If not in that format, try to construct it from litellm_params + bucket_name: str + index_name: str + + if ":" in vector_store_id: + bucket_name, index_name = vector_store_id.split(":", 1) + else: + # Try to get bucket_name from litellm_params + bucket_name_from_params = litellm_params.get("vector_bucket_name") + if not bucket_name_from_params or not isinstance(bucket_name_from_params, str): + raise ValueError( + "vector_store_id must be in format 'bucket_name:index_name' for S3 Vectors, " + "or vector_bucket_name must be provided in litellm_params" + ) + bucket_name = bucket_name_from_params + index_name = vector_store_id + + if isinstance(query, list): + query = " ".join(query) + + # Generate embedding for the query asynchronously + embedding_model = litellm_params.get("embedding_model", "text-embedding-3-small") + + import litellm as litellm_module + embedding_response = await litellm_module.aembedding(model=embedding_model, input=[query]) + query_embedding = embedding_response.data[0]["embedding"] + + url = f"{api_base}/QueryVectors" + + request_body: Dict[str, Any] = { + "vectorBucketName": bucket_name, + "indexName": index_name, + "queryVector": {"float32": query_embedding}, + "topK": vector_store_search_optional_params.get("max_num_results", 5), # Default to 5 + "returnDistance": True, + "returnMetadata": True, + } + + litellm_logging_obj.model_call_details["query"] = query + return url, request_body + + def sign_request( + self, + headers: dict, + optional_params: Dict, + request_data: Dict, + api_base: str, + api_key: Optional[str] = None, + ) -> Tuple[dict, Optional[bytes]]: + return self._sign_request( + service_name="s3vectors", + headers=headers, + optional_params=optional_params, + request_data=request_data, + api_base=api_base, + api_key=api_key, + ) + + def transform_search_vector_store_response( + self, response: httpx.Response, litellm_logging_obj: LiteLLMLoggingObj + ) -> VectorStoreSearchResponse: + try: + response_data = response.json() + results: List[VectorStoreSearchResult] = [] + + for item in response_data.get("vectors", []) or []: + metadata = item.get("metadata", {}) or {} + source_text = metadata.get("source_text", "") + + if not source_text: + continue + + # Extract file information from metadata + chunk_index = metadata.get("chunk_index", "0") + file_id = f"s3-vectors-chunk-{chunk_index}" + filename = metadata.get("filename", f"document-{chunk_index}") + + # S3 Vectors returns distance, convert to similarity score (0-1) + # Lower distance = higher similarity + # We'll normalize using 1 / (1 + distance) to get a 0-1 score + distance = item.get("distance") + score = None + if distance is not None: + # Convert distance to similarity score between 0 and 1 + # For cosine distance: similarity = 1 - distance + # For euclidean: use 1 / (1 + distance) + # Assuming cosine distance here + score = max(0.0, min(1.0, 1.0 - float(distance))) + + results.append( + VectorStoreSearchResult( + score=score, + content=[VectorStoreResultContent(text=source_text, type="text")], + file_id=file_id, + filename=filename, + attributes=metadata, + ) + ) + + return VectorStoreSearchResponse( + object="vector_store.search_results.page", + search_query=litellm_logging_obj.model_call_details.get("query", ""), + data=results, + ) + except Exception as e: + raise self.get_error_class( + error_message=str(e), + status_code=response.status_code, + headers=response.headers, + ) + + # Vector store creation is not yet implemented + def transform_create_vector_store_request( + self, + vector_store_create_optional_params, + api_base: str, + ) -> Tuple[str, Dict]: + raise NotImplementedError + + def transform_create_vector_store_response(self, response: httpx.Response): + raise NotImplementedError diff --git a/litellm/proxy/_experimental/out/assets/logos/s3_vector.png b/litellm/proxy/_experimental/out/assets/logos/s3_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..15a1a456e129f9e2544d82399c6db3f2b9d8d204 GIT binary patch literal 191076 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
      ^jr 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

      3YYKR6{ z;eVZ|Xc9msvJQ0a1f4y;rYN*Z_5;#k5yNt59}4U~2)o?E#zdx9 zPC9b=LLI}SMFA4?dA#P8f6NaE>~Tu@QWvI++oir9CgMp4kI?3l&Tc?W#tuAvXxG2o z`NVw(c1}(WAD$T*oemMiJO;GrH~(E)nul4O$X+P9a_fkAVD z)hZipkv%7T(FL6-59!fX{`4|rAO;L`<9N}%Cs89xXqbMdTHEdj8JHIZz{o}u-W2m& z&OGPICmy}@;!E$o_wIVN##_x`8~?yLH50a{KMsbN9U!j5>|hlU)K;d7G`;mLYz=69 z@FSTG8xx#x2fCdkKlwrJhR-*PU73v=dAD4%Qo-r@7FR?hwV$bPA#{vP6+_^1VGJ|E zLL*-s>`D5G_ekwzlk&_{d-mLT|Ks0&a`%bxBO~Jzz9%w4R{F6Z%D<5;GYH^m<+}P_ zbo!~kzHZ|SPTknKaN$5_sl+x!HLu0%+Ibsna-uwqRp4hNNnt1sJ|KZ)syZd21zDGf!+Igp7&cJY zzz_l(3D`7?1sAD}VWLaSP|c}O4bxI*8?I4Ky+xiq>Fs3Q$KCivfH$!3Aa1V?PnRp> zhxd-`|HigwzH)5;(L?)^<`j`6Ipd_+MFz|NV=$Uvu-4yQ>M1Q)-?!|wtIvAl>1Qrk zy4q@0e#2%usZUlXCZ|~zWP1RKV}GfwsA@S$OEZ>|JQAo*z2dzoxul!rgPF{udvfa* z|m);sUsmyWd7yW+Q0uOJ2I7A|K`GLFLi;5Y+A}Tnc-hBbM7Qq(`KuMwR(j& zY#bk+*tBW=$ndfAF1+}``|hojEBvT0axmKgHICZ+Tl4NDr|U zsJKSDIc6&xTed0)dRLdLkvsMr8XKGH@9$0@B1|PpkQ8^jX!kjXpoJl>X^+jiTMCw+ z(mHV>cm4IXH(Zyz;+Lsw^{ZcAe8JVVkN{2QA;jEksMcJA8qjmHi?v-gQ(BL^Pd zKYcKLZjg!*(pl|Df!LCK* zjm?cG)1%2mBbl1yEl^3bQmxbsi|`K}B{di?<}O8DJATLHwFUqc@eyYaku`8^(B5&vr@jjM74WbTM8z=LJ8o4fRjEQSDd`OcM)FMU+K_FsaG}KJ( z1R_oul!0_iVJMtHa|bZFg{7k=izONcT4)9^>cqF`d@xsGlZAZnBVbqt%#N6RGxbL`0(z%2PURZ>>57!(7~NgA3d~vm{mI8K$+zGl7YSi5oK

      3YYKR6{ z;eVZ|Xc9msvJQ0a1f4y;rYN*Z_5;#k5yNt59}4U~2)o?E#zdx9 zPC9b=LLI}SMFA4?dA#P8f6NaE>~Tu@QWvI++oir9CgMp4kI?3l&Tc?W#tuAvXxG2o z`NVw(c1}(WAD$T*oemMiJO;GrH~(E)nul4O$X+P9a_fkAVD z)hZipkv%7T(FL6-59!fX{`4|rAO;L`<9N}%Cs89xXqbMdTHEdj8JHIZz{o}u-W2m& z&OGPICmy}@;!E$o_wIVN##_x`8~?yLH50a{KMsbN9U!j5>|hlU)K;d7G`;mLYz=69 z@FSTG8xx#x2fCdkKlwrJhR-*PU73v=dAD4%Qo-r@7FR?hwV$bPA#{vP6+_^1VGJ|E zLL*-s>`D5G_ekwzlk&_{d-mLT|Ks0&a`%bxBO~Jzz9%w4R{F6Z%D<5;GYH^m<+}P_ zbo!~kzHZ|SPTknKaN$5_sl+x!HLu0%+Ibsna-uwqRp4hNNnt1sJ|KZ)syZd21zDGf!+Igp7&cJY zzz_l(3D`7?1sAD}VWLaSP|c}O4bxI*8?I4Ky+xiq>Fs3Q$KCivfH$!3Aa1V?PnRp> zhxd-`|HigwzH)5;(L?)^<`j`6Ipd_+MFz|NV=$Uvu-4yQ>M1Q)-?!|wtIvAl>1Qrk zy4q@0e#2%usZUlXCZ|~zWP1RKV}GfwsA@S$OEZ>|JQAo*z2dzoxul!rgPF{udvfa* z|m);sUsmyWd7yW+Q0uOJ2I7A|K`GLFLi;5Y+A}Tnc-hBbM7Qq(`KuMwR(j& zY#bk+*tBW=$ndfAF1+}``|hojEBvT0axmKgHICZ+Tl4NDr|U zsJKSDIc6&xTed0)dRLdLkvsMr8XKGH@9$0@B1|PpkQ8^jX!kjXpoJl>X^+jiTMCw+ z(mHV>cm4IXH(Zyz;+Lsw^{ZcAe8JVVkN{2QA;jEksMcJA8qjmHi?v-gQ(BL^Pd zKYcKLZjg!*(pl|Df!LCK* zjm?cG)1%2mBbl1yEl^3bQmxbsi|`K}B{di?<}O8DJATLHwFUqc@eyYaku`8^(B5&vr@jjM74WbTM8z=LJ8o4fRjEQSDd`OcM)FMU+K_FsaG}KJ( z1R_oul!0_iVJMtHa|bZFg{7k=izONcT4)9^>cqF`d@xsGlZAZnBVbqt%#N6RGxbL`0(z%2PURZ>>57!(7~NgA3d~vm{mI8K$+zGl7YSi5oK

      r3Jp0Uc^q-SbK3x%nZpgSinP)CI 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%0Av z@pI?h8uYSnUlYfN*$+Ht4Yv(B;PwT{w2^1Sx7{5-!}7w1cUPbB1>tOZCY<=3jI}cZ z&CCRsrkUcplAaIgnE7!Q9@;JC?0%NmAsEpKGX@yV{qbB%nS1ep$MK{(4RXd-=}Wf} zPWWIzSVF&#$fmvZ`9L^2rVh(S}_D9 zEfE6~6AH8@57yH!3i4?AFiC?UByMUrd57E2-MsnK?d$hH^y1wEmw)hm9~y^uYv(f| zm+rfM{_+io#+C6Zu?uOo*{{=e?Htw(8#@wgMdZm<8V+sJWn z&&=Wl*x0j&zfM+JRr|kn-qk?ZkGn6PW`WBzR^_x)-?l-mVioWE&ynRR-P%Xe6aZD> zw5Y)z?!Yt9M*F^ak%A|2`q7uY=+j=+3lfWXVqH_xDcO&7IOHm|pJcTwLx(Z}?sgA7 zvU~a|&l_b_Tzqi?qsLIoHnlCxPBf+tqxvPqeckIp4)3;dN?Y@b4Vw(=~T7F0>+O76RwPoD;8Mm`2E2<67 z%-z#3Enc%$O9g>MMJb42$xl)3UQ!$_Zrq#~>|%IJZ8Hecv7jd}fSZ|-Y$DEq;@WCP zOZ?jtclv~WObC-ft$9m{be;wFEq{pK(1_D8D}c^3ve{UC!(&_Wu8pcC*{wL~;VUCJyNpKzGTxWKZRCVqRsNL?7 zhhO~Y!w)#Ys6l3dP%vuHaXP}@aZVk!<6Ik0D_aA%o6`6blP?d)*goA24&xZ2CtO%-uq76^5GC4;cDWlnTKX`@R_-cyZIUl%^OoYUYRnv z*;MNs10`7#ah{11PabTntRTU*fWql`h7hqgM+Q)Kg#$ubOn2wK#$ggggA zeq-7_cvxr#CLwgjgiB+^zZL-V2%xt--W;RE8X@_-@^GssEr%BdTjd0W-{@1N=z$Gn z%Tp9Fg;H;j5_UXl2BHLbWjDGV<7jn&eS`@tHE$(;YPzGL2V-jtrQwk%JsPZvPi3Lq z`B;uJ_fbDgZL)>7TQeU*xX7DKOOCWK%UH4t5KkuY5v>tJiK!9m%ci*j_uYptt2C%< z>m>IT&nO8Ajk)Qw?>0?W`;q=S9bDGw9#lsq{`OsuY7R?QgRN;TD`@X%)6NwqyN9ug zS8cRy*G|MlB5#hpJA1zOCEoR}cfRGv-WCwy;BeDvcoLC^o71lRAH*C}!`(@5Zr!{= z@xZ1(CU10#HK=2x6P`<+=eCboplm$xS4~Sz6MA&0@noIe#Z$^`(r5}Vq6)-CME{F~ z=^t~+sM&zGlHE!YzkR~c$fdtjPiy#s403RTOo%QtQ{vl5ROGZZxXNAfb z`KX4VP#L$F$@23PlL-iwi1WcuQ9dS?-XfG4g*)0o> zouRjAUdT>yFclH`w%!sgMd^L#bi*OWw6NC<1@pm+>jV;_ddCXGBWD?1kA;`g6y%A! zWF(JZkh-9S2nb^wJ`9>fDZ$m@KB7%NPG7%%_2%v8?t1K@-Dke)PyW6C=e}?MBj5M- zcbTW|PF+8J>e{srzW3s#gAp*`I&M+kd8dc-isT4r5Hyw+lqB5__kW4}>n-s_t}o0EelK zH(R@DRkyZfsOt(_oYW5FK-9s1D6h^HZJU}!PS^YHo$p&ZuD^YCLFE&-5!$h0qVg_X zRG&Y8-<02Z`#dJx6d6b`Z3{1#PWC11cvwB5Eus$|c#wWrR5-Oe+dc3AHBT-x&aITv zw^$7jeeCW~YD=SOjI4ob&>RZJ9Hfq8YC16*dQxu@JqJIDY10b~$G*~jMnL5ZblX~X zcNlx!c)Uo8o=>>5^EipM{X*23Lih5`IKJJ;;e&_jjTcEO%$-#3aMz(Z5GtaaRw3_G3;`prW6@x%~ZIA6E8CV`<6JVK3V0T2XS5adQeewMoftQ+nW(`hs0;3k29Ykca*vYI+% ziEtp}&@J(3MXbm=Rtq|AFYuNIsqGSLj3^(geGd&7v;=xpNJYY1PkK&~l zmO(TkH|#3akPE>Lk$8#SB@PWj3NzoC8*)C|!n@%BLapGTHeXZHU(S$MkYK5%U%60D zb=23W$fI$wT`4InbI4zC^z%+J=a1~%z2!)Qwlc)WwiHS% zd+PF+efE2Ir@r+s{ZC*07yg%D{;(hUy0N?Sp+EcQ{=x^$Qcs+^`gC8rzx%|QyYD^w zu3!33-}61+Bl%L|n{~hW8-DZG{@Sm9^N+pFX9Y`zxPe)KUJObnj%_6G>b|@0dh1X8 zI2ZZ5zU`Y`dIKSRhV|)bA~@VOBaPH;J6^I14?8$fvR&>iXmyiOuFB05?E4&o-Ge_o z?pr9BQ}RB9e1uKS!-xnDZT1kuL#z*-%|KuED>i)TmwxW#fV-zY@=GceHb?;Xu4=#^ zb8G{m-89TryEt+0gQw4&Hy0=rP#cvLNo3MsZkLzVdl4^XDhJlB5aX;6XvT;FX|eoy zo(0bnm@H5cDA7=1qex2Y2t6YzK`lFFK9dLcmV3%e@3M_se2ei7C)=UYMFr}ciVD1V zl~(~iLoPUSN$tRZW|2$|yp2X_={&chNB=mmVlxnFcqZJH1NclkvRkS&0szSLaQwR0 zcuNf+qZca;YATk>wh|#*$g^2C7jQF?>E724VkMf;!?L6zSu8W}5va1-WnT!KXw0s% zd|qHOC-d*TNJ7XznA4;usXG@TTa!@boDu;7AQyjgSz6>C@_OS_nHFIMq(F<=^1MPi zpzKph;O3&%*x7)3sSaC^Gj&i(NlNDO`fl!kW7yk%nf}(z3$J+O^edkD)Bo2$ef0PL z58wOt_mjO(`+nPR|DErC*L(i(ANmg85VXDai@xY}|K>;k;2-!7=YACLTfXI6KKjv* z{_#Kl$LFg7C;rvH{AXYI1)ue;zvFkSMLO4ft6$3x9!YBXJHy=@6A{@JgV(>g0S+ybwO0cuyP**XSznN+g?B|(`6N4sgZx_tb8&|dAU zTK%W+u;q+!cy)L(gB@N?m!zC}E+_iMU+~(yE_Yw>=Jj5>Vi~qhK7JdTozs8=w^*qDH#hzv`eQ$o@^)8bVrZ?a6^WEB}KMzumm>)2S4(tui8-%0`EL9m+-^fbK8 zB{Lf_XMw$aG)!-$FEr_NtbwjfCOwTZ1>D!znL?0CnPm#2{HOYMX*Si+diM3N7#X!j zl2Z&vso&h;xZNFuuyx(Y29Ba;=S``Rjb6ssR09W%jZhzH15sM8v5-IP$&NWYo(vBP zzBM-(u5iN?NEw;oQS-#a-tf55;d-;_@6L(6vFMB z(jX*gqz~y!Y|J#W%(^GK+ow;Tx$XzSuHCr!&OcGHs&^;8_iy|a-1{?s@h`d1^43ig13v~Y4xll!iQD~0)+Bn8k~6#)5(#cZq4L<4 z%(hEnSXU0z_mgZ2x7m_jqvINVT+0ncy_c7mv%_5{pL|v zeRDEhqPIZ6bql+9UpjZ!#fxg+{oY@;KiwCa>6t*VdK{84C&y8k`q=@W5s>`vsP+lku_|h+p@=wo znw2Y#paSOv@Pap8Mxc+8r7L5PCB125DwxV=_-VJ%ih0ym!$}rkEb+iymuBht23w}Y z?86LFaL*EpzZ?~JmyHd!seTW>@ntD4SCBVj8zmsT%s7uRt&CZ|Vt{m$Ct#cnmuGA? zVK@kwuyjka?0c*(R>m64_7pEqhb>+AXl1whT2Mz2ik7ECa_g1I<#}YI@pZl73K6B-(|IA;0?RWj9XRlq{J@?cD4_y1sKmXnD{F$Hmj8A{1 zv2WkHeg52;GoB?I6k%s;B6;%k`3q;wAFKsmymsJG$@*%{F)ozy@BUv}Udha5%;h-c|J<#I=pz+AbO@dRIswrF_2q zTi^OtCTb}zne9n&x`D{&93r@ft4=)&^4gy5;w3-!+I(G*Ev01QRDoWzNXorpS5`mt z(8OR0zUg6Mguxfk=GFTN*gZi@fy!6ta8I4EVwRq|(xsVaX4bU|6Cr@2HIo3&N6qPR zVLtn!ko1*#2;^)g^P^Z4)VQr&N*hBL5|Zq~+sX9`VpbDzLR|zg1O6@ybQFe5BQnmM z4bG0f4?lZbpm{$ngP|n26%w!N`vh6;%my9Z#v{rN_c(izFnnN0#AAt51Vc-4`2py$M`SsMK4!t(L5YqIMoflhEf!3ITR&$yRdur)Xe1UsmHAxxc~Ft{V&J8;!i$%?Jd0cKUn$xvw!paAN=4) zuXxD|A!lis@CnO790;>{F-RuA>=m!M;ij9Q*cD55B2UdA1`Hb%oc*Xr-EiZzfBUZY zK^u_Yz2){NKKZe~_)EWh`B%R&HOaRpK*NJxxziui3h5BvA7r$nll9>>1+*0yx@x_4 zYo^&L;>4ZFVCIyf+ytNj22PIiKR}9l)fr*}wt-Wk+NVh_LD!d#;vLo?6)MdEqDP+g zlpFb>P@tUfX!53;uD|KV?{M1~r89BN8+P@!a3s-Xw=2>DioNz5-@Oax<5x;$THD z51ALEOJOweC!sYtlptG zkR>M2_>O>!7Jf>U289q^=F85oeM*joXS~!0`;PXh{DTDz8$k-+II}w94z$?v@ zi)cjm1{Z+3)k1w#pEC^bN8;paP1C_3k9h=vy@|np`r0_3+l^4KOK8kV*^AM&d+hn_4wvarxH;U%JW&$ZUWSEUf_cgZCrH z@_zc_(uQM>8XS4}+y3oyoBr^%Z{HFV zPQ0)czIHf9>L}79II1$`!d6p5+-5WY`vm4;A4Z^BvN}~acuCDEH>W)8G}r3+R&#!0 z6o&=J5G|*NLpr)vin=1V$OMf;K3G2JQ0jqG!;jO*??&>RPEo>Vu>Ru;jUg)fUdPI=nQ5pdzx=MFDWXaNDQ!#w5y={X|CGaUmjT6HIYfLaFhX_EaeI6GZA ztN<5LfGb$Bi>|7{V$`iZ>_ItgL!Kvk#A=}r`iy$;)mkHsAo$8i8knQYc~uhpa8OOP z35NYx!FxRyE@G;J+JK8y=(K< z{U^^n;k$QSf6Pn%@V7qj@rCW|OuJ`leEGt6{oRc>e*L&3js!bvcpI3U!vzKl?(yG# zDTfRB!o@U8&UBE~Q(tm~c48vFTs)YZ;wR_EcJJPOz`pyu>uvw%o8P?t)KgCq&0z3` z*ZH9qi>50jpnnp)ny$W|f)9%qZNn=WuhL`*9UUby;K2`}aas*1hy5T+{TwoXAa za$krFN0&}b`(^DQw?d(cZEAq)iWv$)dlFiruU|&Zu(xlf!`ZNp7MO);gu#QKf6C)> zN3@u4Dl@P~nLd3VIh4}A?d10jp>ZxMjU9LhK{%`N%DOtI^F&-2B_mqB4GRqji6#Q| zLTr(B^$lR1pDSG?$~y8WTF*#{&%9Jp1|7WwWn270!d$GUHSLRmXB$jZATRv8&adm2 zaPX6^Pz%2~$p%71Uk8k=q8ivB>POy@azbonF9tA}s z2k29_B+_aI*VJUJVJQJE%NnwZ``8d;aa5BBCHPv5T%Hb~?hpbBznG#WK^3)4U~+u| zR5BF&fY63KqDd%(-aJl#beI8U+Hg#r5drTm*nPV0udPcKB~XG$*(EHkDLUh5k!`31 zZf|&M$CFf`G{}lT7@6=0+8~pGfCd`p#sJARc01&duB`0XIWal4_rp%OXKmuw|LUDb zzxo~DxsP{#dBV5t1uy)A#g&C~&--;+#l|9yJe&iQM0E$$V{f?A=&)$LhTXg;gUiy#c8@Fp~%H|VO0oV@y2$6mZ*a=K!w_d!_H4=`z#9+!r`ko zdP6SG;332PGP-r=_@JX%rngQB!XBV43L799`j(7v=#Us8&XocKXvNo$r%{2KEiAxo z(q-o%t}N(mdB(+Kb6hwR8JM5%9bjzm-@>u12nt?9GIXLUC7MC{N=;Yv(N2etl?I5^ z#==WtV;ABu%|=`_ji|$S-+P8=R&FxAcY~7;#AU90uncfLI)=dINOYbC<+bLT_As3E z(Qbo~#TZ}C()eKdWV$Mk=JO^PKnshzr5YFW;fa1&GqGieZ31SWILLzkB#u1tD9%rM{Np&&I(^MQ!Rw$Z2YBcm zTw|bL^gGYJ;f5Rk@MW*g?}ZGmyY{+ApLy2fe*PEkzH0|-;YMdmyw!?ZsZaf}>=bR=Um zX(9hd&{&!(p6L8w@StWX2VcC*A6H^PizW6qkb71Ks8Hxja@f_i!NEtc-*|0tF&~j# zG;VhxUQQvZ!l7Y&4IBw|O)54R3Xq6*1oe?`cLVB1X_na7fS9Fgf)7zDoQ^n?MjQE!jN+=Qmf5xX1P*s3GI3Jb z)>x6z^OFq~Qd-J}$AUCJaSJZ|GPOWxsqONpL7C@IJ8N%{H%j3O@Y)Z6)GoAILqgB= z<=O?co!&6B0uVT|C__?I36QgK5JQYYOA?!}#SjiE^ROL`G8l|6hJc2l60W)W$Iapr zZ}@IF_`tykfJL^ZxYW|J>m;{NAalm2Y2p^}l}n;|CwKA2wojWeIJx&i#&F zW|^(Q{X-5pcwuqz+2@@LAo3!iJw#tOnG6I{#mFqo`xeZfU+~9E3(G7GR)zok_mA#> zz?K)j=nus+#V;9-GyBNkgU@SW?Ul60ZIMddTJ=gx^_PmHkcFnu3Y7bH%S}=$#=4_$ zb(tM>cNLT>Rm{1ATZdwJvq!Nstk2SqmWKFtkV~cBAOnR z63tEW@(I7OsaZbige)RtI1aqM4g^HT7VPvP4#1>Ov3t)Mq_+mw&TmQMc(_68bcTMp z0xi~#>X49U2347LSAN78AIa(=SkO`c1LA`M4%9r0cZ7QgE~x#`AU#&a;)g*%l6Ig= z;<(|FTolic-{~+7(&K23VJ%3Y+_f!q8x?gC0l|bc)Q>*oeRals6AQqxU;jGYLyV1rAC z7!+8CN7fp!2M~(GAL1Ex6y`w(gN1F?1j2G^(28SSY@<6;%z|PJ8k?#hRYy;ASVk65 z7%zDOniW=JVv~%h9AV5f99|il-?eLcui4F~o^s3T+EZWt+DE_c&9|@eaVkDhd+$5n z`p(70T@OC>1SsO`mDAI+{O&U?Qv3c#FK>z$6B0gP!uuDJE|Fyytz~g{P$$*2u!D&i z9vu2T+XcR7@!=2s^QB+?#)&7h5sqW_&2RdPvGJLYef*R3475u=vWX!mGZ6HJOScjM zr&{>e=!%U9vhLIqLZYGRimbbiPzy#aPTdD&Jz$Sih#{Z4jwZJ|rCn~IcclHoU|CV# z1E9U`oa=Mt+2xmfNo?o`;LXg6Kzu>O$qM|>ZCz{-kyLj16xqJ~_8S_BcQ9AEQ{ZV! zAH-iOqGO3kp}??G6N9J4v>V_-R7{JC7MWtkACZmZ^LwE*PYi(Y>b#`e)}RoFN_)%< zcw){sOfUjCKy(++4lKVXr1aVoRTntoa4s5=*bD<~Ri*Xc7C`9pe}e=5d~Ar_!6xy@ z42faU%NKqu3c*WUh{Rb+geacpU9S~{3nHe8NEGv}cpz8{#kW{IXj z4)16hg{E5UB6MJyWF#5#3ya{VerP^ciM|;<**8v4H@`z0Ii`)nX*CtfnTSPY) zGE(J!p_L#du%5cgsh65nMBk7>x;m-2%&e^Jh9##z?Bs8KK{uuVcRPNLtDu|>g zAh&@b?a0yE{)h3l7cN$`C^stL$1@bWxKSst#;ZikI$AUZVRrWl4hzqq?@>B&n8tE? z-FRll(>;e)T3KGi=Os|F@ie3-S2Z2VQY{pnZ%Q>^5vNxvaT@O6>uQr zV4z46uss+p4MXByWj3OZ!l7O+bGiP2Ix~l$6Bq!55>}>PhW|@6lek$;!~+MN0?(Q# zK|I}dG9o+{1uQ6=L5^P=k&IXjDCUR5e8mQy=&T`)&a)FzX4)COJ%b4IFuBAWMyYfk zlR%f;fIx$>3A_)$$_F|PSDFxFva|}?Nhkp;aSL396HqQoA(bgQn(i1lu-Z`y_|X*5 z62tiFQ^t~&!l|kG#ogn}bJK@x9h`RZXD+?$0nd5$pZ(XBqFLH@{PA1AdfAm1yz$LP z9D3j~AOB*&c^DOu5Mdef^c6S zXIK^%Y4*I|IQO1Aw!P*xe~|}=gKvN9%V(T^`ct0tb3(J_XnbOc-!u&0;CfTpqNo}m zJ*2r6^yO(V07Dq6rDjppgZ2tkMV*XHJ1TuDPnr4mC5->!rs zcM3j#s4aKw0d^fpjTQ+VR}lb$`Dly3^Jj30bw-!j=_M1USh*)MheoR4u+THyMYu@7gBFj9SR$>Z!)f;Qa&rA57U@8)#APkzo=h~{j=!U;T;04}00mUr8E=A~*=dK#HTP<*s3F`QC-2Q!~@lT*zlKUh#?-gXFY_ zKe~WE`KgaF)-V2}S8&UR2@!_H#RXZYkU|L9IdzSN@Tw@4)pWb((kK~bn8HVJ&M5`l zBd;dO&lOZ&V+7Lm!1bqeGbgjOf8G>^Mq#Q;ZxRL8BM+rjC6z2r;|!(zebkwcNY3ES zZOqx?!pQDGK?&`)*^`i>z9s9zQDo(Whpo6I}p62!MGaP|bYikO61AvF3TMxXPQ=FnyN#ry(0f>FW& zW(7xoY2umH!1xd?=tC}1P4vsjJa_7S8j z{xD8%qKx*yU+YB&>7njTooXGG1Oeg(iK z8}Jb(u#!oG7%O7|m<5wry3J!-;K1mBDl`NmlhgCN7A95}H=cI#+<^x?@9qC|)F1un zrMKUwcU`>w7oPsi?K^h9@CCm~TdcS73SYKALQ%=CG(^oiDO1VlSBNJ`M;rtWBR?+2 zZfp?xx+~V{ffe(YT2!!dolFEhCwWlip9JKYKi$2U?P6GxT90H7_EChAau0Xd_BeKh~7m9g~5Ht!m0?hD~1*op3BU*(H zk!_74sT+zrq=9Ta;zGloWSb>m?=dAY9}K#3gF~tKL0rqEFj6P4y?Nd z53O6?m=?0X>3-NqLE-acASXiwmtWh>ucaR?AdX9E;0qj)$p7Xy)V6D&V*pzkOj z6K!Z?37hA)94^t}5-E}xLvXu`7W!*eD1#o*BI0R)4V#U~(O{KdB}izY>>%LiAo*Gy zLVVhQVXpgwcy(pLc1YMvs{2qb>zK~_ajUF2xQGW4fbcnyRbEn(VBIM-AM|t))zlYJ8I?8;fD%I$2aIJ0xeZ#G12t+pW02Jc7-^1_`)nW@j)jCc(Ku2N3y)m^ zNx1F|BeG;glp5i{7Esq{MDl66%%WShn6S_|uP;HJF^4k(h|xkgR&K+DA+jX14XD9g zj;${4SX`N#+i=1ICeM86J3jW=tuK7d+rRL2EXH8*&a+NG`j*CahhG@U`pEj}d3`RF5$uml9Lls%$W&$8gCp(rJjvjX~`PH1~4 zHxj_a-kyEN={MZ)%@6#`hs4P53*C9gum0*&Pdnpmw#qtHL|pvB5ss=fr?6KeArH(! zPF5YZGD=OCU)Ny?10Q8=U0}?$G$ZBG%WW&~k*~WCMCvF=!8g)gA?qu6yFQCMdzdO4 zH`RwjmOuNMOUMX&YXnjpEDcr3LzhGKU_kGYAl}2?cfc>eEiY;85p6?Um7W_I%p(GX zOfgh=5pq41A_wEi5f zVU^sQAjeb#<9$#{$da7HkhwgWS^#PJ-B5*Pg9alQ-*YyIkQuHMB%W|cXcMZ`W|u8# z&|Sf_00u{FO04dVITyB9ZZ-8_BjiPwGqmZN_AmCyZ$4{X1WQM`A2 zZRf?G{_Gbo{lf7NK9*o_X=Q23=Qtj=*CldonOtnMdL>PLq1F=lfJ9BF>-K)?`;n)g z!FhSnEe&;)dMQ$_@HBt z`?X&^S7_fL8q~(6lw02sr8s>}r4Fi|J(prZ!S)BAvx_SncyZsOF3yK_H`pTu8krHnd-`|xxU)D|K3;6u{UbSL&V-Su*tQ_DHa4Ad*-nfeb|m`3S@>8E`Otf*`mV4+wpGnLocuDfC%Cc zaW(-stWKLX_XZU9U92>PKZQXC9X=C7fn6t~+zpOEK(^Bd>9mthaWD&zsa0`KL!Hc8 zAP*6PPjsTD8A8((lt3kM5h^>zPv?NlfuUoPs~Q`2yB*oKjT?xE2r<$=DydFtQe-IF zZgXn7I}=zEkpF(80oP9%=8HC6ROI5mYKC6y>{Ev4*a+uWXq)i%7QAxP)j~MS3)y26 zOFMQ!{-%?T+daMIytlmf_*cE{7QgMmD)P49f9`V$?Vjk?9To_7Ll}D*2r`uQJ&u;4 zRFYKw{GWq+OACVLA=bis7if1Ngl!gM_13$MVwheuB&44jFKxx+& zBZU<35)ouC7`G1o@^ycF*IoCV`IxgwbNs_a??t*UxZri9c`=be#m7*)Ly!bS*a>MF zJ^K4T5qfJ_1IWOMsK`o!!e~(gs+xUcfGDWBSL1qAzzrJ_wLt50TBd~~2eOqrI?45b z{rB6v0aJhtBf6LUK?YX;_w6kb}AnC0R# zRWP3s;t|nvsZBiQlGN(jqBD2rpGY=75y#IqeCH2L+eJ-Hgd5!FxJ-@HPvJz#>J?vz;j(gY1c zeRWVv%Dp5?lT!{3x7N6t!8lrsal{ywdONf%SD@HH=DC5))Tv_hod3%LqZW<6Br-C_ zR;W2o{aGD%{c|u48Dq=$@grWlW*&0f%<;$l^`|d6@V8!i;g?wRUm5KF;V(Y*X*XVT z6+(SWd*Kfh9$wP3 z4zMrjO1Y{~`EOnhF$Z5m(=oSj_fRH=h`CAV9uu(Fmd%GAx*xq!31}4ih=_!;p6ESm zM=8nlX!grd8$bAnvH9)nTZ=o&#UV6Pw@?s; z6ayl1>M90|yxWNQU_SzjOXZIh25NyVZkd^_oIse-W+w#XEB{V-dAbH7IZz{lF*^ zYeF``j3gO!E7?F$8`Yy859~4m-BJmnj`agRvIQa@yDRY7S40=EIUsQM1pnay48foZ z5jlezjhP_a!(RHu!%>jhz5E$jp#73Uk9d80NZ7V2j$?OFlkK_n!~F(T-BdyTZ;~- z93_Q}<&nk3rN=z>>}#*N_MblZukeQoH{JNXXa365e(DKN{Lc68AU+;?a*|Y+>0l-;f6g3?w&b4Kv+-}pr9DhTIy~J zy)BK8&n@!96@#-LajHgq!8y;=#Ej3)l$hZ`(^BAn4^+#GDEP}ofg7wIaL~&9(i&fP zaVm@ks;}mA&q%WTZji0sKqhX!JQ3PPBVxGBJ`xpQQ7xRn`kx!5kGix=~1_jl7L%Uu^6~a_JSavh8O^YkG)E4L9WjRiO{iE z=b^;aJLnKKbwH+?Xe`00F$0}52IB&iJAr_ytaLzG`b$|>`;-_2&N(^>g#(e2I7}YW zhCX8|K_~B(PRVc?!e9*$Mhjr5phwXyR@~gehmL1*1sv620eQ}f>$WB ztz=RMVr@-R31$~wc(0E;c*g+3ua(_%^OKwRoqhO;-=Cj*>~CN2^MCcX-*wv0vj6ti z{n?*y|Ir-}JLO@#fy?)K{1xyBjIsdZayFF&r{vU46Uy8u(IjZUAg#h-wg;nWSChWu zjysVZ(h3a#>TwE$>k`41LXnc&{ZFc?n+;ltHU%Y}`dBT#XEZgnuzP`ld&bkAikbec z7yM2cg3tZOr;j=E;NLj+xeL4J`4kC$2y=n-x$d1qqQoz{mX+r1nnekhLsG#vAX_f* zAqR$eAZ@t1JZ_x`47=RQ+a>T_S}5yx_h`cKCRA{*Y-MY};fEeh-aU8k_{vwlP6Drh z;E5uToJ0dboEZT)fj)O#W(Ft51W9@3Y zt8wbBN~J@A*UW%*{M;buY8efIg_=}x0gPU!<dzPeqao0|(Lxvz$$`0&h1;@^plBUZ2Fsby_1#g$*E~&jX#bk z7g$1@Y^tc(@J{{_z`gGS}TPkdAL7c;_1;RFPWSkLI95 znc5McqXbNA^GFPM4vAZmyQ(wYq&0Wb(46{!x)YjU4rGkcF71JhZmQ=Jj`e{8tN=~r zcXuqolWXQ%IM4QAOcR;VLnSUK7fn*h)}S5ZVg}{N51JE;Lx3UEu|`FTGbSKx1b#b< zVb+iG!Z5pvfPw^%O{hYFLz3TD z$L@hvy{`6`W>c0lLz{dK6qI#PyM~+Bh}lTH$H5oA=pJ?lr{D!EY3%A( zOXgRTm8eqAX-}aLF88f|;W5X7Rw*VYr`gefh@N=DgFf-^AN#~7K7IHR`v>vNZ=e60 z$3OVwPk!P*rf1w$g8xFi85HQsp{(w4sKfk;J7t{60LU?14_h>vhe*Y?nBJ3jg++o* zH9m^4KMJBstu73w?nt|JAIQPJ2OU&p-@59{B)Z;oHR_sL(%iCJ!&Q;t0@do~{U&Co zmlx+)wpLOBP6G*e5l5qFJU)`o(6Vr)Ngx8p2*kDe#M=dER@a%jEBB}xKOCjzQ4dDL zYVo2_w4UexXcQWV^#Bt<*=~UU#Tg^%3?zuNW_%HSmj&9 zREdAmq+n48l7Lc>@ZfHAqugfyzg3*hp5gHq$~rY4I%2ii9{&A07S)B8+FI$7D4cjq((m?<1Z+MeYPi}5Ifq|JF_bR_DXizOP zFj?;~!*y4zpIf8(*$dB8v3LDI1iadnhDrgJ1pOwbB~7S{jXZKgPdA`VRE5U6(X}bQ zH9s-I7O%y*g(pAx@!z}U`+xD5Z}2l`ED&6G^;3T438$a&=$pTP8x|Flzqo+$jS&zZ zjfO8ug_L#;b2B_b0Jo|`9jV&gAcA7?)^63m6gG-U>v=3sc3qNo0(|-)XHZLtAgBPj@{XcL{e68n5wa?S92zLN zu`kmNi8GWIwH6wzVIZye5Dn9U!v&M`W zgOEacFcCy3njy5HYIxqm|qd9`XWqbL>$;$j;kCZZY}l0=GeEJCQ*7E|1aIu2)+7U!w(;y-v1 z*5TZ9+4ZO~y8N=Q{KOH5zUI$gH@AC%ua%MmfAlU6ReI_vy(A%BT|cENl#z$H=PpDh zvy~LrxM@c)n(h-_iB~Jp(-aN?DmBD0Qlmi0K$LOwEg;c8Tth3#MPE20;EoBBN0_c)^VA@*sZ#-7=}IAfTMvpG zMORg8bOMR?A%Kd@(pgLvE#WG)5f}pI^FAokzXFh7m}B`-A%RW+7*0cR6bYThf8slF zhEC(McLmd4*NlhW74_AO8StvbREagB8|r>NW^k3A_Y3S1z-0@aC)i$` zJA^US zs*1AHvnT84Amo{v-az-A{0{~fUikK}Tzct~p7hfOkAvA)z3ip??S05UUGy)o1^yU7 zxJ%6-iv!Gsr4YBAm?qPW#t_;X?OL_=x`Wj*$J2v)9du>XnYJ5bO)uEbSx(x za?(Su{?=6|pK>Zcv;xz4Y=&mFrq;K({;qGF<`K%V!CPLja@U=M2W%Z%;AaIqumo}O zxI?5*2}RU((g4SsAf2%vNbDM~^6(@KxkdLe0}~U|ngYa_3Wzw!RBI#}pMWy^+zmX0 z-sq1F$sWX;)jqPFI(Q*4wkEKQh!4d8HE2fnb@OyHaRw2Q5BnUuI8QQxCAP*%v%^3H z1~$qGV~CQG(#uC`osMvi-**zOB@iW054R-jH#0#1%g1vN1@tw{=`qA{S~XR0)Ya*`#8Nk zw{vXw*v3Ql860)krC<5#Gv58-Z1sWcduM0&zW9?LeaufjhWdU?8KQaMXEbMX{b7gw zZwA-8G!QRc+4^LGRV~vVa2cL9RHOAOjYWnhvPIbBt*6BN?wF_I?9LA5@SjNxen zwq@>_Baihth^3PDp^tp@*Z=o#?7Hu+!GIuT`;kW-|9AiJ?#DjrEQ;zI1XEM|63U)z z6KT4;Cv|;~{u=`O@{UbI()(1xjH=(~t>^SG+f+cA?PPbOeC;!}(S8qoy;B8nVJVcH%z#0v zJH%bv4sIHub^*T*v^4Tc5G#Xzf(oOMg$e~j3V?zZdO(R& zBmgKp4Pr$91rAIab4(a8@Um>1kBCwlXwmhgB+>9&I|uhkS3XI3n!FyQ0PAdKA?(oZ z30C=VgU^|=Qux$g{P~^RfAred{@GyK*!h<4Ui*`0KkA$(K7};v2-8zD{AMxZSt40& za1PQ614u$qu#PrGdh|9xsaPH9F?ESP+gj@?cO4mJeOJqCI4yleadvfyY2+Fo3RJ`sNn;-iso#)*LqvbkPeNl? z%Q4{C0H!D|{o#I@WEh;N<4Q29gy_dJ(|~cf5xdsNE+c;K2T&%BOKgBM?GnXXhB2dm zm=Wy+&pgbe%T8Xi;YqqNedJOJy`npb`k7!j{iXLfTsqI!l0nRE9y9>Xnq8h;5MUU) z(0geBD=a0((P~JLbki5N|4R)H-_F7&{+JxOyPBWycr~LHNecNCB`!A%Ye$1cW@1E8%z-T)RMKYii&}@$;2(q#}DlKqT07z>5 zBPm6x)v0~Ts?hR+OASi2*P?+>V?4DN!?4MQh^&AFe;^8^yYH@IZsZo!$eDbLf~P3p zZU|hur0a+OYpZN1WXO49K*q~o{!(5-e)5xlq3VA2)1SolzV3BzqG;2G878mUGdY5b zg1&{Y1^Qa^Df;hDts6415$2V@VgIOF#R0(5rf3wzj1<}mhBel(mneGvR5kYX`dT>ydoG{gsn0Yd1}1;!dR#+{=bxkdGC z73GVM*2|*oOrSAb`ND^rY_MUznd7fRkLfay$QYgw~u|CG*M(K16EkNn%&jfj8qQtj1A37js)-Dn)VdlRx$7!n3$*I|+T4;@l1sP*wLMt8+xTne!DtE#+OF(@18)amy!o!0 z5d@Qo_Mjt(0X{OZ1cm~g!OfOspoSVpZE|ga?|pG)SpiP?gxp{Oy$l-LLhB4jP%d3I znvRx17c&iVsOUP8-j~{3vxKMSfew3v+Ce^T>ah)HfOL7!ct%5nNdN`$VzAkcCHitE z62>`DjreOX31fI(jS-Xuon||^G2n+qF0N{Fvp+kL2|Xn8!n7{0^2P3%y=TTxJnoL& zYiGasf@i(;?`~zY4+^q)+l6m`$1OMCc-o`RcB`Me!hH1t)~IXhh8hKE9nw*3tNURI z_az?<(%SxSx2>3t46!k$tW$>9#{U>M466gNtDt6b@wsH=@ zV5G8Bv^4@-57v=uMUMOBbyX)0{lOjFGH`A)U>AE>uF}aw--h#wLlxK_Kb0WDE~=z87Q^Nlum$(RGMdZNUU! z!XgZg4-5%1vCFoL>(CZ~0VYAEc9|OLympRiSqe4M(JWE}S~MFV9q<`o)o6KsWoB~2 zX~*u|XP;-i{yhi3;I&`8h2(uFrG=aWa zu#tv=L@*cq$t7plgAPnuliq`lhOmJ}!qO=-(qh`2n3!RFeIhs*JniYvU|-Dn&wE~} z)wjR#rNa+9_!pk~zgCwQ;4OosC?N$S6b4ra2*1T$2QWRD-OV8f%Zi5RVK%Vocxdjc z2FQxV{tjOu>!1=k4o-XcDSl;hF#hf9_})8@$6&hRYFZ2)QrNZ9jbuUyvl%aa;@IAY z@Uqz0B44aiiuLvM7s-|ueTyoE9J@=1CQyXn^wG05vI8)9MZ1**F4^) zSfFo{0u+`%jEoBCvKopFfF>KYcBafk9n0av1C+|Im=F>Bu+9jaX@D%%f>3O;RL9RS zzD%z*1~_GiLaEqltRYYsVFdbt_0O|MgZK&r+~*^0=%q9LSQtzJBSuhx0PzT(mf4zH z1IM!izuG~&Dzhq$B@{pH`9UELVu{2L&peQvMkUhsEczIrgRX|QnfS&usVKQ6xHV;{VTAJs@k?cB=*L3B-gV;mvBVv&J8)uQ$2zegvj&8;<+YK13)|?mS46%8diffYETv;VX(f5hNsZ%J$B` z`I{f!ap%*Y_KZ{;eDuTbpPbq7@>jfyUrSR6I}1>@sPGAyR9(ey%juG36+pIJGyZ=a zeZ4-hNA=1d8{3Ozp_5KM?W!x;ChQY6p0pvi{TR_Xhhlh8k0Vr)Bw|*L#s;rEcXh*- z)lGXTf(o}Qb0C2|T+nDD0RnDwbZM^Bl`oHq1H&_abV$rdBw+!!Zi?sidLJvO8dw*D z1$57a0w6JrQAu8ip(5Yi)c>=K&SiS^7Vq5frfdsWrG(ZXk5mp^E-N933Nzey$nrs6cXAL1?VhLXW zpwfdCpao_=G=s?i69^1!GIwIjldNI30N^AcQ+Sr?F->DJU=P-dm!ge2m~Ck|9S$0U zx|OxX>FEuF&6^(b`gdP_)AfT*M-6s;m$zKr{MY~IxzBs9TwBU_kip>%D5&dzc$p}~Ls*B8$^>vYtNJjZ&EL)ysd z@@bb z->L_P=ls+;|M8jsaJI-gRCjcI?e4oP`5g3B%#0~fbL(GaPwBu;u+j&)fa`i8Ne{F8(%D($gEG@7i zfG{J)T$rZ2IT!`O`}zPpns0o7l+jf@n5ye+UR*}w_)HYiiM%R_g|!euQ84hJD8OJs zFikku)xjdb(Ckx&XeQVU4yfjuoehD|`7+GpL!?E36Adf{1cFqx)|Dm<*17ry5)PfX zfw}*b4p)>O0fCit4_1N?!qfw)g#qrF!j=IUbv2LrY(H37m_2ms%{N^C6R&^A z9xXJ#E30%j%z^4o z9Y}Y-{+fzm96jfNZ}2#QL5I9YuuhK@ifZ5NAT^_5r<7FP_w}o6kK6n4M#NxB^{#MT zohA=hV1HN!MJI3_3_kst&phdgKeM*B_h4-s5~5%7M`S3na)*FxA#RDD&I0J|9$gAV zWv5ctx2joL!*d6noFN~)r7y)6W6Htc_y-zjA#ihZt_Ws(b_$ZqsT^(*-Q{&xB(hWh zAG~Q_e#UiTdWOe1h^pIG>LH-gje6O0;&fjKU@yNv3`y_kl|B)_3`QQiA^oTjMH&Nk zg|cq%VxW+A0&PMUosILTpS67u^BqmF`BEU!dbEcp2VnC#AWgbDAPPbVv>X!Hbw~ir zyV5GBD?MNWGtQV6wYM=dkg)1&p`yn+>8#N}Rv1A{O9n2QX&!n&Fm2=Q-Nry(b~;YW zGkQWL;i<)VWZ^=RP-!Wlm&Pi_70f#bUt9+RHx`j{L|9Da9KiZFNVa>mq0dn2JeV5f;E$_vP%+d6)uDKKYL}f|?#f8FExg%DI{Zrh##vtcXw} zVAvcP9lAbqj|>O4M~5{KUz+KNk90Z!EZib?d`WX*X>suh=bZDm?|kcE?aum0A0x;h z5396PkGLghDy=oDLJHlJlZuz@@zySR@kqXz{U4c~%}QP%gQ~BTiq41!gEJn*BaJ)< zUU5ki(Jfb-v>MuQ*tpdIDH__1QY*~(=8dZh%z9M{?s2NPeElFQToYm}0)IUFCf}7T z-JE<0wN5^&#Ag+#mC?An>0F&h(pfRU`3r;q831mCWsGWsH^Q5%ep@wVEbS<{4+OLjp+MOQE_GepYvL2g{KldlQx>5S^m zXMhc@%!4P+TkKLD5HI%?EyA&49Fda<`u zXayi(0FzUckg`i%Go}mkk2?$1373>bq%rf;{B$c*!NO=Ot+LmoQ?Iol6#w(r5o$Mp zDZ)}i4EDa^9LcNdg*deWDEzv^CX3n*Mdbh#WO-7|uNBqmz`gglmdWcFg(Jqd!3!-V zRkFu*Bz$1 z|D)*5D|8GO4l7bHvDf~C-8&R7bjn#c*wq8|(6|;+*Y%=U1i<{d6oQ%nogC)AQ$9>f zTSQCvK{N(0y~=m>QFZst5#>91P%qKwG=pOYO!31u5TzTS1BQ|)ohWU^*|q%cOGV5i zTsVU$AIc%RPK2T-=$;v>L8d*AtpbZl0Kqmfm`3SU zU80^MP20piBnU()1WRC6C1Qfidq3aBQKRXr?8)(5bFP?Kk!Is!H?C{HXf zNxY$pjbk=k->^^2!1y5c;u5v}EZN}h`y5t65aSH(kR*_^=K&&dab##!Nd>F2y0f<_ zu1myBWC7D9ckmiD0lWLrRB#lQhKn2!HiJQ{`GD`>>Z`9|G5zoV@gfTSwWZSAhH(UO zC+xwJ6KM07@G&$14sT?Ul=PL87$u_U?902}Dl?_8twwLLqI%U_ibM`a5F^@y(+)wF zZ@jDFGG#lqJJM2e?{~UCfTPlKxrC4os0>PX=XKaOVZ~nURy$~kqj&nLd^IQL6ExAV!$kCJYedanCFZ*9fG3+dn273^KEN z{@f*-Du_7ofRg}pN_ltieHgE$B0w;FP#;s@VyY!z03G1WGV*{9g=Y*QQ?0DMKx8T7 zv`(9@B@mXV=!JytqPQ9dF#FwPw4C0k`OJbK)JeW$L>9zpM(X$fu#7Bth{yd=PymeU z6sk1|CD$RKNumR|XFst3IzYw0M7|3_6X*prIO*Xp3la&Ecoh&}pI0sMdp`7#N;aLN z*jMQvb8g%Xi~9;gxDH92MY~C93{(?3S9~Sf0-H|rfoeHbv7Nm{T>&$l+2~+?-k%l! z&P_L4#ds)48i;wq#x77sW9CqbfSBrfE4)RT^a$0ksKItvEa;9P>#+ty>rPRTrUTq8 zgWVlH5^fR}s##-eJdWi^{56CN$?IzcjMFf8n5wdLFv(#rE9JTLyOns~sI9u~EKr$S z-)iI7vX6U&f&Rp&KF3A(n|pFfZrU9e3dr(YH$8drMMphQXN8Ipaq6G=lDALkaezoN zvA4pF`^LW_x9B0Vjo))m3b8U6Q4rSbj1YL4jzX6z410k!e?*PG6OD}^KqHp zlz9Y(pa^2*qD|~ML`#?z`$Gr#T=d3OKQ!3G=B$xhZAN!*n0iWv@nlt7HR3Y2dN-PKb_m@u4;shzkUu2PvXvZ{1-~?95 zh^^w{15Npo87J?oGN@n@frf@7c2G8B7f9O;&4FYw6?5&9EhP}J`7in;V+y+FT6qT*n98FUBT7VvDU0_Q+;z80 zR5A&CPzGzn`v zgq{$I0JX78Rs)i_JsJv&8x1|q)c1~pJ*D69z_<>-UspuyYHqu0cVvydIHk_`JJIGz7eCi)ybOJ)lZu5~C(r-`%X)0p$Aw#l3#11u!VxI@DGT*f z{~r|;cf)~m&C^6w(N_at7oYJ43c3yZu?kevW|##Y9>Vy<0mTkiD^LL`Rz&^IBYm)A zi}()=%1$rv&>+^F5Z6n!hQ)UP93EPAfxxJrX#|L<>!U|IY2Tp%@_kmp+=eWk@GCrE z!M@QIS3OX0g&QmJ^yH% zyXtiN%#?V*y_#O4au27H!AmvDLn_VNT{W8aJs5d0{g)kFhdm83i>&$O_{aYuUbOHcwv4b^1+)*NURTf>TM=Xi`ic$tr5RP_PmkPoZgtEZ3j#j#B zVC1fm-c?oi>6b^>0$m_kRLXzkDrY649fEeu>hkK^a*I{LlCdpWw6L|6Hfg+W*W+kq zL$a*pU4W&n)xy8RO&xR9Ta*T5bY;o4~=3T6hM*vA7htgI_?>#vJv8J=J8Ww}A@ z^n!>1CkQw--FJk#BPr}7a!{O?<3ruE;Fcbnry6zv)@N@os%Myno5eKo>=8$Ui6SO& zVKV!f!K^XS|A52&2~2HxTD8oozc<()*XmSPuw$S|pmmr&43SG6%s~ihYMoB8Tw}ii z{>|WnVgrRdLZ%BKqZe2d6q+tUtG%zihIv4MQ=uD%LMAYIF@2Fb<|S;J_8kHw5B5R_ z2qt-&h82-6@pY~&V=KA-R~Wd!gP|-%Qo^n_>Ow@$tBT3)pogL;=wzl8Y$Eh%MO>2V z>$XIhk%DVAD8U=Rbr{Unz=xh#-Kii!QvKgcWMu?9xNIX$br;$m>`} z_oUJPRiP{BkV{27QpBkTv2s_~TFWh&W6Qh!LclrQ%R*5T$s)7r*kk_IwVK8_wSlJh zh@S3i@|4Fe-}${UUYk}LwF)|JCi=n1{Fb-$vXRJTJf)tqVXN%{NO<6!n-Wydl{l1P z**$zX>O5rk?Oj}O>Y_erBG3DskE^ck16Hi4=)1+ZVKxdQQ7Bn>0A?oiXgFgd{boZq z<^mg_VZrjCU|`TLpgX?qB?o-I0VcYHs^O+wed8bV2;Dd}-64RfBb1?vHbh0m`Mc&n z&fhO{eoERAX~34!HJ$>@&Fxxo6Ml(gM`POTs(AH((Gq%k zd6!cE|JWnSJW|pDrmdzlT_Xk7L(q!s?T+xjF{8_CsuX(;Tl#~f=B!YGhTBpuAkrFz z)hb%Szx5Q5V-5d{VOYprN1aV2-L+zdh=hr1Tf2vjWf`3KpyL9z_W3KmN&>;b4EHeP z*k(IK!vEGrmy6KiYt~MG^6HNJ40{m=+Qdb=Wd{{RJi+3=9%xaFIgoJ$lLRgnugBsk z76JE$k0oB?FeyaJ@z;*GG3O>W${X~ORXlmJF} zXmnIB(h(6>LLPI}{fOAM;vTM`3p8m?qNRFQ)RUI%4wt3;kDdx4OW3 zA5Hh|T2!5ieBB#TkaD)r;9uS9>kow3)##MEiR`P2H zMmCf%7WN8VRe$0`QF(svl1!s=pAZr#aL-n*nk1<3IBH$ISTRYO15}#mhV2Dtp)NiA zV?EGUfwSEa%fbVC9X2L}YDD3KMI!@EM3(4{W!PZowjAhlTH_?&cpno%jB70j!8T$s zXAC&#G$IH1Vh(~jhZ37^f1p~{`^gE{oeO)rL|^NyM{U)k&gZd(YDZzN>QZ__}C>) z^xf$)lOc4g(O2xV`kWpDL{x)c@F1NNSv*vxUrv3^=}=~nya&D!1FG;Zxm{l61cvn? zF&4GSSB=Q?zezwnqVfd9BM^CSXoVy(nwTVCErT?{+slm#k z)d`VlO~dJvRHYp)u^}8h(KRu0-Y?2ad@RUu4^V3<~BPujTe)3;3T zZ#>}m$D#zmh&0(Uy&PX&TA7%c{L&?tyzE8Kzx+#={_DT|z2>!=ZteHCs4s`+_b}iZFt@(bB1yW8sK;05x)PtW%pNrF5hd(jrer z(59xJ#u$N9pjyVBkf|CTjG*m+Q>#vCw$Wuy)co+nkMZlVgB`ctaa%I&gF0Iy3<)8P zB9N!$YF_54BPr0RfbWc-T)X(9!S`-l+j{KS{EkGt7(|MYNyB1v$z6Nu9pNHTDyqQ| zhS@4*nIJQRK$$QD=zH{BO<*k!K}Wyg1bU>jIDul2rH&6tvXk1?6K&x=`eE-bw+a5ui5j{a1n6*;UFSJ7qDZr@S z7$QkZpl|<(BP#5rF7FzVrCmX@4K`GA5N6?niixGE$pmG5Y??Lg8e2+1(2h2``_d}EM7(Kolg4uf3|P&D!QxHxx4rs~1ODg!n;*520WJkeE3FN&g&xXc z9|lvi?pV3&9zN7bw_ua;!5&8xs0rC9is}9OhN@bJDHR)& zI=Eb;2p#v-b;8oT?~EKa+>C-rhp5j>QF3U9>^3MxsZb)~$OTeM;nv|G%L1WtGSNpG zl@oLglVItSVAD~+2Of9K;XiQ@w-aMNKtg^-g-5s;En3lCgG|}ZA@f9zbXsL;iAL7W zf9dMB+s5X1jx)i)g)6a40~}aG-$_CP9}+MN@Uu#OT-)%WdVDTsrWWmMlNUzMLE zOkbJe*Lt`G9C`QKVy+?Retjkn3cWPB>IZG;Lcwi3$=n0HM)^>S9WuC(Ycv8%tO!%+ zbjOvwMZ*NA0$HF>HZ8aW$!uRmra)UnRPIB53uyL4|#O_c+*rE^DtnlYU23I+p z2s6#03)nS>44z=`64gV5(-uC~4KbF|A#56K_aS8XjrD*?knw0!S80#sx$MREz?8hf z%-G@k*A`@Wq$YE!N~SZBl9E<*7ZCrANKS@Ud}cfD92w@sZk26b)uG(3(6|)c_4d2Q z_nX@M@C`chT}!JwSC{TtUEQ@bwzRzA!7~%bPH%hnk9J)(r|GK*8U9(Bs!EY3#m^BV z!3qlJ*{NC1@-m}1LaDjbYM4x#v+l6CG77n*a#Wrj(t_u%ffeu&CijIoRJL-VyBgg! z{pd+3&ed9g(O(@Jvd|oklD2&gJ3dN3xeZea(iW-Kl=>T1Rff5AuN8Jc%23z&09Y^z zlLo*vK0ZIUdv<#4_^b%-+Tl*D34eec;3%6O3S7dcK1vXg>yZ^L=m0QGrH29|X)SBpbD-CL)7b(QX(vP|A}!Hu1y?sJS?I z)mlf39%)5<;s&8({CEd-nN-jsAT~g(zynOSJ{pc7Qv@2csO6(Ak~L4z3`q@?>m4Ex z3FgBZyB|A;oq&EiKjLYb5QxtBqfrYRFKi3QhIJq=YuZi`}Wa^wVq)RkBK3PP>@9?l51SN>eHYNAe14XdzQloXbd$ zuo14*G}t=IWMgm<#`wyR{1wuW9MJBbCIL$meb$hUk^KA7FLvtZ@A%Rl)ycH9G;M)zM?sBb=Xjh1GfQ0IWh05`sAa|nS91?t$gj$mF2nRso4a? zfikiuR9Al(R_FO($43$t+cT5|f5KD&Rb;i>ZF>BErAYO+fTH=xdREwIO=nFH&_h&- z$QTv(9UKr!rZy&ffqWi;xuDUwe6k%G;|%BQh!vJX(}b*okqmkzJ^XXxkhKDeNaAND zk|~15Mf1gTUmixVABaEZ7%p}~yUv<$iI;XYJ6IVE08MS`yT`6YTY#&ceNF<|4YFD?Qr;{pk6 ze?;^$m^Sufj?@~-|M5^(hFep8(@j zm!G?oH*kg9?Unm-azf3K}T@Gjl5$RVrYq3;}7Ca-QfEXup(g}V}cx^5|M z7`z`zR=zQROa-L@6r`&obXTM0i$qYk+7|&-Y;o?|hrqhs!Tj8g%P+se3W#22GvG-# zWrXd7rJQ1jz$*62Cs8*D7Gk{egkK(<_Xp!wUpd%u?_k45(Jbkc5nZGL2Z8#jmGH#n zcOMn#IrB&yjdf@RO;GO_7!A9%7&>%Zvnua@s3HU8ph923%8w?~KLh>vNQlW;INZ8? zcMvlW>M2L?Mel4WPFjx(EOtkqtQ_*+2O6PQ$_Po}1!9e(*M6bD*gZ6Gb(O~sF5MHc zI2(XEq z)1+xmN1RTw6A8=7*WCTda0XQWsFmP=;(+8P!zR~C5bQ4z<(yUn4G+vIOV`TMF&z&LYyM4ea55OH6pcg%QX(Vz?sW-Elm!LfL#}nn z$}zM0Z;L6b%JMw_^F+3dj#-(_^?a}TH5$|g!w8Nv5w%Rp=AooC&&vocHVUO3fdyE# zEDF-DgWZkr1;U^x8V4VCRNY^5&GjUROBFF)Ax8rx-KXgA@V07NidZ9&-sA2EKl!tR z{U5OM&ex9JbH~~-4;f!r;5RH?$3`8Ec^D4t0$&{B9$n;>9sDCUiRrM)3ZTqK^%yxF zFSB@*(uuL&k2P@}F;fFFSu5~rDZL>kb3k}xhN_`0+7s8}Tr^}5SXy9ujc|b36$7FP zC|TnPKSKmRSRim_k;eg2f~LEU2p&-Dgmu$AkRyevLwbewKB6=3cI6Qrglb|CrOe)u z0xWuLZ8X|kx(hah8?E+{1$D4%;jP+}1y+g6qdhDoDb%a18xa>VHhK{wz={iBK!RF0 zMQ@qnu)iS(>x-goBd4m6%;*;YcO+=d(T-&YoN_Y@gXi^k?KV;b(=6Z3ukg9bi9I43 zvpORdBMm*ODb&Ks-4j!r#&_RJc;a{r(Kh_KV2hvy`0=sLn^>i;qvRBTIy(8IV+x!t zhMW)`P9sbVGV-OlbkRk|0T=C&B)d1#Mad0gM)TIew5A#Xb!mj#6AmCqrE67O4bW6|2Xl3mpNkbH7o_U%dmf)D5 z^DEORTL~?I{V_}@VQv9%)@y2DZuAFqnzV~ip@l4W7>E?TM-f!h z7ABAfzG}#jfg6HV0u6mDBf;_mdr`6lpL^B}qQ+VXbeW1ZRjIWCrvDlyhER`(eW1`? zP__Oj`3@tSbeI`1dB==^PU%xE)D0gPFgVDjmLV1wY|bIHU@CyRu6^Lo?!qhd-9mN4 zsKdDn#;Ns5ZF8lz6h$aQJX&IXhFY4MAnRn@nX4{Zrdbr~N=F<&Gdy_&NKx%`pfCl) z4A&yGtxz)!DvXsDhW%ON<9iN>X-!S8OW|}W1(L-Mdv*{7ys}dOZ$P00; z(8f5@XqUycs2FBQlBgM%ustytoarFC1R$df_0B(z5Z78G%iw(UD1Npa1s|%dC}ACm z%^bwSP*QkF#5Hz6jZ)+1`p(&@4?AUg!=}agUGuyBQFm;n#8Wwt?OY8Pj+6jU15qWO z)yFiOC>}4lI<I8v=Fd}dy|@aG02}Y>R$O4i zh@e!2|4?BbMF1F|^OOl^L)Tb)n_6ReZk+u^bQSp_SBsJdf&`_8)`Z^f8-^ZCh%o^T zGe)ie`eY8Ls~XX`ZRxjE-EqG+tWyP_y>!(eL4?vdzKj`SXCGup7vK0d@?|$8KL%tJ z5mLbud*XutEd)|wEDJ(yoH{L|Fkpy2FZyWa%JOn{wbOSXun^8;nA)(2GV(&+#S6m6yuvL5Jw}f4diHISvMs&qRcRdm@u)5NtQ@OzzmnnZ*H;; zdMcy!HZyU+IQsx5SON32sNAyn30t@_r1uQe&ySm|cjhX#(^B6E5;Evrh?Us#+ ziL1W$jsJV`Ck{H~&@&%-2Bw>yyT~G_b*gm-)*7RS#muUFUt}=&(zS~hU%s@kGT3Xw z*n`D0Uh@{3`OD)cf(QHw3m|BLN!0itG)oP^SEto>FA@6*k|wk z@0{Ot{daBxd}@~8RE-y*R*~8Fp=)#GT0~W=#RSsy5%pAfWyF(yapmlD#^3*@waYFU z9I|!n0bAEtCY;-)g8HDaqFhwPWi&Jp8-zfkFOItA2!-?sxl3P2odT6nRJ#(XD{>4h z&EX`o48VBcYmr8Hp(WYd{nN>gGI^AFIIDT2>(ww$l)c4{Yp5LA3}(34RYP zKicV+;n-?`)?r6nvvN((sl7_VN~F&~dELlm31by!*H8)*2yb8v)*!kpPj%DT2xaJz zSOY@Q6dr(JY&3k#BYjsC%;0Ax;$i{Kin7#`5{x7L$$O44NfSz+;Y@s{Y@_S31hy!y zkt3rvA~#KFn*2uwYm5_pqyycUmw15-#nI%fO&>XJ%(HWOe9OezJT@K3;Ey=K*pgpH zXPMtLexQqFB{X96zlI`aPPc?vCTruSEu1%Rsh8Q^sznI`K({-g6s(RB>4r&sBVr7- zf6g0s-Eiyb0b7=5r^n}(S3i2`*n2;_@E6aXIsWhs#TDCZ0^1=#;yQiQDs(NS6-W-f zBh6|LfJyD9wE>OpYvQ>>lZwblD9OSDmTIXVgD%n00;m+W%E_&}7_VfvLNB4J1MV6T zL8~8t{-z3Ys}Dqvh|*%{ulm+CJLVQxR(IHRz74er;MJ%-4|vcJ%MHNl4u*h{2_1QE z`=8vj*Tng+9DD71);4S$eCzVn?_WPQJ-ssH!ZmAnRflynHI!X1yd6{uttkQ%3d=Hr zT1OZRB`6R%h?=79^p^zA7-(K4Op`3T(Y`S{UKV7LEA*0n^8C!;9dSaNFdjbC!_L48 zZHuBNJkRIM!IDs%5X7y!><&f>!JIt>l8rG?XN?aGhv`6abyylRUT%a8U4Iw{ZY3cd zVN#P|9Y}Q-R-w+I5Yk^A#z5O6ElD2k$w?;4>bTOvdua6gE5E~dKEE9Wj z9af_fssWE~4G)??j$~UnADd#*1fcC8hkvk0MF}7U-8C>iW#KndiE8$G?55qftPW;e zmk}%f7#4ti&By7?*oMi4@2pNAKC{esAAj=nDaTAd_^_!{kD7Yo$&>qT9Q)-9cHVI79MZ%a zpTkD`%ELsXhrSeJdIFVjvvLHAj)Xn-hccV5j>QD@?+Y4#SWgD~AO3f@h0Al{$dx-r zsBtMRIyl~Uyz)k3+K{z`pk|4@T1vwEn3T$wgw&JUrRw=vp*wHAX;GDc~^aum@6ub(56UZI7b?RkrUH#oZo!I-Jr7JI4`~D3RGn>Y- z^k8vXuUg{;agAbU{)_smOsIjTib3g?t$Y`8C+)!z4huGnZzF9n^RIt?L4; zV1fomNRwD1cmS_g_<8`Am2E^U)H{?+QrI{wSHQ<9+kS`}jOnA%`f$32qGN{?P??AD z<5X=O`duu99(`{{j&ASPqJpP+zgC#5Z5W%}Fu8d1 z?$!DE2b{mZh|3<@AXG?#hXio=2!+cd9&!5fp8tYppZ6@%B4cQ!j2aznxuw+MYZu=( z1H)TBzWk$IYiFN4ao^(d_PLe&=GS&EjNLuAbj-n%$86pB|GZzb#MZqqp{jQ0o)|Lh zqlPSWb&XY19m&b`3r*_>(wTbTmJA+ke{I;Jx3zWW{$*_#E$tpOTpRCP_J(F{jn zOtFYUS)ro3jMHe)R zlY?0!4;CHxouPSmrnp^&XzW~Ft2yFpD-fc_sU*0jkY5d?Z0=<`BG-C+piTpCTf1L`QK9<)9o6mcvOD5_<50C^4uqsSRdUR$TQ z3FelO0(+MCEqf@daT7^3AwfAD)EbtCrXg#k7LFWUQ+<|Umm)cM>|@Tn{EMHa-PL6m zkaWt7D#R(Q;K0&}DGi5yIvs53M&GE0t02W8qOM*lxd?~I^Nn~0_4t$4jz4MU&L6CO zA@okV5bD72*J>(Vt7{5+DgeYP_B zy3rCI2@)v9!}%ma+Vrq&Um+lIi6Ain6AIXhF7o3&5EUB*91rfnO(T3^hz1~4_r^TJ z7{ds{bpuQS)5W{#(k53&o zvG*VBv+)?FDA1QcCYY+ONJvFkO2mQ~L0sLo?e4v{%x>JUxpF*r6aX0lBZH}ixDuHW zb$#>3)rFObeP(qfuq!LLj2the@v}3^^#S|NeEJ)M6OM&Zux*Gk=pBYM(zj%@lG^Fc zu!bri?deEBiV_3Ju%|P?qG(5Dd80z0z1DA6GP$dUgY$k*1X3@q%wV$}F;8_ja*n=% zt@N*hO{*g}CaIJV@tM#3mDm5-Ysk3#t6x9ooF~i>)KZvJXzCi|s?>YPtUk$oYcyq5 z9-!QJLd2pyBG22ijM(y$t8ND#I{utj`AY_$`rzahpI^J-n>xDvw@w^%1S2%Trv2sJ zNSAABRFM=sxREfp4GCYPN5@Jj*PC|af z!QF_gO`ujNJp+S{U|XwDq-lOQPA$8 zB78-O=jS}MR}jcgq^GIyoh2M6=7!HM(pzkeR~IW)VG8K8NJXc>fSoCc7y1JENFy2f zL7wqYuPGT~6{1(HkS4X`;|Cqo-eC=jqDo7XTZw_Xs%;MTJ(%v@MTAGd zgfl}Ju)i2cWJ6iy0SZGmJ3YAWhs*^wID9f@H*vehbx8@j|UvHq)LO%C`+@Ng*+6cFCV*GG92V@PRZxsp^+@&>$DvAqp33NY9_M2_y${-5iYb zSEr34oNHnuh~aCivkwV)+lX!%m=J!u)^GcalVKFAcYLaNjIV@@xmOIdZb3ks0oB$} z595Q|hpN0FF}}tR{t&Rx;8z1L=<)6Z0z%M40RGY5?VbaxdXtyh`UjE91iM_6Mt(IeBWs*JK67y2arU#UB;E30Se7{zHd;hGIA{|e@)BcoGdmBA1JPV2OMC>ph6;ahV!&7eC2d+pb| z*M6O6ykvUyJ)N6=(0lFIXEyy}cInEQrMt{7S=_f^p=QMsEWUYa&e##1fU6nZG~@)Y zUMv4Od&V?dXCAEskQsYJPf{OOWq2&1m^ty&U^F+tEnO6_u%{brurL&GS%9Yi8UPr2 zAmBdRqrp$tRi)A=oiVj_U1Z>vvh61e^oB1&G;OA-ILx(>d|~`zZo(Bltb9_{-^ySF zVPK%ya?!&*3l)iWF;{|V0&|>r@{U17+Ew0^0=9%U$D?|ZXci8EEUA!|ieQr((I_tdC>j>{)2{aCXT8JOdh%yb+c`XHj5C73;`h$x$sw_9?FAXFROVluj+%agf5dU3`2)jS-i zYI%X$RIDf(4wx*7^e0nhR9%aqDfz~t87RkOgwJJ)VzqW-ZCe_Y@~`rkWD4(ga)Ro7 z^5Y*4+!a?|C2rlPl8|I&RN{)7a#tlfLnc{$a5X-L<1i`@#f=;jB3qh8>Lkb{oKq@W z__C-?-`jJ)zGt7;d;XVtKXBpHv8S_`-1oqJGrzp0=f2x#M>gxEGQ7NR+47zR!?E&* zMcsI#y0yUworvd4UeH*lM2?fX86ps-j8Ov5l_Ks z_OB3?blRvO4P3_Bp zJa~|@|H)3iv(Hv>fb7!T2*Qjzi%Jj?nhcRzSO7|(Te2F7Wk!)zB(q4uOVAAF3Bi&! zQBCC76OI>eXXW$GK6m@p^)x;@Nz5m0*hCI8A9f0c{vo^e%M4X_azt}!oH8@@3H+PX+_}BUj-%6H+@Y6Ka`HeUGN6>vvt< ztMXVkgK<$G_UuHmp zN80Jiy8O@#NSh6yhy@5OsG(oQNcOQgpxgdf*8NTV(LkviHDm&5ngml5&6$zb=%dbA9mv6uqt@2prh@Qs_tpZ&yzyYE7Ia*C7IIU#Vk>DFmqieT-4!r#Ddft7(^jrU}{}pfUf6~)%Z{}A&nYreh zGq?Pxv*CAI7Z_UFw_s_{(7^N%AEwj}d%7a@*_JAh=UNhCCa(7js1v%ljp($-g1ah= zX$1MBYccJIUFQ~*Ag$So-o!zSMn$K^X=gzPy1P{1GhQ&3NZwbQJW%Y3sG5PM`e<-d z@bv;sUQ-MvDKsT8j0qZbm22gBLVZmha%3E1aAf#UCKy|2PAsdU)a_fd9R`dTdi2dk zEU|-dG$(TE6HruFsTE=jatuU4XP!dRC#hgmCiQCt)mkGaLRSi^1?WhML!-Fbsc5QV zRe#f69o0c+`SKMUkAD1PIK~Z~syl7OkR{&?*^+Ny&7AV+-dCPF@Rc8KotT_mwy=l) zCBs8Q{rz9RVf=udd;jI-Tm`W6Y{<{elKlW_BgrBjtCwSj=ehtsQDPye0^I9e@E&|C zM)U~Mm5Pgg4bXyJ8Zq=y+hFo^*)}7%q#cV>twXJ;F%h6t(2S(IC`%R*bc)eKFMV%& z%R4^xKcDW*F8+sizx$-qo^{Gojv5~y9~#n>tlF|%%f=jiX^#k=WQ&sYSs<(iQ*~2G zCzN+tazgxS?ivg5P>;~)-X8sWaB#mvd-glDbL^>|b2`1-xAd%EGyChCW`26@>;t#= zjE&9?Eu0-*)IYe0`-^;Eqjv$HJZDK?XKK#qe72ga0d+fiur3lf)%&cg)i~;oX#%5z zMh-eUvj_D(9wt;!O=u$EQx)Bj5kgl7OepD!EEzCZz``)XYyerE(m1+K)XV9$o*M9& zk_HJCyS~Lf!NUvWl_#3;P^WK*T>WF6P17Y{C+PlK-k|BCP+c0My1-#jU{TX27#4B+ zdd9eC!O%eeS5MM5CqM#i(6vIsZAvk}CZZ4GY**b<+~O&xZaJE@W4V-ft8yE2Zbiy= z2Dd?>2O^!`Z4)t};JbK_A=js;YB%_9wo}?g^gesMQ)pZf1Iq3CR(izM3 zs!APR<1cwJKgTS5lC?M_$q(H{QpPp25H1QiR&=eT#U(j$Sw4u((SC3c6{cYGltx1( zDAgaQAjmQLWOip*9UmAU8$0NLz25qUH~-7||Jb)=zdt(h=wJWl&O;AAKrdY|KW@~a zqm|(#WHCi6!f>l0iG)eH?Vlw$)I5l&AVlO10s9Y99aRQ(Vb7>YVR8kH8P3((KWw0P z(bC!d`9HMt^mCEv+q`k+=QnlkxpnH^J9-}8&^N|y#ZgY_O!YfM3ucFhJ4=?&uv#`a z+&9F2B&-4Yxe;9tNJ=v2KDI zdL$hf2CV`_aZ6NX?N|B81osbg!`hXg?ydb!nW%eLMdx2HFVWfg6o76&$_V3u<{<32 zz!YM@C99bX6oziGX(S_mT8Hdq31FJNT=nRS3eSyDgNvGDG>oW+QoM4nREu${EszQ^ z85V>4MetRkq=af$wWW+rHbv1`ENuy)#2C^+cN)+Qg=HBAxBfl$*ewPxx1TZ!wVPI& zj>u-*pecRUb)I|TLjLc(XX37neTS~<*=G;E_dz*m=XbwUoi;PVKh;@R_KH^`*=bd) zO3^1PkrMEnQGl zRYdqFM^R_4!kXUFaLT{~Mj@l21zLLf=l8w)w%dPp>1CI9IxC)d)Uj9p;73nyTiRge%#F)A_L zR&8@;*DRRpf4b-FvYlq1^0eNkJdNVh8Svo;J9qxNck@OzFX{wr=Q~ z80RXzcaZZ=|Lmego#AD(?0UOk$@Ib@(0zlfC299lZU?d(elH(2)0_ZXI_=WSb@xr{ z2}~U13X^ubPTSS;J&x+Z1a9i-Jp^XwDsp-@4)anLLk3b%aGAEjc%xSbwJ@Re2etuX zP-1Y?V51?0GnS?TBrwP%nbQ~JhKhp+78r=&*5!=n4+BG!itYd4LzSr-iU*Q)PmU(0 zQ?vpRxf4_V@GmtbcaX9JNra&5su@l7>FEdVH*ny7R008&lp%%e8M-YujZX}j0aI)R zsQ4{<1h~M9#4$w*En?TSGp#hW>|m>fzfr3`UMz>!!s9B8MA)&-hH9T$r?$${D4 z!NuHhVD7-}irK-1(}P2LNP*>r0j`WFs39ISXY^s7?uQK-AbmkjpXBPFN9T3vuK56O z12e_oAqEx?G=lXEXztGQJ3P`(&!y`#fRQ`eJFAVn9s?tNnC%jo(f2YdhJi0NYkbpo zYTC?L(^ztiKCL(Ko)yE&_~`7$%>xf?=xp6My>30vGLh?Pzh)EJS82KkTTLztCQp78 z8#Fvt$w%oIQOBjKT}h}Sh$|o`l_nTtTTZkYOt)^gM*ETj4H1JjVRqt*iF~)gi)Th-bi!$A@Myn`RGB4J} zA-YN!b}>a(TV-Hr%n@W98HVu;IXfsx$MDZB#poVVq*0vEnwxZW;T%08tHBz&5by6xMPm~%%?wd-b>Eo(VWTg$^IeT zNs|%hHs&X(%aISJh5kaL{L)IaFE^c*XAs@)R45WR-L9qv8@0~JyBN$EcH(HUB0wF` zLG>6OU5v}WUi$FBqT$Y>;n~g}QBO#rgE=BHw6Xq~2|j8&yJ^EL`yg*v(^(xy|UcnvL;`Yc0j|b>J z!qnK*#H1*?hsvh?{T(*s8C*KGa^c`Jo-@2|ZRe90p<{?)%NgXDA!mp#>MW;>R4ud$ zH(6DN%S2M5`yKw`$l}HO97a@mN|W)lKysfxf=$Z@lSgr=9c{ zuY2Q1{^MU6NLgN?!0<14%Q4NgZ1`-KZ6`EFW3ibqCGN72~#-T7~yb!H|nwG!8{wMOJDlh}C6l{VEDd zB5lRMlB}{NeDU9cMObsnsi{?~cDwD@cb{y$ zfDS@X@=VLMTIWj8MBK9&Iu7xxBuBw&L>wH|Kt_Y4d!S~0s~*MWt@ zv)nVs=cOwLcH6CI&;4h2-F;?w86Ki*%()nP=po0Q1w(r4p2BRk!Yn+W7@Wn(rvy|- z6pAWAaOjAmn4(^xnh}OBj;x!ukYS`WvV=a45>G)dP^D%nL@p_}`USLl&1$6?87w6R z)5=k*s{86l(i}`;2`L+Qa^8bAhl?pM>yaCD6Vin9t!CxCNJ4*R5Vpt&L2)Z+L}Loa zoRB=V=K#`ZZ&MCo>yuDuBI4;lTMix_8>lh`*4*|WJV~#ltoUWPm}`j}-#*|7g8*~T zsRQ;~^_x5HeCBh`{=rq>=wErn#b3Rc|Ns8X1usAEr3kPd#S2CK+U8w-2#l?UD%EpK zY5Jq`RqGOG<|QK2we)VZQx;FTWUfLoCBb&hh9c0Vaiv4%tZ3$c=v0H!5ayPqPN|D` z6llt>cBttnR8^bSbbUD=*Kv#}YMp({R?IA0(OI=`f9|)IdChu{qL`WP-@0vPVxnhq zq-SIs*Z1r-&^tZB;|#iLXHKuZQkW{T62N?d9FwLXC%%jzNyQkWNiw+tLrTXMT5!a#HrBtl`WHi@VM^V6`;Pr7wtQ9-iPB*#7X-jk!!8qK3* z?LZuas?Et3luYlHzefyB4nspom3%pSE$PGy6D=x)!T{I;WZrPqE=w#10AjT!1?x7{ zeQ4TqW&~4lAz(-9>D>Ltc`Ob_OvehWlS-&~!-o9=j&pF9kaLo>-W62y zq_YSJa22AX+-(k(dR2%_tW0=+{dw6sZ#OzK*mCai~l>Cb(gWy>f_ zG{D7wz#RD}M0)@Z)qxBXZ8$L=vUFXmjZ7rUPcI=*gjnTzgQZ2h)^ehrOyIey2qXoB z4P0?aL`G}-a5Xri*=EcqgiB8HA?Y}qN=1oGsH~B+i39^y;VMuO8fGamiG-MF@QoN)a8`k{>mm5s%4$vL)))F6oOcG2(Uz#GKHaE zrdxUG(wX`cxxTagIxA{ONJc?XIV$n@0T7M=06+jqL_t)Tz}1rtm>P2WpjMM*TN*Je zX(v2`tf0t-18iXhnhH75$t%^Mj0_?Q*a(6oa_@2M{ z!F4z8yH{uA;olA{J#5RSk$v~w^XxO9_t3)+b7kE>*w1^RliE%z+g)@?jqO&?F%{F1 zg)%mdHM4=kzse98c|_qxHC0)VEy>6oL}f2|3M;WJN#0bY#g9)Wp@&KrNC2fr146Y{ zj3@x8 z2#m^E%a?*KI(R@stI;~~=~3?$%a^c>_v~jslQb)WEUgSJ;G(KekE_}D>Zr{rRjd?^ z#BEfhgKeO$>m?&Y30h-{pA~ed*}UwLxb$czzJ}QhR(IMZ{&p1aG&xh z`3NUVDlI#sT{sdojR^lF)qo@+uu$D9GmC*Ui)8exYLaFmDr(sp-(cNyif&@MS2bn3 zR*E$DBMX}|K^9}|*UEyfY4~S2;G%;gPd)3K-*i`cFN=lT44`ZWb$6Oou72(;u(5?+ zh1A=VVjF77YTW>x>Yz-LS%KjuS!t))`kh%lNyhW_Zg6_A&|z|Rlvs^8rya&dG1d}> zD26|=!@2#`H+n!C|fq`LkkaBvYZ@fk_vv07}_)`Zj=ft zKeaC>RSSBGQz-&Nf<}QnHzrqGWw13z)7-}eg)txsPdP4OFqnNbnxJ^z0Q=C z1gxV}Ipq?Ck>~97RxS@yaBAvwKKH4Q-FyE7Cq3=7@rQ2Zsewhi9Q@J$_|U-z9dO23 z&$|D2YiXzbTK#6{#<3|*ZfdO>@aaRLTz(`(#D6*?ay2anG9BEcoOO@|p-zc_%Or{= zNMf<9SQV64Gx`u^UzA~$zpkvfaooc}`wNs)}xBm%fm*3P_i zic?Vnp*0L;zQvGeoOer7-U2NQVB?*X1*vk_@9;v4Ny!hRt|dF2r=EV+f}w$1e)bFC z@$pGLQ_<5i&YY;zdF^Xn`@$ETz2AQOfA^Z}NU~fiT{cFt7?8=Pgyo=TZ6dd`uQatM z_rjT0wSXieFet!a6NSqdn5956^1zU#oG^lw9njnr7L~g;iael2hp3EM*417D(h-V_ zLCYH@7XID%0uh-gE<+5k5L1;jShV0<3Dsqlw<$6w1ia2G?RKDVfM=>ECnopVYt{F^ z`HdTHxPIlzh1)mW!6%8A?0wibF8kI#d+)JopChij{wK&S;4ayKrVry|JbuF>8}7#P zT6^{gIx8@IDh(?9On1WzIU>iZmn9cLZt!9XHdxgn-5w<7v<#XL0heC3?Xp02ARaF?|hzoMDrW3%)?$D(#NU{c`niC>mzbdS4iNNSN zLWh`<#-oHa&&UO}b?mZQ$Pt%RaF>)SPu>?n(n`vsx%!Jpc$yMCPQ|m@Tmb28(Rt~4 zucX^t`K`+qFJ8X$F1vzZMxc(wbE^YvH`Mv`=RUpPe*4~g?>(oUbo~3y|2L*rJR^ZL zZ8H3dqxwHy@K_b0G%!FHcDQN>RRSbSgD|_%AGn;PqNtIGPA=xsAq8t3yg`SSjEcf7K_yRsk&C8#BckTT57TaxRaK6h zQGF6E?GQFK9Nh=hFwi%^a{=U$tsOUReBcXT{>l>`fAH4(f6+U*XyJ-Sty#V9_~VXR zuz2|=|L4=cz4Jb%a|;%*p)6MiZ0I>*KjdA>U{?rP76m6Usr7y zYl7I!S^#O+zto$Mogr0s2X8vbY?BdlyJp2zx&i@J>4D;4X%7t?~;AO`)5Am z8UOyDpD0|4S+AO$RBa_vdvDlMm;(mTf2I=%WXco~ab-D}yE&M#s1mzKCfCR;H5Igm zjkJp?~UqGiqM z`=S05v?NlfqIGUu2-Q>|NOC@D2OfzadF{17 zyygc#47{F*&a#qUM#}Pz#%}%PufO}fYpb^45NF7=2$B^!wIzd7rc~B85X>o42`JIO z#F9aJ3uv~PQQlRXoqhlL@1+(7hL%Q-S?{Py3`m85mTaO5T8kk@H7s387mIo3Fw9Y_ z6YGnv2nS_3Hbh{BMjQK-bkZAR(b57tWe%{F3a0L3P7z}6p$Q4I1ophGoQWy|KIY~ckQ~{f{_PrN5i6> z443T6`CVE|^8A=a~cW&CoW3rtzL?oqO^^oouHzxRwnEPdHPIb|xm(v)&d6~ATT)I-50I)Yg>lHo zhMheSY7B^H7K6p;$gUAmFHLfgf2Rsc45CG7wTyzSGU5ni8cPnh9mC*D?$o4$J-H&I z!l|4<`afD5iyPGC-~ju@_e}EKh70n2@BRCAYw!R16<59H&tAE>f8+KCf7R(-Jhbw# z{-pNFEFuL$ zNPA?aI3y<(q3M?%ZJFdruAFvm-a2~uE4n8+)WU;gU0O~ktM4CLJmqZCH++p^4~nT0hlivZ1R7WlY=Ypq3=OqFmPpouQ*3;<_7-_= zX6NA!R7++DkkOt3S03rIx?&sEibw>;ge$-I{lkxVY>WgN=lb^;-sN!iDKv(sY5P{~ zd&p-#|7G~2RTNQFPHi9AHo9$OjC}#y*Pn6CSoxg0ZqG>xQIVN$L;`AfDrFAmoMdII zz>X?}>8`QBR1r~kM1@d;uMohF>_X1bGcl>g_q+QaaKUzNy6HxeW%mNUCoDSt2l9E+H1uAD7cqA%#k;<=#bg@U{fB*UC z<4OOJ9&;p=T8LEDkb*^?xPX3xJnB(LCL84<&a*90IrVFJa%Q1+X7Veqdl|Xu%N6|GI6v0>QRr`b7aG>*r%}5vwZ1_LuLn8t-g27OU`{h(>!(wd+O7k^|ebbx$gR# zRzI|vM_-2*E?Tf?;n2Vk&%(2{(fIh-#5f!KGtDbb=r#=IHI1ZH!t*SRGTj0h|CR|! z9V5Fj$8%B#l2(#zDOk+~pOb+TvjvD9@-AS}15P@t0s-yE3PLE4IpcMzDwPZTTxXSA zNM%5W)XiH@gqDh!mNsq{KUJs#jIo$wqDsm$rn*OaAA@;#I;V`>7Ha|fp+Fq`F}NCwLCM7H3{ucnjY zawb9>A=TMzs}4JX-Y`_8Y)FYP8D=fbJzSQE^q95sq&MN>=?*UGd~W9n?7qRi=fChQ z{$aTK+MBQc@%MiAvs=IT`A?A~^bPOMm*{wc_R8;EedV|R7fkQa($h{o;n9a2wsgfF zFMiRB4nBA<_U|xnbKq2=dnY`7#1auB2$x)XB2Nnm9P}tJ$8@$zxv*TA(SO|Z#iW8z zo*bGilCP$4(WV^2*HjQ~!6T{a#I)v6d4rNkOu2sNaHmP68>poU8%;`(1`_`GFZ^8$ zT#SpUT%RUQ{#Qi;U1LSJ6>)ILrY#*6v~N(mE$PfpX|qtr3J!zx;{N_uz5L~y9=!j! zC!Ko1CqHrMq5D%y+JVl0dBH5hQsbg97=}Z2!o`>1EOtGl>b)->nU0n=L|so$zv|U5 zJLu2@Kk@PZ-uTd_V~*DDqr-!II7kL{CyQ^iaB<#UOX);p(kHVfYf-VJRl!ZBEfS>; zQhleTlxO5s>=cJ+ylbi^NKngkePr=#5Fpg50G2t#5LAVBT?lA)5EFztO%R|7mwpaL z6t*&*Fh@lu=Ui0<4ZbzYOTBGe+G;T&3No$8PSAWWMYLj?dAmk}8LkhvZP})MwM)3~ z{5v@UVBJY*vg*w(MsYxabn`a)ows{_X2 zDm2Hx)Dh~_yQm&Z#Gx^14t+_%YU~Uf7nRHYngM{dYajf<)jtYMD?dnDXA-2w+CgHL z3RIAGHJETD5GKrXDB7&W)Bd?ktJgnVQF(!4=0Hk5byU}i&NiuVD+AE|FTQLIm33xh z+X#vC&;J*ypnqs-$Z0L0eVHpI(iGGL+8Di_;}GTm!)PF#tm4U6Nv0OvZEPD(by6a` zbAvF(c3WxKQoaiznG|$htf1i##4zXIEO!$}*aK&Wp8T6T?s&~#yk+;@_u6?EJ}IY# zU&hg%;oTSQykF0vy?Hmmn|Cm(YKR?Py8APq`-0D2_|?1b{q35y>o#oO+HEaUY=5wQ zWb5b%*JvzKFgA>_Y{_DyoYAIRCCIe`H|3q(0g4AUW!!~QN+5G7wg96zTjiP@juNhB zx`9#?4VP^-NmZ8&aqurqhL#zY19d&T=7BXXx6bv~#iK#7Y-Yh~FLcH+kxc{aLKkYp z4M|Xw+CDP+p7(tKyWjryl@Qub!syQN9}euRIyE~sH9a=TLLyi8?789rAxt!e+E%-; z#RQKJa65n+rpCd&{q66>tNr(T^fll6@wh#~kgA;;MZPJY+Emi&{kjQ1y5Z-a|Lo^CJ$UcBwQGL(qo0mXYz^At<$JRq@Ya#h&h%Cd z1(RE<%wvyu%<;!R`O%L%V)4?IOP4HNwa-2W?R((PI}cZeHh>Eg>?y9#d}z+axZ-OD z-%Qu0A$G@eIL+n4H`S~3@0)~I7*kUVSvmhNr!yF z1UZr{givAnVS#tIy!U7+*(`AODw@!y@9Q5}x7%L3BXr$$*ByK8v8>5(<;_JY^#(HX zVGHep>L@va$%teZ4AyOt{M&2o#>VEy)013}|KQpmpZMexLfy}P_VdR*?lJ8DrF?j! zb8h&h0_#W*jB<-WHJd2SPP0G|D%wZw%uHj9rk#Y))->HVzhK=>#z~qMiv>Tt`kK?v zdd~Ju+DYlCW1e#3_18>IjS9Hcz9CNc0_Ba8$&#LpQYBJlZ3wO_` z6cbfKk*qocVHXXWBg#9}OI@jPtBzu>TGcT9wh6@|J}YQEl2V0KF-N^L<5|eSlY>ly zLXsg)JlX@IuWtbe(hLRw9Jy>780)Qg9$4;3zqUIX7AMYTkqQN^Iv_TGpn!AL|Dvv;~@v{xoVewz9}%UV6VORK5)MS zAM>~)PdN6-!9gB2849*}8eh@S6>G(li%MQ#)ih0CH}I}Q+^fcaK1it6N2BF67(I@{ zeQGa`(8|iXP$?=5GVG~$JL}|HI@KPff-M5|>aRx=b$E25O>;waLv=wtMlW&UrBnWJ zP(DWTH&K30(?K1ta~@8BGZWRhO!j#vltSeT6*b0ZB-TbwGtg=LWI3 zi>Rh;KKpzmvSw1Mi!S~-r4$-=KsM6zc!18tT6;-^OhZf^j=Iejv4%I#A8irkrfuBq zx|A1;TzE4<&{LITJVB%_v|3@?_VLMyZL8O=yZrL2zH;GLZvNTLotY7pcdDcpEaN(? zf5AewHKNaUMwuzFofi1$AUz9*7Y}MH3O1rpH5_`-VUIiV@vHXU=b!@)*mIxV58iiQ znz9wPtp5KE>?(B?=k)kg-%vlVY^~Z;vw$0ac->J?ViqvXvp2ur_jX+f=0~X26G>`_ zo)Tw&kx57MR$|@i4ZE${MbMmJ+0ueVvwqGCD4^iAkV}>HTzl8{mwkC=%V^*7#hu~4 zsnMx{HCtw$ve%-^UxVuyWx!MuP?phAJxhJkTY~hkPSdQ_>* za_oII)v{{s)d_Z^jk#u-V^r&wjWfEui9#t;2^FeJsnzKvSV~TDalrPh)fFVQp;Zha zkgLU6;x=reOTkHTN=In5O6#$RE#XQwfC`AsPBK3*zq^yVcW^+Bw64>Bizt-y$Aup3--wxsuq_nSwg|qxC=e(T}dv#=STcr`aM?;(rRVTE?=>7r=3@<+RoDagW`3#j?^NB}8Ce!UBq~Y@EiLLNuk|35?NAWAHo;db{hZW>kwh5;3plEq!^b zuJV6B`d@$kx>vJ75zDXEHB0~3w1|CA;dZqOk|ICPmcjp)?xqT*|-7u>l0bzkW@ zmhVdMr43T3Z|x5@J9G6Nqer}F_}0JGogTh2$dYXE$?;`NH3eW{VsLQq>Z`9g`Q(%O2A5oN$yc6r#?$Ekah8@!&(})s?QwGueQwD7 zm}J}T5R{vr(e$g@h-mx_Up4rt^*f}mT{?@A7@@?TK@bAuN>Jv|kZTFZ>WJG=Wj8(z zTaBv6deWWwGmR~C7u_XpY}lP*HGEL5qcy80s>2!a!8}%)e89R@R7^E_VN>bZ3gl0v*?Leq7XZ?apz>p1^ctX?;{eN&rLg~2wwJqtVf&=6OVgWTcb#ali5%!>_ugBv!Fui1EK z=a$?3)G31nt>5|R*7E;4Wpm=DixOxgab5)<2-FL)#+b6u&96a>U*#K z(U1S=lqYkFqgY(NY>3S4maVlIo*c>!Vp)D=I#$euP?)v{s!G}>e~{Ej8DDthd*Kin zagpm8Rv}#Dp46mutM>ur1cN1}09XVfHT|w{&aB$Gv*+^J zwOeNSwt{AY+#6sJ?&)kC?LTF|u?v4X`0``>AHOdP`Px{m6|&eGj7;!YewR@tQ~)gK zk~_9)qn#`m9=`pTKfCzyZ=7@H88=;j15~a#2YBH{t&Z2LS>T|J#Y6+#?++zk;%ZrD z-*~slG6v9aX(}50T5Rw{;ml(qvYH*YlwR9dOU7t*r8>Z?POLm6T(bfLOA)~;)8dmy z_6lNEP~{U7dO|_Aw{*buFIYpb+0ab@PNB-57@_M=_RUZ*l65Hlm2`2lsI}w48EdV; zXwnNO4xF8Ir;ZyyarZ{=(M|EKPVIWy*SBKHV*Z2k4<4td#SJRx+Osg&`P+N;LC%Yx{%^@uBD~vUcME^MZ(PVP|pmP8&m7n zKkzs2e24r0^dO%ll%T!@6}M4Ys*4ooW_y?7>~!!XggQVN;X-SpgnDjP?hl_IT(nELt^Tf zkbc5ewN!&4n>lq$2p2TT6MtAwN!vDz%FKL}g4vQRm2yGGig=f05yF#3zl6XMN_LAK zx>FBJLHslRMzi(6OrML*E40;bEJv}R3%GR-DIA^77ruP)o8S7@)%X1N z^>6x{4}IW0+ye0G8fR+W@~d^^N^v_1Ng1+FQ8BVjz_6Nz8vxgEcz4TMeF=W?VDFak z>4k&(+%s*1Uct8Lp3iany=UdX>@8~$>(uYj(qgvSSxtyQ_p$B8((|+(@td|iuPPuoOlRXcIb=ijpB!BJc%i? zCWZq%=nAAS$q{Qn$y!NAif_(uRG;oFqCX6j?+8d349@$P_Jc`C2Z=bL+!X%M6BHGN z`(+{{D%I!m@}+~stDIChfPpXvZ%ZJZe>bcw30Ht5QhhLH(yF>OWy(>&UB)CH4ibm1 ztdVZ!R3nE&6}+lIA!J_$qk`Uljk2ib>M~GtT(-w=d%VPyg)IpZes-CMUTfi8U$Yd{nm-pwXnX^Pk!p2o2Rn`_KZDvyBN>VfbYtQ-Mk+!6{#=d*xC5b}e#2(yhX3 z;1FH>&O@}9(4PorJ$MilseK@kGQyi`j^wdKGz`o7!4`8i2NM_;(mljoESf)Pq_8^m zQPnZ~B4$-He9%kj^Wvl7>VlGp6wOvGS$71$d0MYejxwF~hd~(z==@L!afV76EKeLxubzDa}Y}FtMz>ij3;wLeQ*67YDvtC>^qH9u*MP;iglhl-ndvOir+A zzjlJQEzn0C_P7VvZ~veF`S_`)o+u@J>VtJ^K8YmjDkfEKnkRM@x+bFsB4F2|Vgd)h zLS%hr;Q%j|apBF`p4Z9H*r#>J$SFr>mQ~j!&Vr<>;?RtyaKLs#vn)87xD+v8v;gz@ zs)98P7p#V|Q%`#G#P%(p`~0PsTyoLd-~1MsC<+Rm4GkC=xw_*L(&kcsbtYPD7)1}& z00(CPnPHVwkYhv9RDXnZ>B{Ou#B( z{?i93e&ir)>8hE4^^b6)&|{F8_@S-pP0hj%S;C?oc`TQ92-fS6lZX0hQI_-eM{}r{G4p{bs@oi zF$cVEajMqoEb!^!aM}gUNn<{z94!v0_j8i)zbKrGw4|noVHhqLD%9&~djh0fe#xp% zTe^X$wND{R8DOr@r~Mv%T-+gU4U}Pq3~B^+NoRH>ixN)$ydg2c?bgi?Z@&2_KSwxD z7@zsfC-1%Yw&?$?aYUA+T8_H7q9&qjY*Y1RpdLg_lxjB;Aj#gslMm_eL@+Y_taGwB z>N`Cu8pcjNb;W(u&Vyt9NA80TT$J4|y>c}35_rh6fT3Wl>}s@XHw_|Ni@ftAk32ID z{3qw0bKn1s2wr$yZ!;L>-#z_BXQOS)%nW<_FrL{zQJm+OedBnJEtSdnf zKY2na`QJni)=**zW_1fJ0aS<;M8sL(@@mIm{fTZkY^cQ?{l5lE^6E$urJ*LPQVV z*gA+}%Zq$9sZ7`v8%w98Py~h!H@;W`AU)`*WK6Hk&>SRy4Thy0WONhs*T25|kb{qS z;!%$qotWn0MQ>y~=y^zP_~&Z87yq5xpcYr1Vq{Ct@hKo@DOlxoV#CRvBX=1b9_-^O zphW}hHmx}l{Ye94P+bt?};uTjk0=pabOY5+kg_~Glbg=4hU~BiW zJ>e=~6LJQON=e2v>p_Efq%OTosWKdiQQkQi4&j2J;KGO$i*AG~!rCQldFLirEt}a5 zj5%Btupx}QR^gN(6Y z(Z8sQz!tK-XcBywQBPX;4!-H+nQ#2Mcj3bR#Y40GTKnK@>^&@F4E4{hSTOVbU-dox z;Jy>~XK0w=yY^n8D8?c#DlxyrIW748GBlTV>W$BJ>E!2l)7);dpV?jo9H5>P!A-?jncDoZ0 z1XsE%)&8iS9w|r*WE-A`r@N|3HbWp}q`OL!a9W2}h@>4dmUI=7MAAb-Y|-*fNygF_ zB56keozkJ5#bUf#sa!A`DGmb`Exy=96tapf#3=yqPI73PLn{X!BdjnoP_;)=wy?v$ zx@{;{N`sn0x*nxqr18>XK?t%yTE2zyY;fkWu2M6mCzBLp2*ylEz5GbiR+_Ge;y=#m zT7#gQ%a!LqnX~xvuBV=|z`*7KSf;^@>X`(PKX_szqk| zbq*SbO6^NuJIFo%=b=qY-bM+J5^3q8@AXgVd&RMnpZf9SrU^bD+P8es^rGS3#S3S* zPR(BQ%gzBSmwff*Hp6uR9vN)uE&A*sc$K?+h{7+7V9ZEC5zp08xD*#oSPzDi`JDuSCoF*p_IGnp*##UlrUT@r)-x= z5*960o3e#9+L}#^Qd&SEXLj75TOLuerKUX+NEA&i4(rl^pG(u))0e=S6dXla5s;8V zaU)rkG|KC3K!oh~))Nlc3wdaIFiFbkszRcoSzl?lA)+HcC_xlk1}&%&^xZuLHtEo@ zGKNMye9NORB3<>pYgX;P$Ki(^tOdDdj?K~qXEdME?3VMBWonz@NHI?vj`Gg&qGTrg z6H<9j?i6(?a4UuG(APWkf1fvV&`wkTer?Z|sp%nomX#-xdY1GrdBt(P?|mlz>%l&a z7j!0h6{?DP5CrLs{1v!h;6ub2Nt7k+b@8fHoMpuo%2|@&l7Jb(e}DX={7aF;=RWt9 zV~>5p!3Q6xxj+78?rdLOUt>T#t3p2GDGi~dwyF2vh7oC(Tp|jd>q`x0c1e*k5m`iy zD765>d@bT&j-wQaJ6Wpk&@7czshrc#nuWDfHpGOHa<{MG)Rd?s47CI^mh#hMX^<;5DejmibSwt zY~Z~JvIb5Al48|I^!>0Ed{QL_VwI(n0)!U3aH1u~kPzlHQim{DaiPdZu_{=BtiT-a zqsI5SNykW_H{sl!84_r)T7c~BU%&q0cmLBr{^v(NxMJnXhc<4UoSNwC9gwP-2_EyM z|A!@MjjYQBoXImm5pb#`{aph?wr}M zRS)p37#e!YezVIK>4pmH3%Za-kZefY3PY`q)+p6MtaUGZp@m3PM7XJvExB>N5HIzZ zKHEfJ-xOV%3lrR!n(1FK^sR4y|Ge{fV7c>#H~;Owp8rpH#^M1N5Lw(r(cQUhK_$zr zJblD-2!XU8;f$Mwb3+NjnphxbgroK(&{ECs3-d8li3+5Kn${Kvx!plyz#AX5SR@q5 ziu`?^n3kN~s*0MFhUXC#dhdmx<~9uT^H%5Q_o$jEhUVdS;Z~<3RoIJ%7E5InZkSpb zN@S&}c;mlBFc(d8oKEx{Z2BOLt<6Z#A&h=4ecGv;G)rYXoCvUH<9fHF&QEU9evPqh z5?d~^m7`kZ?CcFU=vIG(e|hh}ftg}^CA|y*#KcuRe;|YlnWv^OTT*bue+$=uMP4s| zakpf4s_T0vg>RCZ08n98A;h836sMLNw`nc%9CS(UAni&nRKNi3=Uw$y@9SRoMkL<$);9q6aJyd*G+~W<7dl}z4w8s;Jpy1s925;u z7N*#usmX}(h0mmtV+7jGzpq zy=Hz3x)_>^ZskfIW^mmbj>;`~;;O(aqfDms)B+{+&cAsRUobl9q|-n5=`X;>D8{Rz zY}Udh1K-_Dh2E8fZy<%1SR;hFwC9!?3^o2#XvVj8HB~8oggY^HVKBG5r6A!E8R_b@ z6M>kk!p0G`vD)t~$)UOs>e7YKD}9Xx7=-XIJBd^`3c`@=*agSMOR#bw%om-C3!H{a zM#E0{WWAL!Qa+}Iim|Tnr>Lzos{-o^6V<|UOUTfasU1v-y@*(SR+Dh;kXmY{!UPsCZ|a1ffNdqp3)YO`!lu6=YGD(%srK72c&BPZl%n=SFZ}@Atp|jo_f? z^Lf2bfBG|j_R>FPvy(~2FXcuh?1wi2Sb_C@VFuZ-7k#JL&i13y;75v394-996=_ky zN2RGXxqF!GqBN^5)st$Ve3X85TeZSsC3J;wm=|jr5F$w7nzi_VVR*zAih|9q$$b1P zmI|k(Nlix$K^Pq+AEhjmL$@a(9hpqHFt%fal&?9#_U4l+nW;1b_Q?4m83j}r>|;7w za2OL`X0Wkt2sL&ljzSeEtk_#~242j?t2xYYB@YljkPsjVC~g9}J;lZYq$fCkI`sRM z!3WlEJpP1}&pzw)*S+dxpxHu$M$Ej_cl)iv7vwhJ8dZHrzF3TWgh}hoaxU2hm(Hl* zq7JfcDIs0fCs{Q)>8&+oBSQLG8uv@)#OvMlZAw#@UBYv#fV;(3E2*v#|YTf9@2|n{K{9q>g9Xxz5n-ra6Mni0y8}+VV)z? z^F#!m>*TR-K&Qgb03jB)j<=nc28AjS$rev=M_nb+5yfYrmZVv6B`Tp3Dh9b7 z?T4D`QH8gc5fK(|{iLks!PB!k!DDcw|7@u;gWSYEkKpn6caK~z%FUTDOT>nUx(Lu1P! zV8zN^Ui(*X+G~%Uulw=U3zzJ2;aBw~zrle4y+5xtLC#*P38agrXch7-G1zP>t8x`8 zqR_=-s7O~wMRXHvB;~2-EsSMD2CNBfD*DsE$Yh#I4UMht)^82ABo2PkL6j9(#7b7v zAXM>$Mf1%$;d}%ncBjb?DLtZu^ofo17CJTZ_>d++>@~u*XiehZG+0t%X zx5+I-p(u~w>%WD>oeCYITW@(tEsfMjEdJ?G)kM988#(Vi2%}og@A*J?xgxLOG|?r3g=K( z0^*&Ng-e%*{FbrFwfEmM*gyQve>i_+%lg9)c@)$CcuauR0cH&jnmE+ZUH`3OZ43%x zjA;W+Yhgs3E{lmO`pQ&nrjVoSpFlWPr&phi!v zH&E~e!Fho#q(ii{0c9C3{uxPiA+_HD`)_*ifv;TnHQqfM*R~Fw6)ToD^IHWun zmR_55$|Ry2KM!B%5nHep1M)FcwJ<`Y=Oqfh!fG8svaQe%KDQCpoffN|RFX2SNQ@<< zkeq5^3zc|&Y-JF6E=zHwG9{3Fkh^RdJy%C+ZKEy5!nhWt=c;zPZiztZ%I|#d=;M#; z^sVSyxW{82f86bN++Rglsb>0$idbaFMBcd&CJk1*El-7OlUt-pNEVZlf3BEWTC!G| zdaI9*0Q@1gMi&O=tjU3^i1i8y^Tc?yMwp zkc4xVic}XBWTeep`GjoYgD9LFNkaN04aNjowgmCZsK!OGFob}4&Dtnz=OnnGB%jSNZ=nadpd)1BgFwN-#nSyJ}iiE6b1RRvDU&j{&? z5{YxHQYS;1haAta(6OqDd9PrL>WX~XxqnuSPH$&5(TUSeJHrg@#j2oBD50yF1q3=Xk_qUg zpvz!pWuXxb0c0fB_^;w~fMjoBg$e8&T2^aiB|V2jq{LQA1%g@0ib8?mc7=&t8Cp;a zOmfKDV)e-$6dwW`4oQZeMT=mdf(uHjRXVu45SbtfqPZkw{iRaULaIoWR-K2Sw3H>- zXoW)|@Z;|1U%TS#(UR7zUkhn+EV}XRmoB<^=Urm=?qL`n|HQ|C=LgqXdiEPve)ojq zVl!3kV6%MLu9sbUd64M*Q;Z=@C31cdrZ`4X1(%P-Ik^*AG)9M#@#3lJDp~)G74-Xq z3PmE;ruHnYslx=P+B&**2CIbNu_{SLaMJoJDhZLU*a}p^1c*XsD3yDf$n$XnUKC;v zf&5U?75{tr;DY@49YuZi^Ut~M_PavGeQVbpd34l*DsaJ~m7nv%nOIt^CZ}eGn-aB2Eco=N!67 zAy+x(O&Zx8c63uYDUyQH?bO;Lc4Z+n7P;yI063wOUXS%DM|yvH>u*kZ+8?X&=yhc_Ctvb~ zFMd7@GC$zDAmA@t_{EhgwdGla$3EehpWpJUAWiaVHEv#oPeQri6&D8_Csr`OCJHFi zAskA~7OW~Ni-@A&lw=G?6s#)O_{qK!#a6>={?r#r#MaQ;+6z{?%#(+%M2lcqY>Mum zU9d00SWKT$(H6BcJWm;--~Yk2hdtqmrF1(79sa1RuFfHNa(uM1efO&G9(drvX47!I z?}3M3dDYdS;m*4s==5qE%O^egbTE7pigB5c7Xn@G;)NXP!pXVN6vuh!ZSwDdt7J=G z3rtC2T4gGs{LN7vqH&xgGEEcB{i29d{n*&$uwUjG~_v& zq@b;|CMwXP3YT~y%9%5b&h`&K%zo#ZPhN1rr$~Z(*(+Y{_QXL?{=ELL->&O=rjXOq zW8?a)C1GM*j{pSxmbZ7!QO`Q(TwQcJjE}QGfMjxlBZGyQJP}p2srE1#yV;wRB{JDy zyOg#Pp?@B}s-b$&l1i}h>_CDdVlwPNHli>DQ>pT(=^_{f#J4c3iqoEcW~l|@-jDp} ze+7vJn(MM+T z0coDXEmcE76t`ruz!~QZv7*J&5~#Ieb`D)}Fq>WYE<2ev9;qDPEpD-v#VEVL#!+6i zSlgs7O39mfIbcN|hp5t$)FCiR2@IYf2DRma!J;?>s)FqLv0BZ*l64Pl{^d_^aSO_udQUm=#NXY!IxJ0& z>ja{URHmuc#WO(MqYCQy_KM=18WG$R|&bg`89aw9wbwu?hB;(_`Y75&rFZdJQZBt0>001O{ zNklZQIxOdUwU4h^5Mm@DXvTc+~+E$CR$x zl13CzL$54GsSM1Mk&rT5r7B?d_Ms)1=;U=&5gf&AzmI;gyRyYSIs%eT+zQq#4CV>?_rT{>@?#2hg zmLB@pQ(pX%*Jt{S5r#wu*8i+A=GZul3?96OupG~e)FnhxofDPR=C?< z`+w=8uN5K-gfW6>vKz=$Bafnh5^XXE{WrYHo%)ijlnC`8O_2~TNk&SU5Yh-BQl_fB z00$A9ATeW7k0{AuMGYL=M}oE(mASty;kxIX8qKT)$6fBj0|@S_1}BbVIp*h;W- z*x^Uq_>-TS%j>JUu2N|ib}0d+3kYf<7h-4cx_`|{r<{g()WXS6J#)7M9^dKgG`L{t z`VG2$!*HWF1$PKpDAFnm(P|5yOCS;j)lx7Ag?Qtm*XFSbz~H%vShw}yFQQox9@ldEoG;Dj~-aCpW2K<&wqS0mz3!Gxqzf|b6X9f zH7R?vstK<@LAd0iOBO9|mah&x{E5H%?cLxBl437arU@cuXfd;ca??+KIy{umaSiQ!*e?4YMb&=r z-#!S5S2vrRf>l{~T+Gyr7J4^1O?O4f;g(X=RE7o-P%sy=aVkm|TETY3sUV{+QY0Rk zlFZURhlymx7_O-np@>(TEhghi+8P>#g};zV3v49|M>`I3W!kYs5(7tNO8G97h;td* zc47(u=AeTQ$gQI#qni-nzdjy7ip=6N6K&fxhxb5#SS(KmI)$+1Gj4PlUr2>D6u1tO6awTuylY6osv|7H)tD+3 zY`Nr2o`NbOQqbUxEu1M>BDl<4ln1`i6A;IW5}b*Me2kp5xx}P@kpr|PCu}8=$(O`R zss2|?Ro)0n_YMJtfuBnaIomTS(#Qv65i1G75U6($t^^UH7MCjZFmEDx|^!NiPZM88wG3+ee@IoUR3efB(>jx3R0Q_+~h@xnZ}) zf>315F6vN&t(qMfb}*?JZpnp6At)u0!reH%0~CUJY|GacQaBJT6)MLHZ)%jaf(p2% z^oXohQV3-#^p#7$zHBEh#0a`{I{x?*e{;t@VaU(*W=V#|Mp4^>-DxpYuGt@7cf++m z{O(I%_Sc=h-IwoqdGQVf`-?wwsMn&77Upq5>D%2xRujFgHk}TwH#Hd zJ1GXMFsJEpaQU{<;_GSyl~yG~R~o2_)eAtD#3il~y#AI5f;K1nAsy$)*3Rwx__&q`bHHq$i*9 zCoewte?I%gv_=p0B-ADYmw60J?F^?GU7B)%n$7n|H{5XaF-O~q9w^*t=RH39@e7J0 z331^ED|qqG(A0 zws^yC3n4|_fih8k9d5q))>BUYBNvM<`-d0r@}2MGojlFxwNStkflN2%69i#`^_W9N zt*1IYsBYdq^5=j4`eTkd-pb>kk|!)(wt|ma!kj}uD3`ua?b3D1YJ+SuX-nuT)CHN~ zgVmYVa5vP1#Dulra8$CCK8P-SaT<8%&%6Eh+dlWDuN-kC&z#QDJ#q@SL+=bkvbgShh@01YYF_0a?J~bktat zjO;ly}cb${`ug^Tr|VKmKWJo8L0T!U2ZY`N{rM70v2lr}gK z;|I2c1S_HdMb5F2R#wECxCjW-2z9yAl?Way6WDU4(Fw$vKOf_nnf=m*daJsIGtWNz zp@+8xHzlB_gRr2WSom(Agqbg39LXrd+it&Ow>|fK{L#le>zU_$@B7!yVb`Nae1kt zc;mVbRkFbv)rFTf5RTGECGBD(7Z6>V^LoHn{rH+g4vuH|wC%@HM;-Us&wVKc{E{Ep z5AUp96e~>@8LWhY3pY|sUOi%9?NQ5*ImM_$z$5a{N2vP4l@?2-G&rIBGmV2|(Ib;; z4i)8F&D{ub&Knw477uN6IYVjD_kvEvx&s>=d{i7kv$`cn}z; z>H+;+8U*FG-~9H36HfL(pvPC2?YzqcpS>`Jc)?(Fl5s$bk-i*`%4?~vPJ>IdAc2_- zRW2M+TFJswa2BfxGuG66Wh)LdU@qcDe@cVK_nGn7+>>!_eEg|@{A_174GTt@2iS(IvzVNSf@#r0xjntW-HG z6qqIn6#vOuC^@>c$tE$z@S&k#zU;EE4Gb-*ePid{54`K1yMi=6F~&26z_i@dp;XBW zaTJshrdUp_N@XZuH$%x+7EWO*LfvtpITwnt-X(M*&806{fBs0J~kOMYF&cs#a8aFDcTg$wu7H>D$N);=h=E0iUji1+&WZP^Nu0V>_v;ZecVUY-8 z91D4Va}`^ei?k^Xwn7OgnuDv!`IJ^%0(je;EUK=eqQs4qM)kxJ1ylgXMiq=0q@D%9 zdg^=qo8K`o6bl4;%jNkme#yEG8^Zuk!$%WVH?bn&DTP&f-J{GyIM6!0N z37NE1vnQ-oXmktyv|kh}Z`wLBxZ})%A{P#KNpxf@bJ4ozn&NG41S5!4B zg2P9tZzU5nY94&UiOWH6`CbH|0Co)lEhCW3Shz`5Fi4L;ZgJs9NfEaS%7s?b-E56a z5vdq?Y^kEP$*6P)D-L4|ONr%4g}ddH+L82#{N|pA-_9jokqRv0IqJhhj!=_dF4SOL zIRu+&l|6)#Ls5W5qZ|PhT!orE#Yn2HJVi&93VE?LJP8@uLQALkjDn}IrLBSqRY?pk z8;L=N-ja97)@;~#-np>{fx67#@WMZP% zShJ*u8Hr@JIqAqvOE8oL7oDFi)q}`o&Z(z9)t%o%TmSH9KA$&P$+8}ZfHBtyT!I#} z`eHIOBb>5Yj0WSJWVg2vlkTX|U(mYWSe64ruNWIK;Zj45g({ln=af{2%3v);6~qd* zbOmmQJccTWNiVuXOI6fDx4;nl157Rc-v@@SKfnRmd||SE{KJBUqcJ2XbQGHOH}p(2 zEVY5Oim{=#l_WebQM7popp2F7Hn|PAO#FT@h3sc&(~N_~@*D{6zIXKj`yb|>qr;*l zD?a?;{|c2%X?dow%xZ<}_8?Lmi;cq3%@)ecB|;GAXAx_gUbsr!(D90waFurW%h&&( zk_Fw3f7@H$o+3=h#m4a0yj77l%%LI)KxLgms7zdeTCwfrA^D?R+XTanHj*gMcLV}m z43rdcQB&fgP%Qq5ry#rIHbrn{3&2O=E#-U$*sUe0Vr$41Y8Ow+HFoAv1gc9>ktxch zxGJAtetxV5=qgx&`FXs;WR`GUk!wDpv!De~y;9s36Z_YBW@+a_m_C zRYm0qDUuYB%4iOuDutl=u)aoAW&{^s^7X;t<`shj4nF+m>u(H!?W6xsV^=}OfVE^8&QJA z#EOl^#Kw;wLL!}H(yyfW`2%BgiY=Kk)%oho9iNZ2*1O()_O$G|^S*06>silQ`#pP~ zd(J)Q?DL#IBn#Jy8k;!H<~prb+pb2Cl9%(G+R#BQfsFEtfKQx_cjNxieV_HW0sAiC zs;l1gDY0oMX5L3I02=ZDCfXkygSY|6=R&inJWHbAgdrb zI`4^DIHQ^YQByoJlq*CL2{9-_4wkovvDKSwi@7Rki{Ru-Oq>O;urihvD^LcztzEL= z`o)MBcm_IK@Yp=Tm|I-xR_dQ1`shb~`_fBzom^j}@a^yXsbl)MJ2mhyTJIj<+Z95| z6UHn=#SB{Afa0UPLnI1wz^z7>1(Q%x@w7jF`TyM)k6ib|Z&9}|#rW-4T=Dt8jE_j7 zMZRO2r@!7O6-~L4+I4Bfs|Yy$H=uF5lf~>%XdR`=^d5Bv$6~Z60wPC7R887quJpi{ zMF3O4Ws;n8YT2JqIukIwQ33=xgD5Lq&kbs3mX3KP;_R_%qipQbLZVzGlH2*MP0NOO z<=7CaJFpFLW*tVxt(IOea7-URkCx-NT zE$zgK$F4Ttrg;h*k1(ZjZ!OBlm-88XI zK}kOC&o}v>IJN)on{Uy{AH(l|@>Bn-PwDV4etf4iALytA75zWEk(*TubYBTG#~peU zPMNk1my0~SFdGm^y9-#A3D9Caoq^#qUS1hZahRQYai$`*4=cQFs3WxHV;GI~j@eLT z#57v0NQb@wyDCvJoF?APNla{J#Q*GTB3aLe&zcY-Yw)a5UZ=|T5P!ce8Vm%IpxMx1 z7|c-N31Ci>nQ7PD4&}!!Q^5VPi{j@{R;bNtH z?VV?s(z8NH>7I(3h1+POLlw8K#{i2AD(`Xd^{W1cRoHjk{V88?$?g5vPyFQ9kMjfh zxR20ff5{)k>EJ&Rg0=~4Z4nj2!Q?Y-Qk-)ywz6am2{^tBX!K~xtSmgG%$1g2rV#IG z-CpL%cVbI#=4t}vu}w5O6Cld!5Y&l1IjdQ#V808$j{(Wf8mo&;ImV zzlE2+;TIZhHn08e@BP9*e9=X4Ribz}kYwN`NzSO$%?Y>Ea%5sG0)P3Rk2m21eeB_f z4`0T|{NAp*`b~fTg@1JVd9_Wx?lN+(#@wr*LhCLfpayu6a94mWaxGO4G7?f9=3M~z zSw$h!qRX|UWT#%vD&dv|VUR~h|Ao>?an;MADALcQj7lN}1{l_0XLAhn{fbW36apKW zX${p@a7957h89}vA>CAMW=mMxKVl>3B!* zu6OQ{bjy-wf z+uxx!c)`V&zU&ph_lb`OneW8o7pdc6fbywoW$vFzG0}l(R2+w6^h!=pG|BhUhE_@0 z;Ao{1W(n1a(L^}7f^Z9w3Fpt zfm?6CWA7k8+w1K;x7`+h55%wjGiP-l zBOuoxDw{M6sxYWcPXyA-nGvU(vx(d|eenX^rZ>@j6Vs?900H?p4B za?eWDGFt>=^CZAF{ZSyeihIspqDtmV*G@z*;l!?Y5Ipkum%r=Pug)`ZbMWwsAAIm{ zOg(${R9uS$McdywRyEy=Doy2ZbKtJz3|`3N2PL`v^; z6ExK!(6Z9>@~7AOVU5Zli=3h0JnmWLDuYO3h>V~EF$O%Qkjp9xU@$?3L#0ijWF>Ei z=Z=?zLr%z@80jqvttrls0n(M?5fAw5y#C|Q{mB(qew*$Hc(L>AufOrg(MK)HFEjG% z1!EVXXCaAOHI!LgVGVi`kKgNh1ajfwCmz4{E#vDtE`RwIpZ-j|)sL?Xj89d$@^XY? zZ0;mnOe4a++gkW|AfJcv?KB7=hvkatpzF&KuZwlgO(H7T50 zl^d1Dgb0H@vs#!WRGFcm4v9z>&M(~IGk<)XkdM!wJ#q4Pf9GTMZ~(?l@4n^u*ZQPTRaQfGi4v4(()(^y`y!BNJAO5Y6p3Ov@{`gY`e)%T=dNbWY z2V#{O@S2Dc3>+;TTv-IA%@veu*{&tK59ZYYiBSJGp=5#;%_QP^6`U#bR%nC*#w4rl zBoLv*6{E^Gx+(K{$SZ3Fx9}%*qK~R2W&lPmx{@4q`MJj35oDLef?uyK1s2#+iAX9JZO5dG;I^Ql?}T zjzN<}lNp6qB4qUB=n#89}s)Q1zp=rx2;#?vT&!GQUQ9GU8fo3x1ID;f1 zJ0z?*9|lnejENMEVM+6EWH5*= zXM1#oRA~!G)VfoS^O-g*%38o!c$$JHjfhq*s}vSiHBu2tgEp8>8_Xy6sz z<%9dL9Q*3~Zo9osetf0EALh4o^05a$1zPHH1_l$Xg7 zOE+i1bXXnpLbqt5n8q=PoTcC)lc_}{!<-2S)SOmQ$Y4g_66njKIDxES5=Z>^&(N5B zc7Pu;w-h7duqdNLez4!$9Uu6GuRi@Wd*;RVeDagpyI{0#FZa?2ZcrT3(pb(Jz?>%OwtXte?!nTC zr5uFDDpDF5!(1N|%9v^g0aN^VGH1Tkh>i0+5=%^mL5>;Dxj|D(ix&>8U>fD5H2?;? zR~j-#WLPt!ydXRu4>5&xJGtzjJ2?DhSB^(lP)H`{w5u5#hA$EfB_)f3p;2u%p!mg7 z5JU7rH~0j@bSE*6aEI5JBTg-QS!d>VuiHZ*Ekym30B0aLLHT?>UdB6f=JXFV&EjD zAPs2=6Y8KC0SXEER9DjExPYL6LlGa%!Do2#cl(3*;_dJ8M-2Fe!q>h2>W3bRZ|Oss z|2g*L+urt8-A(YVey@7vEAPEKzf6rEK!`U5SwC8+Vr6hQ)J-C7KVlhr#J2a3wtTOO z77l<)F+jMfWsapn!OA}N&)Gj(o=>;73H6mu?s#SQjx z)F0ikuz!>wdh4dA$R<~$Q99k69bp53$do6b&@4O^nbgH7ofIDYK(sWlp`7AQvUhO- z#Un-ev2KYYlL*|Qk#xSihmYy;T0?H*6ZhQvqDyoEAD!;+{OOAE)!xcGZ3-LE+gTpP>xQA&EqAj=J)Y$E@*IJkqBh$q(W7Q}g z!WO9!0tn^aRUs#5XSv1|Zbm3Yh0-M>(^^bs6Q^I{3=+YX)fe3bJ;_0IH6@N?LNXYf zqTncJaEp>lq3}?xqbn0UhbEoUYgm#iw%Ny5XYOrw@z;TahvF^0H^29e&-}s1O?}Db zFMsx#r)=MFtjR*R{Zt2#Z0N$)v!Q2_x*p(R|!O67N zxApjpu6TklV2cij5ZKqz*bg{jq=^`J0X(YF8{2oHvIt6$LZvL5L!pv$=A6F|K?OO{ z@PRfRrc-ihFN`F$RmWZcrKWa-3?4kGEdixPZtu_PbJUF{3yjFagsp1G8$*vqbKcX) z36V@#xK)G(rN%u6Gsw=2+&A7*byvj{5!4=2YQyTZ-)p*k>+YdQP982SO2+QW^1veA zFD-IXf;=YoLALUow%IxF5A^{fH4ZBUMFm-Nj7s%DI>j9B7*$3Q5=2bObQnlpzf|zM z6b}dv9_9-Kcn86aH@xGKM~^t?6<5CM&+otQ+G}{V54^yLM*(}gd;6PnI~Pc&=gF2^Q}k7K~Mmy=Ye?}`8=>A;0G@2caL#SNf!+S=>fRnmL{be*}JygJmBz?+Jx ztjs-iltiL^bChKNAO?u2M$%0Q$V$oJtbjQX$#_UeC+mk(SXVKqa+2I?v?psp3s3{< z-n%fO^4)l`x0fJxFd6KDiJ6yk##d%=nbkHY352{!{bbMK zySKN8-~2mx^uS8J8tl?_>D&o=W&(jBI{{IVXy1uBcC6cuCxSUmbl@JEV8v2(%++sj zCM7%yz+E&TYYoL=SxG($_uU;e!U__+EnevP2?7r_6y0t*SY2+b$O{E$jrH^`4ghT1 z4Q;1aDvd}JwiamV#VK9}0eD-KH{QU=ECCTXcqy@{b$W?YM9Z(Z3kbZ1@PWkIt;Bnp zdh8W9bW3xwDhY$TphG8Y$J)3!t{{f3?RXsT9Ra~LNp3sN%naF<2lIlSn+C>L_0L~8 zaA0R=H{bOO-nny|-923MZ)I=XVgy<|%X6N4j!K?d1`qzaowC&_eXLbaoAlC|2#aN0 zUo~d-YWsd7z@`vcEOD0c+=>lzSRyUlA%MX4?L;gduBw4pn(>&Z@@wB*Aj(jbO$Rs@ zc3NYxw(gNE4PD$>>GlZC#I+V#0N@lhX$usG!z#IyVR)f~8a})c8T$fkMULc&16Q4s6bxKE1cQdG7q?(80sIx;u!@Yc--PBrTU`L>vR9%Bx05b)J_X8}9Vz zbPnn6)(7Jb|0LnZQxr^5&FOIMPyx>wc*GOc;<+!zc+da>9=|p=oBs#rLfLz910lu$ O0000 = ({ style={{ animationDuration: "2s" }} title="Happy Holidays!" > - 🎄 + ❄️ diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index a1625b6ffb..e0dccbe6e8 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -6954,7 +6954,8 @@ export const ragIngestCall = async ( customLlmProvider: string, vectorStoreId?: string, vectorStoreName?: string, - vectorStoreDescription?: string + vectorStoreDescription?: string, + providerSpecificParams?: Record ): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/rag/ingest` : `/rag/ingest`; @@ -6967,6 +6968,7 @@ export const ragIngestCall = async ( vector_store: { custom_llm_provider: customLlmProvider, ...(vectorStoreId && { vector_store_id: vectorStoreId }), + ...(providerSpecificParams && providerSpecificParams), }, }, }; 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 index db2975781b..a8ba55b91f 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.test.tsx @@ -22,17 +22,51 @@ vi.mock("../vector_store_providers", () => ({ BEDROCK: "Amazon Bedrock", OPENAI: "OpenAI", AZURE_OPENAI: "Azure OpenAI", + S3Vectors: "AWS S3 Vectors", }, vectorStoreProviderMap: { BEDROCK: "bedrock", OPENAI: "openai", AZURE_OPENAI: "azure_openai", + S3Vectors: "s3_vectors", }, vectorStoreProviderLogoMap: { "Amazon Bedrock": "https://example.com/bedrock.png", "OpenAI": "https://example.com/openai.png", "Azure OpenAI": "https://example.com/azure.png", + "AWS S3 Vectors": "https://example.com/aws.png", }, + getProviderSpecificFields: vi.fn((provider: string) => { + if (provider === "s3_vectors") { + return [ + { + name: "vector_bucket_name", + label: "Vector Bucket Name", + tooltip: "S3 bucket name for vector storage", + placeholder: "my-vector-bucket", + required: true, + type: "text", + }, + { + name: "aws_region_name", + label: "AWS Region", + tooltip: "AWS region", + placeholder: "us-west-2", + required: true, + type: "text", + }, + { + name: "embedding_model", + label: "Embedding Model", + tooltip: "Embedding model to use", + placeholder: "text-embedding-3-small", + required: true, + type: "select", + }, + ]; + } + return []; + }), })); describe("CreateVectorStore", () => { @@ -43,9 +77,9 @@ describe("CreateVectorStore", () => { it("should render the component successfully", () => { render(); - expect(screen.getByText("Create Vector Store")).toBeInTheDocument(); + expect(screen.getAllByText("Create Vector Store").length).toBeGreaterThan(0); expect(screen.getByText("Step 1: Upload Documents")).toBeInTheDocument(); - expect(screen.getByText("Step 2: Select Provider")).toBeInTheDocument(); + expect(screen.getByText("Step 2: Configure Vector Store")).toBeInTheDocument(); }); it("should display upload area with correct text", () => { @@ -123,7 +157,15 @@ describe("CreateVectorStore", () => { }); await waitFor(() => { - expect(mockRagIngestCall).toHaveBeenCalledWith("test-token", expect.any(File), "bedrock", undefined); + expect(mockRagIngestCall).toHaveBeenCalledWith( + "test-token", + expect.any(File), + "bedrock", + undefined, + undefined, + undefined, + {} + ); }); }); @@ -163,4 +205,72 @@ describe("CreateVectorStore", () => { expect(screen.getByText("Vector Store Created Successfully")).toBeInTheDocument(); }); }); + + it("should display S3 Vectors provider-specific fields when selected", async () => { + render(); + + // Find and click the provider dropdown + const providerSelect = screen.getByRole("combobox"); + + await act(async () => { + fireEvent.mouseDown(providerSelect); + }); + + // Wait for dropdown options to appear + await waitFor(() => { + const s3Option = screen.queryByText("AWS S3 Vectors"); + if (s3Option) { + fireEvent.click(s3Option); + } + }); + + // Check if S3-specific fields are displayed + await waitFor(() => { + expect(screen.queryByText("Vector Bucket Name")).toBeInTheDocument(); + expect(screen.queryByText("AWS Region")).toBeInTheDocument(); + expect(screen.queryByText("Embedding Model")).toBeInTheDocument(); + }); + }); + + it("should validate S3 Vectors required fields before submission", async () => { + render(); + + // Upload a file first + 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(); + }); + + // Select S3 Vectors provider + const providerSelect = screen.getByRole("combobox"); + + await act(async () => { + fireEvent.mouseDown(providerSelect); + }); + + await waitFor(() => { + const s3Option = screen.queryByText("AWS S3 Vectors"); + if (s3Option) { + fireEvent.click(s3Option); + } + }); + + // Try to create without filling required fields + const createButton = screen.getByRole("button", { name: /Create Vector Store/i }); + + await act(async () => { + fireEvent.click(createButton); + }); + + // Should show validation warning (mocked message.warning would be called) + // The actual validation happens in the component + }); }); diff --git a/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx index 685e37ac73..97162aa132 100644 --- a/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx +++ b/ui/litellm-dashboard/src/components/vector_store_management/CreateVectorStore.tsx @@ -10,8 +10,11 @@ import { VectorStoreProviders, vectorStoreProviderLogoMap, vectorStoreProviderMap, + getProviderSpecificFields, + VectorStoreFieldConfig, } from "../vector_store_providers"; import NotificationsManager from "../molecules/notifications_manager"; +import S3VectorsConfig from "./S3VectorsConfig"; const { Dragger } = Upload; @@ -28,6 +31,7 @@ const CreateVectorStore: React.FC = ({ accessToken, onSu const [vectorStoreName, setVectorStoreName] = useState(""); const [vectorStoreDescription, setVectorStoreDescription] = useState(""); const [ingestResults, setIngestResults] = useState([]); + const [providerParams, setProviderParams] = useState>({}); const uploadProps: UploadProps = { name: "file", @@ -92,6 +96,27 @@ const CreateVectorStore: React.FC = ({ accessToken, onSu return; } + // Validate provider-specific required fields + const requiredFields = getProviderSpecificFields(selectedProvider).filter((field) => field.required); + for (const field of requiredFields) { + if (!providerParams[field.name]) { + message.warning(`Please provide ${field.label}`); + return; + } + } + + // S3 Vectors specific validation + if (selectedProvider === "s3_vectors") { + if (providerParams.vector_bucket_name && providerParams.vector_bucket_name.length < 3) { + message.warning("Vector bucket name must be at least 3 characters"); + return; + } + if (providerParams.index_name && providerParams.index_name.length > 0 && providerParams.index_name.length < 3) { + message.warning("Index name must be at least 3 characters if provided"); + return; + } + } + if (!accessToken) { message.error("No access token available"); return; @@ -118,7 +143,8 @@ const CreateVectorStore: React.FC = ({ accessToken, onSu selectedProvider, vectorStoreId, // Use the same vector store ID for subsequent uploads vectorStoreName || undefined, - vectorStoreDescription || undefined + vectorStoreDescription || undefined, + providerParams ); // Store the vector store ID from the first successful ingest @@ -298,6 +324,74 @@ const CreateVectorStore: React.FC = ({ accessToken, onSu })} + + {/* S3 Vectors Configuration */} + {selectedProvider === "s3_vectors" && ( + + )} + + {/* Other Provider-specific fields */} + {selectedProvider !== "s3_vectors" && + getProviderSpecificFields(selectedProvider).map((field: VectorStoreFieldConfig) => { + if (field.type === "select") { + // For embedding model selection, we'd need to fetch available models + // For now, provide a text input as fallback + return ( + + {field.label}{" "} + + + + + } + required={field.required} + > + + setProviderParams((prev) => ({ ...prev, [field.name]: e.target.value })) + } + placeholder={field.placeholder} + size="large" + className="rounded-md" + /> + + ); + } + + return ( + + {field.label}{" "} + + + + + } + required={field.required} + > + + setProviderParams((prev) => ({ ...prev, [field.name]: e.target.value })) + } + placeholder={field.placeholder} + size="large" + className="rounded-md" + /> + + ); + })}

      diff --git a/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.test.tsx b/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.test.tsx new file mode 100644 index 0000000000..beb13b5441 --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.test.tsx @@ -0,0 +1,203 @@ +import { render, screen, fireEvent, waitFor, act } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import S3VectorsConfig from "./S3VectorsConfig"; +import * as fetchModels from "../playground/llm_calls/fetch_models"; + +// Mock fetchAvailableModels +vi.mock("../playground/llm_calls/fetch_models", () => ({ + fetchAvailableModels: vi.fn(), +})); + +describe("S3VectorsConfig", () => { + const mockOnParamsChange = vi.fn(); + const defaultProps = { + accessToken: "test-token", + providerParams: {}, + onParamsChange: mockOnParamsChange, + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render the component successfully", () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + render(); + + expect(screen.getByText("AWS S3 Vectors Setup")).toBeInTheDocument(); + expect(screen.getByText("Vector Bucket Name")).toBeInTheDocument(); + expect(screen.getByText("Index Name")).toBeInTheDocument(); + expect(screen.getByText("AWS Region")).toBeInTheDocument(); + expect(screen.getByText("Embedding Model")).toBeInTheDocument(); + }); + + it("should display setup instructions", () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + render(); + + expect( + screen.getByText(/AWS S3 Vectors allows you to store and query vector embeddings directly in S3/) + ).toBeInTheDocument(); + expect(screen.getByText(/Vector buckets and indexes will be automatically created/)).toBeInTheDocument(); + expect(screen.getByText(/Vector dimensions are auto-detected/)).toBeInTheDocument(); + }); + + it("should fetch embedding models on mount", async () => { + const mockModels = [ + { model_group: "text-embedding-3-small", mode: "embedding" }, + { model_group: "text-embedding-3-large", mode: "embedding" }, + { model_group: "gpt-4", mode: "chat" }, + ]; + + const fetchSpy = vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue(mockModels); + + render(); + + await waitFor(() => { + expect(fetchSpy).toHaveBeenCalledWith("test-token"); + }); + }); + + it("should filter and display only embedding models", async () => { + const mockModels = [ + { model_group: "text-embedding-3-small", mode: "embedding" }, + { model_group: "text-embedding-3-large", mode: "embedding" }, + { model_group: "gpt-4", mode: "chat" }, + { model_group: "gpt-3.5-turbo", mode: "chat" }, + ]; + + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue(mockModels); + + render(); + + // Wait for models to load + await waitFor(() => { + expect(fetchModels.fetchAvailableModels).toHaveBeenCalled(); + }); + + // The component should filter to only embedding models internally + // We can verify this by checking the component loaded successfully + expect(screen.getByText("Embedding Model")).toBeInTheDocument(); + }); + + it("should call onParamsChange when vector bucket name changes", async () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + render(); + + const bucketInput = screen.getByPlaceholderText("my-vector-bucket"); + + await act(async () => { + fireEvent.change(bucketInput, { target: { value: "test-bucket" } }); + }); + + expect(mockOnParamsChange).toHaveBeenCalledWith({ + vector_bucket_name: "test-bucket", + }); + }); + + it("should call onParamsChange when AWS region changes", async () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + render(); + + const regionInput = screen.getByPlaceholderText("us-west-2"); + + await act(async () => { + fireEvent.change(regionInput, { target: { value: "us-east-1" } }); + }); + + expect(mockOnParamsChange).toHaveBeenCalledWith({ + aws_region_name: "us-east-1", + }); + }); + + it("should call onParamsChange when embedding model is selected", async () => { + const mockModels = [ + { model_group: "text-embedding-3-small", mode: "embedding" }, + { model_group: "text-embedding-3-large", mode: "embedding" }, + ]; + + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue(mockModels); + + render(); + + await waitFor(() => { + expect(fetchModels.fetchAvailableModels).toHaveBeenCalled(); + }); + + // Find the Select component and trigger change directly + const selectElement = screen.getByRole("combobox"); + + await act(async () => { + // Simulate selecting a value by firing the change event + fireEvent.change(selectElement, { target: { value: "text-embedding-3-small" } }); + }); + + // The component should handle the selection + expect(screen.getByText("Embedding Model")).toBeInTheDocument(); + }); + + it("should preserve existing params when updating a field", async () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + const existingParams = { + vector_bucket_name: "existing-bucket", + aws_region_name: "us-west-2", + }; + + render(); + + const indexInput = screen.getByPlaceholderText("my-vector-index"); + + await act(async () => { + fireEvent.change(indexInput, { target: { value: "my-index" } }); + }); + + expect(mockOnParamsChange).toHaveBeenCalledWith({ + vector_bucket_name: "existing-bucket", + aws_region_name: "us-west-2", + index_name: "my-index", + }); + }); + + it("should display existing param values", () => { + vi.spyOn(fetchModels, "fetchAvailableModels").mockResolvedValue([]); + + const existingParams = { + vector_bucket_name: "my-bucket", + index_name: "my-index", + aws_region_name: "eu-west-1", + embedding_model: "text-embedding-3-small", + }; + + render(); + + expect(screen.getByDisplayValue("my-bucket")).toBeInTheDocument(); + expect(screen.getByDisplayValue("my-index")).toBeInTheDocument(); + expect(screen.getByDisplayValue("eu-west-1")).toBeInTheDocument(); + }); + + it("should handle model fetch error gracefully", async () => { + const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + vi.spyOn(fetchModels, "fetchAvailableModels").mockRejectedValue(new Error("Failed to fetch models")); + + render(); + + await waitFor(() => { + expect(consoleErrorSpy).toHaveBeenCalledWith("Error fetching embedding models:", expect.any(Error)); + }); + + consoleErrorSpy.mockRestore(); + }); + + it("should not fetch models if accessToken is null", () => { + const fetchSpy = vi.spyOn(fetchModels, "fetchAvailableModels"); + + render(); + + expect(fetchSpy).not.toHaveBeenCalled(); + }); +}); diff --git a/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.tsx b/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.tsx new file mode 100644 index 0000000000..e54d3a163c --- /dev/null +++ b/ui/litellm-dashboard/src/components/vector_store_management/S3VectorsConfig.tsx @@ -0,0 +1,192 @@ +import React, { useState, useEffect } from "react"; +import { Alert, Form, Input, Select, Tooltip } from "antd"; +import { InfoCircleOutlined } from "@ant-design/icons"; +import { fetchAvailableModels, ModelGroup } from "../playground/llm_calls/fetch_models"; + +interface S3VectorsConfigProps { + accessToken: string | null; + providerParams: Record; + onParamsChange: (params: Record) => void; +} + +const S3VectorsConfig: React.FC = ({ + accessToken, + providerParams, + onParamsChange, +}) => { + const [embeddingModels, setEmbeddingModels] = useState([]); + const [isLoadingModels, setIsLoadingModels] = useState(false); + + useEffect(() => { + if (!accessToken) return; + + const loadModels = async () => { + setIsLoadingModels(true); + try { + const models = await fetchAvailableModels(accessToken); + // Filter for embedding models only + const embeddingOnly = models.filter((model) => model.mode === "embedding"); + setEmbeddingModels(embeddingOnly); + } catch (error) { + console.error("Error fetching embedding models:", error); + } finally { + setIsLoadingModels(false); + } + }; + + loadModels(); + }, [accessToken]); + + const handleFieldChange = (fieldName: string, value: string) => { + onParamsChange({ + ...providerParams, + [fieldName]: value, + }); + }; + + return ( + <> + {/* S3 Vectors Setup Instructions */} + +

      AWS S3 Vectors allows you to store and query vector embeddings directly in S3:

      +
      +
      + } + type="info" + showIcon + style={{ marginBottom: "16px" }} + /> + + {/* Vector Bucket Name */} + + Vector Bucket Name{" "} + + + + + } + required + validateStatus={ + providerParams.vector_bucket_name && providerParams.vector_bucket_name.length < 3 + ? "error" + : undefined + } + help={ + providerParams.vector_bucket_name && providerParams.vector_bucket_name.length < 3 + ? "Bucket name must be at least 3 characters" + : undefined + } + > + handleFieldChange("vector_bucket_name", e.target.value)} + placeholder="my-vector-bucket (min 3 chars)" + size="large" + className="rounded-md" + /> + + + {/* Index Name (Optional) */} + + Index Name{" "} + + + + + } + validateStatus={ + providerParams.index_name && providerParams.index_name.length > 0 && providerParams.index_name.length < 3 + ? "error" + : undefined + } + help={ + providerParams.index_name && providerParams.index_name.length > 0 && providerParams.index_name.length < 3 + ? "Index name must be at least 3 characters if provided" + : undefined + } + > + handleFieldChange("index_name", e.target.value)} + placeholder="my-vector-index (optional, min 3 chars)" + size="large" + className="rounded-md" + /> + + + {/* AWS Region */} + + AWS Region{" "} + + + + + } + required + > + handleFieldChange("aws_region_name", e.target.value)} + placeholder="us-west-2" + size="large" + className="rounded-md" + /> + + + {/* Embedding Model */} + + Embedding Model{" "} + + + + + } + required + > +

      r3Jp0Uc^q-SbK3x%nZpgSinP)CI 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%0Av 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 O0000 Optional[str]: + """ + Extract text from PDF using pypdf if available. + + Args: + file_content: Raw PDF bytes + + Returns: + Extracted text or None if extraction fails + """ + try: + from io import BytesIO + + # Try pypdf first (most common) + try: + from pypdf import PdfReader as PypdfReader + + pdf_file = BytesIO(file_content) + reader = PypdfReader(pdf_file) + + text_parts = [] + for page in reader.pages: + text = page.extract_text() + if text: + text_parts.append(text) + + if text_parts: + extracted_text = "\n\n".join(text_parts) + verbose_logger.debug(f"Extracted {len(extracted_text)} characters from PDF using pypdf") + return extracted_text + + except ImportError: + verbose_logger.debug("pypdf not available, trying PyPDF2") + + # Fallback to PyPDF2 + try: + from PyPDF2 import PdfReader as PyPDF2Reader + + pdf_file = BytesIO(file_content) + reader = PyPDF2Reader(pdf_file) + + text_parts = [] + for page in reader.pages: + text = page.extract_text() + if text: + text_parts.append(text) + + if text_parts: + extracted_text = "\n\n".join(text_parts) + verbose_logger.debug(f"Extracted {len(extracted_text)} characters from PDF using PyPDF2") + return extracted_text + + except ImportError: + verbose_logger.debug("PyPDF2 not available, PDF extraction requires OCR or pypdf/PyPDF2 library") + + except Exception as e: + verbose_logger.debug(f"PDF text extraction failed: {e}") + + return None diff --git a/litellm/rag/ingestion/s3_vectors_ingestion.py b/litellm/rag/ingestion/s3_vectors_ingestion.py index 13964cd89a..e6c166a101 100644 --- a/litellm/rag/ingestion/s3_vectors_ingestion.py +++ b/litellm/rag/ingestion/s3_vectors_ingestion.py @@ -253,6 +253,20 @@ class S3VectorsRAGIngestion(BaseRAGIngestion, BaseAWSLLM): verbose_logger.debug( f"Ensuring S3 vector bucket exists: {self.vector_bucket_name}" ) + + # Validate bucket name (AWS S3 naming rules) + if len(self.vector_bucket_name) < 3: + raise ValueError( + f"Invalid vector_bucket_name '{self.vector_bucket_name}': " + f"AWS S3 bucket names must be at least 3 characters long. " + f"Please provide a valid bucket name (e.g., 'my-vector-bucket')." + ) + if not self.vector_bucket_name.replace("-", "").replace(".", "").isalnum(): + raise ValueError( + f"Invalid vector_bucket_name '{self.vector_bucket_name}': " + f"AWS S3 bucket names can only contain lowercase letters, numbers, hyphens, and periods. " + f"Please provide a valid bucket name (e.g., 'my-vector-bucket')." + ) # Try to get bucket info using GetVectorBucket API get_url = f"https://s3vectors.{self.aws_region_name}.api.aws/GetVectorBucket" @@ -455,30 +469,43 @@ class S3VectorsRAGIngestion(BaseRAGIngestion, BaseAWSLLM): await self._ensure_config_initialized() if not embeddings or not chunks: - verbose_logger.warning("No embeddings or chunks to store") - return self.index_name, None + error_msg = ( + "No text content could be extracted from the file for embedding. " + "Possible causes:\n" + " 1. PDF files require OCR - add 'ocr' config with a vision model (e.g., 'anthropic/claude-3-5-sonnet-20241022')\n" + " 2. Binary files cannot be processed - convert to text first\n" + " 3. File is empty or contains no extractable text\n" + "For PDFs, either enable OCR or use a PDF extraction library to convert to text before ingestion." + ) + verbose_logger.error(error_msg) + raise ValueError(error_msg) # Prepare vectors for PutVectors API vectors = [] for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)): + # Build metadata dict + metadata: Dict[str, str] = { + "source_text": chunk, # Non-filterable (for reference) + "chunk_index": str(i), # Filterable + } + + if filename: + metadata["filename"] = filename # Filterable + vector_obj = { "key": f"{filename}_{i}" if filename else f"chunk_{i}", "data": {"float32": embedding}, - "metadata": { - "source_text": chunk, # Non-filterable (for reference) - "chunk_index": str(i), # Filterable - }, + "metadata": metadata, } - if filename: - vector_obj["metadata"]["filename"] = filename # Filterable - vectors.append(vector_obj) # Call PutVectors API await self._put_vectors(vectors) - return self.index_name, filename + # Return vector_store_id in format bucket_name:index_name for S3 Vectors search compatibility + vector_store_id = f"{self.vector_bucket_name}:{self.index_name}" + return vector_store_id, filename async def query_vector_store( self, vector_store_id: str, query: str, top_k: int = 5 diff --git a/litellm/types/router.py b/litellm/types/router.py index 8ea7a20753..43943d9e07 100644 --- a/litellm/types/router.py +++ b/litellm/types/router.py @@ -404,6 +404,10 @@ class LiteLLMParamsTypedDict(TypedDict, total=False): aws_access_key_id: Optional[str] aws_secret_access_key: Optional[str] aws_region_name: Optional[str] + ## AWS S3 VECTORS ## + vector_bucket_name: Optional[str] + index_name: Optional[str] + embedding_model: Optional[str] ## IBM WATSONX ## watsonx_region_name: Optional[str] ## CUSTOM PRICING ## diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 2d67e13e92..49c903502d 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -4,20 +4,22 @@ from enum import Enum from typing import TYPE_CHECKING, Any, Dict, List, Literal, Mapping, Optional, Union from openai._models import BaseModel as OpenAIObject -from openai.types.audio.transcription_create_params import FileTypes as FileTypes # type: ignore +from openai.types.audio.transcription_create_params import ( + FileTypes as FileTypes, # type: ignore +) from openai.types.chat.chat_completion import ChatCompletion as ChatCompletion from openai.types.completion_usage import ( CompletionTokensDetails, CompletionUsage, PromptTokensDetails, ) +from openai.types.moderation import Categories as Categories from openai.types.moderation import ( - Categories as Categories, CategoryAppliedInputTypes as CategoryAppliedInputTypes, - CategoryScores as CategoryScores, ) +from openai.types.moderation import CategoryScores as CategoryScores +from openai.types.moderation_create_response import Moderation as Moderation from openai.types.moderation_create_response import ( - Moderation as Moderation, ModerationCreateResponse as ModerationCreateResponse, ) from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, model_validator @@ -3075,6 +3077,7 @@ class LlmProviders(str, Enum): LLAMA = "meta_llama" NSCALE = "nscale" PG_VECTOR = "pg_vector" + S3_VECTORS = "s3_vectors" HELICONE = "helicone" HYPERBOLIC = "hyperbolic" RECRAFT = "recraft" diff --git a/litellm/utils.py b/litellm/utils.py index bb95be05b5..d7fb4855a4 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8452,6 +8452,12 @@ class ProviderConfigManager: ) return RAGFlowVectorStoreConfig() + elif litellm.LlmProviders.S3_VECTORS == provider: + from litellm.llms.s3_vectors.vector_stores.transformation import ( + S3VectorsVectorStoreConfig, + ) + + return S3VectorsVectorStoreConfig() return None @staticmethod @@ -8699,9 +8705,9 @@ class ProviderConfigManager: """ Get Search configuration for a given provider. """ + from litellm.llms.brave.search.transformation import BraveSearchConfig from litellm.llms.dataforseo.search.transformation import DataForSEOSearchConfig from litellm.llms.exa_ai.search.transformation import ExaAISearchConfig - from litellm.llms.brave.search.transformation import BraveSearchConfig from litellm.llms.firecrawl.search.transformation import FirecrawlSearchConfig from litellm.llms.google_pse.search.transformation import GooglePSESearchConfig from litellm.llms.linkup.search.transformation import LinkupSearchConfig diff --git a/requirements.txt b/requirements.txt index 36328a081a..f250fb213e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -68,6 +68,7 @@ jsonschema>=4.23.0,<5.0.0 # validating json schema - aligned with openapi-core + websockets==15.0.1 # for realtime API soundfile==0.12.1 # for audio file processing openapi-core==0.21.0 # for OpenAPI compliance tests +pypdf>=6.6.2 # for PDF text extraction in RAG ingestion ######################## # LITELLM ENTERPRISE DEPENDENCIES diff --git a/tests/test_litellm/llms/s3_vectors/__init__.py b/tests/test_litellm/llms/s3_vectors/__init__.py new file mode 100644 index 0000000000..d4b0c4d855 --- /dev/null +++ b/tests/test_litellm/llms/s3_vectors/__init__.py @@ -0,0 +1 @@ +# S3 Vectors tests diff --git a/tests/test_litellm/llms/s3_vectors/vector_stores/__init__.py b/tests/test_litellm/llms/s3_vectors/vector_stores/__init__.py new file mode 100644 index 0000000000..231735c1de --- /dev/null +++ b/tests/test_litellm/llms/s3_vectors/vector_stores/__init__.py @@ -0,0 +1 @@ +# S3 Vectors vector store tests diff --git a/tests/test_litellm/llms/s3_vectors/vector_stores/test_s3_vectors_transformation.py b/tests/test_litellm/llms/s3_vectors/vector_stores/test_s3_vectors_transformation.py new file mode 100644 index 0000000000..3a84da3154 --- /dev/null +++ b/tests/test_litellm/llms/s3_vectors/vector_stores/test_s3_vectors_transformation.py @@ -0,0 +1,115 @@ +from unittest.mock import MagicMock, Mock + +import httpx +import pytest + +from litellm.llms.s3_vectors.vector_stores.transformation import ( + S3VectorsVectorStoreConfig, +) +from litellm.types.vector_stores import VectorStoreSearchResponse + + +class TestS3VectorsVectorStoreConfig: + def test_init(self): + """Test that S3VectorsVectorStoreConfig initializes correctly""" + config = S3VectorsVectorStoreConfig() + assert config is not None + + def test_get_supported_openai_params(self): + """Test that supported OpenAI params are returned""" + config = S3VectorsVectorStoreConfig() + params = config.get_supported_openai_params("test-model") + assert "max_num_results" in params + + def test_get_complete_url(self): + """Test URL generation for S3 Vectors""" + config = S3VectorsVectorStoreConfig() + litellm_params = {"aws_region_name": "us-west-2"} + url = config.get_complete_url(None, litellm_params) + assert url == "https://s3vectors.us-west-2.api.aws" + + def test_get_complete_url_missing_region(self): + """Test that missing region raises error""" + config = S3VectorsVectorStoreConfig() + litellm_params = {} + with pytest.raises(ValueError, match="aws_region_name is required"): + config.get_complete_url(None, litellm_params) + + @pytest.mark.skip(reason="Requires embedding API call, tested in integration tests") + def test_transform_search_request(self): + """Test search request transformation""" + # This test requires making an actual embedding API call + # It's better tested in integration tests + pass + + def test_transform_search_request_invalid_vector_store_id(self): + """Test that invalid vector_store_id format raises error""" + config = S3VectorsVectorStoreConfig() + mock_logging_obj = Mock() + mock_logging_obj.model_call_details = {} + + with pytest.raises( + ValueError, match="vector_store_id must be in format 'bucket_name:index_name'" + ): + config.transform_search_vector_store_request( + vector_store_id="invalid-format", + query="test query", + vector_store_search_optional_params={}, + api_base="https://s3vectors.us-west-2.api.aws", + litellm_logging_obj=mock_logging_obj, + litellm_params={}, + ) + + def test_transform_search_response(self): + """Test search response transformation""" + config = S3VectorsVectorStoreConfig() + mock_logging_obj = Mock() + mock_logging_obj.model_call_details = {"query": "test query"} + + mock_response = Mock(spec=httpx.Response) + mock_response.json.return_value = { + "vectors": [ + { + "distance": 0.05, # S3 Vectors returns distance, not score + "metadata": { + "source_text": "This is test content", + "chunk_index": "0", + "filename": "test.pdf", + }, + }, + { + "distance": 0.15, + "metadata": { + "source_text": "More test content", + "chunk_index": "1", + }, + }, + ] + } + mock_response.status_code = 200 + mock_response.headers = {} + + result = config.transform_search_vector_store_response( + mock_response, mock_logging_obj + ) + + # VectorStoreSearchResponse is a TypedDict, so check structure instead of isinstance + assert result["object"] == "vector_store.search_results.page" + assert result["search_query"] == "test query" + assert len(result["data"]) == 2 + # Score should be 1 - distance (cosine similarity) + assert result["data"][0]["score"] == 0.95 # 1 - 0.05 + assert result["data"][0]["content"][0]["text"] == "This is test content" + assert result["data"][0]["filename"] == "test.pdf" + assert result["data"][1]["score"] == 0.85 # 1 - 0.15 + assert result["data"][1]["content"][0]["text"] == "More test content" + + def test_map_openai_params(self): + """Test OpenAI parameter mapping""" + config = S3VectorsVectorStoreConfig() + non_default_params = {"max_num_results": 5} + optional_params = {} + + result = config.map_openai_params(non_default_params, optional_params, False) + + assert result["maxResults"] == 5 diff --git a/tests/vector_store_tests/test_s3_vectors_vector_store.py b/tests/vector_store_tests/test_s3_vectors_vector_store.py new file mode 100644 index 0000000000..a7a1568c1c --- /dev/null +++ b/tests/vector_store_tests/test_s3_vectors_vector_store.py @@ -0,0 +1,42 @@ +from base_vector_store_test import BaseVectorStoreTest +import os +import pytest + + +class TestS3VectorsVectorStore(BaseVectorStoreTest): + @pytest.fixture(autouse=True) + def check_env_vars(self): + """Check if required environment variables are set""" + required_vars = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"] + missing_vars = [var for var in required_vars if not os.getenv(var)] + if missing_vars: + pytest.skip(f"Missing required environment variables: {', '.join(missing_vars)}") + + def get_base_request_args(self) -> dict: + """ + Must return the base request args for searching. + For S3 Vectors, vector_store_id should be in format: bucket_name:index_name + """ + return { + "custom_llm_provider": "s3_vectors", + "vector_store_id": os.getenv( + "S3_VECTORS_VECTOR_STORE_ID", "test-litellm-vectors:test-index" + ), + "query": "What is machine learning?", + "aws_region_name": os.getenv("AWS_REGION_NAME", "us-west-2"), + "aws_access_key_id": os.getenv("AWS_ACCESS_KEY_ID"), + "aws_secret_access_key": os.getenv("AWS_SECRET_ACCESS_KEY"), + } + + def get_base_create_vector_store_args(self) -> dict: + """ + Vector store creation is not yet implemented for S3 Vectors. + This test will be skipped. + """ + return {} + + @pytest.mark.parametrize("sync_mode", [True, False]) + @pytest.mark.asyncio + async def test_basic_create_vector_store(self, sync_mode): + """S3 Vectors doesn't support vector store creation via this API yet""" + pytest.skip("Vector store creation not yet implemented for S3 Vectors") diff --git a/ui/litellm-dashboard/public/assets/logos/s3_vector.png b/ui/litellm-dashboard/public/assets/logos/s3_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..15a1a456e129f9e2544d82399c6db3f2b9d8d204 GIT binary patch literal 191076 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

    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