nvtitan/graphRAG
0
1"""2Configuration management for GraphLLM system3"""4from pydantic_settings import BaseSettings5from pydantic import Field, field_validator6from typing import Optional7import os8 9 10class Settings(BaseSettings):11 """Application settings loaded from environment variables"""12 13 # Application14 app_name: str = "GraphLLM"15 app_version: str = "1.0.0"16 environment: str = "development"17 debug: bool = True18 19 # API20 api_host: str = "0.0.0.0"21 api_port: int = 800022 api_workers: int = 423 24 # LLM Settings - Gemini (Primary)25 gemini_api_key: str = Field(default="", env="GEMINI_API_KEY")26 gemini_model: str = "gemini-2.5-flash"27 28 # LLM Settings - Mistral (Fallback)29 mistral_api_key: str = Field(default="", env="MISTRAL_API_KEY")30 mistral_model: str = "mistral-7b-instruct-v0.1"31 32 # LLM Parameters33 llm_temperature: float = 0.034 llm_max_tokens: int = 204835 llm_timeout: int = 12036 37 # Embedding Settings38 embedding_model: str = "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"39 embedding_dimension: int = 38440 embedding_batch_size: int = 3241 42 # FAISS Vector DB43 faiss_index_path: str = "./data/faiss_index"44 faiss_metric: str = "cosine"45 46 # Neo4j Graph DB47 neo4j_uri: str = "bolt://localhost:7687"48 neo4j_user: str = "neo4j"49 neo4j_password: str = Field(default="", env="NEO4J_PASSWORD")50 neo4j_database: str = "neo4j"51 52 # PostgreSQL53 postgres_host: str = "localhost"54 postgres_port: int = 543255 postgres_db: str = "graphllm"56 postgres_user: str = "postgres"57 postgres_password: str = Field(default="", env="POSTGRES_PASSWORD")58 59 # MongoDB (optional)60 mongodb_uri: str = "mongodb://localhost:27017"61 mongodb_database: str = "graphllm"62 63 # Chunking64 chunk_size: int = 51265 chunk_overlap: int = 12866 min_chunk_size: int = 10067 68 # Triplet Extraction69 triplet_confidence_threshold: float = 0.670 entity_similarity_threshold: float = 0.8571 max_triples_per_chunk: int = 1072 73 # Graph Pruning74 node_importance_threshold: float = 0.375 edge_confidence_threshold: float = 0.576 min_node_mentions: int = 277 78 # RAG79 rag_top_k: int = 1080 rag_rerank_top_k: int = 581 max_context_length: int = 400082 83 # File Upload84 max_file_size_mb: int = 5085 allowed_extensions: str = "pdf"86 upload_dir: str = "./data/uploads"87 88 # Storage89 data_dir: str = "./data"90 logs_dir: str = "./logs"91 cache_dir: str = "./cache"92 93 # Monitoring94 enable_metrics: bool = True95 metrics_port: int = 909096 log_level: str = "INFO"97 98 @property99 def postgres_url(self) -> str:100 """Build PostgreSQL connection URL"""101 return f"postgresql://{self.postgres_user}:{self.postgres_password}@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}"102 103 @property104 def max_file_size_bytes(self) -> int:105 """Convert MB to bytes"""106 return self.max_file_size_mb * 1024 * 1024107 108 class Config:109 env_file = ".env"110 case_sensitive = False111 112 113# Global settings instance114settings = Settings()115 116 117def ensure_directories():118 """Ensure all required directories exist"""119 dirs = [120 settings.data_dir,121 settings.upload_dir,122 settings.logs_dir,123 settings.cache_dir,124 settings.faiss_index_path,125 ]126 for directory in dirs:127 os.makedirs(directory, exist_ok=True)128 