import os from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() ## Configuration class MyConfig: pass MY_CONFIG = MyConfig () ## All of these settings can be overridden by .env file ## And it will be loaded automatically by load_dotenv() ## And they will take precedence over the default values below ## See sample .env file 'env.sample.txt' for reference ## HuggingFace config MY_CONFIG.HF_ENDPOINT = os.getenv("HF_ENDPOINT", "https://thealliance.ai/") ## Crawl settings MY_CONFIG.WEBSITE_URL = os.getenv("WEBSITE_URL", "") MY_CONFIG.CRAWL_MAX_DOWNLOADS = int(os.getenv("CRAWL_MAX_DOWNLOADS", 100)) MY_CONFIG.CRAWL_MAX_DEPTH = int(os.getenv("CRAWL_MAX_DEPTH", 3)) MY_CONFIG.WAITTIME_BETWEEN_REQUESTS = float(os.getenv("WAITTIME_BETWEEN_REQUESTS", 0.1)) # in seconds MY_CONFIG.CRAWL_MIME_TYPE = 'text/html' ## Directories MY_CONFIG.WORKSPACE_DIR = os.path.join(os.getenv('WORKSPACE_DIR', 'workspace')) MY_CONFIG.CRAWL_DIR = os.path.join( MY_CONFIG.WORKSPACE_DIR, "crawled") MY_CONFIG.PROCESSED_DATA_DIR = os.path.join( MY_CONFIG.WORKSPACE_DIR, "processed") ## llama index will download the models to this directory os.environ["LLAMA_INDEX_CACHE_DIR"] = os.path.join(MY_CONFIG.WORKSPACE_DIR, "llama_index_cache") ### ------------------------------- # Find embedding models: https://huggingface.co/spaces/mteb/leaderboard MY_CONFIG.EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", 'ibm-granite/granite-embedding-30m-english') MY_CONFIG.EMBEDDING_LENGTH = int(os.getenv("EMBEDDING_LENGTH", 384)) ## Chunking MY_CONFIG.CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", 512)) MY_CONFIG.CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", 20)) ### Milvus config MY_CONFIG.COLLECTION_NAME = 'pages' # Separate Milvus databases for different RAG approaches # This allows running Vector RAG and Hybrid GraphRAG simultaneously without conflicts MY_CONFIG.MILVUS_URI_VECTOR = os.path.join( MY_CONFIG.WORKSPACE_DIR, 'vector_only_milvus.db') # Vector RAG only MY_CONFIG.MILVUS_URI_HYBRID_GRAPH = os.path.join( MY_CONFIG.WORKSPACE_DIR, 'hybrid_graph_milvus.db') # Hybrid GraphRAG # Vector Database Configuration MY_CONFIG.VECTOR_DB_TYPE = os.getenv("VECTOR_DB_TYPE", "cloud_zilliz") # Options: "local" or "cloud_zilliz" # Zilliz Cloud Configuration (for cloud deployment) MY_CONFIG.ZILLIZ_CLUSTER_ENDPOINT = os.getenv("ZILLIZ_CLUSTER_ENDPOINT") MY_CONFIG.ZILLIZ_TOKEN = os.getenv("ZILLIZ_TOKEN") ## ---- LLM settings ---- ## Choose one: We can do local or cloud LLMs # LLM_RUN_ENV controls which LLM backend to use: 'local_ollama' for local Ollama, 'cloud' for cloud LLMs # Set LLM_RUN_ENV in your .env file. Default is 'cloud' for production deployment. ## Local LLMs are run on your machine using Ollama ## Cloud LLMs are run on any LiteLLM supported service like Replicate / Nebius / Cerebras / etc ## For running Ollama locally, please check the instructions in the docs/llm-local.md file MY_CONFIG.LLM_RUN_ENV = os.getenv("LLM_RUN_ENV", "cloud") MY_CONFIG.LLM_MODEL = os.getenv("LLM_MODEL", 'cerebras/llama3.1-8b') # Replicate API token (if using Replicate) MY_CONFIG.REPLICATE_API_TOKEN = os.getenv("REPLICATE_API_TOKEN", None) # Nebius API key (if using Nebius) MY_CONFIG.NEBIUS_API_KEY = os.getenv("NEBIUS_API_KEY", None) # --- GraphBuilder LLM API keys --- MY_CONFIG.CEREBRAS_API_KEY = os.getenv("CEREBRAS_API_KEY", None) MY_CONFIG.GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", None) # --- Graph entity/relationship extraction config --- MY_CONFIG.GRAPH_MIN_ENTITIES = int(os.getenv("GRAPH_MIN_ENTITIES", 5)) MY_CONFIG.GRAPH_MAX_ENTITIES = int(os.getenv("GRAPH_MAX_ENTITIES", 15)) MY_CONFIG.GRAPH_MIN_RELATIONSHIPS = int(os.getenv("GRAPH_MIN_RELATIONSHIPS", 3)) MY_CONFIG.GRAPH_MAX_RELATIONSHIPS = int(os.getenv("GRAPH_MAX_RELATIONSHIPS", 8)) MY_CONFIG.GRAPH_MIN_CONFIDENCE = float(os.getenv("GRAPH_MIN_CONFIDENCE", 0.8)) MY_CONFIG.GRAPH_MAX_CONTENT_CHARS = int(os.getenv("GRAPH_MAX_CONTENT_CHARS", 12000)) MY_CONFIG.GRAPH_SENTENCE_BOUNDARY_RATIO = float(os.getenv("GRAPH_SENTENCE_BOUNDARY_RATIO", 0.7)) ## --- GraphRAG --- # --- Neo4j config --- MY_CONFIG.NEO4J_URI = os.getenv("NEO4J_URI") MY_CONFIG.NEO4J_USER = os.getenv("NEO4J_USERNAME") MY_CONFIG.NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD") MY_CONFIG.NEO4J_DATABASE = os.getenv("NEO4J_DATABASE") MY_CONFIG.GRAPH_DATA_DIR = os.path.join(MY_CONFIG.WORKSPACE_DIR, "graph_data") ## --- UI settings --- MY_CONFIG.STARTER_PROMPTS_STR = os.getenv("UI_STARTER_PROMPTS", 'What is this website? | What are upcoming events? | Who are some of the partners?') MY_CONFIG.STARTER_PROMPTS = MY_CONFIG.STARTER_PROMPTS_STR.split("|") if MY_CONFIG.STARTER_PROMPTS_STR else [] ## --- Port Configuration --- # Flask apps (auto-configured via MY_CONFIG) MY_CONFIG.FLASK_VECTOR_PORT = int(os.getenv("FLASK_VECTOR_PORT", 8081)) # app_flask.py (vector RAG) MY_CONFIG.FLASK_GRAPH_PORT = int(os.getenv("FLASK_GRAPH_PORT", 8080)) # app_flask_graph.py (GraphRAG) # Chainlit apps (default port: 8000, custom ports for Docker deployments) MY_CONFIG.CHAINLIT_VECTOR_PORT = int(os.getenv("CHAINLIT_VECTOR_PORT", 8082)) # app_chainlit.py (Docker: 8082, Native: 8000) MY_CONFIG.CHAINLIT_GRAPH_PORT = int(os.getenv("CHAINLIT_GRAPH_PORT", 8083)) # app_chainlit_graph.py (Docker: 8083, Native: 8000) # Docker and external services MY_CONFIG.DOCKER_PORT = int(os.getenv("DOCKER_PORT", 8080)) # External host port (maps to DOCKER_APP_PORT) MY_CONFIG.DOCKER_APP_PORT = int(os.getenv("DOCKER_APP_PORT", 8080)) # Internal container port (all apps use this in Docker) MY_CONFIG.OLLAMA_PORT = int(os.getenv("OLLAMA_PORT", 11434)) # Ollama server port