This commit is contained in:
Anish Gurjar 2026-10-31 01:22:26 -04:00 • committed by GitHub
commit 6bffb9eee8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 129 additions and 1 deletions

View file

@ -3086,8 +3086,67 @@ def token_counter(
def supports_httpx_timeout(custom_llm_provider: str) -> bool:
"""
Helper function to know if a provider implementation supports httpx timeout
A provider supports ``httpx.Timeout`` when its completion is dispatched to
LiteLLM's own httpx clients (``AsyncHTTPHandler``/``HTTPHandler`` accept
``float | httpx.Timeout``): the shared ``BaseLLMHTTPHandler.completion``
path in ``main.py``, or the ``CodestralTextCompletion`` handler which uses
``AsyncHTTPHandler`` directly. Providers routed through third-party SDKs
that expect a plain float (for example ``vertex_ai``, ``anthropic``,
``azure_ai``, ``gemini``) are intentionally not listed, and neither are
OpenAI-SDK-based OpenAI-compatible providers (handled conservatively for
now, matching the pre-existing ``openai``/``azure`` coverage).
"""
supported_providers: Final = ["openai", "azure", "bedrock"]
supported_providers: Final = [
# SDK clients that accept httpx.Timeout natively
"openai",
"azure",
"bedrock",
# Providers dispatched to BaseLLMHTTPHandler.completion (shared httpx handler)
"a2a",
"anthropic_text",
"bedrock_mantle",
"bytez",
"cloudflare",
"cohere",
"cohere_chat",
"cometapi",
"compactifai",
"databricks",
"databricks_agent",
"datarobot",
"deepseek",
"edenai",
"fal_ai",
"fireworks_ai",
"gdc",
"gigachat",
"gradient_ai",
"groq",
"heroku",
"hosted_vllm",
"huggingface",
"langflow",
"langgraph",
"lemonade",
"minimax",
"mistral",
"nadir",
"oci",
"ollama",
"ollama_chat",
"openrouter",
"ovhcloud",
"ragflow",
"scaledown",
"snowflake",
"text-completion-codestral",
"together_ai",
"triton",
"vercel_ai_gateway",
"watsonx_text",
"xai",
]
if custom_llm_provider in supported_providers:
return True

View file

@ -143,6 +143,75 @@ def test_httpx_timeout_coerced_for_provider_without_httpx_timeout_support():
assert not isinstance(out, httpx.Timeout)
SHARED_HTTPX_HANDLER_PROVIDERS: Final = (
"a2a",
"anthropic_text",
"bedrock_mantle",
"bytez",
"cloudflare",
"cohere",
"cohere_chat",
"cometapi",
"compactifai",
"databricks",
"databricks_agent",
"datarobot",
"deepseek",
"edenai",
"fal_ai",
"fireworks_ai",
"gdc",
"gigachat",
"gradient_ai",
"groq",
"heroku",
"hosted_vllm",
"huggingface",
"langflow",
"langgraph",
"lemonade",
"minimax",
"mistral",
"nadir",
"oci",
"ollama",
"ollama_chat",
"openrouter",
"ovhcloud",
"ragflow",
"scaledown",
"snowflake",
"text-completion-codestral",
"together_ai",
"triton",
"vercel_ai_gateway",
"watsonx_text",
"xai",
)
@pytest.mark.parametrize("provider", SHARED_HTTPX_HANDLER_PROVIDERS)
def test_httpx_timeout_preserved_for_shared_httpx_handler_providers(provider: str) -> None:
"""Providers dispatched to the shared httpx handler accept httpx.Timeout (issue #47822)."""
assert supports_httpx_timeout(provider) is True
t: Final = httpx.Timeout(40.0, connect=5.0)
resolved: Final = CompletionTimeout.resolve(
t,
{},
provider,
global_timeout=None,
supports_httpx_timeout=supports_httpx_timeout,
stream_kind=StreamKind.NOT_STREAMED,
)
assert resolved is t
@pytest.mark.parametrize("provider", ("azure_ai", "vertex_ai", "anthropic", "gemini", "watsonx"))
def test_httpx_timeout_still_coerced_for_sdk_providers(provider: str) -> None:
"""Providers on third-party SDKs keep the float coercion."""
assert supports_httpx_timeout(provider) is False
def test_httpx_timeout_preserved_for_openai():
t = httpx.Timeout(40.0, connect=5.0)
out = CompletionTimeout.resolve(