RAGChatbot / config.py
Shurem's picture
add personlize agent
a5ddf46
Raw
History Blame Contribute Delete
2.87 kB
import os
from typing import Optional
class Config:
"""
Configuration class for the RAG Chatbot backend
"""
# Database configuration
DATABASE_URL: str = os.getenv("DATABASE_URL", "postgresql+asyncpg://user:password@localhost/rag_chatbot")
# Qdrant configuration
QDRANT_URL: str = os.getenv("QDRANT_URL", "http://localhost:6333")
QDRANT_API_KEY: Optional[str] = os.getenv("QDRANT_API_KEY")
QDRANT_COLLECTION_NAME: str = os.getenv("QDRANT_COLLECTION_NAME", "textbook_content_embeddings")
# OpenAI/Gemini API configuration
OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "")
OPENAI_BASE_URL: str = os.getenv("OPENAI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta/openai/")
GEMINI_MODEL: str = os.getenv("GEMINI_MODEL", "gemini-2.5-flash")
# Embedding configuration
EMBEDDING_MODEL: str = os.getenv("EMBEDDING_MODEL", "text-embedding-004")
EMBEDDING_DIMENSION: int = int(os.getenv("EMBEDDING_DIMENSION", "768"))
# Application settings
APP_ENV: str = os.getenv("APP_ENV", "development")
LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")
# Rate limiting
RATE_LIMIT_REQUESTS: int = int(os.getenv("RATE_LIMIT_REQUESTS", "100"))
RATE_LIMIT_WINDOW: int = int(os.getenv("RATE_LIMIT_WINDOW", "60")) # in seconds
# RAG settings
RAG_TOP_K: int = int(os.getenv("RAG_TOP_K", "5"))
RAG_MIN_SCORE: float = float(os.getenv("RAG_MIN_SCORE", "0.3"))
MAX_TOKENS_PER_CHUNK: int = int(os.getenv("MAX_TOKENS_PER_CHUNK", "512"))
MAX_RESPONSE_TOKENS: int = int(os.getenv("MAX_RESPONSE_TOKENS", "2000"))
# CORS settings
ALLOWED_ORIGINS: list = os.getenv("ALLOWED_ORIGINS", "*").split(",")
# SSE Streaming
SSE_STREAMING_ENABLED: bool = os.getenv("SSE_STREAMING_ENABLED", "true").lower() == "true"
# Personalization settings
PERSONALIZE_MAX_TOKENS: int = int(os.getenv("PERSONALIZE_MAX_TOKENS", "8192"))
PERSONALIZE_RATE_LIMIT: int = int(os.getenv("PERSONALIZE_RATE_LIMIT", "5"))
PERSONALIZE_RATE_LIMIT_WINDOW: int = int(os.getenv("PERSONALIZE_RATE_LIMIT_WINDOW", "60")) # in seconds
PERSONALIZE_TIMEOUT: int = int(os.getenv("PERSONALIZE_TIMEOUT", "60")) # in seconds
AUTH_BACKEND_URL: str = os.getenv("AUTH_BACKEND_URL", "http://localhost:3001")
@classmethod
def validate(cls):
"""
Validate that required configuration values are set
"""
errors = []
if not cls.OPENAI_API_KEY:
errors.append("OPENAI_API_KEY is required")
if cls.APP_ENV not in ["development", "staging", "production"]:
errors.append(f"APP_ENV must be one of: development, staging, production. Got: {cls.APP_ENV}")
if errors:
raise ValueError(f"Configuration validation failed: {'; '.join(errors)}")
# Validate configuration on import
Config.validate()