import os from dotenv import load_dotenv load_dotenv() # API Keys GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") GROQ_API_KEY = os.getenv("GROQ_API_KEY") HF_API_KEY = os.getenv("HF_API_KEY") # Model Names EMBEDDING_MODEL = "BAAI/bge-small-en-v1.5" # 384-dim, CPU-friendly RERANKER_MODEL = "cross-encoder/ms-marco-MiniLM-L-6-v2" # lightweight cross-encoder, CPU-friendly LLM_MODEL = "llama-3.3-70b-versatile" # Qdrant — local Docker or Qdrant Cloud QDRANT_HOST = os.getenv("QDRANT_HOST", "localhost") QDRANT_PORT = int(os.getenv("QDRANT_PORT", 6333)) QDRANT_API_KEY = os.getenv("QDRANT_API_KEY", None) QDRANT_URL = os.getenv("QDRANT_URL", None) # e.g. https://xyz.qdrant.io for cloud QDRANT_COLLECTION = "chatjio" VECTOR_SIZE = 384 # bge-small-en-v1.5 output dimension # Chunking — 1024 tokens suits dense PDF content; revisit for web-only runs CHUNK_SIZE = 512 CHUNK_OVERLAP = 64 # Retrieval RETRIEVAL_TOP_K = 20 RERANK_TOP_K = 10 # Match quality thresholds (cross-encoder ms-marco-MiniLM raw logit scores) # bge-small dense scores are unreliable for "no match" detection (always 0.5+), # so the reranker score is used as the sole signal. # Uruguay (in DB) → +10.3 | Jio Institute (not in DB) → -8.9 NO_MATCH_RERANKER_THRESHOLD = -4.0 # below this AND no keyword hits → ask user before LLM PARTIAL_MATCH_RERANKER_THRESHOLD = 0.0 # below this (but above NO_MATCH) → auto-switch to LLM # Data Paths RAW_DATA_DIR = "data/raw" PROCESSED_DATA_DIR = "data/processed"