dell_ai/auth.py (55 lines of code) (raw):
"""Authentication functionality for the Dell AI SDK."""
import os
from typing import Optional, Dict, Any
from huggingface_hub import login as hf_login, logout as hf_logout, whoami
from huggingface_hub.utils import get_token as hf_get_token
from huggingface_hub import auth_check as hf_auth_check
from huggingface_hub.utils import GatedRepoError, RepositoryNotFoundError
from dell_ai.exceptions import (
AuthenticationError,
GatedRepoAccessError,
ResourceNotFoundError,
)
def get_token() -> Optional[str]:
"""
Get the Hugging Face token from the environment or the Hugging Face token cache.
Returns:
The Hugging Face token if available, None otherwise
"""
# First try from environment variable
token = os.environ.get("HF_TOKEN")
if token:
return token
# Then try from the Hugging Face token cache using native method
return hf_get_token()
def login(token: str) -> None:
"""
Log in with a Hugging Face token.
Args:
token: The Hugging Face token to use for authentication
Raises:
AuthenticationError: If login fails or token is invalid
"""
try:
# Use native login method which also validates the token
hf_login(token=token)
except Exception as e:
raise AuthenticationError(f"Failed to login: {str(e)}")
def logout() -> None:
"""
Log out and remove the stored token.
"""
hf_logout()
def is_logged_in() -> bool:
"""
Check if the user is logged in.
Returns:
True if the user is logged in, False otherwise
"""
token = get_token()
return token is not None
def validate_token(token: str) -> bool:
"""
Validate a Hugging Face token by making a test API call.
Args:
token: The Hugging Face token to validate
Returns:
True if the token is valid, False otherwise
"""
try:
# Use whoami to validate the token
whoami(token=token)
return True
except Exception:
return False
def get_user_info(token: Optional[str] = None) -> Dict[str, Any]:
"""
Get information about the authenticated user.
Args:
token: The Hugging Face token to use. If not provided, will use the
token from get_token().
Returns:
A dictionary with user information
Raises:
AuthenticationError: If authentication fails or no token is available
"""
token = token or get_token()
if not token:
raise AuthenticationError("No authentication token found. Please login first.")
try:
return whoami(token=token)
except Exception as e:
raise AuthenticationError(f"Failed to get user information: {str(e)}")
def check_model_access(model_id: str, token: Optional[str] = None) -> bool:
"""
Check if the user has access to a specific model repository.
Args:
model_id: The model ID in the format "organization/model_name"
token: The Hugging Face token to use. If not provided, will use the
token from get_token().
Returns:
True if the user has access to the model repository
Raises:
AuthenticationError: If authentication fails or no token is available
GatedRepoAccessError: If the repository is gated and the user doesn't have access
ResourceNotFoundError: If the repository doesn't exist
"""
token = token or get_token()
if not token:
raise AuthenticationError("No authentication token found. Please login first.")
try:
# Use huggingface_hub's auth_check function to verify access
hf_auth_check(repo_id=model_id, token=token)
return True
except GatedRepoError as e:
# User doesn't have access to a gated repository
raise GatedRepoAccessError(model_id, original_error=e)
except RepositoryNotFoundError as e:
# Repository doesn't exist or is private and user doesn't have access
raise ResourceNotFoundError("model", model_id, original_error=e)
except Exception as e:
# Other errors (network issues, invalid token, etc.)
raise AuthenticationError(
f"Failed to check model access: {str(e)}", original_error=e
)