import os # --- API Keys & Secrets --- # GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY", "") PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY", "") GOOGLE_CLIENT_ID = os.environ.get("GOOGLE_CLIENT_ID", "") # Optional: shared fallback key (users bring their own via BYOK) OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "") # Optional: shared Tavily web-search fallback key (users bring their own via BYOK) TAVILY_API_KEY = os.environ.get("TAVILY_API_KEY", "") # --- LangSmith (tracing & analytics) --- os.environ["LANGCHAIN_TRACING_V2"] = os.environ.get("LANGSMITH_TRACING", "true") os.environ["LANGCHAIN_API_KEY"] = os.environ.get("LANGSMITH_API_KEY", "") os.environ["LANGCHAIN_PROJECT"] = os.environ.get("LANGCHAIN_PROJECT", "stemcopilot-canvas") # --- Pinecone --- PINECONE_INDEX = "stem-embed" # --- Embedding --- EMBED_MODEL_NAME = "BAAI/bge-large-en-v1.5" BGE_QUERY_PREFIX = "Represent this sentence: " # --- Database --- DB_PATH = "/data/stemgraph.db" if os.path.isdir("/data") else "stemgraph.db" # Public URL of the deployed app — used as the OpenRouter HTTP-Referer header. APP_URL = os.environ.get("APP_URL", "https://moai633-stem-copilot.hf.space") # --- Defaults --- DEFAULT_PERSONA = "nerd" RETRIEVAL_TOP_K = 3 LLM_TIMEOUT = 180 # seconds — free models are slow, needs generous timeout # Number of most-recent messages sent to the LLM per request (full history is # still stored for the /history view). Caps input-token growth on long chats. CONTEXT_WINDOW = int(os.environ.get("CONTEXT_WINDOW", "10")) # Minimum Pinecone relevance score for a chunk to be injected as context. RETRIEVAL_MIN_SCORE = float(os.environ.get("RETRIEVAL_MIN_SCORE", "0.45")) # --- Logging --- import logging logging.basicConfig( level=os.environ.get("LOG_LEVEL", "INFO").upper(), format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", )