-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into litellm_bedrock_document_processing_improvem…
…ents
- Loading branch information
Showing
17 changed files
with
754 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
import Image from '@theme/IdealImage'; | ||
import Tabs from '@theme/Tabs'; | ||
import TabItem from '@theme/TabItem'; | ||
|
||
# Control Model Access with SSO (Azure AD/Keycloak/etc.) | ||
|
||
:::info | ||
|
||
✨ JWT Auth is on LiteLLM Enterprise | ||
|
||
[Enterprise Pricing](https://www.litellm.ai/#pricing) | ||
|
||
[Get free 7-day trial key](https://www.litellm.ai/#trial) | ||
|
||
::: | ||
|
||
<Image img={require('../../img/control_model_access_jwt.png')} style={{ width: '100%', maxWidth: '4000px' }} /> | ||
|
||
## Example Token | ||
|
||
<Tabs> | ||
<TabItem value="Azure AD"> | ||
|
||
```bash | ||
{ | ||
"sub": "1234567890", | ||
"name": "John Doe", | ||
"email": "[email protected]", | ||
"roles": ["basic_user"] # 👈 ROLE | ||
} | ||
``` | ||
</TabItem> | ||
<TabItem value="Keycloak"> | ||
|
||
```bash | ||
{ | ||
"sub": "1234567890", | ||
"name": "John Doe", | ||
"email": "[email protected]", | ||
"resource_access": { | ||
"litellm-test-client-id": { | ||
"roles": ["basic_user"] # 👈 ROLE | ||
} | ||
} | ||
} | ||
``` | ||
</TabItem> | ||
</Tabs> | ||
|
||
## Proxy Configuration | ||
|
||
<Tabs> | ||
<TabItem value="Azure AD"> | ||
|
||
```yaml | ||
general_settings: | ||
enable_jwt_auth: True | ||
litellm_jwtauth: | ||
user_roles_jwt_field: "roles" # the field in the JWT that contains the roles | ||
user_allowed_roles: ["basic_user"] # roles that map to an 'internal_user' role on LiteLLM | ||
enforce_rbac: true # if true, will check if the user has the correct role to access the model | ||
|
||
role_permissions: # control what models are allowed for each role | ||
- role: internal_user | ||
models: ["anthropic-claude"] | ||
|
||
model_list: | ||
- model: anthropic-claude | ||
litellm_params: | ||
model: claude-3-5-haiku-20241022 | ||
- model: openai-gpt-4o | ||
litellm_params: | ||
model: gpt-4o | ||
``` | ||
</TabItem> | ||
<TabItem value="Keycloak"> | ||
```yaml | ||
general_settings: | ||
enable_jwt_auth: True | ||
litellm_jwtauth: | ||
user_roles_jwt_field: "resource_access.litellm-test-client-id.roles" # the field in the JWT that contains the roles | ||
user_allowed_roles: ["basic_user"] # roles that map to an 'internal_user' role on LiteLLM | ||
enforce_rbac: true # if true, will check if the user has the correct role to access the model | ||
|
||
role_permissions: # control what models are allowed for each role | ||
- role: internal_user | ||
models: ["anthropic-claude"] | ||
|
||
model_list: | ||
- model: anthropic-claude | ||
litellm_params: | ||
model: claude-3-5-haiku-20241022 | ||
- model: openai-gpt-4o | ||
litellm_params: | ||
model: gpt-4o | ||
``` | ||
</TabItem> | ||
</Tabs> | ||
## How it works | ||
1. Specify JWT_PUBLIC_KEY_URL - This is the public keys endpoint of your OpenID provider. For Azure AD it's `https://login.microsoftonline.com/{tenant_id}/discovery/v2.0/keys`. For Keycloak it's `{keycloak_base_url}/realms/{your-realm}/protocol/openid-connect/certs`. | ||
|
||
1. Map JWT roles to LiteLLM roles - Done via `user_roles_jwt_field` and `user_allowed_roles` | ||
- Currently just `internal_user` is supported for role mapping. | ||
2. Specify model access: | ||
- `role_permissions`: control what models are allowed for each role. | ||
- `role`: the LiteLLM role to control access for. Allowed roles = ["internal_user", "proxy_admin", "team"] | ||
- `models`: list of models that the role is allowed to access. | ||
- `model_list`: parent list of models on the proxy. [Learn more](./configs.md#llm-configs-model_list) | ||
|
||
3. Model Checks: The proxy will run validation checks on the received JWT. [Code](https://github.com/BerriAI/litellm/blob/3a4f5b23b5025b87b6d969f2485cc9bc741f9ba6/litellm/proxy/auth/user_api_key_auth.py#L284) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
""" | ||
This file contains the logic for dot notation indexing. | ||
Used by JWT Auth to get the user role from the token. | ||
""" | ||
|
||
from typing import Any, Dict, Optional, TypeVar | ||
|
||
T = TypeVar("T") | ||
|
||
|
||
def get_nested_value( | ||
data: Dict[str, Any], key_path: str, default: Optional[T] = None | ||
) -> Optional[T]: | ||
""" | ||
Retrieves a value from a nested dictionary using dot notation. | ||
Args: | ||
data: The dictionary to search in | ||
key_path: The path to the value using dot notation (e.g., "a.b.c") | ||
default: The default value to return if the path is not found | ||
Returns: | ||
The value at the specified path, or the default value if not found | ||
Example: | ||
>>> data = {"a": {"b": {"c": "value"}}} | ||
>>> get_nested_value(data, "a.b.c") | ||
'value' | ||
>>> get_nested_value(data, "a.b.d", "default") | ||
'default' | ||
""" | ||
if not key_path: | ||
return default | ||
|
||
# Remove metadata. prefix if it exists | ||
key_path = ( | ||
key_path.replace("metadata.", "", 1) | ||
if key_path.startswith("metadata.") | ||
else key_path | ||
) | ||
|
||
# Split the key path into parts | ||
parts = key_path.split(".") | ||
|
||
# Traverse through the dictionary | ||
current: Any = data | ||
for part in parts: | ||
try: | ||
current = current[part] | ||
except (KeyError, TypeError): | ||
return default | ||
|
||
# If default is None, we can return any type | ||
if default is None: | ||
return current | ||
|
||
# Otherwise, ensure the type matches the default | ||
return current if isinstance(current, type(default)) else default |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,16 @@ | ||
model_list: | ||
- model_name: gpt-3.5-turbo-end-user-test | ||
litellm_params: | ||
model: gpt-3.5-turbo | ||
region_name: "eu" | ||
model_info: | ||
id: "1" | ||
- model_name: gpt-3.5-turbo | ||
litellm_params: | ||
model: gpt-3.5-turbo | ||
timeout: 2 | ||
num_retries: 0 | ||
- model_name: anthropic-claude | ||
litellm_params: | ||
model: anthropic.claude-3-sonnet-20240229-v1:0 | ||
|
||
litellm_settings: | ||
callbacks: ["langsmith"] | ||
model: claude-3-5-haiku-20241022 | ||
- model_name: groq/* | ||
litellm_params: | ||
model: groq/* | ||
api_key: os.environ/GROQ_API_KEY | ||
mock_response: Hi! | ||
- model_name: deepseek/* | ||
litellm_params: | ||
model: deepseek/* | ||
api_key: os.environ/DEEPSEEK_API_KEY |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.