Spaces:
Running
Running
| """Application configuration settings.""" | |
| import os | |
| from typing import Optional | |
| from pathlib import Path | |
| from pydantic_settings import BaseSettings | |
| from pydantic import ConfigDict | |
| # Load .env from the project root (frontend/src/) | |
| _backend_dir = Path(__file__).resolve().parent # src/config/ | |
| _src_dir = _backend_dir.parent.parent # src/ | |
| _dotenv_path = _src_dir / ".env" | |
| if _dotenv_path.exists(): | |
| from dotenv import load_dotenv | |
| load_dotenv(_dotenv_path) | |
| class Settings(BaseSettings): | |
| """Application settings loaded from environment variables.""" | |
| model_config = ConfigDict( | |
| env_file=str(_dotenv_path), | |
| env_file_encoding="utf-8", | |
| case_sensitive=True, | |
| extra="ignore", | |
| ) | |
| # Application | |
| APP_NAME: str = "Physical AI Edge Kit API" | |
| APP_VERSION: str = "1.0.0" | |
| DEBUG: bool = False | |
| # Database - Neon Postgres | |
| DATABASE_URL: str = os.getenv("DATABASE_URL", "postgresql://localhost:5432/edgekit") | |
| # Qdrant Vector Database | |
| QDRANT_URL: str = os.getenv("QDRANT_URL", "http://localhost:6333") | |
| QDRANT_API_KEY: Optional[str] = os.getenv("QDRANT_API_KEY") | |
| QDRANT_COLLECTION: str = os.getenv("QDRANT_COLLECTION", "physical_ai_docs") | |
| # OpenRouter (DEFAULT provider - chat + embeddings) | |
| OPENROUTER_API_KEY: str = os.getenv("OPENROUTER_API_KEY", "").strip() | |
| OPENROUTER_CHAT_MODEL: str = os.getenv("OPENROUTER_CHAT_MODEL", "openai/gpt-oss-20b:free").strip() | |
| OPENROUTER_EMBEDDING_MODEL: str = os.getenv("OPENROUTER_EMBEDDING_MODEL", "nvidia/llama-nemotron-embed-vl-1b-v2:free").strip() | |
| EMBEDDING_DIM: int = int(os.getenv("EMBEDDING_DIM", "2048")) | |
| # Cohere (fallback for embeddings - matches legacy data) | |
| COHERE_API_KEY: str = os.getenv("COHERE_API_KEY", "").strip() | |
| COHERE_EMBEDDING_MODEL: str = os.getenv("COHERE_EMBEDDING_MODEL", "embed-english-v3.0") | |
| # Gemini (for chat completion) | |
| GEMINI_API_KEY: str = os.getenv("GEMINI_API_KEY", "") | |
| GEMINI_CHAT_MODEL: str = os.getenv("GEMINI_CHAT_MODEL", "gemini-2.5-flash") | |
| # OpenAI (fallback) | |
| OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "") | |
| OPENAI_EMBEDDING_MODEL: str = os.getenv("OPENAI_EMBEDDING_MODEL", "text-embedding-3-small") | |
| OPENAI_CHAT_MODEL: str = os.getenv("OPENAI_CHAT_MODEL", "gpt-4o-mini") | |
| # RAG Configuration | |
| RAG_CHUNK_SIZE: int = 500 | |
| RAG_CHUNK_OVERLAP: int = 50 | |
| RAG_TOP_K: int = 5 | |
| RAG_SIMILARITY_THRESHOLD: float = 0.20 | |
| RAG_MAX_RESPONSE_TOKENS: int = 300 | |
| # Authentication | |
| SECRET_KEY: str = os.getenv("SECRET_KEY", "dev-secret-key-change-in-production") | |
| ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 | |
| # CORS | |
| CORS_ORIGINS: list = ["*"] | |
| settings = Settings() | |