mindnet/app/config.py

115 lines
5.6 KiB
Python
Raw Normal View History

2025-09-02 17:04:00 +02:00
"""
2025-12-15 15:40:39 +01:00
FILE: app/config.py
2025-12-25 09:58:25 +01:00
DESCRIPTION: Zentrale Pydantic-Konfiguration.
WP-20: Hybrid-Cloud Modus Support (OpenRouter/Gemini/Ollama).
FIX: Einführung von Parametern zur intelligenten Rate-Limit Steuerung (429 Handling).
VERSION: 0.6.7
2025-12-15 15:40:39 +01:00
STATUS: Active
2025-12-23 19:05:43 +01:00
DEPENDENCIES: os, functools, pathlib, python-dotenv
2025-09-02 17:04:00 +02:00
"""
2025-09-02 10:19:42 +02:00
from __future__ import annotations
import os
from functools import lru_cache
2025-12-08 10:32:57 +01:00
from pathlib import Path
2025-12-23 19:05:43 +01:00
from dotenv import load_dotenv
# WP-20: Lade Umgebungsvariablen aus der .env Datei
2025-12-25 09:58:25 +01:00
# override=True garantiert, dass Änderungen in der .env immer Vorrang haben.
# WP-24c v4.5.10: Expliziter Pfad für .env-Datei, um Probleme mit Arbeitsverzeichnis zu vermeiden
# Suche .env im Projekt-Root (3 Ebenen über app/config.py: app/config.py -> app/ -> root/)
_project_root = Path(__file__).parent.parent.parent
_env_file = _project_root / ".env"
_env_loaded = False
# Versuche zuerst expliziten Pfad
if _env_file.exists():
_env_loaded = load_dotenv(_env_file, override=True)
if _env_loaded:
# Optional: Logging (nur wenn logging bereits initialisiert ist)
try:
import logging
_logger = logging.getLogger(__name__)
_logger.debug(f"✅ .env geladen von: {_env_file}")
except:
pass # Logging noch nicht initialisiert
# Fallback: Automatische Suche (für Dev/Test oder wenn .env an anderer Stelle liegt)
if not _env_loaded:
_env_loaded = load_dotenv(override=True)
if _env_loaded:
try:
import logging
_logger = logging.getLogger(__name__)
_logger.debug(f"✅ .env geladen via automatische Suche (cwd: {Path.cwd()})")
except:
pass
2025-09-02 10:19:42 +02:00
class Settings:
2025-12-23 15:09:47 +01:00
# --- Qdrant Datenbank ---
2025-09-02 10:19:42 +02:00
QDRANT_URL: str = os.getenv("QDRANT_URL", "http://127.0.0.1:6333")
QDRANT_API_KEY: str | None = os.getenv("QDRANT_API_KEY")
# WP-24c v4.5.10: Harmonisierung - Unterstützt beide Umgebungsvariablen für Abwärtskompatibilität
# COLLECTION_PREFIX hat Priorität, MINDNET_PREFIX als Fallback
# WP-24c v4.5.10-FIX: Default auf "mindnet" (Prod) statt "mindnet_dev" (Dev)
# Dev muss explizit COLLECTION_PREFIX=mindnet_dev in .env setzen
COLLECTION_PREFIX: str = os.getenv("COLLECTION_PREFIX") or os.getenv("MINDNET_PREFIX") or "mindnet"
2025-12-25 09:58:25 +01:00
# WP-22: Vektor-Dimension für das Embedding-Modell (nomic)
2025-12-23 18:51:12 +01:00
VECTOR_SIZE: int = int(os.getenv("VECTOR_DIM", "768"))
2025-09-02 10:19:42 +02:00
DISTANCE: str = os.getenv("MINDNET_DISTANCE", "Cosine")
2025-12-08 10:32:57 +01:00
# --- Lokale Embeddings (Ollama & Sentence-Transformers) ---
2025-12-23 18:51:12 +01:00
EMBEDDING_MODEL: str = os.getenv("MINDNET_EMBEDDING_MODEL", "nomic-embed-text")
2025-09-02 10:19:42 +02:00
MODEL_NAME: str = os.getenv("MINDNET_MODEL", "sentence-transformers/all-MiniLM-L6-v2")
2025-12-08 10:32:57 +01:00
2025-12-23 15:55:06 +01:00
# --- WP-20 Hybrid LLM Provider ---
# Erlaubt: "ollama" | "gemini" | "openrouter"
2025-12-25 09:58:25 +01:00
MINDNET_LLM_PROVIDER: str = os.getenv("MINDNET_LLM_PROVIDER", "openrouter").lower()
# Standardwert 10000, falls nichts in der .env steht
MAX_OLLAMA_CHARS: int = int(os.getenv("MAX_OLLAMA_CHARS", 10000))
2025-12-23 15:09:47 +01:00
# Google AI Studio (2025er Lite-Modell für höhere Kapazität)
2025-12-23 14:33:51 +01:00
GOOGLE_API_KEY: str | None = os.getenv("GOOGLE_API_KEY")
2025-12-25 09:58:25 +01:00
GEMINI_MODEL: str = os.getenv("MINDNET_GEMINI_MODEL", "gemini-2.5-flash-lite")
2025-12-23 15:09:47 +01:00
# OpenRouter Integration (Verfügbares Free-Modell 2025)
2025-12-23 15:09:47 +01:00
OPENROUTER_API_KEY: str | None = os.getenv("OPENROUTER_API_KEY")
OPENROUTER_MODEL: str = os.getenv("OPENROUTER_MODEL", "mistralai/mistral-7b-instruct:free")
2025-12-23 15:09:47 +01:00
2025-12-23 14:33:51 +01:00
LLM_FALLBACK_ENABLED: bool = os.getenv("MINDNET_LLM_FALLBACK", "true").lower() == "true"
# --- NEU: Intelligente Rate-Limit Steuerung ---
# Dauer der Wartezeit in Sekunden, wenn ein HTTP 429 (Rate Limit) auftritt
LLM_RATE_LIMIT_WAIT: float = float(os.getenv("MINDNET_LLM_RATE_LIMIT_WAIT", "60.0"))
# Anzahl der Cloud-Retries bei 429, bevor Ollama-Fallback greift
LLM_RATE_LIMIT_RETRIES: int = int(os.getenv("MINDNET_LLM_RATE_LIMIT_RETRIES", "3"))
2025-12-23 15:09:47 +01:00
# --- WP-05 Lokales LLM (Ollama) ---
2025-12-08 10:32:57 +01:00
OLLAMA_URL: str = os.getenv("MINDNET_OLLAMA_URL", "http://127.0.0.1:11434")
2025-12-08 10:52:57 +01:00
LLM_MODEL: str = os.getenv("MINDNET_LLM_MODEL", "phi3:mini")
2025-12-08 10:32:57 +01:00
PROMPTS_PATH: str = os.getenv("MINDNET_PROMPTS_PATH", "config/prompts.yaml")
2025-12-09 13:14:24 +01:00
# --- WP-06 / WP-14 Performance & Last-Steuerung ---
2025-12-23 18:51:12 +01:00
LLM_TIMEOUT: float = float(os.getenv("MINDNET_LLM_TIMEOUT", "300.0"))
2025-12-08 19:36:12 +01:00
DECISION_CONFIG_PATH: str = os.getenv("MINDNET_DECISION_CONFIG", "config/decision_engine.yaml")
2025-12-23 14:33:51 +01:00
BACKGROUND_LIMIT: int = int(os.getenv("MINDNET_LLM_BACKGROUND_LIMIT", "2"))
2025-12-08 19:36:12 +01:00
2025-12-23 18:51:12 +01:00
# --- System-Pfade & Ingestion-Logik ---
2025-09-02 10:19:42 +02:00
DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true"
2025-12-25 09:58:25 +01:00
MINDNET_VAULT_ROOT: str = os.getenv("MINDNET_VAULT_ROOT", "./vault_master")
2025-12-23 15:09:47 +01:00
MINDNET_TYPES_FILE: str = os.getenv("MINDNET_TYPES_FILE", "config/types.yaml")
2025-12-25 09:58:25 +01:00
MINDNET_VOCAB_PATH: str = os.getenv("MINDNET_VOCAB_PATH", "/mindnet/vault/mindnet/_system/dictionary/edge_vocabulary.md")
2025-12-23 18:51:12 +01:00
CHANGE_DETECTION_MODE: str = os.getenv("MINDNET_CHANGE_DETECTION_MODE", "full")
2025-12-08 10:32:57 +01:00
2025-12-25 09:58:25 +01:00
# --- WP-04 Retriever Gewichte ---
2025-10-07 10:50:36 +02:00
RETRIEVER_W_SEM: float = float(os.getenv("MINDNET_WP04_W_SEM", "0.70"))
RETRIEVER_W_EDGE: float = float(os.getenv("MINDNET_WP04_W_EDGE", "0.25"))
RETRIEVER_W_CENT: float = float(os.getenv("MINDNET_WP04_W_CENT", "0.05"))
RETRIEVER_TOP_K: int = int(os.getenv("MINDNET_WP04_TOP_K", "10"))
RETRIEVER_EXPAND_DEPTH: int = int(os.getenv("MINDNET_WP04_EXPAND_DEPTH", "1"))
RETRIEVER_EDGE_TYPES: str = os.getenv("MINDNET_WP04_EDGE_TYPES", "references,belongs_to,prev,next")
2025-09-02 10:19:42 +02:00
@lru_cache
def get_settings() -> Settings:
2025-12-25 09:58:25 +01:00
"""Gibt die zentralen Einstellungen als Singleton zurück."""
2025-12-08 10:32:57 +01:00
return Settings()