proportio / config.py
grasant's picture
Upload 15 files
a0debed verified
"""
Configuration management using Pydantic Settings.
Handles environment variables with validation and defaults.
"""
import os
from typing import Optional
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Application settings with environment variable support."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore"
)
# Server configuration
server_name: str = Field(
default="0.0.0.0",
description="Server bind address"
)
server_port: int = Field(
default=7860,
ge=1024,
le=65535,
description="Server port (1024-65535)"
)
# Security configuration
mcp_token: Optional[str] = Field(
default=None,
description="MCP authentication token (required for production)"
)
# Request limits
max_request_size: int = Field(
default=65536, # 64KB
ge=1024,
le=1048576, # 1MB max
description="Maximum request body size in bytes"
)
# Development settings
debug: bool = Field(
default=False,
description="Enable debug mode"
)
reload: bool = Field(
default=False,
description="Enable hot reload in development"
)
# Logging configuration
log_level: str = Field(
default="INFO",
description="Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)"
)
def is_production(self) -> bool:
"""Check if running in production mode."""
return not self.debug and self.mcp_token is not None
def validate_production_settings(self) -> None:
"""Validate settings for production deployment."""
if self.is_production():
assert self.mcp_token, "MCP_TOKEN environment variable is required for production deployment"
# Global settings instance
settings = Settings()
def get_settings() -> Settings:
"""Get the current settings instance."""
return settings
def setup_logging() -> None:
"""Configure logging based on settings."""
import logging
logging.basicConfig(
level=getattr(logging, settings.log_level.upper()),
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# Set Gradio logging level
if not settings.debug:
logging.getLogger("gradio").setLevel(logging.WARNING)
logging.getLogger("uvicorn").setLevel(logging.WARNING)
# Environment detection helpers
def is_huggingface_space() -> bool:
"""Check if running on Hugging Face Spaces."""
return "SPACE_ID" in os.environ
def is_docker() -> bool:
"""Check if running in Docker container."""
return os.path.exists("/.dockerenv") or "DOCKER_CONTAINER" in os.environ
def get_deployment_info() -> dict[str, str]:
"""Get deployment environment information."""
info = {
"environment": "unknown",
"platform": "local"
}
if is_huggingface_space():
info["platform"] = "huggingface_spaces"
info["environment"] = "production"
elif is_docker():
info["platform"] = "docker"
info["environment"] = "production" if settings.is_production() else "development"
else:
info["platform"] = "local"
info["environment"] = "development"
return info