diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000..7d87db6 --- /dev/null +++ b/backend/config.py @@ -0,0 +1,38 @@ +import os +from pydantic import Field, SecretStr +from pydantic_settings import BaseSettings, SettingsConfigDict + +class Settings(BaseSettings): + # Required for LLM + google_api_key: SecretStr = Field(..., alias="GOOGLE_API_KEY") + + # Required for Vector Search (Vertex AI) + gcp_project_id: str = Field(..., alias="GCP_PROJECT_ID") + index_endpoint_id_full: str = Field(..., alias="INDEX_ENDPOINT_ID_FULL") + deployed_index_id: str = Field(..., alias="DEPLOYED_INDEX_ID") + + # Optional with Defaults + gcp_region: str = Field("europe-west4", alias="GCP_REGION") + bq_dataset_id: str = Field("ks_metadata", alias="BQ_DATASET_ID") + bq_table_id: str = Field("docstore", alias="BQ_TABLE_ID") + + # Load from .env file + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + extra="ignore" + ) + +def validate_config(): + """Validates presence of critical env vars at startup.""" + try: + settings = Settings() + print("āœ… Environment variables validated successfully.") + return settings + except Exception as e: + print("\nāŒ CRITICAL ERROR: Missing or Invalid Environment Variables") + print("Please check your .env file or system environment.") + print(f"Details: {e}") + # Exit the process to prevent 'zombie' deployment + import sys + sys.exit(1) \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 9021161..09fc865 100644 --- a/backend/main.py +++ b/backend/main.py @@ -4,7 +4,7 @@ import asyncio from typing import Optional, Dict, Any from datetime import datetime - +from config import validate_config from dotenv import load_dotenv from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware @@ -16,6 +16,8 @@ load_dotenv() +validate_config() + # FastAPI app + CORS app = FastAPI( title="KnowledgeSpace AI",