This commit is contained in:
devin-ai-integration[bot] 2026-08-27 17:49:08 -05:00 • committed by GitHub
commit 4381af7649
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 49 additions and 12 deletions

View file

@ -480,7 +480,7 @@ async def new_user(
- object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {"vector_stores": ["vector_store_1"], "mcp_servers": ["github"], "mcp_tool_permissions": {"github": ["list_issues"]}}. The MCP grants act as a ceiling on every key this user holds. IF null or {} then no object permission.
- prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.
- organizations: List[str] - List of organization id's the user is a member of
- budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the user. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
Returns:
- key: (str) The generated api key for the user
- expires: (datetime) Datetime object for when key expires.
@ -1582,7 +1582,7 @@ async def user_update(
- key_alias: Optional[str] - [NOT IMPLEMENTED].
- object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {"vector_stores": ["vector_store_1"], "mcp_servers": ["github"], "mcp_tool_permissions": {"github": ["list_issues"]}}. The MCP grants act as a ceiling on every key this user holds. IF null or {} then no object permission.
- prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.
- budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the user. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
"""
try:

View file

@ -1668,7 +1668,7 @@ async def generate_key_fn(
- allowed_vector_store_indexes: Optional[List[dict]] - List of allowed vector store indexes for the key. Example - [{"index_name": "my-index", "index_permissions": ["write", "read"]}]. If specified, the key will only be able to use these specific vector store indexes. Create index, using `/v1/indexes` endpoint.
- router_settings: Optional[UpdateRouterConfig] - key-specific router settings. Example - {"model_group_retry_policy": {"gpt-4": {"RateLimitErrorRetries": 5}}}. IF null or {} then no router settings.
- access_group_ids: Optional[List[str]] - List of access group IDs to associate with the key. Access groups define which models a key can access. Example - ["access_group_1", "access_group_2"].
- budget_limits: Optional[list] - List of concurrent budget windows for the key. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the key. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
Examples:
@ -2785,7 +2785,7 @@ async def update_key_fn(
- allowed_vector_store_indexes: Optional[List[dict]] - List of allowed vector store indexes for the key. Example - [{"index_name": "my-index", "index_permissions": ["write", "read"]}]. If specified, the key will only be able to use these specific vector store indexes. Create index, using `/v1/indexes` endpoint.
- router_settings: Optional[UpdateRouterConfig] - key-specific router settings. Example - {"model_group_retry_policy": {"gpt-4": {"RateLimitErrorRetries": 5}}}. IF null or {} then no router settings.
- access_group_ids: Optional[List[str]] - List of access group IDs to associate with the key. Access groups define which models a key can access. Example - ["access_group_1", "access_group_2"].
- budget_limits: Optional[list] - List of concurrent budget windows for the key. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the key. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
Example:
```bash

View file

@ -1239,7 +1239,7 @@ async def new_team(
- access_group_ids: Optional[List[str]] - List of access group IDs to associate with the team. Access groups define which models the team can access. Example - ["access_group_1", "access_group_2"].
- enforced_file_expires_after: Optional[dict] - Enforced file expiration policy for the team. Keys created under this team will inherit this policy for file uploads. Example - {"anchor": "created_at", "days": 30}.
- enforced_batch_output_expires_after: Optional[dict] - Enforced batch output file expiration policy for the team. Keys created under this team will inherit this policy for batch output files. Example - {"anchor": "created_at", "days": 30}.
- budget_limits: Optional[list] - List of concurrent budget windows for the team. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the team. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
- default_team_member_models: Optional[List[str]] - Default models assigned to new team members when they join this team. Must be a subset of the team's models.
Returns:
@ -1953,7 +1953,7 @@ async def update_team(
- access_group_ids: Optional[List[str]] - List of access group IDs to associate with the team. Access groups define which models the team can access. Example - ["access_group_1", "access_group_2"].
- enforced_file_expires_after: Optional[dict] - Enforced file expiration policy for the team. Keys created under this team will inherit this policy for file uploads. Example - {"anchor": "created_at", "days": 30}.
- enforced_batch_output_expires_after: Optional[dict] - Enforced batch output file expiration policy for the team. Keys created under this team will inherit this policy for batch output files. Example - {"anchor": "created_at", "days": 30}.
- budget_limits: Optional[list] - List of concurrent budget windows for the team. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
- budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the team. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
- default_team_member_models: Optional[List[str]] - Default models assigned to new team members when they join this team. Must be a subset of the team's models.
```

View file

@ -11,6 +11,43 @@ Related issue: https://github.com/BerriAI/litellm/issues/21305
import pytest
class TestBudgetLimitsOpenAPISchema:
def test_descriptions_use_budget_limit_entry_field_names(self):
from fastapi.openapi.utils import get_openapi
from litellm.proxy.management_endpoints.internal_user_endpoints import (
router as user_router,
)
from litellm.proxy.management_endpoints.key_management_endpoints import (
router as key_router,
)
from litellm.proxy.management_endpoints.team_endpoints import (
router as team_router,
)
schema = get_openapi(
title="LiteLLM",
version="test",
routes=[*key_router.routes, *user_router.routes, *team_router.routes],
)
for path in (
"/key/generate",
"/key/update",
"/user/new",
"/user/update",
"/team/new",
"/team/update",
):
description = schema["paths"][path]["post"]["description"]
budget_limits_line = next(line for line in description.splitlines() if "budget_limits:" in line)
assert "max_budget and budget_duration" in budget_limits_line
assert '{"budget_duration": "24h", "max_budget": 10.0}' in budget_limits_line
assert '"budget_limit"' not in budget_limits_line
assert '"time_period"' not in budget_limits_line
class TestSpendCalculateOpenAPISchema:
"""Test /spend/calculate response schema is valid OpenAPI 3.x."""

View file

@ -7374,7 +7374,7 @@ export interface paths {
* - allowed_vector_store_indexes: Optional[List[dict]] - List of allowed vector store indexes for the key. Example - [{"index_name": "my-index", "index_permissions": ["write", "read"]}]. If specified, the key will only be able to use these specific vector store indexes. Create index, using `/v1/indexes` endpoint.
* - router_settings: Optional[UpdateRouterConfig] - key-specific router settings. Example - {"model_group_retry_policy": {"gpt-4": {"RateLimitErrorRetries": 5}}}. IF null or {} then no router settings.
* - access_group_ids: Optional[List[str]] - List of access group IDs to associate with the key. Access groups define which models a key can access. Example - ["access_group_1", "access_group_2"].
* - budget_limits: Optional[list] - List of concurrent budget windows for the key. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the key. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
*
* Examples:
*
@ -7819,7 +7819,7 @@ export interface paths {
* - allowed_vector_store_indexes: Optional[List[dict]] - List of allowed vector store indexes for the key. Example - [{"index_name": "my-index", "index_permissions": ["write", "read"]}]. If specified, the key will only be able to use these specific vector store indexes. Create index, using `/v1/indexes` endpoint.
* - router_settings: Optional[UpdateRouterConfig] - key-specific router settings. Example - {"model_group_retry_policy": {"gpt-4": {"RateLimitErrorRetries": 5}}}. IF null or {} then no router settings.
* - access_group_ids: Optional[List[str]] - List of access group IDs to associate with the key. Access groups define which models a key can access. Example - ["access_group_1", "access_group_2"].
* - budget_limits: Optional[list] - List of concurrent budget windows for the key. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the key. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
*
* Example:
* ```bash
@ -14986,7 +14986,7 @@ export interface paths {
* - access_group_ids: Optional[List[str]] - List of access group IDs to associate with the team. Access groups define which models the team can access. Example - ["access_group_1", "access_group_2"].
* - enforced_file_expires_after: Optional[dict] - Enforced file expiration policy for the team. Keys created under this team will inherit this policy for file uploads. Example - {"anchor": "created_at", "days": 30}.
* - enforced_batch_output_expires_after: Optional[dict] - Enforced batch output file expiration policy for the team. Keys created under this team will inherit this policy for batch output files. Example - {"anchor": "created_at", "days": 30}.
* - budget_limits: Optional[list] - List of concurrent budget windows for the team. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the team. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
* - default_team_member_models: Optional[List[str]] - Default models assigned to new team members when they join this team. Must be a subset of the team's models.
*
* Returns:
@ -15193,7 +15193,7 @@ export interface paths {
* - access_group_ids: Optional[List[str]] - List of access group IDs to associate with the team. Access groups define which models the team can access. Example - ["access_group_1", "access_group_2"].
* - enforced_file_expires_after: Optional[dict] - Enforced file expiration policy for the team. Keys created under this team will inherit this policy for file uploads. Example - {"anchor": "created_at", "days": 30}.
* - enforced_batch_output_expires_after: Optional[dict] - Enforced batch output file expiration policy for the team. Keys created under this team will inherit this policy for batch output files. Example - {"anchor": "created_at", "days": 30}.
* - budget_limits: Optional[list] - List of concurrent budget windows for the team. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the team. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
* - default_team_member_models: Optional[List[str]] - Default models assigned to new team members when they join this team. Must be a subset of the team's models.
*
* ```
@ -16233,7 +16233,7 @@ export interface paths {
* - object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {"vector_stores": ["vector_store_1"], "mcp_servers": ["github"], "mcp_tool_permissions": {"github": ["list_issues"]}}. The MCP grants act as a ceiling on every key this user holds. IF null or {} then no object permission.
* - prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.
* - organizations: List[str] - List of organization id's the user is a member of
* - budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the user. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
* Returns:
* - key: (str) The generated api key for the user
* - expires: (datetime) Datetime object for when key expires.
@ -16337,7 +16337,7 @@ export interface paths {
* - key_alias: Optional[str] - [NOT IMPLEMENTED].
* - object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {"vector_stores": ["vector_store_1"], "mcp_servers": ["github"], "mcp_tool_permissions": {"github": ["list_issues"]}}. The MCP grants act as a ceiling on every key this user holds. IF null or {} then no object permission.
* - prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.
* - budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{"budget_limit": 10.0, "time_period": "1d"}, {"budget_limit": 50.0, "time_period": "7d"}].
* - budget_limits: Optional[List[BudgetLimitEntry]] - List of concurrent budget windows for the user. Each window specifies max_budget and budget_duration. Example - [{"budget_duration": "24h", "max_budget": 10.0}, {"budget_duration": "30d", "max_budget": 100.0}].
*/
post: operations["user_update_user_update_post"];
delete?: never;