Coverage for .venv/lib/python3.13/site-packages/litellm/proxy/client/users.py: 0%
55 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
1from collections.abc import Mapping
2from typing import Any, Final
4import requests
6from .exceptions import NotFoundError, UnauthorizedError
9class UsersManagementClient:
10 def __init__(self, base_url: str, api_key: str | None = None, timeout: int = 30):
11 self.base_url = base_url.rstrip("/")
12 self.api_key = api_key
13 self.timeout = timeout
15 def _get_headers(self) -> dict[str, str]:
16 headers: Final = {"Content-Type": "application/json"}
17 if self.api_key:
18 headers["Authorization"] = f"Bearer {self.api_key}"
19 return headers
21 def list_users(self, params: dict[str, Any] | None = None) -> list[dict[str, Any]]:
22 """List users (GET /user/list)"""
23 url: Final = f"{self.base_url}/user/list"
24 response: Final = requests.get(url, headers=self._get_headers(), params=params, timeout=self.timeout)
25 if response.status_code == 401:
26 raise UnauthorizedError(response.text)
27 response.raise_for_status()
28 return response.json().get("users", response.json())
30 def get_user(self, user_id: str | None = None) -> dict[str, Any]:
31 """Get user info (GET /user/info)"""
32 url: Final = f"{self.base_url}/user/info"
33 params: Final = {"user_id": user_id} if user_id else {}
34 response: Final = requests.get(url, headers=self._get_headers(), params=params, timeout=self.timeout)
35 if response.status_code == 401:
36 raise UnauthorizedError(response.text)
37 if response.status_code == 404:
38 raise NotFoundError(response.text)
39 response.raise_for_status()
40 return response.json()
42 def get_user_v2(self, user_id: str | None = None) -> dict[str, Any]:
43 """Get user info v2 - lightweight, returns only user object (GET /v2/user/info)"""
44 url: Final = f"{self.base_url}/v2/user/info"
45 params: Final = {"user_id": user_id} if user_id else {}
46 response: Final = requests.get(url, headers=self._get_headers(), params=params, timeout=self.timeout)
47 if response.status_code == 401:
48 raise UnauthorizedError(response.text)
49 if response.status_code == 404:
50 raise NotFoundError(response.text)
51 response.raise_for_status()
52 return response.json()
54 def create_user(self, user_data: Mapping[str, object]) -> dict[str, Any]:
55 """Create a new user (POST /user/new)"""
56 url: Final = f"{self.base_url}/user/new"
57 response: Final = requests.post(url, headers=self._get_headers(), json=user_data, timeout=self.timeout)
58 if response.status_code == 401:
59 raise UnauthorizedError(response.text)
60 response.raise_for_status()
61 return response.json()
63 def delete_user(self, user_ids: list[str]) -> dict[str, Any]:
64 """Delete users (POST /user/delete)"""
65 url: Final = f"{self.base_url}/user/delete"
66 response: Final = requests.post(
67 url, headers=self._get_headers(), json={"user_ids": user_ids}, timeout=self.timeout
68 )
69 if response.status_code == 401:
70 raise UnauthorizedError(response.text)
71 response.raise_for_status()
72 return response.json()