from pydantic_settings import BaseSettings from pydantic import Field from functools import lru_cache from pathlib import Path class CVSettings(BaseSettings): # Device device: str = Field("cpu", env="CV_DEVICE") # CLIP clip_model: str = Field("ViT-B-32", env="CLIP_MODEL") clip_pretrained: str = Field("openai", env="CLIP_PRETRAINED") # YOLO — ONNX backend (tidak pakai ultralytics) # yolo_model field dipertahankan untuk backward compat env var, tapi tidak dipakai # detector langsung pakai yolov5nu.onnx yang di-download ke models_cache_dir yolo_conf_threshold: float = Field(0.25, env="YOLO_CONF") yolo_iou_threshold: float = Field(0.45, env="YOLO_IOU") # Image Captioning caption_model: str = Field( "Salesforce/blip-image-captioning-base", env="CAPTION_MODEL" ) # OCR ocr_engine: str = Field("tesseract", env="OCR_ENGINE") ocr_languages: str = Field("en,id", env="OCR_LANGUAGES") # API api_host: str = Field("0.0.0.0", env="CV_API_HOST") api_port: int = Field(8001, env="CV_API_PORT") max_image_size_mb: float = Field(10.0, env="MAX_IMAGE_SIZE_MB") # Storage upload_dir: str = Field("./uploads", env="CV_UPLOAD_DIR") models_cache_dir: str = Field("./model_cache", env="CV_MODELS_CACHE") # MLflow class Config: env_file = ".env" env_file_encoding = "utf-8" def ensure_dirs(self): for d in [self.upload_dir, self.models_cache_dir, "./logs"]: Path(d).mkdir(parents=True, exist_ok=True) @lru_cache() def get_cv_settings() -> CVSettings: s = CVSettings() s.ensure_dirs() return s