SahilCodevally/codevally-vision-language-action
0
1"""2Configuration module for the VLA Demo System.3 4Loads settings from environment variables (with .env file support).5All configuration is centralized here to avoid hardcoded values.6"""7 8import os9import logging10from pathlib import Path11 12from dotenv import load_dotenv13 14# Load .env from project root15_PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent16load_dotenv(_PROJECT_ROOT / ".env")17 18logger = logging.getLogger(__name__)19 20# ---------------------------------------------------------------------------21# LLM Provider Configuration22# ---------------------------------------------------------------------------23# LLM_PROVIDER selects the language model backend: "openai" or "groq"24LLM_PROVIDER: str = os.getenv("LLM_PROVIDER", "openai") # "openai" or "groq"25 26OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "")27OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "gpt-4o-mini")28 29GROQ_API_KEY: str = os.getenv("GROQ_API_KEY", "")30GROQ_MODEL: str = os.getenv("GROQ_MODEL", "llama-3.3-70b-versatile")31 32# ---------------------------------------------------------------------------33# Vision / Detection Configuration34# ---------------------------------------------------------------------------35DETECTION_MODEL: str = os.getenv("DETECTION_MODEL", "grounding_dino") # "yolo" or "grounding_dino"36YOLO_MODEL: str = os.getenv("YOLO_MODEL", "yolov8n.pt")37YOLO_CONFIDENCE: float = float(os.getenv("YOLO_CONFIDENCE", "0.25"))38GROUNDING_DINO_MODEL: str = os.getenv(39 "GROUNDING_DINO_MODEL", "IDEA-Research/grounding-dino-tiny"40)41GROUNDING_DINO_CONFIDENCE: float = float(os.getenv("GROUNDING_DINO_CONFIDENCE", "0.3"))42 43# ---------------------------------------------------------------------------44# Paths45# ---------------------------------------------------------------------------46ASSETS_DIR: Path = _PROJECT_ROOT / "assets"47DEMO_IMAGES_DIR: Path = ASSETS_DIR / "demo_images"48MODELS_DIR: Path = _PROJECT_ROOT / "models"49 50# ---------------------------------------------------------------------------51# Logging Setup52# ---------------------------------------------------------------------------53LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")54 55 56def setup_logging() -> None:57 """Configure root logger with a consistent format."""58 logging.basicConfig(59 level=getattr(logging, LOG_LEVEL.upper(), logging.INFO),60 format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",61 datefmt="%Y-%m-%d %H:%M:%S",62 )63 64 65def validate_config() -> list[str]:66 """67 Validate critical configuration values.68 69 Returns:70 List of warning messages for missing/invalid config values.71 """72 warnings: list[str] = []73 74 valid_providers = ("openai", "groq")75 if LLM_PROVIDER not in valid_providers:76 warnings.append(77 f"Unknown LLM_PROVIDER='{LLM_PROVIDER}'. "78 f"Valid values: {valid_providers}. Defaulting to 'openai'."79 )80 81 if LLM_PROVIDER == "openai" and not OPENAI_API_KEY:82 warnings.append(83 "LLM_PROVIDER='openai' but OPENAI_API_KEY is not set. "84 "Language reasoning will use fallback mode."85 )86 87 if LLM_PROVIDER == "groq" and not GROQ_API_KEY:88 warnings.append(89 "LLM_PROVIDER='groq' but GROQ_API_KEY is not set. "90 "Language reasoning will use fallback mode."91 )92 93 valid_detectors = ("yolo", "grounding_dino")94 if DETECTION_MODEL not in valid_detectors:95 warnings.append(96 f"Unknown DETECTION_MODEL='{DETECTION_MODEL}'. "97 f"Valid values: {valid_detectors}. Defaulting to 'grounding_dino'."98 )99 100 return warnings101 