Spaces:
Running
Running
""" | |
GlucoBuddy Configuration File | |
This file contains all configuration settings for the GlucoBuddy application, | |
including Dexcom API credentials, Claude MCP settings, and application preferences. | |
IMPORTANT: | |
- Replace placeholder values with your actual credentials | |
- Never commit this file to version control with real credentials | |
- Consider using environment variables for sensitive data in production | |
""" | |
import os | |
from typing import Dict, Any | |
# ============================================================================= | |
# DEXCOM API CONFIGURATION | |
# ============================================================================= | |
# Dexcom Developer Portal Credentials | |
# Get these from: https://developer.dexcom.com/ | |
DEXCOM_CONFIG = { | |
# REQUIRED: Replace with your actual Dexcom Developer Portal credentials | |
"CLIENT_ID": os.getenv("DEXCOM_CLIENT_ID", "your_client_id_here"), | |
"CLIENT_SECRET": os.getenv("DEXCOM_CLIENT_SECRET", "your_client_secret_here"), | |
# OAuth Redirect URI - must match exactly what you registered in Developer Portal | |
"REDIRECT_URI": "http://localhost:7860/callback", | |
# API Endpoints | |
"SANDBOX_BASE_URL": "https://sandbox-api.dexcom.com", | |
"PRODUCTION_BASE_URL": "https://api.dexcom.com", | |
# Environment setting - set to False for production | |
"USE_SANDBOX": True, | |
# OAuth Scopes | |
"SCOPES": ["offline_access"], | |
# Token refresh settings | |
"TOKEN_REFRESH_BUFFER_MINUTES": 5, # Refresh token 5 minutes before expiration | |
"MAX_RETRY_ATTEMPTS": 3, | |
} | |
# ============================================================================= | |
# CLAUDE MCP CONFIGURATION | |
# ============================================================================= | |
# Claude API Configuration | |
# Get your API key from: https://console.anthropic.com/ | |
CLAUDE_CONFIG = { | |
# REQUIRED: Replace with your actual Anthropic API key | |
"API_KEY": os.getenv("ANTHROPIC_API_KEY", "your_anthropic_api_key_here"), | |
# Model selection | |
"MODEL": "claude-3-5-sonnet-20241022", # Updated to latest model | |
# Generation parameters | |
"MAX_TOKENS": 4000, | |
"TEMPERATURE": 0.3, # Lower for more consistent medical advice | |
# Timeout settings | |
"REQUEST_TIMEOUT": 60, # seconds | |
"MAX_RETRIES": 2, | |
# Content filtering | |
"ENABLE_SAFETY_FILTERS": True, | |
} | |
# ============================================================================= | |
# APPLICATION SETTINGS | |
# ============================================================================= | |
# Logging Configuration | |
LOGGING_CONFIG = { | |
"LEVEL": "INFO", # DEBUG, INFO, WARNING, ERROR, CRITICAL | |
"FORMAT": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", | |
"LOG_FILE": "glucobuddy.log", | |
"MAX_LOG_SIZE_MB": 10, | |
"BACKUP_COUNT": 3, | |
"ENABLE_CONSOLE_LOGGING": True, | |
"ENABLE_FILE_LOGGING": True, | |
} | |
# Data Processing Settings | |
DATA_CONFIG = { | |
# Default data range for analysis | |
"DEFAULT_DAYS_BACK": 7, | |
"MAX_DAYS_BACK": 30, | |
# Glucose thresholds (mg/dL) | |
"TARGET_RANGE_LOW": 70, | |
"TARGET_RANGE_HIGH": 180, | |
"HYPOGLYCEMIA_THRESHOLD": 70, | |
"HYPERGLYCEMIA_THRESHOLD": 250, | |
# Time in Range targets (percentages) | |
"EXCELLENT_TIR_THRESHOLD": 80, | |
"GOOD_TIR_THRESHOLD": 70, | |
"ACCEPTABLE_TIR_THRESHOLD": 50, | |
# Data quality settings | |
"MIN_READINGS_FOR_ANALYSIS": 20, | |
"MAX_GAP_HOURS": 3, # Maximum gap between readings for continuous analysis | |
# Pattern detection settings | |
"PATTERN_DETECTION_MIN_DAYS": 3, | |
"SIGNIFICANT_TREND_THRESHOLD": 2.0, # mg/dL per reading | |
} | |
# ============================================================================= | |
# DEMO USER CONFIGURATION | |
# ============================================================================= | |
# Demo mode settings - for development and testing | |
DEMO_CONFIG = { | |
"ENABLE_DEMO_MODE": True, | |
"DEFAULT_DEMO_USER": "sarah_g7", # Which demo user to use by default | |
"GENERATE_SYNTHETIC_DATA": True, # Generate realistic demo data when API fails | |
"DEMO_DATA_DAYS": 14, # Days of demo data to generate | |
"DEMO_DATA_NOISE_FACTOR": 0.1, # Randomness in demo data (0.0 to 1.0) | |
} | |
# ============================================================================= | |
# SECURITY SETTINGS | |
# ============================================================================= | |
SECURITY_CONFIG = { | |
# Data encryption (for local storage) | |
"ENCRYPT_LOCAL_DATA": True, | |
"ENCRYPTION_KEY": os.getenv("GLUCOBUDDY_ENCRYPTION_KEY", None), | |
# Session management | |
"SESSION_TIMEOUT_MINUTES": 30, | |
"REQUIRE_REAUTHENTICATION": True, | |
# Data retention | |
"MAX_LOCAL_DATA_DAYS": 90, | |
"AUTO_CLEANUP_OLD_DATA": True, | |
# Privacy settings | |
"ANONYMIZE_LOGS": True, | |
"ALLOW_TELEMETRY": False, | |
} | |
# ============================================================================= | |
# UI/UX CONFIGURATION | |
# ============================================================================= | |
UI_CONFIG = { | |
# Display preferences | |
"DEFAULT_GLUCOSE_UNIT": "mg/dL", # or "mmol/L" | |
"DATE_FORMAT": "%Y-%m-%d %H:%M", | |
"TIMEZONE": "local", # or specific timezone like "US/Eastern" | |
# Chart settings | |
"CHART_HEIGHT": 400, | |
"CHART_WIDTH": 800, | |
"SHOW_TARGET_RANGE": True, | |
"ENABLE_INTERACTIVE_CHARTS": True, | |
# Notification settings | |
"ENABLE_DESKTOP_NOTIFICATIONS": True, | |
"ALERT_SOUND": True, | |
"NOTIFICATION_TIMEOUT": 5, # seconds | |
} | |
# ============================================================================= | |
# INTEGRATION SETTINGS | |
# ============================================================================= | |
# External service integrations | |
INTEGRATION_CONFIG = { | |
# Health app integrations | |
"ENABLE_APPLE_HEALTH": False, | |
"ENABLE_GOOGLE_FIT": False, | |
# Export formats | |
"SUPPORTED_EXPORT_FORMATS": ["CSV", "JSON", "PDF"], | |
"DEFAULT_EXPORT_FORMAT": "CSV", | |
# Webhook settings (for advanced users) | |
"WEBHOOK_URL": None, | |
"WEBHOOK_SECRET": os.getenv("GLUCOBUDDY_WEBHOOK_SECRET", None), | |
"ENABLE_WEBHOOKS": False, | |
} | |
# ============================================================================= | |
# DEVELOPMENT SETTINGS | |
# ============================================================================= | |
# Development and debugging options | |
DEV_CONFIG = { | |
"DEBUG_MODE": False, | |
"ENABLE_API_MOCKING": False, # Mock API calls for development | |
"VERBOSE_LOGGING": False, | |
"SAVE_RAW_API_RESPONSES": False, | |
"ENABLE_PERFORMANCE_MONITORING": False, | |
# Testing settings | |
"RUN_TESTS_ON_STARTUP": False, | |
"TEST_DATA_PATH": "test_data/", | |
} | |
# ============================================================================= | |
# ENVIRONMENT-SPECIFIC OVERRIDES | |
# ============================================================================= | |
# Override settings based on environment | |
ENVIRONMENT = os.getenv("GLUCOBUDDY_ENV", "development").lower() | |
if ENVIRONMENT == "production": | |
# Production overrides | |
DEXCOM_CONFIG["USE_SANDBOX"] = False | |
LOGGING_CONFIG["LEVEL"] = "WARNING" | |
DEMO_CONFIG["ENABLE_DEMO_MODE"] = False | |
DEV_CONFIG["DEBUG_MODE"] = False | |
SECURITY_CONFIG["REQUIRE_REAUTHENTICATION"] = True | |
elif ENVIRONMENT == "testing": | |
# Testing overrides | |
LOGGING_CONFIG["LEVEL"] = "DEBUG" | |
DEV_CONFIG["ENABLE_API_MOCKING"] = True | |
DEV_CONFIG["RUN_TESTS_ON_STARTUP"] = True | |
DEMO_CONFIG["ENABLE_DEMO_MODE"] = True | |
# ============================================================================= | |
# CONFIGURATION VALIDATION | |
# ============================================================================= | |
def validate_config() -> Dict[str, Any]: | |
""" | |
Validate configuration settings and return validation results. | |
Returns a dictionary with validation status and any errors. | |
""" | |
validation_results = { | |
"valid": True, | |
"errors": [], | |
"warnings": [] | |
} | |
# Check required Dexcom credentials | |
if DEXCOM_CONFIG["CLIENT_ID"] == "your_client_id_here": | |
validation_results["errors"].append("Dexcom CLIENT_ID not configured") | |
validation_results["valid"] = False | |
if DEXCOM_CONFIG["CLIENT_SECRET"] == "your_client_secret_here": | |
validation_results["errors"].append("Dexcom CLIENT_SECRET not configured") | |
validation_results["valid"] = False | |
# Check Claude API key | |
if CLAUDE_CONFIG["API_KEY"] == "your_anthropic_api_key_here": | |
validation_results["warnings"].append("Claude API key not configured - AI insights will be limited") | |
# Validate glucose thresholds | |
if DATA_CONFIG["TARGET_RANGE_LOW"] >= DATA_CONFIG["TARGET_RANGE_HIGH"]: | |
validation_results["errors"].append("Invalid glucose target range") | |
validation_results["valid"] = False | |
# Check encryption key for production | |
if ENVIRONMENT == "production" and SECURITY_CONFIG["ENCRYPT_LOCAL_DATA"]: | |
if not SECURITY_CONFIG["ENCRYPTION_KEY"]: | |
validation_results["warnings"].append("No encryption key set for production environment") | |
return validation_results | |
def get_active_config() -> Dict[str, Any]: | |
""" | |
Get the complete active configuration as a dictionary. | |
Useful for debugging and configuration inspection. | |
""" | |
return { | |
"dexcom": DEXCOM_CONFIG, | |
"claude": CLAUDE_CONFIG, | |
"logging": LOGGING_CONFIG, | |
"data": DATA_CONFIG, | |
"demo": DEMO_CONFIG, | |
"security": SECURITY_CONFIG, | |
"ui": UI_CONFIG, | |
"integration": INTEGRATION_CONFIG, | |
"development": DEV_CONFIG, | |
"environment": ENVIRONMENT | |
} | |
# ============================================================================= | |
# CONFIGURATION HELPERS | |
# ============================================================================= | |
def get_dexcom_base_url() -> str: | |
"""Get the appropriate Dexcom API base URL based on environment.""" | |
return (DEXCOM_CONFIG["SANDBOX_BASE_URL"] if DEXCOM_CONFIG["USE_SANDBOX"] | |
else DEXCOM_CONFIG["PRODUCTION_BASE_URL"]) | |
def is_demo_mode_enabled() -> bool: | |
"""Check if demo mode is enabled.""" | |
return DEMO_CONFIG["ENABLE_DEMO_MODE"] | |
def get_glucose_unit() -> str: | |
"""Get the configured glucose unit.""" | |
return UI_CONFIG["DEFAULT_GLUCOSE_UNIT"] | |
# ============================================================================= | |
# STARTUP CONFIGURATION CHECK | |
# ============================================================================= | |
if __name__ == "__main__": | |
print("GlucoBuddy Configuration Validation") | |
print("=" * 40) | |
results = validate_config() | |
if results["valid"]: | |
print("✅ Configuration is valid!") | |
else: | |
print("❌ Configuration has errors:") | |
for error in results["errors"]: | |
print(f" - {error}") | |
if results["warnings"]: | |
print("\n⚠️ Warnings:") | |
for warning in results["warnings"]: | |
print(f" - {warning}") | |
print(f"\nEnvironment: {ENVIRONMENT}") | |
print(f"Demo Mode: {'Enabled' if is_demo_mode_enabled() else 'Disabled'}") | |
print(f"Sandbox Mode: {'Enabled' if DEXCOM_CONFIG['USE_SANDBOX'] else 'Disabled'}") | |
print(f"Claude Integration: {'Enabled' if CLAUDE_CONFIG['API_KEY'] != 'your_anthropic_api_key_here' else 'Disabled'}") |