""" Shared configuration for T6 Mem0 v2 Loads environment variables and creates Mem0 configuration """ import os from typing import Dict, Any from pydantic_settings import BaseSettings from pydantic import Field class Settings(BaseSettings): """Application settings loaded from environment variables""" # LLM Provider Selection llm_provider: str = Field(default="openai", env="LLM_PROVIDER") # openai or ollama embedder_provider: str = Field(default="openai", env="EMBEDDER_PROVIDER") # openai or ollama # OpenAI openai_api_key: str = Field(default="", env="OPENAI_API_KEY") # Optional if using Ollama # Ollama ollama_base_url: str = Field(default="http://localhost:11434", env="OLLAMA_BASE_URL") ollama_llm_model: str = Field(default="llama3.1:8b", env="OLLAMA_LLM_MODEL") ollama_embedding_model: str = Field(default="nomic-embed-text", env="OLLAMA_EMBEDDING_MODEL") # Supabase supabase_connection_string: str = Field(..., env="SUPABASE_CONNECTION_STRING") # Neo4j neo4j_uri: str = Field(..., env="NEO4J_URI") neo4j_user: str = Field(default="neo4j", env="NEO4J_USER") neo4j_password: str = Field(..., env="NEO4J_PASSWORD") # API api_host: str = Field(default="0.0.0.0", env="API_HOST") api_port: int = Field(default=8080, env="API_PORT") api_key: str = Field(..., env="API_KEY") # MCP Server mcp_host: str = Field(default="0.0.0.0", env="MCP_HOST") mcp_port: int = Field(default=8765, env="MCP_PORT") # Mem0 mem0_collection_name: str = Field(default="t6_memories", env="MEM0_COLLECTION_NAME") mem0_embedding_dims: int = Field(default=1536, env="MEM0_EMBEDDING_DIMS") mem0_version: str = Field(default="v1.1", env="MEM0_VERSION") # Logging log_level: str = Field(default="INFO", env="LOG_LEVEL") log_format: str = Field(default="json", env="LOG_FORMAT") # Environment environment: str = Field(default="development", env="ENVIRONMENT") # Docker (optional, for container deployments) docker_network: str = Field(default="bridge", env="DOCKER_NETWORK") class Config: env_file = ".env" env_file_encoding = "utf-8" case_sensitive = False def get_settings() -> Settings: """Get application settings""" return Settings() def get_mem0_config(settings: Settings) -> Dict[str, Any]: """ Generate Mem0 configuration from settings with support for OpenAI and Ollama Args: settings: Application settings Returns: Dict containing Mem0 configuration """ # LLM Configuration - Switch between OpenAI and Ollama if settings.llm_provider.lower() == "ollama": llm_config = { "provider": "ollama", "config": { "model": settings.ollama_llm_model, "temperature": 0.1, "max_tokens": 2000, "ollama_base_url": settings.ollama_base_url } } else: # Default to OpenAI if not settings.openai_api_key: raise ValueError("OPENAI_API_KEY is required when LLM_PROVIDER=openai") llm_config = { "provider": "openai", "config": { "model": "gpt-4o-mini", "temperature": 0.1, "max_tokens": 2000, "api_key": settings.openai_api_key } } # Embedder Configuration - Switch between OpenAI and Ollama if settings.embedder_provider.lower() == "ollama": embedder_config = { "provider": "ollama", "config": { "model": settings.ollama_embedding_model, "ollama_base_url": settings.ollama_base_url } } else: # Default to OpenAI if not settings.openai_api_key: raise ValueError("OPENAI_API_KEY is required when EMBEDDER_PROVIDER=openai") embedder_config = { "provider": "openai", "config": { "model": "text-embedding-3-small", "embedding_dims": settings.mem0_embedding_dims, "api_key": settings.openai_api_key } } return { # Vector Store - Supabase "vector_store": { "provider": "supabase", "config": { "connection_string": settings.supabase_connection_string, "collection_name": settings.mem0_collection_name, "embedding_model_dims": settings.mem0_embedding_dims, "index_method": "hnsw", # Fastest search "index_measure": "cosine_distance" # Best for embeddings } }, # Graph Store - Neo4j "graph_store": { "provider": "neo4j", "config": { "url": settings.neo4j_uri, "username": settings.neo4j_user, "password": settings.neo4j_password } }, # LLM Provider - Dynamic (OpenAI or Ollama) "llm": llm_config, # Embedder - Dynamic (OpenAI or Ollama) "embedder": embedder_config, # Version "version": settings.mem0_version } # Global settings instance settings = get_settings() # Global mem0 config mem0_config = get_mem0_config(settings)