import os from dotenv import load_dotenv # Explicit path so .env is found regardless of the working directory _THIS_DIR = os.path.dirname(os.path.abspath(__file__)) load_dotenv(os.path.join(_THIS_DIR, ".env")) # --- API Keys --- GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY", "") OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "") # --- Model Names --- PLANNER_MODEL = "gemini-3-flash-preview" CROPPER_MODEL = "gemini-3-flash-preview" ANNOTATOR_MODEL = "gemini-2.5-flash-image" ANALYZER_MODEL = "gemini-3-flash-preview" CODE_LOOKUP_MODEL = "gpt-5-mini" DELIBERATION_MODEL = "gpt-5.2" VERDICT_MODEL = "gemini-3-flash-preview" METADATA_MODEL = "gemini-3-flash-preview" # --- ChromaDB --- CHROMA_DB_PATH = os.path.join(os.path.dirname(__file__), "data", "nyc_code_db") CHROMA_COLLECTION_NAME = "nyc_building_codes" EMBEDDING_MODEL_NAME = "BAAI/bge-large-en-v1.5" # --- Processing Constants --- PDF_RENDER_DPI = 100 MAX_INVESTIGATION_ROUNDS = 3 CROP_PADDING_PX = 40 # --- Code Lookup Budgets (per individual query, queries run in parallel) --- MAX_DISCOVER_CALLS = 1 MAX_FETCH_CALLS = 1 MAX_CODE_LOOKUP_TURNS = 5 # --- Search Defaults --- DISCOVER_N_RESULTS = 50 # Retrieve more candidates for re-ranking RERANK_TOP_K = 20 # Return top-K after re-ranking FETCH_MAX_SECTIONS = 30 # Max sections per chapter fetch