Coverage for .venv/lib/python3.13/site-packages/litellm/proxy/client/cli/commands/users.py: 0%

64 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 12:01 +0000

1from typing import Final 

2 

3import click 

4import rich 

5 

6from ... import UsersManagementClient 

7from ._cli_context import cli_context_values 

8 

9 

10@click.group() 

11def users(): 

12 """Manage users on your LiteLLM proxy server""" 

13 

14 

15@users.command("list") 

16@click.pass_context 

17def list_users(ctx: click.Context): 

18 """List all users""" 

19 context: Final = cli_context_values(ctx) 

20 client: Final = UsersManagementClient(base_url=context["base_url"], api_key=context["api_key"]) 

21 users = client.list_users() 

22 if isinstance(users, dict) and "users" in users: 

23 users = users["users"] 

24 if not users: 

25 click.echo("No users found.") 

26 return 

27 from rich.console import Console 

28 from rich.table import Table 

29 

30 table: Final = Table(title="Users") 

31 table.add_column("User ID", style="cyan") 

32 table.add_column("Email", style="green") 

33 table.add_column("Role", style="magenta") 

34 table.add_column("Teams", style="yellow") 

35 for user in users: 

36 table.add_row( 

37 str(user.get("user_id", "")), 

38 str(user.get("user_email", "")), 

39 str(user.get("user_role", "")), 

40 ", ".join(user.get("teams", []) or []), 

41 ) 

42 console: Final = Console() 

43 console.print(table) 

44 

45 

46@users.command("get") 

47@click.option("--id", "user_id", help="ID of the user to retrieve") 

48@click.pass_context 

49def get_user(ctx: click.Context, user_id: str): 

50 """Get information about a specific user""" 

51 context: Final = cli_context_values(ctx) 

52 client: Final = UsersManagementClient(base_url=context["base_url"], api_key=context["api_key"]) 

53 result: Final = client.get_user(user_id=user_id) 

54 rich.print_json(data=result) 

55 

56 

57@users.command("create") 

58@click.option("--email", required=True, help="User email") 

59@click.option("--role", default="internal_user", help="User role") 

60@click.option("--alias", default=None, help="User alias") 

61@click.option("--team", multiple=True, help="Team IDs (can specify multiple)") 

62@click.option("--max-budget", type=float, default=None, help="Max budget for user") 

63@click.pass_context 

64def create_user(ctx: click.Context, email, role, alias, team, max_budget): 

65 """Create a new user""" 

66 context: Final = cli_context_values(ctx) 

67 client: Final = UsersManagementClient(base_url=context["base_url"], api_key=context["api_key"]) 

68 user_data: Final = { 

69 "user_email": email, 

70 "user_role": role, 

71 } 

72 if alias: 

73 user_data["user_alias"] = alias 

74 if team: 

75 user_data["teams"] = list(team) 

76 if max_budget is not None: 

77 user_data["max_budget"] = max_budget 

78 result: Final = client.create_user(user_data) 

79 rich.print_json(data=result) 

80 

81 

82@users.command("delete") 

83@click.argument("user_ids", nargs=-1) 

84@click.pass_context 

85def delete_user(ctx: click.Context, user_ids): 

86 """Delete one or more users by user_id""" 

87 context: Final = cli_context_values(ctx) 

88 client: Final = UsersManagementClient(base_url=context["base_url"], api_key=context["api_key"]) 

89 result: Final = client.delete_user(list(user_ids)) 

90 rich.print_json(data=result)