mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-19 00:01:29 +00:00
The keys, credentials, models, model groups, and chat clients still sent requests with no timeout, so a proxy that accepts the connection and never answers pinned the caller forever. They now default to the same 30 seconds as their teams and users siblings, with chat on the OpenAI SDK's 600 second default, and Client wires its timeout through to all of them. S113 cannot see Session methods, so each client gets a hanging-server regression test instead.
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
from typing import Any, Final
|
|
|
|
import requests
|
|
|
|
from .exceptions import UnauthorizedError
|
|
|
|
|
|
class ModelGroupsManagementClient:
|
|
def __init__(self, base_url: str, api_key: str | None = None, timeout: int = 30):
|
|
"""
|
|
Initialize the ModelGroupsManagementClient.
|
|
|
|
Args:
|
|
base_url (str): The base URL of the LiteLLM proxy server (e.g., "http://localhost:8000")
|
|
api_key (Optional[str]): API key for authentication. If provided, it will be sent as a Bearer token.
|
|
timeout (int): Request timeout in seconds (default: 30)
|
|
"""
|
|
self._base_url = base_url.rstrip("/") # Remove trailing slash if present
|
|
self._api_key = api_key
|
|
self._timeout = timeout
|
|
|
|
def _get_headers(self) -> dict[str, str]:
|
|
"""
|
|
Get the headers for API requests, including authorization if api_key is set.
|
|
|
|
Returns:
|
|
Dict[str, str]: Headers to use for API requests
|
|
"""
|
|
headers: Final = {}
|
|
if self._api_key:
|
|
headers["Authorization"] = f"Bearer {self._api_key}"
|
|
return headers
|
|
|
|
def info(self, return_request: bool = False) -> list[dict[str, Any]] | requests.Request:
|
|
"""
|
|
Get detailed information about all model groups from the server.
|
|
|
|
Args:
|
|
return_request (bool): If True, returns the prepared request object instead of executing it
|
|
|
|
Returns:
|
|
Union[List[Dict[str, Any]], requests.Request]: Either a list of model group information dictionaries
|
|
or a prepared request object if return_request is True
|
|
|
|
Raises:
|
|
UnauthorizedError: If the request fails with a 401 status code
|
|
requests.exceptions.RequestException: If the request fails with any other error
|
|
"""
|
|
url: Final = f"{self._base_url}/model_group/info"
|
|
request: Final = requests.Request("GET", url, headers=self._get_headers())
|
|
|
|
if return_request:
|
|
return request
|
|
|
|
# Prepare and send the request
|
|
session: Final = requests.Session()
|
|
try:
|
|
response: Final = session.send(request.prepare(), timeout=self._timeout)
|
|
response.raise_for_status()
|
|
return response.json()["data"]
|
|
except requests.exceptions.HTTPError as e:
|
|
if e.response.status_code == 401:
|
|
raise UnauthorizedError(e)
|
|
raise
|