from __future__ import annotations import os from pathlib import Path from typing import Optional from dotenv import load_dotenv from loguru import logger load_dotenv() BASE_DIR = Path(__file__).resolve().parent CLAIMS_DATA_ROOT = Path(os.getenv("CLAIMS_DATA_ROOT", BASE_DIR / "data" / "claims")) SCHEDULING_DATA_ROOT = Path( os.getenv("SCHEDULING_DATA_ROOT", BASE_DIR / "data" / "scheduling") ) CLAIM_PACKETS_ROOT = CLAIMS_DATA_ROOT / "mock_claim_packets" CLAIMS_POLICY_RAG_JSONL = ( CLAIMS_DATA_ROOT / "rag" / "policy_benefit_rag" / "policy_benefit_chunks.jsonl" ) CLAIMS_EXCEPTION_RAG_JSONL = ( CLAIMS_DATA_ROOT / "rag" / "exception_similarity_rag" / "resolved_exception_cases.jsonl" ) SCHEDULING_MOCK_DATA_ROOT = SCHEDULING_DATA_ROOT / "mock_data" SCHEDULING_PROVIDER_RAG_JSONL = ( SCHEDULING_DATA_ROOT / "rag" / "provider_specialty_matching" / "provider_specialty_profiles.jsonl" ) OPENAI_CHAT_MODEL = os.getenv("OPENAI_CHAT_MODEL", "gpt-4o-mini") OPENAI_EMBED_MODEL = os.getenv("OPENAI_EMBED_MODEL", "text-embedding-3-small") HF_FT_EMBED_MODEL_URL = os.getenv("HF_FT_EMBED_MODEL_URL") # Cost controls. Keep paid calls explicit for demos/HF Spaces. USE_LLM = os.getenv("USE_LLM", "false").lower() == "true" USE_PAID_EMBEDDINGS = os.getenv("USE_PAID_EMBEDDINGS", "false").lower() == "true" LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") logger.remove() logger.add(lambda msg: print(msg, end=""), level=LOG_LEVEL) logger.info("Config loaded") logger.info(f"USE_LLM={USE_LLM}; USE_PAID_EMBEDDINGS={USE_PAID_EMBEDDINGS}") logger.debug(f"CLAIMS_DATA_ROOT={CLAIMS_DATA_ROOT}") logger.debug(f"SCHEDULING_DATA_ROOT={SCHEDULING_DATA_ROOT}") def build_llm() -> Optional[object]: """Create the shared chat LLM only when explicitly enabled.""" if not USE_LLM: logger.info("LLM disabled. Set USE_LLM=true to enable chat-completion calls.") return None try: from langchain_openai import ChatOpenAI logger.info(f"Creating ChatOpenAI model={OPENAI_CHAT_MODEL}") return ChatOpenAI(model=OPENAI_CHAT_MODEL, temperature=0) except Exception as exc: logger.warning( f"Could not create LLM. Falling back to deterministic logic. Error: {exc}" ) return None LLM = build_llm()