import os from typing import List, Union, Optional from pydantic import AnyHttpUrl, field_validator from pydantic_settings import BaseSettings, SettingsConfigDict ENV_FILE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), ".env") class Settings(BaseSettings): APP_NAME: str = "Archvise" DEBUG: bool = False API_VERSION: str = "v1" SECRET_KEY: str = "generate-a-secure-jwt-secret-key-for-production-deployment-2026" SENTRY_DSN: Optional[str] = None # Database DATABASE_URL: str = "postgresql://postgres.lxqysvqlhajjweorgztt:Sweaty%40ashok1@aws-1-ap-southeast-2.pooler.supabase.com:6543/postgres" # Redis REDIS_URL: str = "redis://localhost:6379/0" # NVIDIA NIM APIs NVIDIA_BASE_URL: str = "https://integrate.api.nvidia.com/v1" NVIDIA_LLAMA_KEY: str = "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" NVIDIA_MISTRAL_KEY: str = "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" NVIDIA_DEEPSEEK_KEY: str = "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" NVIDIA_LLAMA_VISION_KEY: str = "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" NVIDIA_EMBED_KEY: str = "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" # Supabase Auth Settings SUPABASE_URL: str = "https://lxqysvqlhajjweorgztt.supabase.co" SUPABASE_ANON_KEY: str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imx4cXlzdnFsaGFqandlb3JnenR0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODA1NDYwNjIsImV4cCI6MjA5NjEyMjA2Mn0.G93M7eXhhtNee04NYmmZBEmIKS1v4Typ7VEk4TkwHnM" SUPABASE_SERVICE_ROLE_KEY: str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imx4cXlzdnFsaGFqandlb3JnenR0Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc4MDU0NjA2MiwiZXhwIjoyMDk2MTIyMDYyfQ.7ANfu1C845PV9e0Go3qiSyFvQ_AfCFSP_5aulKxbMdk" SUPABASE_JWT_SECRET: str = "super-secret-jwt-token-with-at-least-32-characters-long" # Storage API (Supabase Storage S3-Compatible) CLOUDFLARE_R2_ACCOUNT_ID: str = "supabase" CLOUDFLARE_R2_ACCESS_KEY: str = "98d156188e6d2f13bb31061a039fe9b3" CLOUDFLARE_R2_SECRET_KEY: str = "ef8ebc4ca31c6a917ecabd506341750ca7326dacf4218e31a7696a972c3e23c0" CLOUDFLARE_R2_BUCKET: str = "scaleai-audits" CLOUDFLARE_R2_ENDPOINT_URL: str = "https://lxqysvqlhajjweorgztt.storage.supabase.co/storage/v1/s3" CLOUDFLARE_R2_REGION_NAME: str = "ap-southeast-2" # CORS Settings CORS_ORIGINS: Union[str, List[str]] = ["*"] @field_validator("CORS_ORIGINS") @classmethod def assemble_cors_origins(cls, v: Union[str, List[str]]) -> List[str]: if isinstance(v, str): if v.startswith("[") and v.endswith("]"): import json try: return json.loads(v) except Exception: pass return [x.strip() for x in v.split(",")] return v # Rate Limiting RATE_LIMIT: str = "100/minute" # Stripe STRIPE_SECRET_KEY: str = "sk_test_placeholder_please_replace" STRIPE_WEBHOOK_SECRET: str = "whsec_placeholder_please_replace" STRIPE_STARTER_PRICE_ID: str = "price_placeholder_starter" STRIPE_PRO_PRICE_ID: str = "price_placeholder_pro" # GitHub OAuth GITHUB_CLIENT_ID: str = "Iv23lipw1OEG5Q6myilm" GITHUB_CLIENT_SECRET: str = "c01eaa49ac9db4e6f40f7ea1f99397964d0a975a" # Frontend Redirect FRONTEND_URL: str = "http://localhost:3000" # OpenRouter/OpenAI/Groq/Gemini API Keys OPENAI_API_KEY: str = "" OPENAI_BASE_URL: str = "https://openrouter.ai/api/v1" OPENROUTER_API_KEY: str = "" GROQ_API_KEY: str = "" GEMINI_API_KEY: str = "" model_config = SettingsConfigDict( env_file=(".env", ENV_FILE_PATH), env_file_encoding="utf-8", extra="ignore" ) settings = Settings()